AS3 w/o Flash
coremedia / jangaroo-tools Goto Github PK
View Code? Open in Web Editor NEWAS3 w/o Flash Plugin
Home Page: https://www.jangaroo.net
License: Other
AS3 w/o Flash Plugin
Home Page: https://www.jangaroo.net
License: Other
AS3 w/o Flash
hi ,
first thank you for Jangaroo !!!
i am a beginner with Jangaroo and i need a very simple and clear explanation
starting with an AS3 flie and ending in the browser
Tx
Ron
Hi,
mbuse and I have found an interesting behaviour of jangaroo. Look at this tiny incomplete example.
First, write a jangaroo class.
package wrong.packagepath {
public class WfProtocolListPanelBase extends Container
{
}
}
Secondly, write a corresponding exml file.
baseClass="de.lynorics.example.WfProtocolListPanelBase">
And now look at the jangaroo class, the jangaroo compiler has generated.
package de.lynorics.example {
public class WfProtocolListPanel extends de.lynorics.example.WfProtocolListPanelBase {
}
}
As you see, the generated "WfProtocolListPanel" extends "WfProtocolListPanelBase" as defined by the given exml. And, as you can see, there ist no class "WfProtocolListPanelBase" in package "de.lynorics.example" since the declaration of this class lives in package "wrong.packagepath".
But, now to the most interesting part of this example.
The jangaroo compiler accepts and compiles this code to a running example! I asume, there is an explanation for this behaviour. Even I have doubts, that it is correct. Am I wrong? ;-)
Using a script to convert (with some manual fixes) joo.cup
to an EBNF
understood by (IPV6) https://www.bottlecaps.de/rr/ui or (IPV4) https://rr.red-dove.com/ui to generate a nice navigable railroad diagram that can be used to document/develop/debug this project grammar.
Follow the instructions shown bellow at the top:
//
// EBNF to be viewd at
// (IPV6) https://www.bottlecaps.de/rr/ui
// (IPV4) https://rr.red-dove.com/ui
//
// Copy and paste this at one url shown above in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//
as3_joo ::=
compilationUnit
arguments ::=
| nonEmptyArguments
arrayLiteral ::=
LBRACK arrayLiteralFields RBRACK
arrayLiteralFields ::=
| expr
| optExpr COMMA arrayLiteralFields
block ::=
LBRACE statements RBRACE
catches ::=
catchClause
| catches catchClause
catchClause ::=
CATCH LPAREN parameter RPAREN block
classBody ::=
LBRACE classBodyDirectives RBRACE
classBodyDirectives ::=
| classBodyDirectives classBodyDirective
classBodyDirective ::=
statement
| directive
classDeclaration ::=
annotationsAndModifiers CLASS ide extends implements classBody
| annotationsAndModifiers INTERFACE ide interfaceExtends classBody
commaExpr ::=
expr
| expr COMMA commaExpr
compilationUnit ::=
packageDeclaration LBRACE optDirectives compilationUnitDeclaration RBRACE optClassDeclarations
| mxmlCompilationUnit
compilationUnitDeclaration ::=
classDeclaration SEMICOLON
| classDeclaration
| variableDeclaration
| functionDeclaration
| namespaceDeclaration
optClassDeclarations ::=
| optDirectives classDeclaration optClassDeclarations
constOrVar ::=
CONST
| VAR
directive ::=
IMPORT qualifiedIde SEMICOLON
| IMPORT qualifiedIde DOT MUL SEMICOLON
| USE ide qualifiedIde SEMICOLON
annotationsAndModifiers ::=
modifiers
| annotations modifiers
annotations ::=
annotation
| annotations annotation
annotation ::=
LBRACK ide RBRACK
| LBRACK ide LPAREN annotationParameters RPAREN RBRACK
nonEmptyAnnotationParameters ::=
annotationParameter
| annotationParameter COMMA nonEmptyAnnotationParameters
annotationParameter ::=
ide EQ literalExpr
| ide EQ qualifiedIde
| literalExpr
| ide
annotationParameters ::=
| nonEmptyAnnotationParameters
optDirectives ::=
| directive optDirectives
literalExpr ::=
INT_LITERAL
| FLOAT_LITERAL
| BOOL_LITERAL
| STRING_LITERAL
| REGEXP_START REGEXP_LITERAL
| NULL_LITERAL
expr ::=
literalExpr
| objectLiteral
| arrayLiteral
| lvalue
| functionExpr
| THIS
| parenthesizedExpr
| NEW LT type GT arrayLiteral
| NEW expr
| PLUSPLUS expr
//%prec PREFIX_PLUSPLUS
| MINUSMINUS expr
//%prec PREFIX_MINUSMINUS
| PLUS expr
//%prec PREFIX_PLUS
| MINUS expr
//%prec PREFIX_MINUS
| NOT expr
| BITNOT expr
| TYPEOF expr
| DELETE expr
| expr LPAREN arguments RPAREN
| expr AS expr
| expr IS expr
| expr NO_LINE_TERMINATOR_HERE_POSTFIX_OP PLUSPLUS
| expr NO_LINE_TERMINATOR_HERE_POSTFIX_OP MINUSMINUS
| expr MUL expr
| expr DIV expr
| expr MOD expr
| expr PLUS expr
| expr MINUS expr
| expr LSHIFT expr
| expr RSHIFT expr
| expr URSHIFT expr
| expr LT expr
| expr GT expr
| expr LTEQ expr
| expr GTEQ expr
| expr INSTANCEOF expr
| expr EQEQ expr
| expr NOTEQ expr
| expr EQEQEQ expr
| expr NOTEQEQ expr
| expr AND expr
| expr XOR expr
| expr OR expr
| expr ANDAND expr
| expr OROR expr
| expr IN expr
| lvalue EQ expr
| lvalue MULTEQ expr
| lvalue DIVEQ expr
| lvalue MODEQ expr
| lvalue PLUSEQ expr
| lvalue MINUSEQ expr
| lvalue LSHIFTEQ expr
| lvalue RSHIFTEQ expr
| lvalue URSHIFTEQ expr
| lvalue ANDEQ expr
| lvalue XOREQ expr
| lvalue OREQ expr
| lvalue ANDANDEQ expr
| lvalue OROREQ expr
| expr QUESTION expr COLON expr
extends ::=
|
EXTENDS qualifiedIde
interfaceExtends ::=
| EXTENDS ideList
namespaceDeclaration ::=
annotationsAndModifiers EQ STRING_LITERAL SEMICOLON
functionExpr ::=
FUNCTION_EXPR optIde LPAREN parameters RPAREN optTypeRelation block
functionDeclaration ::=
annotationsAndModifiers FUNCTION ide LPAREN parameters RPAREN optTypeRelation block
| annotationsAndModifiers FUNCTION ide LPAREN parameters RPAREN optTypeRelation SEMICOLON
| annotationsAndModifiers FUNCTION IDE ide LPAREN parameters RPAREN optTypeRelation block
| annotationsAndModifiers FUNCTION IDE ide LPAREN parameters RPAREN optTypeRelation SEMICOLON
ide ::=
IDE
implements ::=
| IMPLEMENTS ideList
lvalue ::=
qualifiedIde
| IDE NAMESPACESEP IDE
| THIS DOT namespacedIde
| SUPER DOT namespacedIde
| expr DOT namespacedIde
| expr LBRACK commaExpr RBRACK
modifier ::=
PUBLIC
| PROTECTED
| PRIVATE
| INTERNAL
/* syntactic keyword modifier or a namespace: */
| IDE
modifiers ::=
| modifier modifiers
namespacedIde ::=
ide
| modifier NAMESPACESEP IDE
nonEmptyArguments ::=
expr
| expr COMMA nonEmptyArguments
nonEmptyParameters ::=
parameter
| REST ide optTypeRelation
| parameter COMMA nonEmptyParameters
nonEmptyObjectFields ::=
objectField
| objectField COMMA nonEmptyObjectFields
objectField ::=
ide COLON expr
| STRING_LITERAL COLON expr
| INT_LITERAL COLON expr
objectFields ::=
| nonEmptyObjectFields
objectLiteral ::=
LBRACE_EXPR objectFields RBRACE
optCatches ::=
| catches
optCommaExpr ::=
| commaExpr
optExpr ::=
| expr
optIde ::=
| ide
optInitializer ::=
| EQ expr
optTypeRelation ::=
| typeRelation
packageDeclaration ::=
PACKAGE
| PACKAGE qualifiedIde
parameter ::=
ide optTypeRelation optInitializer
parameters ::=
| nonEmptyParameters
parenthesizedExpr ::=
LPAREN expr RPAREN
qualifiedIde ::=
ide
| IDE DOTLT type GT
| qualifiedIde DOT namespacedIde
statement ::=
SEMICOLON
| commaExpr SEMICOLON
| ide COLON statement
| variableDeclaration
| BREAK SEMICOLON
| BREAK NO_LINE_TERMINATOR_HERE ide SEMICOLON
| CONTINUE SEMICOLON
| CONTINUE NO_LINE_TERMINATOR_HERE ide SEMICOLON
| RETURN SEMICOLON
| RETURN NO_LINE_TERMINATOR_HERE expr SEMICOLON
| THROW NO_LINE_TERMINATOR_HERE commaExpr SEMICOLON
| SUPER LPAREN arguments RPAREN SEMICOLON
| IF parenthesizedExpr statement ELSE statement
| IF parenthesizedExpr statement
| SWITCH parenthesizedExpr LBRACE statementsInSwitch RBRACE
| WHILE parenthesizedExpr statement
| DO statement WHILE parenthesizedExpr SEMICOLON
| FOR LPAREN SEMICOLON optCommaExpr SEMICOLON optCommaExpr RPAREN statement
| FOR LPAREN commaExpr SEMICOLON optCommaExpr SEMICOLON optCommaExpr RPAREN statement
| FOR LPAREN forVariableDeclaration SEMICOLON optCommaExpr SEMICOLON optCommaExpr RPAREN statement
| FOR LPAREN lvalue IN expr RPAREN statement
| FOR LPAREN VAR ide optTypeRelation IN expr RPAREN statement
| FOR IDE LPAREN lvalue IN expr RPAREN statement
| FOR IDE LPAREN VAR ide optTypeRelation IN expr RPAREN statement
| TRY block catches
| TRY block optCatches FINALLY block
| block
| functionDeclaration
statements ::=
| statements statement
statementInSwitch ::=
statement
| CASE expr COLON
| DEFAULT COLON
statementsInSwitch ::=
| statementsInSwitch statementInSwitch
type ::=
ideType
| MUL
| VOID
ideType ::=
qualifiedIde
ideList ::=
qualifiedIde
| qualifiedIde COMMA ideList
typeRelation ::=
COLON type
| COLON TYPE_START type
forVariableDeclaration ::=
VAR ide optTypeRelation optInitializer optNextVariableDeclaration
variableDeclaration ::=
annotationsAndModifiers constOrVar ide optTypeRelation optInitializer optNextVariableDeclaration SEMICOLON
optNextVariableDeclaration ::=
| COMMA ide optTypeRelation optInitializer optNextVariableDeclaration
mxmlCompilationUnit ::=
optXmlHeader mxmlElement
/* <?xml version="..."?> */
optXmlHeader ::=
| LT_QUESTION ide xmlAttributes QUESTION_GT
mxmlElement ::=
closedMxmlTag
| openingMxmlTag mxmlElements closingMxmlTag
mxmlElements ::=
| mxmlElements mxmlElement
| mxmlElements STRING_LITERAL
xmlAttribute ::=
namespacedXmlIde EQ STRING_LITERAL
xmlAttributes ::=
| xmlAttributes xmlAttribute
namespacedXmlIde ::=
IDE
| IDE COLON IDE
openingMxmlTag ::=
LT namespacedXmlIde xmlAttributes GT
closedMxmlTag ::=
LT namespacedXmlIde xmlAttributes SLASH_GT
closingMxmlTag ::=
LT_SLASH namespacedXmlIde GT
//Tokens
//\("[^"]+"\)\s+{ return symbol(\([^)]+\)); }
AS ::= "as"
BREAK ::= "break"
CASE ::= "case"
CATCH ::= "catch"
CLASS ::= "class"
CONST ::= "const"
CONTINUE ::= "continue"
DEFAULT ::= "default"
DELETE ::= "delete"
DO ::= "do"
ELSE ::= "else"
EXTENDS ::= "extends"
FINALLY ::= "finally"
FOR ::= "for"
FUNCTION ::= "function"
IF ::= "if"
IMPLEMENTS ::= "implements"
IMPORT ::= "import"
IN ::= "in"
INSTANCEOF ::= "instanceof"
INTERFACE ::= "interface"
INTERNAL ::= "internal"
IS ::= "is"
NEW ::= "new"
NULL_LITERAL ::= "null"
PACKAGE ::= "package"
PRIVATE ::= "private"
PROTECTED ::= "protected"
PUBLIC ::= "public"
RETURN ::= "return"
SUPER ::= "super"
SWITCH ::= "switch"
THIS ::= "this"
THROW ::= "throw"
TRY ::= "try"
TYPEOF ::= "typeof"
USE ::= "use"
VAR ::= "var"
VOID ::= "void"
WHILE ::= "while"
WITH ::= "with"
BOOL_LITERAL ::= "true"
BOOL_LITERAL ::= "false"
LPAREN ::= "("
RPAREN ::= ")"
LBRACE ::= "{"
RBRACE ::= "}"
LBRACK ::= "["
RBRACK ::= "]"
SEMICOLON ::= ";"
COMMA ::= ","
DOT ::= "."
EQ ::= "="
GT ::= ">"
LT ::= "<"
NOT ::= "!"
QUESTION ::= "?"
COLON ::= ":"
EQEQ ::= "=="
LTEQ ::= "<="
GTEQ ::= ">="
NOTEQ ::= "!="
ANDAND ::= "&&"
OROR ::= "||"
PLUSPLUS ::= "++"
MINUSMINUS ::= "--"
PLUS ::= "+"
MINUS ::= "-"
MUL ::= "*"
AND ::= "&"
OR ::= "|"
XOR ::= "^"
MOD ::= "%"
BITNOT ::= "~"
LSHIFT ::= "<<"
RSHIFT ::= ">>"
URSHIFT ::= ">>>"
PLUSEQ ::= "+="
MINUSEQ ::= "-="
MULTEQ ::= "*="
ANDEQ ::= "&="
ANDANDEQ ::= "&&="
OREQ ::= "|="
OROREQ ::= "||="
XOREQ ::= "^="
MODEQ ::= "%="
LSHIFTEQ ::= "<<="
RSHIFTEQ ::= ">>="
URSHIFTEQ ::= ">>>="
EQEQEQ ::= "==="
NOTEQEQ ::= "!=="
REST ::= "..."
NAMESPACESEP ::= "::"
DIV ::= "/"
DIVEQ ::= "/="
DOTLT ::= ".<"
caused by Maven 3 regression bug: https://jira.codehaus.org/browse/MNG-5135
Workarounds:
There are several possible workarounds:
a) Use Maven 2.2.1
b) define jangaroo-maven-plugin (which contains extensions) in parent POM instead of in modules
c) use mvn validate sonar:sonar
Exception on import:
org.jetbrains.idea.maven.project.MavenProject.findPlugin(Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/idea/maven/project/MavenPlugin;
at net.jangaroo.ide.idea.JangarooFacetImporter.isApplicable(JangarooFacetImporter.java:64)
at org.jetbrains.idea.maven.importing.MavenImporter.getSuitableImporters(MavenImporter.java:48)
at org.jetbrains.idea.maven.project.MavenProject.getSuitableImporters(MavenProject.java:794)
at org.jetbrains.idea.maven.project.MavenProject.resolve(MavenProject.java:405)
at org.jetbrains.idea.maven.project.MavenProjectsTree.resolve(MavenProjectsTree.java:1004)
at org.jetbrains.idea.maven.project.MavenProjectsProcessorResolvingTask.perform(MavenProjectsProcessorResolvingTask.java:39)
at org.jetbrains.idea.maven.project.MavenProjectsProcessor.doProcessPendingTasks(MavenProjectsProcessor.java:131)
at org.jetbrains.idea.maven.project.MavenProjectsProcessor.access$100(MavenProjectsProcessor.java:28)
at org.jetbrains.idea.maven.project.MavenProjectsProcessor$2.run(MavenProjectsProcessor.java:107)
at org.jetbrains.idea.maven.utils.MavenUtil$9.run(MavenUtil.java:395)
at com.intellij.openapi.application.impl.ApplicationImpl$6.run(ApplicationImpl.java:382)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
at com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:130)
See also: CoreMedia Support Ticket 46032
Migration Step 7:
leads to:
But the library is present in the local repository - this is guaranteed after performing step 6.
The working device is a Lenovo P51 which is running on Win10.
Please go to http://jangaroo.myjetbrains.com/youtrack
There are multiple versions of commons-codec:commons-codec in jangaroo-tools\jangaroo\jangaroo-app-runner. As shown in the following dependency tree, library commons-codec:commons-codec:1.11 is transitively introduced by org.apache.httpcomponents:httpclient:4.5.9, but has been managed to be version 1.3.
However, several methods defined in shadowed version commons-codec:commons-codec:1.11 are referenced by client project via org.apache.httpcomponents:httpclient:4.5.9 but missing in the actually loaded version commons-codec:commons-codec:1.3.
For instance, the following missing method(defined in commons-codec:commons-codec:1.11) are actually referenced by jangaroo-tools\jangaroo\jangaroo-app-runner, which will introduce a runtime error(i.e., "NoSuchMethodError") into jangaroo-tools\jangaroo\jangaroo-app-runner.
org.apache.commons.codec.binary.Base64: void init(int) is invoked by jangaroo-tools\jangaroo\jangaroo-app-runner via the following path:
Invocation path------
<net.jangaroo.apprunner.proxy.AddDynamicPackagesServlet: void doGet(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)> jangaroo-tools\jangaroo\jangaroo-app-runner\target\classes
<org.apache.http.impl.client.CloseableHttpClient: org.apache.http.client.methods.CloseableHttpResponse execute(org.apache.http.client.methods.HttpUriRequest)> Repositories\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar
<org.apache.http.impl.client.CloseableHttpClient: org.apache.http.client.methods.CloseableHttpResponse execute(org.apache.http.client.methods.HttpUriRequest,org.apache.http.protocol.HttpContext)> Repositories\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar
<org.apache.http.impl.client.InternalHttpClient: org.apache.http.client.methods.CloseableHttpResponse doExecute(org.apache.http.HttpHost,org.apache.http.HttpRequest,org.apache.http.protocol.HttpContext)> Repositories\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar
<org.apache.http.impl.execchain.MainClientExec: org.apache.http.client.methods.CloseableHttpResponse execute(org.apache.http.conn.routing.HttpRoute,org.apache.http.client.methods.HttpRequestWrapper,org.apache.http.client.protocol.HttpClientContext,org.apache.http.client.methods.HttpExecutionAware)> Repositories\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar
<org.apache.http.impl.auth.HttpAuthenticator: void generateAuthResponse(org.apache.http.HttpRequest,org.apache.http.auth.AuthState,org.apache.http.protocol.HttpContext)> Repositories\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar
<org.apache.http.impl.auth.HttpAuthenticator: org.apache.http.Header doAuth(org.apache.http.auth.AuthScheme,org.apache.http.auth.Credentials,org.apache.http.HttpRequest,org.apache.http.protocol.HttpContext)> Repositories\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar
<org.apache.http.impl.auth.BasicScheme: org.apache.http.Header authenticate(org.apache.http.auth.Credentials,org.apache.http.HttpRequest,org.apache.http.protocol.HttpContext)> Repositories\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar
<org.apache.commons.codec.binary.Base64: void init(int)>
Declare a direct dependency commons-codec:commons-codec:1.11 in the pom file of jangaroo-tools\jangaroo\jangaroo-app-runner
This repair will not introduce new dependencies and conflicts.
Use configuration attribute <dependencyManagement> to unify the version of library commons-codec:commons-codec to be 1.11 in jangaroo-tools\jangaroo\jangaroo-app-runner's pom file.
This repair will not introduce new dependencies and conflicts.
Please let me know which solution do you prefer? I can submit a PR to fix it.
Thank you very much for your attention.
Best regards,
net.jangaroo:jangaroo-app-runner:jar:4.0.77-SNAPSHOT
+- org.slf4j:slf4j-api:jar:1.7.2:compile
+- org.apache.commons:commons-lang3:jar:3.7:compile
+- com.fasterxml.jackson.core:jackson-databind:jar:2.7.1:compile
| +- com.fasterxml.jackson.core:jackson-annotations:jar:2.7.1:compile (version managed from 2.7.0)
| \- com.fasterxml.jackson.core:jackson-core:jar:2.7.1:compile
+- org.eclipse.jetty:jetty-server:jar:9.4.19.v20190610:compile
| +- (javax.servlet:javax.servlet-api:jar:3.1.0:compile - omitted for duplicate)
| +- org.eclipse.jetty:jetty-http:jar:9.4.19.v20190610:compile
| | +- (org.eclipse.jetty:jetty-util:jar:9.4.19.v20190610:compile - omitted for duplicate)
| | \- (org.eclipse.jetty:jetty-io:jar:9.4.19.v20190610:compile - omitted for duplicate)
| \- org.eclipse.jetty:jetty-io:jar:9.4.19.v20190610:compile
| \- (org.eclipse.jetty:jetty-util:jar:9.4.19.v20190610:compile - omitted for duplicate)
+- org.eclipse.jetty:jetty-util:jar:9.4.19.v20190610:compile
+- org.eclipse.jetty:jetty-servlet:jar:9.4.19.v20190610:compile
| \- org.eclipse.jetty:jetty-security:jar:9.4.19.v20190610:compile
| \- (org.eclipse.jetty:jetty-server:jar:9.4.19.v20190610:compile - omitted for duplicate)
+- org.eclipse.jetty:jetty-webapp:jar:9.4.19.v20190610:compile
| +- org.eclipse.jetty:jetty-xml:jar:9.4.19.v20190610:compile
| | \- (org.eclipse.jetty:jetty-util:jar:9.4.19.v20190610:compile - omitted for duplicate)
| \- (org.eclipse.jetty:jetty-servlet:jar:9.4.19.v20190610:compile - omitted for duplicate)
+- javax.servlet:javax.servlet-api:jar:3.1.0:compile
+- org.mitre.dsmiley.httpproxy:smiley-http-proxy-servlet:jar:1.11:compile
| \- (org.apache.httpcomponents:httpclient:jar:4.5.9:compile - version managed from 4.5.6; omitted for duplicate)
+- org.apache.httpcomponents:httpclient:jar:4.5.9:compile
| +- (org.apache.httpcomponents:httpcore:jar:4.4.9:compile - version managed from 4.4.11; omitted for duplicate)
| +- commons-logging:commons-logging:jar:1.1.1:compile (version managed from 1.2)
| \- commons-codec:commons-codec:jar:1.3:compile (version managed from 1.11)
+- org.apache.httpcomponents:httpcore:jar:4.4.9:compile
\- junit:junit:jar:4.12:test
\- org.hamcrest:hamcrest-core:jar:1.3:test
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.