Comments (37)
@happierall I added a bugfix into c-for-go
, please update. The missing functions like UA_Client_readValueAttribute
would appear in the result.
Also I suggest you to avoid lower
in camel-case libraries like this one, try generating with my version of manifest, the results will be much more readable:
TRANSLATOR:
ConstRules:
defines: expand
enum: expand
PtrTips:
function:
- {target: ^UA_, tips: [ref,ref,ref]}
Rules:
global:
- {action: accept, from: "^UA_"}
- {action: replace, from: "(i?)^UA_", to: _}
- {transform: export}
function:
- {action: ignore, from: "EndpointUrl_split"}
const:
- {action: ignore, from: "INT64_MIN"}
- {action: ignore, from: "INT64_MAX"}
- {action: ignore, from: "UINT64_MIN"}
- {action: ignore, from: "UINT64_MAX"}
- {action: ignore, from: "LOGLEVEL"}
type:
- {action: replace, from: "_t$"}
private:
- {transform: unexport}
post-global:
- {action: doc, from: "^UA_u?int[0-9]+_t"} # types like ogg_uint32_t
- {action: replace, from: _$}
- {load: snakecase}
from c-for-go.
The error means that stdbool.h
was not found in any of the include directories specified in the yaml configuration file. You have to find where your system has that include file and use that path in the list of include paths. Or maybe try using the host configuration using -ccdefs
from c-for-go.
Solved by add:
typedef int bool;
#define true 1
#define false 0
from c-for-go.
But I have new errors:
open62541.h:1654:5: undefined: __builtin_object_size
open62541.h:1654:5: undefined: __builtin___memset_chk
open62541.h:1654:5: called object is not a function or function pointer (have '')
open62541.h:1654:5: called object is not a function or function pointer (have '')
open62541.h:5162:5: undefined: __builtin_object_size
open62541.h:5162:5: undefined: __builtin___memset_chk
open62541.h:5162:5: called object is not a function or function pointer (have '')
open62541.h:5162:5: called object is not a function or function pointer (have '')
open62541.h:5187:5: undefined: __builtin_object_size
open62541.h:5187:5: undefined: __builtin___memset_chk
too many errors
from c-for-go.
@happierall seems that the code relies on built-in functions we don't have. You can override or disable any macro or built-in reference (this is documented briefly). For this particular case use the following:
PARSER:
Defines:
__builtin___memset_chk: {}
__builtin_object_size: {}
After that the errors went away. Also, I've fixed an unrelated bug in c-for-go, please update. In your manifest try using expand
rather than eval for defines / enums. This will improve the readability of results!
TRANSLATOR:
ConstRules:
defines: expand
enum: expand
Final note. The only problem I got is that the header defines an UInt value using Int64 type, the Go side reports a const overflow. You'd better ignore that single const (use YAML/ RE rules):
// Uint64Max as defined in ua/open62541.h:664
Uint64Max = (Int64)(18446744073709551615)
Happy hacking!
from c-for-go.
Thank you. It's work. But now out lib haven't functions like UA_Client_readValueAttribute
:(
ua.yml
---
GENERATOR:
PackageName: ua
PackageDescription: "Package ua provides Go bindings for open62541"
PackageLicense: "THE AUTOGENERATED LICENSE. ALL THE RIGHTS ARE RESERVED BY ROBOTS."
Includes: ["open62541.h"]
PARSER:
IncludePaths: ["/usr/local/include", "/usr/include"]
SourcesPaths: ["open62541.h"]
Defines:
__builtin___memset_chk: {}
__builtin_object_size: {}
TRANSLATOR:
ConstRules:
defines: expand
enum: expand
PtrTips:
function:
- {target: ^Ua_, tips: [ref,ref,ref]}
Rules:
global:
- {transform: lower}
- {action: accept, from: "^UA_"}
- {action: replace, from: "^Ua_", to: _}
- {transform: export}
function:
- {action: accept, from: "^UA"}
- {action: replace, from: "^Ua"}
- {action: ignore, from: "UA_EndpointUrl_split"}
const:
- {action: accept, from: "^UA_"}
- {action: replace, from: "^Ua"}
- {action: ignore, from: "UA_INT64_MIN"}
- {action: ignore, from: "UA_INT64_MAX"}
- {action: ignore, from: "UA_UINT64_MIN"}
- {action: ignore, from: "UA_UINT64_MAX"}
- {action: ignore, from: "UA_LOGLEVEL"}
type:
- {action: replace, from: "_t$"}
- {action: replace, from: "^Ua"}
private:
- {transform: unexport}
post-global:
- {action: doc, from: "^Ua_u?int[0-9]+_t"} # types like ogg_uint32_t
- {action: replace, from: _$}
- {load: snakecase}
from c-for-go.
I'm trying write simple code by tutorial
from c-for-go.
@happierall you're doing everything right there.
-
I know the root of issue with functions like
UA_Client_readValueAttribute
and will fix them tomorrow (no time today).
Can you help with generating bindings for Golang? #967
Ha ha they won't be able to help.
from c-for-go.
With your config some errors:
-
StatusCodeDescription redeclared
-
Unresolved type 'Size'
-
In function 'ByteCopy', unpackPByteString(src): Cannot use src (type *Byte) as type string
-
In function 'SByteCopy', unpackPSByteString(src): Cannot use src (type *Byte) as type string
-
In function 'ClientWriteAccessLevelAttribute', unpackPByteString(newAccessLevel): Cannot use newAccessLevel (type *Byte) as type string
-
In function 'ClientWriteUserAccessLevelAttribute', unpackPByteString(newUserAccessLevel): Cannot use newUserAccessLevel (type *Byte) as type string
-
In function 'ClientWriteEventNotifierAttribute', unpackPByteString(newEventNotifier): Cannot use newEventNotifier (type *Byte) as type string
-
"ua.go:7766:2: unexpected type: ..." Function 'LogStdout', C.UA_Log_Stdout(clevel, ccategory, cmsg)
-
Undefined symbols for architecture x86_64:
"_UA_Server_addExternalNamespace", referenced from: __cgo_05833af092eb_Cfunc_UA_Server_addExternalNamespace in ua.cgo2.o (maybe you meant: __cgo_05833af092eb_Cfunc_UA_Server_addExternalNamespace) "_UA_Server_call", referenced from: __cgo_05833af092eb_Cfunc_UA_Server_call in ua.cgo2.o (maybe you meant: __cgo_05833af092eb_Cfunc_UA_Server_call) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
from c-for-go.
@happierall
Just ignore stuff that doesn't work, especially variadic methods that aren't supported by CGO. Yout can return later and play with tips to make them work.
Undefined symbols for architecture x86_64:
Your header is newer / older than your installed library. Either use appropriate header or ingnore these functions, most users are probably on the older versions anyways.
from c-for-go.
How about this?
/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1117[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1281]: ref7a29fd4.builtin undefined (type *_Ctype_struct_UA_DataType has no field or method builtin)
/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1121[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1287]: ref7a29fd4.fixedSize undefined (type *_Ctype_struct_UA_DataType has no field or method fixedSize)
/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1125[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1293]: ref7a29fd4.overlayable undefined (type *_Ctype_struct_UA_DataType has no field or method overlayable)
/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1162[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1339]: x.ref7a29fd4.builtin undefined (type *_Ctype_struct_UA_DataType has no field or method builtin)
from c-for-go.
@happierall you're using some outdated sources, I managed to eliminate almost all issues from your previous message by getting the latest sources and putting them together
https://github.com/open62541/open62541/releases/download/0.2-rc2/open62541.c
https://github.com/open62541/open62541/releases/download/0.2-rc2/open62541.h
Also, the header has many structs with bitfields and function pointers, so for this library I'd avoid exploring the inner state too much, simply alias types with raw
mem tip, and bind only those that are really in use, see example:
MemTips:
- {target: "UA_EndpointDescription", self: bind}
- {target: "UA_Variant", self: bind}
- {target: "UA_", self: raw}
Also I created this because UA_NumericRangeDimension
struct is embedded:
package ua
/*
#include "open62541.h"
typedef struct {
UA_UInt32 min;
UA_UInt32 max;
} UA_NumericRangeDimension;
*/
import "C"
type Size C.size_t
type NumericRangeDimension C.UA_NumericRangeDimension
With all that, it compiles fine, having like ~100% functions API coverage.
from c-for-go.
Try compile this:
package main
import (
"fmt"
"ua"
)
func main() {
client := ua.ClientNew(ua.ClientConfigStandard)
retval := ua.ClientConnect(client, "opc.tcp://localhost:4840")
if retval != ua.STATUSCODEGOOD {
ua.ClientDelete(client)
fmt.Printf("Can't connect. Statuc code: %d", retval)
}
var value ua.Variant
nodeID := ua.NODEIDNUMERIC(0, ua.NS0IDSERVERSERVERSTATUSCURRENTTIME)
retval = ua.ClientReadValueAttribute(client, nodeID, &value)
if retval == ua.STATUSCODEGOOD && ua.VariantHasScalarType(&value, &ua.TYPES[ua.TYPESDATETIME]) == ua.Boolean(1) {
var rawDate ua.DateTime = (ua.DateTime)(value.Data)
stringDate := ua.DateTimeToString(rawDate)
fmt.Println(string(stringDate.Data))
ua.StringDeleteMembers(&stringDate)
}
ua.VariantDeleteMembers(&value)
ua.ClientDelete(client)
}
from c-for-go.
- To get around
*Byte
problems you have to tip it as plain type, also don't forget about PtrTips of function values that are references, not arrays (and vice versa).
PtrTips:
function:
- {target: ^UA_, tips: [ref,ref,ref,ref,ref]}
TypeTips:
type:
- {target: "UA_Byte", self: plain}
- {target: "UA_SByte", self: plain}
-
Secondly, in your example
UA_Variant_hasScalarType
is used, but it isn't present in the current API header, find a replacement -
You need to write a simple getter to fetch data from
stringDate
, the field is not exported from C
stringDate := ua.DateTimeToString(rawDate)
fmt.Println(string(stringDate.Data))
ua.ClientConnect(client, "opc.tcp://localhost:4840")
- you must terminate strings with\x00
otherwise you're passing non-NULL terminated strings into C, that's extremely bad.
With all above fixed, the example works OK, as far as I could check.
from c-for-go.
Are you use Mac OS?
May be you upload your full config, libraries, helpers?
What version compiler do you use?
from c-for-go.
from c-for-go.
It can't connect to server :(
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x0]
runtime stack:
runtime.throw(0x41669ff, 0x2a)
/usr/local/go/src/runtime/panic.go:596 +0x95
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:274 +0x2db
goroutine 1 [syscall, locked to thread]:
runtime.cgocall(0x410d120, 0xc42004de40, 0xc42004dea0)
/usr/local/go/src/runtime/cgocall.go:131 +0xe2 fp=0xc42004de10 sp=0xc42004ddd0
ua._Cfunc_UA_Client_connect(0x4700000, 0x4163b6b, 0x0)
/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb887722252/ua/_cgo/_cgo_gotypes.go:6721 +0x4d fp=0xc42004de40 sp=0xc42004de10
ua.ClientConnect.func1(0x4700000, 0x4163b6b, 0x0)
/Users/ruslan/Work/playgroundGo/src/ua/ua.go:6514 +0x6a fp=0xc42004de78 sp=0xc42004de40
ua.ClientConnect(0x4700000, 0x4163b6b, 0x19, 0x0)
/Users/ruslan/Work/playgroundGo/src/ua/ua.go:6514 +0x49 fp=0xc42004deb0 sp=0xc42004de78
main.main()
/Users/ruslan/Work/playgroundGo/src/client/main.go:12 +0x79 fp=0xc42004df88 sp=0xc42004deb0
runtime.main()
/usr/local/go/src/runtime/proc.go:185 +0x20a fp=0xc42004dfe0 sp=0xc42004df88
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc42004dfe8 sp=0xc42004dfe0
goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2197 +0x1
from c-for-go.
Show the code please
from c-for-go.
package main
import (
"fmt"
"github.com/happierall/l"
"ua"
)
func main() {
client := ua.ClientNew(ua.ClientConfigStandard)
retval := ua.ClientConnect(client, "opc.tcp://localhost:4840\x00")
if retval != ua.STATUSCODEGOOD {
ua.ClientDelete(client)
fmt.Printf("Can't connect. Statuc code: %d", retval)
}
var value ua.Variant
nodeID := ua.NODEIDNUMERIC(0, ua.NS0IDSERVERSERVERSTATUSCURRENTTIME)
retval = ua.ClientReadValueAttribute(client, nodeID, &value)
//if retval == ua.STATUSCODEGOOD && ua.VariantHasScalarType(&value, &ua.TYPES[ua.TYPESDATETIME]) == ua.Boolean(1) {
l.Log(value.Data)
//stringDate := ua.DateTimeToString(rawDate)
//fmt.Println(string(stringDate.Data))
//ua.StringDeleteMembers(&stringDate)
//}
ua.VariantDeleteMembers(&value)
ua.ClientDelete(client)
}
from c-for-go.
server.c
#include <signal.h>
#include "lib/open62541.h"
UA_Boolean running = true;
static void stopHandler(int sig) {
running = false;
}
int main(void) {
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);
UA_ServerConfig config = UA_ServerConfig_standard;
UA_ServerNetworkLayer nl;
nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 4840);
config.networkLayers = &nl;
config.networkLayersSize = 1;
UA_Server *server = UA_Server_new(config);
UA_Server_run(server, &running);
UA_Server_delete(server);
nl.deleteMembers(&nl);
return 0;
}
from c-for-go.
@happierall
Your code uses wrong config, instead of using empty ua.ClientConfigStandard
you should add this into etc.go
:
func GetClientConfigStandard() ClientConfig {
return (ClientConfig)(C.UA_ClientConfig_standard)
}
which will return a handle to static extern variable set to some initialised config. After that your code works, I was able to connect to the server.
P.S. must exit after if retval != ua.STATUSCODEGOOD
from c-for-go.
Also use value.Deref()
after getting any struct value from C, this will map fields.
value.Deref()
str := ua.DateTimeToString(*(*ua.DateTime)(value.Data))
l.Log(str)
->
2017-02-21 08:05:10 example/main.go:33 -> str=ua.String{
length: 0x1f,
data: &ua._Ctype_UA_Byte(0x30),
}
And final string helper:
func (s String) String() string {
return string((*[1 << 20]byte)(unsafe.Pointer(s.data))[:s.length])
}
->
2017-02-21 08:07:16 example/main.go:33 -> str.String()=02/21/2017 08:07:16.388.867.000
from c-for-go.
I can't connect)
Can't connect. Statuc code: 2147614720
func main() {
config := ua.GetClientConfigStandard()
client := ua.ClientNew(config)
retval := ua.ClientConnect(client, "opc.tcp://localhost:4840\x00")
if retval != ua.STATUSCODEGOOD {
ua.ClientDelete(client)
l.Logf("Can't connect. Statuc code: %d", retval)
return
}
}
from c-for-go.
@happierall please see my code again
ua_new.zip
from c-for-go.
Huh it's work. Thank you!
from c-for-go.
ua.NODEIDSTRING
must accept []byte
, not *byte
Code
var val ua.Variant
ua.VariantInit(&val)
val.Deref()
nodeID := ua.NODEIDSTRING(0, &([]byte("MyVariable")))
retval = ua.ClientReadValueAttribute(client, nodeID, &val)
UPDATE.
May be string
, not []byte
from c-for-go.
Full Code
client.go:
package main
import (
"fmt"
"runtime"
"github.com/happierall/l"
"ua"
)
func main() {
l.Default.Production = true
runtime.LockOSThread()
defer runtime.UnlockOSThread()
client := ua.ClientNew(ua.GetClientConfigStandard())
retval := ua.ClientConnect(client, "opc.tcp://0.0.0.0:4840\x00")
//retval := ua.ClientConnect(client, "opc.tcp://opcuaserver.com:4841/freeopcua/server\x00")
if retval != ua.STATUSCODEGOOD {
ua.ClientDelete(client)
fmt.Printf("Can't connect. Statuc code: %d", retval)
return
}
var value ua.Variant
ua.VariantInit(&value)
value.Deref()
nodeID := ua.NODEIDNUMERIC(0, ua.NS0IDSERVERSERVERSTATUSCURRENTTIME)
retval = ua.ClientReadValueAttribute(client, nodeID, &value)
value.Deref()
//if retval == ua.STATUSCODEGOOD && ua.VariantHasScalarType(&value, &ua.TYPES[ua.TYPESDATETIME]) == ua.Boolean(1) {
str := ua.DateTimeToString(*(*ua.DateTime)(value.Data))
l.Log(str.String())
ua.StringDeleteMembers(&str)
//}
var val ua.Variant
ua.VariantInit(&val)
val.Deref()
nodeID2 := ua.NODEIDSTRING(1, "the.answer\x00")
retval = ua.ClientReadValueAttribute(client, nodeID2, &val)
val.Deref()
if retval == ua.STATUSCODEGOOD {
l.Log("success", retval)
resultInt32 := *(*ua.Int32)(value.Data)
l.Log(int(resultInt32))
} else {
l.Log("error", retval)
}
ua.VariantDeleteMembers(&value)
ua.ClientDelete(client)
}
server.c
#include <signal.h>
#include "open62541.h"
UA_Boolean running = true;
static void stopHandler(int sig) {
running = false;
}
int main(void) {
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);
UA_ServerConfig config = UA_ServerConfig_standard;
UA_ServerNetworkLayer nl;
nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 4840);
config.networkLayers = &nl;
config.networkLayersSize = 1;
UA_Server *server = UA_Server_new(config);
/* add a static variable node to the server */
UA_VariableAttributes myVar;
UA_VariableAttributes_init(&myVar);
myVar.description = UA_LOCALIZEDTEXT("en_US", "the answer");
myVar.displayName = UA_LOCALIZEDTEXT("en_US", "the answer");
myVar.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
UA_Int32 myInteger = 42;
UA_Variant_setScalarCopy(&myVar.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId,
myIntegerName, UA_NODEID_NULL, myVar, NULL, NULL);
UA_Variant_deleteMembers(&myVar.value);
UA_Server_run(server, &running);
UA_Server_delete(server);
nl.deleteMembers(&nl);
return 0;
}
from c-for-go.
If change by hand to string, then request is work.
But
resultInt32 := *(*ua.Int32)(value.Data)
l.Log(int(resultInt32))
give not 42
from c-for-go.
@happierall nice progress!
-
Do not edit generated code by hand, check out the docs on PtrTips https://github.com/xlab/c-for-go/wiki/Translator-config-section and use
arr
instead ofref
tip.
resultInt32 := *(*ua.Int32)(value.Data)
l.Log(int(resultInt32))
looks like a typo, shouldn't be val.Data
? Anyway, organize your code, it's hard to understand when and what you're Deref'ing.
from c-for-go.
It's work. I understand about Ptr, thank you.
You are great man.
from c-for-go.
I'm trying make subscription, but all functions doesn't exists.
- UA_Client_Subscriptions_new (function)
- UA_SubscriptionSettings_standard (const or struct)
- UA_Client_Subscriptions_addMonitoredItem (function)
- UA_Client_Subscriptions_manuallySendPublishRequest (function)
from c-for-go.
@happierall always check the the source. In header file you have
#ifdef UA_ENABLE_SUBSCRIPTIONS
which should be enabled in generator yaml manifest, also in your CFLAGS when compiling (use #cgo
directives, example)
from c-for-go.
Added FlagGroups, but functions still doesn't exists
GENERATOR:
PackageName: ua
PackageDescription: "Package ua provides Go bindings for open62541"
PackageLicense: "THE AUTOGENERATED LICENSE. ALL THE RIGHTS ARE RESERVED BY ROBOTS."
Includes: ["open62541.h"]
FlagGroups:
- {name: "CFLAGS", flags: [
"-UA_ENABLE_SUBSCRIPTIONS",
]}
from c-for-go.
Ah, I'm understand. Added to Parser.Defines too
from c-for-go.
Hm, but can't build...
could not determine kind of name for C.UA_MonitoredItemHandlingFunction
could not determine kind of name for C.UA_SubscriptionSettings
from c-for-go.
- {name: "CFLAGS", flags: [
"-DUA_ENABLE_SUBSCRIPTIONS",
]}
from c-for-go.
Magic, thanks :)
from c-for-go.
Related Issues (20)
- type C.struct_ in strut and func HOT 1
- How to handle a function returning a struct as value
- Type translation does not respect systems data model HOT 1
- Verbose argument to print more logs
- Avoid lock / unlock for some function call
- Wiki need to be updated
- panic: unknown type _Float128 HOT 2
- Non int return function pointer not recognized
- Generator uses underlying type of typedef when used as a parameter
- Website down HOT 3
- It would be nice to at least have an example of the YML required in the readme since the website does not work HOT 1
- build HOT 5
- [OS X / Ubuntu ARM64] include file not found: <string> HOT 3
- Extracting SAL annotations from declarations HOT 2
- Example where C const get translated into Go typed const
- Callback generation HOT 2
- THIS IS NOT AN ISSUE!!!
- Avoid symbol lookup error
- Passing in an array to a C function and reading the data - incorrect autogenerated Go code
- Write rules against the location of the type/define rather than the name
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 c-for-go.