afawcett / apex-toolingapi Goto Github PK
View Code? Open in Web Editor NEWApex wrapper for the Salesforce Tooling API
License: BSD 3-Clause "New" or "Revised" License
Apex wrapper for the Salesforce Tooling API
License: BSD 3-Clause "New" or "Revised" License
Hello,
I have an issue while trying to create ApexClassMember :
System.CalloutException: Web service callout failed: WebService returned a SOAP Fault: INVALID_TYPE: Must send a concrete entity type. faultcode=sf:INVALID_TYPE faultactor=
Here is the code :
List<ToolingAPIWSDL.ApexClassMember> lACM = new List<ToolingAPIWSDL.ApexClassMember>(); for(ToolingAPI.ApexClass aAC : apexClasses){ // ApexClasses are previously fetched with a query call which is ok ToolingAPIWSDL.ApexClassMember aACM = new ToolingAPIWSDL.ApexClassMember(); aACM.Body = aAC.Body; aACM.ContentEntityId = aAC.Id; aACM.MetadataContainerId = aSR.id; // Come from lACM.add(aACM); } tooling.create(lACM); // This call generate the error
Is there anything wrong with the code ?
How should I do ?
Regards
Just a typo.
I am curious about why the project folder structure for apex-toolingapi is setup the way it is. Specifically, what was the reason to check in the parent workspace folder of the project (i.e. "/apex-toolingapi") and subsequently all other project files are one folder level lower than normal? Is there an advantage to setting up the project this way that I am not recognizing?
Thanks for the info.
Cheers!
Hi Andrew
the current version does not support ApexPageMember because of missing serialization. I think it is very easy to fix an I provided a solution which is working great for my purpose. Have a look at it here: http://salesforce.stackexchange.com/questions/42736/edit-existing-visualforce-page-apexpage-using-andrewfawcett-toolingapi-package
Just let me know if you have any questions and thanks a lot for all your effort on ToolingAPI.cls. It rocks! We use it for http://www.elastify.eu/apps/CodeFusion
Uwe
gm, I know that this repo is incredibly old and obviously not maintained, but I was wondering as I am trying to do something similar...
Did you take and break down the the Apex2WSDL into separate files so the entire thing would fit into the org?
thanks
Chris
Hi!
When I retrieve a SymbolTable of an Apex class, the field "modifiers" in tableDeclaration is always empty. When I have "public virtual class ..." or "public with sharing class ..." - no matter it's always empty. The class is valid.
All other fields like constructors, methods and properties I retrieve without any problems (with their modifiers as well).
Thank you,
Liudmila
Hello, I may be at the wrong place to ask that but I found none other!
I'm an intern working on salesforce and I'm trying to create a Documentation generator in apex, so I installed this tool, wich alllows me to get all the metadata I need through the tooling API.
BUT I'm trying to figure out how to retrieve the metadata for Validation rules (among other things) of a specific object, and I can't seem to figure out how to do that properly.
Here's how I tried to do that:
ToolingApi toolingApi = new ToolingApi();
ToolingAPIWSDL.QueryResult qr = toolingApi.query('Select Id, metadata From ValidationRule','ToolingAPIWSDL.ValidationRule');
for(ToolingAPIWSDL.ValidationRule vr : (List<ToolingAPIWSDL.ValidationRule>)qr.records){
System.debug(vr.metadata);
}
I run that in anonymous in the developper console and it gives me this error:
Line: 4627, Column: 1
System.CalloutException: Web service callout failed: Unable to parse callout response. Apex type not found for element active
I'm probably using it wrong, but I've been stuck on this for two days and this seem like the perfect solution to my needs so if you can help me out, or even just point me to the documentation or example I've been looking for I'd be the happiest salesforce developper !
Thanks in advance :)
No Reply..........!!!
Came across this, I think it might be a bug:
ToolingApi toolingApi = new ToolingApi();
ToolingAPIWSDL.QueryResult qr = toolingApi.query('Select metadata From FieldDefinition WHERE EntityDefinition.QualifiedApiName=\'Account\' ','ToolingAPIWSDL.FieldDefinition');
Throws the following exception:
System.JSONException: Duplicate field: ToolingAPIWSDLMetadata.PicklistValue.won_type_info
This is actually a bug in the Tooling API itself rather than the wrapper, but logging here to discuss. I did some research over on this StackExchange answer here.
To test this i updated the ToolingAPIDemo class and output the JSON returned, also tested (as per StackExchange answer) in Workbench, the info is just not present, yet you get the corresponding number of pick list items.... 👎
public static void updatePicklist() {
ToolingAPI toolingAPI = new ToolingAPI();
// Query CustomObject object by DeveloperName (note no __c suffix required)
List<ToolingAPI.CustomObject> customObjects = (List<ToolingAPI.CustomObject>)
toolingAPI.query('Select Id, DeveloperName, NamespacePrefix From CustomObject Where DeveloperName = \'Test\'').records;
// Query CustomField object by Name (filtered by CustomObject Id)
Id customObjectId = customObjects[0].Id;
List<ToolingAPI.CustomField> customFields = (List<ToolingAPI.CustomField>)
toolingAPI.query('Select Id, DeveloperName, NamespacePrefix, TableEnumOrId, Metadata From CustomField Where TableEnumOrId = \'' + customObjectId + '\' And DeveloperName = \'YesNo\'').records;
// Dump Picklist entries
for(ToolingAPI.PicklistEntry picklistEntry : customFields[0].metadata.picklist.pickListValues) {
System.debug('Pick list label ' + picklistEntry.label);
}
// Next step would be to update pick list values and call the update Tooling API end point
// ...
}
We need to port the old examples class to the new style SOAP edition version.
I tried to access a custom field id of Case object but it is showing compile time error that ToolingAPI.CustomObjects is an invalid type. no idea, why showing this.
If we are going to maintain two variants of this project, one for SOAP and one for REST, then I would recommend that we rename the branches to the following:
...or something equivalent. These suggestions are a tad verbose, but they leave no room for misunderstanding of purpose.
Thoughts?
Hi Andrew,
I am using your sample code for retrieving Custom fields and Custom Objects, the issue I am facing is that in our org we have around 3k custom fields,
when I try to do the same with your class ToolingApi I only get 2000 custom fields. Sample code below
ToolingAPI toolingAPI = new ToolingAPI();
List<ToolingAPI.CustomField> customFields = (List<ToolingAPI.CustomField>)
toolingAPI.query('Select Id, DeveloperName, NamespacePrefix, TableEnumOrId From CustomField ').records;
System.debug(customFields.size());
Any ideas why I am getting only 2k fields ?
Update: I figured it out , would have to retrieve records using "nextRecordsURL" .
Hi Andy,
Thanks for your hardwork with the Tooling API. I checked out your code example for custom object/fields and it works great for a sample custom object in my Org. However, I have some custom fields in the Lead standard object and from what I found from the Salesforce Tooling API doc, the API does not seem to support standard objets – which is a bummer.
The workaround is that I am using the listMetaData method from your excellent Metadata API apex wrapper, and I am able to get the Ids of custom fields in the Lead object. The only issue with this method is that it gives the Ids of all the fields in the Org, thus is probably not the most efficient way to get to find the Id of a specific custom field. Please let me know if there is a better way to find the Ids.
Thanks again for the API classes. I find them very useful.
Madhav
Apply 'extends SObject_x'
Apply implementation of ISerialise
Test
Write test methods?
Suggest to work from top (James) and bottom (Andy) of the existing Enum list
SELECT Fullname, metadata, entitydefinition FROM ValidationRule WHERE EntityDefinition.QualifiedApiName='Account'
For example gives me:
Web service callout failed: WebService returned a SOAP Fault: INVALID_FIELD: Select Fullname, metadata, EntityDefinition From ValidationRule ^ ERROR at Row:1:Column:28 No such column 'EntityDefinition' on entity 'ValidationRule'. If you are attempting to use a custom field, be sure to append the '__c' after the custom field name. Please reference your WSDL or the describe call for the appropriate names. faultcode=sf:INVALID_FIELD faultactor=
When trying to retrieve workflowrule (using toolingapi stub), getting following error:
System.JSONException: Expected ToolingAPI.WorkflowActionReference but found [line:1, column:568]
STACKTRACE: (System Code)
Class.ToolingAPI.getQueryResultRecords: line 539, column 1
Class.ToolingAPI.parseQueryResult: line 520, column 1
Class.ToolingAPI.query: line 111, column 1
Any clue what this error is about? Is JSON parser not able to parse certain part of received response containing actions? Please advise here!
Hi, Andrew! Thank you for your tool.
I want to get all references and external references of Apex Class method. My code:
`
ToolingAPIWSDL.SforceService toolingService = new ToolingAPIWSDL.SforceService();
toolingService.SessionHeader = new ToolingAPIWSDL.SessionHeader_element();
toolingService.SessionHeader.SessionId = UserInfo.getSessionId();
toolingService.endpoint_x = URL.getSalesforceBaseUrl().toExternalForm() + '/services/Soap/T/33.0';
ToolingAPIWSDL.QueryResult result = toolingService.query('select Id, Name, symbolTable from ApexClass WHERE Name Like \'MyApexClass\'');
for(ToolingAPIWSDL.sObject_x acx : result.records) {
System.debug(acx.symbolTable.methods);
}`
MyApexClass:
`public with sharing class MyApexClass {
private void testA(){}
public void testB(){
testA();
}
}`
But in all methods I get references = null (really It should not be? because I call testA() method in testB()):
18:04:16:245 USER_DEBUG [8]|DEBUG|(Method:[apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), field_order_type_info=(location, modifiers, name, references, type_x, visibility, parameters, returnType), location=Position:[apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), column=18, column_type_info=(column, urn:tooling.soap.sforce.com, null, 1, 1, false), field_order_type_info=(column, line), line=3, line_type_info=(line, urn:tooling.soap.sforce.com, null, 1, 1, false)], location_type_info=(location, urn:tooling.soap.sforce.com, Position, 1, 1, false), modifiers=(private), modifiers_type_info=(modifiers, urn:tooling.soap.sforce.com, string, 0, -1, false),**name=testA,**name_type_info=(name,** urn:tooling.soap.sforce.com, string, 1, 1, false), parameters=null, parameters_type_info=(parameters, urn:tooling.soap.sforce.com, Parameter, 0, -1, false), references=null, references_type_info=(references, urn:tooling.soap.sforce.com, Position, 0, -1, false), returnType=void, returnType_type_info=(returnType, urn:tooling.soap.sforce.com, string, 1, 1, false), type_x=null, type_x_type_info=(type, urn:tooling.soap.sforce.com, string, 1, 1, false), visibility=Private, visibility_type_info=(visibility, urn:tooling.soap.sforce.com, SymbolVisibility, 1, 1, false)], Method:[apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), field_order_type_info=(location, modifiers, name, references, type_x, visibility, parameters, returnType), location=Position:[apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), column=17, column_type_info=(column, urn:tooling.soap.sforce.com, null, 1, 1, false), field_order_type_info=(column, line), line=6, line_type_info=(line, urn:tooling.soap.sforce.com, null, 1, 1, false)], location_type_info=(location, urn:tooling.soap.sforce.com, Position, 1, 1, false), modifiers=(public), modifiers_type_info=(modifiers, urn:tooling.soap.sforce.com, string, 0, -1, false), name=testB, name_type_info=(name, urn:tooling.soap.sforce.com, string, 1, 1, false), parameters=null, parameters_type_info=(parameters, urn:tooling.soap.sforce.com, Parameter, 0, -1, false), references=null, references_type_info=(references, urn:tooling.soap.sforce.com, Position, 0, -1, false), returnType=void, returnType_type_info=(returnType, urn:tooling.soap.sforce.com, string, 1, 1, false), type_x=null, type_x_type_info=(type, urn:tooling.soap.sforce.com, string, 1, 1, false), visibility=Public, visibility_type_info=(visibility, urn:tooling.soap.sforce.com, SymbolVisibility, 1, 1, false)])
Duplicate of Issue #8
Hello, @afawcett
The current version does not support "SecurityHealthCheck" and "SecurityHealthCheck" for fetching health check scores and risk types from the org into the code. For this to be added it requires the tooling API version to be at least 37 or more than 37.
Links for the same:
SecurityHealthCheck: https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_securityhealthcheck.htm
SecurityHealthCheck: https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_securityhealthcheckrisks.htm
Thanks,
Sourabh
Comment out the update / patch functionality.
Patch / update for the Tooling API is a niche use case. For instance, you only update ApexClassMembers that are not saved to the server (they've encountered some error and need resaving, for instance). See this twitter thread for more information: https://twitter.com/dancinllama/status/450044272650117120
Hi
I'm unable to cast ApexClass list into sObject_x list while calling the create() method. The error that I'm getting when making a callout is: "System.UnexpectedException: Got an unexpected error in callout : null. Contact support with error ID: 552847890-13469 (-979352524)"
Request:
create_element:[apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), field_order_type_info=(sObjects), sObjects=(sObject_x:[ApexClass=ApexClass:[ApiVersion=33.0, ApiVersion_type_info=(ApiVersion, urn:tooling.soap.sforce.com, null, 0, 1, true), Body=@istest
private class Test_toolingSoapSforceCom {
}, BodyCrc=null, BodyCrc_type_info=(BodyCrc, urn:tooling.soap.sforce.com, null, 0, 1, true), Body_type_info=(Body, urn:tooling.soap.sforce.com, null, 0, 1, true), CreatedBy=null, CreatedById=null, CreatedById_type_info=(CreatedById, urn:tooling.soap.sforce.com, null, 0, 1, true), CreatedBy_type_info=(CreatedBy, urn:tooling.soap.sforce.com, null, 0, 1, true), CreatedDate=null, CreatedDate_type_info=(CreatedDate, urn:tooling.soap.sforce.com, null, 0, 1, true), FullName=Test_toolingSoapSforceCom, FullName_type_info=(FullName, urn:tooling.soap.sforce.com, null, 0, 1, true), Id=null, Id_type_info=(Id, urn:tooling.soap.sforce.com, null, 1, 1, true), IsValid=true, IsValid_type_info=(IsValid, urn:tooling.soap.sforce.com, null, 0, 1, true), LastModifiedBy=null, LastModifiedById=null, LastModifiedById_type_info=(LastModifiedById, urn:tooling.soap.sforce.com, null, 0, 1, true), LastModifiedBy_type_info=(LastModifiedBy, urn:tooling.soap.sforce.com, null, 0, 1, true), LastModifiedDate=null, LastModifiedDate_type_info=(LastModifiedDate, urn:tooling.soap.sforce.com, null, 0, 1, true), LengthWithoutComments=null, LengthWithoutComments_type_info=(LengthWithoutComments, urn:tooling.soap.sforce.com, null, 0, 1, true), Metadata=null, Metadata_type_info=(Metadata, urn:tooling.soap.sforce.com, null, 0, 1, true), Name=Test_toolingSoapSforceCom, Name_type_info=(Name, urn:tooling.soap.sforce.com, null, 0, 1, true), NamespacePrefix=null, NamespacePrefix_type_info=(NamespacePrefix, urn:tooling.soap.sforce.com, null, 0, 1, true), Status=Active, Status_type_info=(Status, urn:tooling.soap.sforce.com, null, 0, 1, true), SymbolTable=null, SymbolTable_type_info=(SymbolTable, urn:tooling.soap.sforce.com, null, 0, 1, true), SystemModstamp=null, SystemModstamp_type_info=(SystemModstamp, urn:tooling.soap.sforce.com, null, 0, 1, true), apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), field_order_type_info=(fieldsToNull, Id, ApiVersion, Body, BodyCrc, CreatedBy, CreatedById, CreatedDate, FullName, IsValid, ...), fieldsToNull=null, fieldsToNull_type_info=(fieldsToNull, urn:tooling.soap.sforce.com, null, 0, -1, true), sObject_x.ApexClass=null, sObject_x.ApexClass_type_info=(ApexClass, urn:tooling.soap.sforce.com, null, 0, 1, true), sObject_x.Id=null, sObject_x.apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), sObject_x.fieldsToNull=null], ApexClass_type_info=(ApexClass, urn:tooling.soap.sforce.com, null, 0, 1, true), Id=null, apex_schema_type_info=(urn:tooling.soap.sforce.com, true, false), fieldsToNull=null]), sObjects_type_info=(sObjects, urn:tooling.soap.sforce.com, null, 0, -1, false)]
Please could you help.
Thanks
Pratyush
A problem probably connected to a recent system change (Winter '18 release?) makes the upload of packages fail that contain the MetadataService fail with
MetadataServiceTest.coverGeneratedCodeFileBasedOperations1 | System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out | Class.NS.MetadataService.MetadataPort.retrieve: line 11450, column 1 Class.NS.MetadataServiceTest.coverGeneratedCodeFileBasedOperations1: line 97, column 1
MetadataServiceTest.coverGeneratedCodeFileBasedOperations2 | System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out | Class.NS.MetadataService.MetadataPort.deleteMetadata: line 11320, column 1 Class.NS.MetadataServiceTest.coverGeneratedCodeFileBasedOperations2: line 117, column 1
The same problem occurs in the ToolingApi Wrapper by Andy Fawcett.
I also posted this on StackExchange https://salesforce.stackexchange.com/questions/196996
I tried to convert this sample to using the WSDL:
http://andyinthecloud.com/2014/01/05/querying-custom-object-and-field-ids-via-tooling-api/
String objectName = 'Job_Activity';
String fieldName = 'Order_Line';
ToolingAPI toolingAPI = new ToolingAPI();
List<ToolingAPIWSDL.CustomObject> customObjects = (List<ToolingAPIWSDL.CustomObject>)
toolingAPI.query('Select Id, DeveloperName, NamespacePrefix From CustomObject Where DeveloperName = \''+objectName+'\'').records;
ToolingAPIWSDL.CustomObject customObject = customObjects[0];
Id customObjectId = customObject.Id;
List<ToolingAPIWSDL.CustomField> customFields = (List<ToolingAPIWSDL.CustomField>)
toolingAPI.query('Select Id, DeveloperName, NamespacePrefix, TableEnumOrId From CustomField Where DeveloperName = \''+fieldName+'\' and TableEnumOrId = \'' + customObjectId + '\'').records;
Upon trying to run this, I get:
Invalid conversion from runtime type List<ToolingAPIWSDL.sObject_x> to List<ToolingAPIWSDL.CustomObject>
Am I missing something obvious?
I have a managed (in my ISV package) class that creates an unmanaged class (outside of the package) based on database data.
When I do:
toolingAPI.createSObject(newClass);
it fails with the error:
INVALID_FIELD_FOR_INSERT_UPDATE : No access to entity 'up2go_2f__deliveryschedule__c'
Error is in expression '{!proceedAction}' in component <apex:commandButton> in component up2go_2f:confirm
Error is in expression '{!doGenerateAndLinkClass}' in component <apex:commandButton> in page up2go_2f:generatehighperformanceclass
The entity it does not seem to have access to is an SObject of a packaged type, so not a class. So I see no reason why someone outside should not be able to use and compile a reference to such a record.
Hi Andy
I can see that the Parameter class has only two variable defined i.e. name and type. This works fine for any primitive data types but doesn't work well for any collection parameters as there isn't any reference for the type of collection parameter.
For e.g. if a method is defined as:
public void exampleMethod(List(String) paramStr, List(sObject) sObjects) {
// Sorry, wasn't able to specify it as List<>
}
When I'm trying to retrieve the parameters for the method using SymbolTable, I'm able to get Parameter as:
(Parameter:[name=paramStr, type=LIST],
Parameter:[name=sObjects, type=LIST])
Is there any way I can get the type of Lists (i.e. List(String) or List(sObject)) in this example? It would be really helpful if you could let me know any other property that I'm missing over here.
Thanks in advance.
How can I fetch active validation rules and workflow rules using tooling API for specific objects?
The types exist to describe a HeapDump but need their inheritance wiring up (need to figure out how to support the XXXValue types via polymorphic deserialize).
Hey,
when retrieving ApeClasses with their Symbol Tables via
ToolingAPI.QueryResult qr = toolingApi.query('Select id,name, SymbolTable from ApexClass limit 1');
and looping through results, to retrieve properties and variables, I always get Type = null
Is that a known limitation of the REST version?
These days I'm continuously getting GACK error when I try to make a TOOLING API QUERY call.This used to work earlier.
/services/data/v33.0/tooling/query/?q=Select+Id%2C+FullName+FROM+ValidationRule+limit+100
gives error: An unexpected error occurred. Please include this ErrorId if you contact support: 1269173235-153226 (-6049864)
Am I missing something? or it's really a GACK ie salesforce issue around tooling api for ValidationRule?
I've been trying the API out. I would like to use it to get the Id of a Workflow rule. How would I accomplish that?
When a non-admin (it works for admins) calls those methods in a "with sharing" controller extension:
public String getRelatedListId() {
String result = null;
String soql = 'SELECT Id FROM CustomField WHERE DeveloperName = \'mdr_Travel\' AND TableEnumOrId = \'' + getExpenseObjectId() + '\'';
List<ToolingAPI.CustomField> customFields = (List<ToolingAPI.CustomField>) toolingAPI.query(soql).records;
if(customFields.size() == 1) {
result = customFields.get(0).Id;
result = result.Substring(0,15);
}
return result;
}
private Id getExpenseObjectId() {
Id result = null;
String soql = 'SELECT Id FROM CustomObject WHERE DeveloperName = \'Expense\'';
List<ToolingAPI.CustomObject> customObjects = (List<ToolingAPI.CustomObject>) toolingAPI.query(soql).records;
if(customObjects.size() == 1) {
result = customObjects.get(0).Id;
}
return result;
}
he receives a
UP2GO_ITE.ToolingAPI.ToolingAPIException: INVALID_TYPE : sObject type ‘CustomEntityDefinition’ is not supported.
Class.UP2GO_ITE.ToolingAPI.submitRestCall: line 1841, column 1
Class.UP2GO_ITE.ToolingAPI.submitRestCall: line 1782, column 1
Class.UP2GO_ITE.ToolingAPI.submitRestCall: line 1774, column 1
Class.UP2GO_ITE.ToolingAPI.query: line 105, column 1
Class.UP2GO_ITE.TravelCtrlExt.getExpenseObjectId: line 125, column 1
Class.UP2GO_ITE.TravelCtrlExt.getRelatedListId: line 109, column 1
Apologies in advance if this is something obvious that I've missed.
I copied ToolingAPI.cls into my developer org, added the remote site for my org and ran the following snippet in the developer console (per http://andyinthecloud.com/2014/01/05/querying-custom-object-and-field-ids-via-tooling-api/):
ToolingAPI toolingAPI = new ToolingAPI();
List<ToolingAPI.CustomObject> customObjects = (List<ToolingAPI.CustomObject>)
toolingAPI.query('Select Id, DeveloperName, NamespacePrefix From CustomObject Where DeveloperName = \'DateTest\'').records;
I'm greeted with the following error:
01:12:55.116 (116031036)|CALLOUT_REQUEST|[1820]|System.HttpRequest[Endpoint=https://na10.salesforce.com/services/data/v30.0/tooling/query/?q=Select+Id%2C+DeveloperName%2C+NamespacePrefix+From+CustomObject+Where+DeveloperName+%3D+%27DateTest%27, Method=GET]
...
01:12:55.213 (213558224)|CALLOUT_RESPONSE|[1820]|System.HttpResponse[Status=Unauthorized, StatusCode=401]
...
01:12:55.220 (220007989)|EXCEPTION_THROWN|[1841]|ToolingAPI.ToolingAPIException: INVALID_SESSION_ID : Session expired or invalid
Specific ask here to support AuraDefinitionBundle.
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.