woven-planet / go-zserio Goto Github PK
View Code? Open in Web Editor NEWzserio support for Go
License: Other
zserio support for Go
License: Other
Hi,
the 2024.03 schema version seems to be incompatible with the current go-zserio implementation.
The NDS.Live package builder forces a zserio 2.13 version with this new schema so I don't know which change actually causes the generator issues.
So here is the log when running against the display layer.
When using the previous versions (2023.12 + zserio 2.12) none of the issues below are reported.
The fatal error regarding the layer.zs also appears when generating other layer.zs.
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/all.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/_module.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/attributemap.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/color.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/conditions.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/geometry.zs...
line 306:2 reportAttemptingFullContext d=60 (expression), input='>longitude;/** Latitude. */int<(31-shift)+1>latitude;/** Shift longitude value back to the left. */function'
line 300:31 reportContextSensitivity d=60 (expression), input='>longitude;'
line 306:2 reportAttemptingFullContext d=60 (expression), input='>latitude;/** Shift longitude value back to the left. */function'
line 303:30 reportContextSensitivity d=60 (expression), input='>latitude;'
line 331:2 reportAttemptingFullContext d=60 (expression), input='>deltaLongitude;/** Latitudinal delta to base geographic position. */int<numBits+1>deltaLatitude;/** Shift longitude value back to the left. */function'
line 325:33 reportContextSensitivity d=60 (expression), input='>deltaLongitude;'
line 331:2 reportAttemptingFullContext d=60 (expression), input='>deltaLatitude;/** Shift longitude value back to the left. */function'
line 328:32 reportContextSensitivity d=60 (expression), input='>deltaLatitude;'
line 359:2 reportAttemptingFullContext d=60 (expression), input='>longitude;/** Latitude. */int<(31-shiftXY)+1>latitude;/** Elevation in cm above/below WGS 84 reference ellipsoid. */int<31-shiftZ+1>elevation;/** Shift longitude value back to the left. */function'
line 350:33 reportContextSensitivity d=60 (expression), input='>longitude;'
line 359:2 reportAttemptingFullContext d=60 (expression), input='>latitude;/** Elevation in cm above/below WGS 84 reference ellipsoid. */int<31-shiftZ+1>elevation;/** Shift longitude value back to the left. */function'
line 353:32 reportContextSensitivity d=60 (expression), input='>latitude;'
line 359:2 reportAttemptingFullContext d=60 (expression), input='>elevation;/** Shift longitude value back to the left. */function'
line 356:30 reportContextSensitivity d=60 (expression), input='>elevation;'
line 393:2 reportAttemptingFullContext d=60 (expression), input='>deltaLongitude;/** Latitudinal delta to base geographic position. */int<numBitsXY+1>deltaLatitude;/** Elevation delta to base geographic position. */int<numBitsZ+1>deltaElevation;/** Shift longitude value back to the left. */function'
line 384:35 reportContextSensitivity d=60 (expression), input='>deltaLongitude;'
line 393:2 reportAttemptingFullContext d=60 (expression), input='>deltaLatitude;/** Elevation delta to base geographic position. */int<numBitsZ+1>deltaElevation;/** Shift longitude value back to the left. */function'
line 387:34 reportContextSensitivity d=60 (expression), input='>deltaLatitude;'
line 393:2 reportAttemptingFullContext d=60 (expression), input='>deltaElevation;/** Shift longitude value back to the left. */function'
line 390:34 reportContextSensitivity d=60 (expression), input='>deltaElevation;'
line 550:1 reportAttemptingFullContext d=60 (expression), input='>start;};'
line 549:25 reportContextSensitivity d=60 (expression), input='>'
line 1133:1 reportAttemptingFullContext d=60 (expression), input='>index:index<positionBufferSize;};'
line 1132:41 reportContextSensitivity d=60 (expression), input='>index:'
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/grid.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/icons.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/language.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/location.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/packaging.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/properties.zs...
line 63:2 token recognition error at: '@r'
line 63:11 extraneous input 'METRIC_UNIT' expecting {',', '}'}
line 68:2 token recognition error at: '@r'
line 68:11 extraneous input 'IMPERIAL_UNIT' expecting {',', '}'}
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/speech.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/types.zs...
line 282:1 reportAttemptingFullContext d=60 (expression), input='>minScaleDenominator;};'
line 281:61 reportContextSensitivity d=60 (expression), input='>'
line 422:27 reportAttemptingFullContext d=60 (expression), input='>startPosition;/** End percentage position on the feature.*/bit<numBits>endPosition:'
line 419:28 reportContextSensitivity d=60 (expression), input='>startPosition;'
line 424:2 reportAttemptingFullContext d=60 (expression), input='>endPosition:endPosition>startPosition;function'
line 422:27 reportContextSensitivity d=60 (expression), input='>endPosition:'
line 424:2 reportAttemptingFullContext d=60 (expression), input='>startPosition;function'
line 422:41 reportContextSensitivity d=60 (expression), input='>'
line 444:2 reportAttemptingFullContext d=60 (expression), input='>position;function'
line 442:23 reportContextSensitivity d=60 (expression), input='>position;'
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/vehicle.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/display/_module.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/display/instantiations.zs...
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/display/layer.zs...
panic: interface conversion: interface {} is nil, not *ast.Expression
goroutine 1 [running]:
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitFieldOptionalClause(0xc0006c7128?, 0x3e?)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:233 +0x69
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitStructureFieldDefinition(0xc0003d8c30?, 0xc0006c7128)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:201 +0x1d3
github.com/woven-planet/go-zserio/internal/parser.(*StructureFieldDefinitionContext).Accept(0x8a2800?, {0xa29158?, 0xc00049a768})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/parser/zserio_parser.go:3015 +0x99
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).Visit(0xc0006c6ff0?, {0x7f043c2c2a38?, 0xc0006c7128?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:28 +0x114
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitStructureDeclaration(0x4?, 0xc0006c6ff0)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:174 +0x29a
github.com/woven-planet/go-zserio/internal/parser.(*StructureDeclarationContext).Accept(0x10?, {0xa29158?, 0xc00049a768})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/parser/zserio_parser.go:2769 +0x99
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).Visit(0xc0003072d0?, {0x7f043c2c2968?, 0xc0006c6ff0?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:28 +0x114
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitChildren(0x9501e0?, {0xa2fef0?, 0xc0006c6fd8?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:38 +0xd2
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitTypeDeclaration(0xc000643818?, 0xa29158?)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:134 +0x1d
github.com/woven-planet/go-zserio/internal/parser.(*TypeDeclarationContext).Accept(0x10?, {0xa29158?, 0xc00049a768})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/parser/zserio_parser.go:1714 +0x99
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).Visit(0xc0003072e0?, {0x7f043c2c2900?, 0xc0006c6fd8?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:28 +0x114
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitChildren(0x9501e0?, {0xa2ff68?, 0xc0006c6fc0?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:38 +0xd2
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitLanguageDirective(0xc0001ba1e0?, 0xa29158?)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:129 +0x1d
github.com/woven-planet/go-zserio/internal/parser.(*LanguageDirectiveContext).Accept(0xd0?, {0xa29158?, 0xc00049a768})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/parser/zserio_parser.go:1482 +0x99
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).Visit(0x8cdb60?, {0x7f043c3289d8?, 0xc0006c6fc0?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:28 +0x114
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).VisitPackageDeclaration(0xc00014fd40?, 0xc00070b0b0)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:59 +0x44a
github.com/woven-planet/go-zserio/internal/parser.(*PackageDeclarationContext).Accept(0xc00070b0b0?, {0xa29158?, 0xc00049a768})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/parser/zserio_parser.go:783 +0x99
github.com/woven-planet/go-zserio/internal/visitor.(*Visitor).Visit(0xc00078c7c0?, {0x7f043dc1f158?, 0xc00070b0b0?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/visitor/visitor.go:28 +0x114
github.com/woven-planet/go-zserio/internal/model.PackageFromFile({0xc00003fb80?, 0x0?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/package.go:23 +0x209
github.com/woven-planet/go-zserio/internal/model.(*Model).parseFile(0xc00037a2c0, {0xc00003fb80, 0x34})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/model.go:89 +0xc5
github.com/woven-planet/go-zserio/internal/model.FromFiles({0xc000378800, 0x2e, 0x8cd740?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/model.go:28 +0x9e
github.com/woven-planet/go-zserio/internal/model.FromFilesystem({0xc000256700?, 0xc00010bee0?, 0x0?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/model.go:54 +0x4d
github.com/woven-planet/go-zserio/internal/cli.glob..func1(0xc00035aa00?, {0xc000256700?, 0x4?, 0x95b7cc?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/cli/generate.go:28 +0x30
github.com/spf13/cobra.(*Command).execute(0xe18ae0, {0xc000256690, 0x7, 0x7})
/home/jochen/go/pkg/mod/github.com/spf13/[email protected]/command.go:856 +0x694
github.com/spf13/cobra.(*Command).ExecuteC(0xe18d60)
/home/jochen/go/pkg/mod/github.com/spf13/[email protected]/command.go:974 +0x38d
github.com/spf13/cobra.(*Command).Execute(...)
/home/jochen/go/pkg/mod/github.com/spf13/[email protected]/command.go:902
github.com/woven-planet/go-zserio/internal/cli.Execute()
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/cli/root.go:15 +0x1a
main.main()
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/cmd/go-zserio/main.go:8 +0xf
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
For the sake of completeness, we so far haven't implemented the indexed offset operator (@index
).
It seems to be rarely used, but I'll just post this here as a TODO item.
Hi,
we're seeing errrors regarding an apparently unsupported type RasterImage.
The error is
Error: parse schema: resolve types: smart.types.bytes, field RasterImage: unknown type: .bytes (type not found in package)
RasterImage is a type in the smart module:
/** Unwrapped image data. */
subtype bytes RasterImage;
As we currently do not need this specific type our workaround for now is commenting out this definition along with the 2 services
RasterImage getImage(RasterTileImageRequest);
RasterImage getImageVersioned(RasterTileImageVersionRequest);
which removes the error during code generation.
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
Hi,
when generating code based on zs files of v2.10 or v2.11 we often see errors like the one below that unfortunately contains no hint as of where it is happening.
...
2023/07/24 13:46:00 Parsing file zs/road/reference/types.zs...
2023/07/24 13:46:00 Parsing file zs/road/road.zs...
2023/07/24 13:46:00 Parsing file zs/system/_module.zs...
2023/07/24 13:46:00 Parsing file zs/system/types.zs...
panic: runtime error: integer divide by zero
goroutine 1 [running]:
github.com/woven-planet/go-zserio/internal/ast.(*Expression).evaluateArithmeticExpression(0xc0003c8a80?)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/ast/expression.go:457 +0x44a
github.com/woven-planet/go-zserio/internal/ast.(*Expression).Evaluate(0xc0003c9c00, 0xc000349e30?)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/ast/expression.go:714 +0x26f
github.com/woven-planet/go-zserio/internal/ast.(*Struct).Evaluate(0xc0003dfd00, 0xc0003f26e0)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/ast/struct.go:50 +0x150
github.com/woven-planet/go-zserio/internal/model.(*Model).EvaluateStructs(0xc0002cdd08?)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/transform.go:174 +0x105
github.com/woven-planet/go-zserio/internal/model.(*Model).evaluate(0xc0002cdd08)
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/model.go:131 +0x370
github.com/woven-planet/go-zserio/internal/model.FromFiles({0xc00030ce00, 0x19, 0x8000104?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/model.go:33 +0xbf
github.com/woven-planet/go-zserio/internal/model.FromFilesystem({0xc000248310?, 0x5538ac?, 0xc00037a0a0?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/model/model.go:54 +0x56
github.com/woven-planet/go-zserio/internal/cli.glob..func1(0xe0e580?, {0xc000248310?, 0x7?, 0x7?})
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/cli/generate.go:28 +0x3c
github.com/spf13/cobra.(*Command).execute(0xe0e580, {0xc0002482a0, 0x7, 0x7})
/home/jochen/go/pkg/mod/github.com/spf13/[email protected]/command.go:856 +0x67c
github.com/spf13/cobra.(*Command).ExecuteC(0xe0e800)
/home/jochen/go/pkg/mod/github.com/spf13/[email protected]/command.go:974 +0x3bd
github.com/spf13/cobra.(*Command).Execute(...)
/home/jochen/go/pkg/mod/github.com/spf13/[email protected]/command.go:902
github.com/woven-planet/go-zserio/internal/cli.Execute()
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/internal/cli/root.go:15 +0x25
main.main()
/home/jochen/go/pkg/mod/github.com/woven-planet/[email protected]/cmd/go-zserio/main.go:8 +0x17
It would be good to have some context when an error occurs.
Thanks
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
Currently depends on bazelbuild/bazel-central-registry#1575
Hello everyone,
it is not possible to read 2d positions with negative lat/lon values. Negative values get casted into uint32.
I think that the line where this problem occurs is the following:
go-zserio/ztype/delta_context.go
Line 103 in 7664ccd
Thanks for solving.
Hi,
when looking at the generated code there is some room for improvement when it comes to performance of some functions.
For example, there are quite some duplicate or unused variables, missing slice initializations and so on. Nothing seriously wrong but noticeable when looking at pprof cpu profiles.
The places I noticed can be easily solved by adapting the code generator a little bit or the core library functions (e,g, array decode) but some things require a deeper understanding of zserio (which i don't currently have).
Would you be open to accept a PR to tweak some places in the code?
Is performance optimization something that you are interested in for your use case?
Do you maybe already have some things in mind where there are low-hanging fruit when it comes to performance / memory optimzations?
Thanks,
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
Hi,
when generating the smart
package with schema version 2023.08 (using latest go-zserio), it creates an import cycle between
smart/metadata and smart/object packages because the field
ObjectClass
of type smart_object.SmartLayerObjectClass
was added to struct SmartLayerRegistryMetadata
in the metadata package.
Any ideas how to resolve this?
Thanks!
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
Using arithmetic expressions, such as "+", "-", "*", "/" using variables of different bit length will cause the generated code to fail compiling:
for example, an expression, such as:
u16_var + u32_var
will not compile in Go, as Go does not implicitly perform byte size casts. For such scenarios, the Go code needs to generate explicit casts so that the code compiles.
This problem does not only affect integer types, but also floating point arithmetic (mixing float32
and float64
types).
The expression data type is currently stored using ExpressionTypeFloat
and ExpressionTypeInteger
. To additionally remember the bit size, the Expression
type also needs to keep track of the bit length.
When parsing zserio files, the antlr parser occasionally logs ambiguity events (reportAttemptingFullContext
, reportContextSensitivity
):
2024/04/29 11:15:01 Parsing file ndslive-display-2024.03/zs/core/geometry.zs...
line 306:2 reportAttemptingFullContext d=60 (expression), input='>longitude;/** Latitude. */int<(31-shift)+1>latitude;/** Shift longitude value back to the left. */function'
line 300:31 reportContextSensitivity d=60 (expression), input='>longitude;'
line 306:2 reportAttemptingFullContext d=60 (expression), input='>latitude;/** Shift longitude value back to the left. */function'
line 303:30 reportContextSensitivity d=60 (expression), input='>latitude;'
These notifications don't indicate syntax errors, but point to an ambiguity of the parser. It seems to happen with some comments. It may be something that can be suppressed.
I followed the CONTRIBUTING readme but vscode still shows some errors:
is something missing?
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
Generating code with the lastes version from main branch yields several compile errors in the Go code.
One of them is in the instructions package's JunctionViewImageList type.
Example line:
ImageDataArrayProperties.ArrayTraits = ztype.ObjectArrayTraits[*ztype.ExternType]{}
Compile rrror:
*ztype.ExternType does not satisfy zserio.PackableZserioType (missing method Clone)
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
Currently, several Bazel commands in this repository don't work on Windows:
buildifier
to run under Windows. It fails with:FATAL: ExecuteProgram(C:\users\...\...(...\execroot\__main__\bazel-out\x64_windows-fastbuild\bin\buildifier.bash) failed:
ERROR: src/main/native/windows/process.cc(202): CreateProcessW("C:\users\...\...(...\execroot\__main__\bazel-out\x64_windows-fastbuild\bin\buildifier.bash"): %1 is not a valid Win32 application.
root cause seems to be bazelbuild/buildtools#346 .
sh_binary
, which is not supported on Windows.Hi,
generating code based on newer schema versions (2023.6 - which apparently requires zserio 2.11.0) yields a lot of errors.
In addition to the one reported in #107 which was there in earlier versions as well the code generator stops with the message
Error: parse schema: eval structs: evaluate "0.0": unknown expression type
without giving any hint where this is (probably related to the formulas in PercentageRange & PercentagePosition).
If I remove the "+0.0" in those formulas the code generation ends with a different error:
Error: parse schema: eval structs: evaluate ".": failed to evaluate dot expression
- again without a hint where this happened.
Aside from that there are many strange outputs that were not there with schemas based on zserio 2.10.0 which leads me to believe that something is not compatible anymore with go-zserio:
2023/07/21 14:16:46 Parsing file zs/core/types.zs...
line 282:1 reportAttemptingFullContext d=59 (expression), input='>minScaleDenominator;};'
line 281:61 reportContextSensitivity d=59 (expression), input='>'
line 422:27 reportAttemptingFullContext d=59 (expression), input='>startPosition;/** End percentage position on the feature.*/bit<numBits>endPosition:'
line 419:28 reportContextSensitivity d=59 (expression), input='>startPosition;'
line 424:2 reportAttemptingFullContext d=59 (expression), input='>endPosition:endPosition>startPosition;function'
line 422:27 reportContextSensitivity d=59 (expression), input='>endPosition:'
line 424:2 reportAttemptingFullContext d=59 (expression), input='>startPosition;function'
line 422:41 reportContextSensitivity d=59 (expression), input='>'
line 444:2 reportAttemptingFullContext d=59 (expression), input='>position;function'
line 442:23 reportContextSensitivity d=59 (expression), input='>position;'
2023/07/21 14:16:46 Parsing file zs/display/types.zs...
line 3405:2 reportAttemptingFullContext d=59 (expression), input='>elevation;/** Normal vector. */NormalSphere'
line 3402:30 reportContextSensitivity d=59 (expression), input='>elevation;'
Are you planning to support the newer schema versions along with the newer zserio versions?
Thanks!
Jochen Mehlhorn [email protected], Mercedes-Benz Tech Innovation GmbH
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.