Comments (16)
I made it so that we no longer ever use JarURLConnection
to read the resources (template files) that AutoValue needs. Instead, we always open the jar where the AutoValue code lives explicitly, and read the resources out of it. That's probably a bit more expensive, but only happens once per template and per compilation.
from auto.
I dug around in the code for a bit to see what might have changed between 1.8.2 and 1.10.2 that could be a cause for this, and what looked most likely to me is the change to parse files for #parse
nodes at template evaluation time rather than template parse time.
It seems like that could be a problem here because AutoValueTemplateVars
holds a pre-parsed static final Template
for autovalue.vm
, which will then need to try to open and parse (and cache) equalshashcode.vm
(always) and builder.vm
(if there's a builder -- this seems to be where the exception is occurring in this case). The issue then could have to do with how TemplateVars.class.getResourceAsStream
is used to to open the streams to read those from.
All that said, I'm not sure why opening that stream seemingly must be succeeding in this stack trace and the exception is then occurring while reading from from it. Maybe something is closing the original jar stream that the static reference to TemplateVars.class
was loaded from, making the streams opened from it with getResourceAsStream
also closed?
from auto.
Thanks @cgdecker, I think your theory is correct.
From the stack traces, it looks like this is happening on Java 8. I think the issue is JDK-6947916, which was fixed in Java 9. We already have a workaround but as Colin notes that only applies when the original autovalue.vm
is read. The #parse
happens later, outside the try
/catch
where the workaround is active.
I put a lot of effort into making this workaround, including a ridiculously complicated regression test, then unknowingly undid it all with the change Colin mentions.
While it's probably possible to come up with a new workaround, I think it would be a lot easier just to build with a more recent JDK. JDK 8 was released in 2014 and is more or less EOL now. Unless you can confirm that it is in fact a more recent JDK? (I'm assuming it's 8 because there are no module names in the stack traces.)
from auto.
(You can still build with --target 8
to produce Java-8-compatible .class
files.)
from auto.
Looking at the failed build link, it looks like Maven should be compiling with JDK 11 in this case:
Run actions/setup-java@a12e082d834968c1847f782019214fadd20719f6
with:
distribution: zulu
java-version: 11
java-package: jdk
architecture: x64
check-latest: false
server-id: github
server-username: GITHUB_ACTOR
server-password: GITHUB_TOKEN
overwrite-settings: true
job-status: success
env:
MAVEN_OPTS: -Dorg.slf4j.simpleLogger.log.org.apache.maven.plugins.shade=error
GOROOT: /home/runner/actions-runner/_work/_tool/go/1.17.13/x64
Resolved Java 11.0.19+7 from tool-cache
Setting Java 11.0.19+7 as the default
Specifically with:
Java configuration:
Distribution: zulu
Version: 11.0.19+7
Path: /home/runner/actions-runner/_work/_tool/Java_Zulu_jdk/11.0.19-7/x64
I wonder if changing the distribution
to something else (oracle
or adopt
maybe?) would change anything.
from auto.
Thanks for looking into this!
Right, it should be Java 11.
I got locally too with
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment Temurin-11.0.17+8 (build 11.0.17+8)
OpenJDK 64-Bit Server VM Temurin-11.0.17+8 (build 11.0.17+8, mixed mode)
After running while mvn -T32 clean compile -DskipTests -e; do done
at DataflowTemplates for a couple of minutes.
It's hard to bisect because it takes a bit to run, but I am pretty confident it is not happening with a single thread (or the probability is minimal), as the loop ran for hours with -T1
.
Appreciate you guys looking -- but note that I understand this is a very specific use-case and this is not urgent. We reverted to 1.8.2 for the time being.
from auto.
I'm still puzzled at the absence of module names in those stack traces. Could you do this experiment in your environment?
$ jshell
| Welcome to JShell -- Version 11.0.17
| For an introduction type: /help intro
jshell> new Throwable().printStackTrace()
java.lang.Throwable
at REPL.$JShell$11.do_it$($JShell$11.java:5)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at jdk.jshell/jdk.jshell.execution.DirectExecutionControl.invoke(DirectExecutionControl.java:209)
...
It's those java.base/
that I would expect to see in a stack trace from the JDK 11 compiler. Unless the Zulu JDK doesn't do that?
I'm persisting here just because it still seems like a big coincidence that (1) the stack traces look like Java 8 and (2) the symptoms correspond exactly to a bug that was fixed in Java 9.
from auto.
Curiously, I just ran the jshell
binary from zulu11.66.15-ca-jdk11.0.20-linux_x64
and saw module names as expected, so I do wonder if something weird is going on.
from auto.
For example, if the pom.xml
were doing something like this then the compilation could end up using JDK 8 even though Maven itself is running with JDK 11.
from auto.
We also hit this problem quite often these day. Is there a plan to get this prioritized a bit? Thank you.
from auto.
We also hit this problem quite often these day. Is there a plan to get this prioritized a bit? Thank you.
Can you confirm whether you are using JDK 8 or a later JDK version?
from auto.
I can confirm we use Java 11 and compile with 11 as release target as well. We have Maven parallell build enabled.
from auto.
OK. If you have an exception stack-trace, can you show it? I'm curious if it contains module names, as I mentioned in an earlier comment. But I think it is probably possible to rework the code so that the existing workaround is applied more generally.
from auto.
Sure. There it is:
error: [AutoValueException] @AutoValue processor threw an exception: autovalue.shaded.com.google.escapevelocity.EvaluationException: In expression on line 192 of autovalue.vm: java.io.IOException: Stream closed
14:58:41 at autovalue.shaded.com.google.escapevelocity.Node.evaluationException(Node.java:59)
14:58:41 at autovalue.shaded.com.google.escapevelocity.ParseNode.render(ParseNode.java:65)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Node$Cons.render(Node.java:91)
14:58:41 at autovalue.shaded.com.google.escapevelocity.DirectiveNode$IfNode.render(DirectiveNode.java:103)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Node$Cons.render(Node.java:91)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Template.render(Template.java:189)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Template.evaluate(Template.java:179)
14:58:41 at com.google.auto.value.processor.TemplateVars.toText(TemplateVars.java:99)
14:58:41 at com.google.auto.value.processor.AutoValueProcessor.processType(AutoValueProcessor.java:274)
14:58:41 at com.google.auto.value.processor.AutoValueishProcessor.process(AutoValueishProcessor.java:441)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:985)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:901)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1227)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1340)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1254)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:936)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
14:58:41 at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:75)
14:58:41 at jdk.internal.reflect.GeneratedMethodAccessor134.invoke(Unknown Source)
14:58:41 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
14:58:41 at java.base/java.lang.reflect.Method.invoke(Method.java:566)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcess0(JavacCompiler.java:700)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcessWithProperClassloader(JavacCompiler.java:681)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcess(JavacCompiler.java:670)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:187)
14:58:41 at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1140)
14:58:41 at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:193)
14:58:41 at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:342)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:330)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:175)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:76)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:163)
14:58:41 at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute(DefaultMojosExecutionStrategy.java:39)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:160)
14:58:41 at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:105)
14:58:41 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:193)
14:58:41 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:180)
14:58:41 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
14:58:41 at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
14:58:41 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
14:58:41 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
14:58:41 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
14:58:41 at java.base/java.lang.Thread.run(Thread.java:829)
14:58:41 Caused by: java.io.IOException: Stream closed
14:58:41 at java.base/java.util.zip.InflaterInputStream.ensureOpen(InflaterInputStream.java:68)
14:58:41 at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:143)
14:58:41 at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133)
14:58:41 at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
14:58:41 at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
14:58:41 at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
14:58:41 at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
14:58:41 at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
14:58:41 at java.base/java.io.BufferedReader.read(BufferedReader.java:182)
14:58:41 at java.base/java.io.LineNumberReader.read(LineNumberReader.java:126)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.next(Parser.java:144)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.skipSpace(Parser.java:171)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.expect(Parser.java:189)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseIfOrElseIf(Parser.java:418)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseDirective(Parser.java:370)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseNode(Parser.java:271)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseToStop(Parser.java:223)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.skipNewlineAndParseToStop(Parser.java:251)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseForEach(Parser.java:476)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseDirective(Parser.java:378)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseNode(Parser.java:271)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseToStop(Parser.java:223)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parse(Parser.java:128)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Template.parseFrom(Template.java:147)
14:58:41 at autovalue.shaded.com.google.escapevelocity.ParseNode.render(ParseNode.java:62)
14:58:41 ... 44 more
14:58:41 [�[1;31mERROR�[m] autovalue.shaded.com.google.escapevelocity.EvaluationException: In expression on line 192 of autovalue.vm: java.io.IOException: Stream closed
14:58:41 at autovalue.shaded.com.google.escapevelocity.Node.evaluationException(Node.java:59)
14:58:41 at autovalue.shaded.com.google.escapevelocity.ParseNode.render(ParseNode.java:65)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Node$Cons.render(Node.java:91)
14:58:41 at autovalue.shaded.com.google.escapevelocity.DirectiveNode$IfNode.render(DirectiveNode.java:103)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Node$Cons.render(Node.java:91)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Template.render(Template.java:189)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Template.evaluate(Template.java:179)
14:58:41 at com.google.auto.value.processor.TemplateVars.toText(TemplateVars.java:99)
14:58:41 at com.google.auto.value.processor.AutoValueProcessor.processType(AutoValueProcessor.java:274)
14:58:41 at com.google.auto.value.processor.AutoValueishProcessor.process(AutoValueishProcessor.java:441)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:985)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:901)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1227)
14:58:41 at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1340)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1254)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:936)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
14:58:41 at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
14:58:41 at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:75)
14:58:41 at jdk.internal.reflect.GeneratedMethodAccessor134.invoke(Unknown Source)
14:58:41 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
14:58:41 at java.base/java.lang.reflect.Method.invoke(Method.java:566)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcess0(JavacCompiler.java:700)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcessWithProperClassloader(JavacCompiler.java:681)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcess(JavacCompiler.java:670)
14:58:41 at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:187)
14:58:41 at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1140)
14:58:41 at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:193)
14:58:41 at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:342)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:330)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:175)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:76)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:163)
14:58:41 at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute(DefaultMojosExecutionStrategy.java:39)
14:58:41 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:160)
14:58:41 at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:105)
14:58:41 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:193)
14:58:41 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:180)
14:58:41 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
14:58:41 at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
14:58:41 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
14:58:41 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
14:58:41 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
14:58:41 at java.base/java.lang.Thread.run(Thread.java:829)
14:58:41 Caused by: java.io.IOException: Stream closed
14:58:41 at java.base/java.util.zip.InflaterInputStream.ensureOpen(InflaterInputStream.java:68)
14:58:41 at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:143)
14:58:41 at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133)
14:58:41 at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
14:58:41 at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
14:58:41 at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
14:58:41 at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
14:58:41 at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
14:58:41 at java.base/java.io.BufferedReader.read(BufferedReader.java:182)
14:58:41 at java.base/java.io.LineNumberReader.read(LineNumberReader.java:126)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.next(Parser.java:144)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.skipSpace(Parser.java:171)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.expect(Parser.java:189)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseIfOrElseIf(Parser.java:418)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseDirective(Parser.java:370)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseNode(Parser.java:271)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseToStop(Parser.java:223)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.skipNewlineAndParseToStop(Parser.java:251)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseForEach(Parser.java:476)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseDirective(Parser.java:378)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseNode(Parser.java:271)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parseToStop(Parser.java:223)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Parser.parse(Parser.java:128)
14:58:41 at autovalue.shaded.com.google.escapevelocity.Template.parseFrom(Template.java:147)
14:58:41 at autovalue.shaded.com.google.escapevelocity.ParseNode.render(ParseNode.java:62)
14:58:41 ... 44 more
from auto.
Huh. That certainly does look like a Java 11 stacktrace. But JDK-6947916 is supposed to be fixed there. So perhaps there is another related issue? Anyway, I think this can be worked around and will look into that.
from auto.
@eamonnmcmanus Thank you so much getting this fixed! I'm looking forward to trying in the next release.
from auto.
Related Issues (20)
- noSuchElementException HOT 3
- AutoService breaks with Immutables HOT 8
- Shaded guava triggers CVE checks HOT 1
- AutoValue functional tests not being run by Maven
- auto-value 1.10.2 breaks compatibility with Kotlin 1.6 HOT 8
- AutoBuilder will not build Kotlin data class with Duration HOT 3
- Require Java 11+ for compilation HOT 1
- Use Jakarta's @Generated annotation if available HOT 2
- AutoValue `toBuilder()` works poorly if an extension subclasses `Builder`; possible INCOMPATIBLE change HOT 1
- Android does not use AutoService. See the example code HOT 2
- Is cross-process support available? HOT 3
- Release AutoFactory 1.1.0 HOT 1
- Remove `o == this` check from generated `equals`? HOT 2
- AutoValue null annotations in Eclipse HOT 2
- Possible documentation issue around collection builders HOT 1
- google/auto
- Annotation Processor output is not deterministic HOT 3
- Drop support for running generated code under Java 7 HOT 2
- [Bug] Annotation processor generated duplicated classes from dependency that also used autovalue HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from auto.