myparcelnl / sdk Goto Github PK
View Code? Open in Web Editor NEWPHP SDK to easily integrate with MyParcel NL, MyParcel BE and Flespakket
Home Page: https://developer.myparcel.nl/documentation/50.php-sdk.html
License: Other
PHP SDK to easily integrate with MyParcel NL, MyParcel BE and Flespakket
Home Page: https://developer.myparcel.nl/documentation/50.php-sdk.html
License: Other
Address
Professor Pieter Willemsstraat 23 B 03
The address above should be split like:
Street: Professor Pieter Willemsstraat
House number: 23
Suffix: B 03
Currently, it is only possible to create a related return based on a pre-existing consignment. When you look in the API Reference you find that unrelated returns are also easily possible. As said by the docs, this is useful for for example repair services.
It would be nice if the unrelated returns API was built into the sdk so that these things can also be done.
It should be possible to use the ConsignmentFactory to create a return shipment.
No response
No response
Given a clean Laravel 7.x project, adding the myparcel SDK will result in the errors below.
Cause of the problem: Laravel 7.x is using the Illuminate/support 7.x branch, whilst MyParcel is using a version of branch 5.6
>> composer require myparcelnl/sdk
- Installing myparcelnl/sdk (v3.1.7): Loading from cache
Package anahkiasen/underscore-php is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
PHP Warning: Uncaught ErrorException: Declaration of MyParcelNL\Sdk\src\Support\Collection::push($value) should be compatible with Illuminate\Support\Collection::push(...$values) in Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php:38
Stack trace:
#0 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php(38): Composer\Util\ErrorHandler::handle(2, 'Declaration of ...', 'Z:\\Mega\\Webserv...', 38, Array)
#1 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\AutoLoader.php(4): require_once('Z:\\Mega\\Webserv...')
#2 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\composer\autoload_real.php(66): require('Z:\\Mega\\Webserv...')
#3 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\composer\autoload_real.php(56): composerRequire34f4fcc12f3a0b623a324cdd55cde51f('3480d8f702c8d1d...', 'Z:\\Mega\\Webserv...')
#4 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\autoload.php(7): ComposerAutoloaderInit34f4fcc12f3a0b623a324cdd55cde51f::getLoader()
#5 Z:\Me in Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php on line 38
Warning: Uncaught ErrorException: Declaration of MyParcelNL\Sdk\src\Support\Collection::push($value) should be compatible with Illuminate\Support\Collection::push(...$values) in Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php:38
Stack trace:
#0 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php(38): Composer\Util\ErrorHandler::handle(2, 'Declaration of ...', 'Z:\\Mega\\Webserv...', 38, Array)
#1 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\AutoLoader.php(4): require_once('Z:\\Mega\\Webserv...')
#2 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\composer\autoload_real.php(66): require('Z:\\Mega\\Webserv...')
#3 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\composer\autoload_real.php(56): composerRequire34f4fcc12f3a0b623a324cdd55cde51f('3480d8f702c8d1d...', 'Z:\\Mega\\Webserv...')
#4 Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\autoload.php(7): ComposerAutoloaderInit34f4fcc12f3a0b623a324cdd55cde51f::getLoader()
#5 Z:\Me in Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php on line 38
PHP Fatal error: Declaration of MyParcelNL\Sdk\src\Support\Collection::sort(?callable $callback = NULL) must be compatible with Illuminate\Support\Collection::sort($callback = NULL) in Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php on line 38
Fatal error: Declaration of MyParcelNL\Sdk\src\Support\Collection::sort(?callable $callback = NULL) must be compatible with Illuminate\Support\Collection::sort($callback = NULL) in Z:\Mega\Webserver\www\Laravel\DiagnOSAS\vendor\myparcelnl\sdk\src\Support\Collection.php on line 38
Quick and dirty solution:
https://github.com/myparcelnl/sdk/blob/master/src/Support/Collection.php#L1238
public function push( ...$values )
{
foreach( $values AS $value ) {
$this->items[] = $value;
}
return $this;
}
https://github.com/myparcelnl/sdk/blob/master/src/Support/Collection.php#L1445
public function sort( $callback = NULL )
For me, this solves the problem and the SDK is still working... Better would be to implement the new Collection.php
The readme indicates:
->setItemValue(["amount" => 200, "currency" => "EUR"]) // Must be array with amount and currency like in the example
However, in the class MyParcelCustomsItem, the $item_value parameter is cast to an integer:
public function setItemValue($item_value)
{
$this->item_value = (int) $item_value;
return $this;
}
And the function encodeCdCountryItem which calls getItemValue also expects the returned value to always be an amount and not an array.
So there is some discrepency here. The way it is currently coded in the SDK, it also makes it impossible to provide item value in another currency than EUR.
Ik ben nieuw met MyParcel. Sinds kort heb ik de code uitgeprobeerd die hier te vinden is. Ik heb een zending kunnen aanmaken en vond het interessant dat het goed uitgelegd is. Ik kwam alleen tot een klein probleempje. Hoe maak ik een concept zending inplaats van een echte zending?
Code wat ik nu heb.
`<?php
require_once DIR . "/myParcel/src/AutoLoader.php";
use MyParcelNL\Sdk\src\Factory\ConsignmentFactory;
use MyParcelNL\Sdk\src\Helper\MyParcelCollection;
use MyParcelNL\Sdk\src\Model\Consignment\PostNLConsignment;
$consignment = (ConsignmentFactory::createByCarrierId(PostNLConsignment::CARRIER_ID))
->setApiKey('mijn-api-key')
->setReferenceId('Order 146')
->setCountry('NL')
->setPerson('Piet Hier')
->setFullStreet('Plein 1945 55b')
->setPostalCode('2231JE')
->setCity('Amsterdam')
->setEmail('[email protected]');
$myParcelCollection = (new MyParcelCollection())
->addConsignment($consignment)
->setPdfOfLabels();
$consignmentId = $myParcelCollection->first()->getConsignmentId();
$myParcelCollection->downloadPdfOfLabels();
?>`
Ik waardeer jullie help enorm!
In the PostNL API, you can set the "Remark" field under Address type. PostNL API
Remark | O(ptional) | String [0-35] | Remark of the shipment | Fragile
The SDK ReadMe refers to setDeliveryRemark()
(Line 294), however the source does not contain this method...
If would be nice if the Remark field can be supported, so we can add some extra text to the label ment for the receiver.
When creating a consignment and supplying it with an address of a pickup point the following fatal error occurs.
For reproduction purposes, the address apparently belongs to "De Kade Post".
I am using an older version of this library, but the relevant code seems identical to the current version.
<br />
<b>Fatal error</b>: Uncaught TypeError: Argument 1 passed to MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment::setPickupNumber() must be of the type string, integer given, called in /myparcelnl/sdk/src/Adapter/ConsignmentAdapter.php on line 214 and defined in myparcelnl/sdk/src/Model/Consignment/AbstractConsignment.php:1640
Stack trace:
#0 myparcelnl/sdk/src/Adapter/ConsignmentAdapter.php(214): MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment->setPickupNumber(111)
#1 myparcelnl/sdk/src/Adapter/ConsignmentAdapter.php(184): MyParcelNL\Sdk\src\Adapter\ConsignmentAdapter->setByMethods(Array, Array)
#2 myparcelnl/sdk/src/Adapter/ConsignmentAdapter.php(44): MyParcelNL\Sdk\src\Adapter\ConsignmentAdapter->pickup()
#3 myparcelnl in <b>myparcelnl/sdk/src/Model/Consignment/AbstractConsignment.php</b> on line <b>1640</b><br />
7.2.1
7.4
Some pickup locations do not come with a country, so calling MyParcelNL\Sdk\src\Model\Consignment\HasPickupLocation::setPickupCountry(null)
fails. (Called through Utils::fillObject
through ConsignmentAdapter::setPickup
)
Attempt to construct a ConsignmentAdapter
with a pickup missing a country code. The one that triggered this bug in production was:
array(
'location_name' => 'Jumbo (5747) Groenlo',
'city' => 'Groenlo',
'postal_code' => '7141VW',
'street' => 'Den Koem',
'number' => '2',
'number_suffix' => '',
'location_code' => '211889',
'retail_network_id' => 'PNPNL-01'
)
No response
This occurred in the prestashop module. I fixed it by changing the param type hint to ?string
, though ideally it wouldn't get this far without a country code.
Alternatively/additionally, ConsignmentAdapter::setPickup
shouldn't be ordering Utils::fillObject
to fill nulls into a trait that doesn't take them, though since the get methods on that trait return ?string
perhaps the setters should just be adjusted to match.
I can create a consignment, but is there a way to lookup an existing consignment at a later time?
As described in the API https://myparcelnl.github.io/api/#6_E
Example code:
$parcels = ["refference_1", "refference_2"];
$myParcelCollection = new MyParcelCollection();
foreach($parcels as $parcel){
$consignment = (new MyParcelConsignmentRepository())
->setApiKey("API_KEY_HERE")
->setReferenceId($parcel);
$myParcelCollection->addConsignment($consignment);
}
$myParcelCollection->setLatestData();
This throws the following error:
Fatal error: Call to a member function apiDecode() on null
Changing
$parcels = ["refference_1", "refference_2"];
to
parcels = ["refference_1"];
eliminates the problem.
You could also move $myParcelCollection->setLatestData();
to inside the foreach
loop, but then obviously only the first parcel has the correct data.
Is there something wrong with my implementation or is this a bug in the SDK?
Please add functions to the MyParcel PHP SDK to add, get and delete webhook subscriptions as documented in the webapi documentation:
MyParcel is gekoppeld door middel van API koppeling, maar er worden geen labels gemaakt.
Mijn code:
<?php
require_once __DIR__ . "/Labels/src/AutoLoader.php";
use MyParcelNL\Sdk\src\Factory\ConsignmentFactory;
use MyParcelNL\Sdk\src\Helper\MyParcelCollection;
use MyParcelNL\Sdk\src\Model\Consignment\PostNLConsignment;
?>
<!DOCTYPE html>
......
if($land == 'nederland')
{
$consignment = (ConsignmentFactory::createByCarrierId(PostNLConsignment::CARRIER_ID))
->setApiKey('API_KEY')
->setReferenceId($order_id)
->setCountry('NL')
->setPerson($naam)
->setFullStreet($adresNL)
->setPostalCode($postcodeNL)
->setCity($plaatsNL)
->setEmail($email);
$consignments = (new MyParcelCollection())
->addConsignment($consignment)
->createConcepts();
$consignmentId = $consignments->first()->getConsignmentId();
$consignments->downloadPdfOfLabels();
}
Er word dus geen label aangemaakt voor deze API key. Ik heb ook een ander MyParcel account die wel werkt met deze code. Ligt het aan de API key? Is er kans dat het misschien overhoopt is geraakt waardoor het geen labels meer maakt?
The cooled_delivery
option is currently not supported.
cannot set the following fields for pickup points:
In v2 I was able to get the Barcode from the initial created variable $consignment
.
However, the same code in v3 does no longer work.
$consignment = (new PostNLConsignment())
...
->setApiKey( config( 'parcel.myparcel.key' ) );
$MyParcelCollection = (new MyParcelCollection())->addConsignment( $consignment )
->setPdfOfLabels();
$barcode = $consignment->getBarcode()
// barcode = NULL (fails)
However, using $MyParcelCollection, does allow me to get the barcode:
// Get the barcode
$barcode = $MyParcelCollection->first()->getBarcode();
// barcode = 3SMYPA000000000 (works)
My assumption is that the pointer between $consignment
and the one stored in the collection, somehow gets broken.
Not that important, but would be nice if it can be fixed.
Improve base model to support more Illuminate/Eloquent-like behaviour for better integration with Collections.
Aan deze documentatie zie ik dat er wat gewijzigd is mbt download link van labels pdf.
Required request headers: "Accept: application/json; charset=utf8"
Echter werkt dit nu niet voor labels minder dan 25 stuks. Ik krijg in de request een pdf terug ipv de pdf link.
HI
I can't install the SDK because I am running a PHP version which is too high..
Now: < 7.1 and newer versions aren't accepted.
I am running PHP 7.1.6
Best Regards,
Robert
7.12.1
8.1
A Belgium address with a alphanumeric value as house number suffix is not working.
You will get the PHP error "Undefined array key "box_separator""
The address was like "Street 12-C11" where C11 is the suffix which is not recognized by the address splitter regex
Using the "ConsignmentFactory", set the address with country "BE" and FullStreet "Street 12-C11".
Undefined array key "box_separator"
No response
Hello,
I am getting BadMethodCallException issue with catch block this is not coming in catch and below error is coming
Fatal error: Uncaught BadMethodCallException: Invalid postal code in E:\Hardik\PHP_New\www\parcel\src\Model\Consignment\AbstractConsignment.php on line 1008
this is my try catch block
try
{
$consignments = (new MyParcelCollection())
->addConsignment($consignment)
->setPdfOfLabels();
$consignmentId = $consignments->first()->getConsignmentId();
}
catch (BadMethodCallException $e)
{
echo $e;
}
Can some one help please I am stuck over here
Als je vanuit Woocommerce via de MyParcel plugin een label voor een DPD zending wilt afdrukken, lukt dit niet.
Na troubleshooting blijkt het een fout te zijn in de SDK, daarom log ik het in dit project.
Een DPD zending wordt standaard altijd met 500 verzekering aangeboden (er is geen mogelijkheid om dit uit te schakelen, althans niet voor zendingen vanuit België).
Bestand: myparcelnl/sdk/src/Model/Consignment/DPDConsignment.php
Regel 27 stelt dat verzekering altijd 0 euro moet zijn:
public const INSURANCE_POSSIBILITIES_LOCAL = [0];
Op deze constraint faalt het printen van een label.
Bij het wijzigen naar het volgende lukt het wel:
public const INSURANCE_POSSIBILITIES_LOCAL = [0, 500];
7.8.0
8.1
In the public methods MyParcelCollection::setLinkOfLabels
and MyParcelCollection::setPdfOfLabels
and subsequently the internal private MyParcelCollection::setLabelFormat
, the @param
definition of the $positions
argument is wrong.
It's specified as int
but the methods accept arrays, strings and falsy values as well and this is even expected behaviour.
This makes static analysis tools such as Psalm complain, for example if you pass [2,4]
to specify positions 2 and 4.
You then need to suppress that error with /** @psalm-suppress InvalidArgument
which obviously is not that nice.
Also, the documentation text isn't really that clear and can be improved.
I will send in a PR to fix this issue.
MyParcelCollection::setLinkOfLabels
or MyParcelCollection::setPdfOfLabels
with an array argument, e.g.
$labelLink = $collection->setLinkOfLabels([2, 4])->getLinkOfLabels();
No response
No response
I can create parcels and see them in the MyParcel dashboard. The reference however is always empty.
The documentation describes that you can set the label to 4 positions
https://github.com/myparcelnl/sdk#label-format-and-position
A4:
┏━━━━━┳━━━━━┓
┃ 1 ┃ 2 ┃
┣━━━━━╋━━━━━┫
┃ 3 ┃ 4 ┃
┗━━━━━┻━━━━━┛
However, sincs a month (or two? three?) its only possible to get the label on position 2 and 4
Sending "1" or "2" results in position 2
Sending "3" or "4" results in position 4
Currently running on 5.10, but same applies for 4.10, since it's a server side problem.
Graag zouden we de mogelijkheid hebben om bij een MultiCollo de secondary_shipments een aparte label_description op te geven.
Hi,
When I try
$consignment = (new \MyParcelNL\Sdk\src\Model\Consignment\PostNLConsignment());
echo $consignment->getBarcodeUrl(3SMYPA123456789, '2231JE', 'NL');
I get
Class 'MyParcelNL\Sdk\src\Helper\TrackTraceUrl' not found
Is this a bug? Or do I do something wrong?
Hi,
I just started integrating this package into our existing application. Unfortunately, we still use Laravel 5.5, and #217 seems to have broken compatibility with this version:
[ErrorException] Declaration of MyParcelNL\Sdk\src\Support\Collection::push(...$values) should be compatible with Illuminate\Support \Collection::push($value)
I realize 5.5 is pretty old, but looking at 6.0, the push method has the same prototype as in 5.5, so I suspect the problem occurs there as well.
When MyParcel SDK throws exceptions I'm getting fatal errors.
I checked the autoload.php file and I see that most other files are required there. If I add the exception files there, then I get the errors properly thrown and I can catch them.
So, either they should be added to the autoload.php or I'm doing something wrong that I don't understand.
foreach ($shipments as $shipment) {
$consignment = (new MyParcelConsignmentRepository())
->setApiKey(API_KEY)
->setReferenceId('ref_id_12345678') // same reference id for multiple shipments
// data from $shipment
;
$myParcelCollection
->addConsignment($consignment);
}
$myParcelCollection
->setPdfOfLabels()
->setLinkOfLabels();
Outputs only the last label instead of all created labels
7.6.1
8.1
There seems to be a mismatch in UI and SDK. In the UI of MyParcel. In the UI there is no problem creating parcels for Croatia but you get an exception when trying to register the consignment via the SDK.
The problem is in the validation. In MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment
Croatia is not listed as an EU country. AFAIK it still is but... IANAL ;3. This country code is failing the check. Adding the country code will resolve this issue.
I've already created an PR for this minor bug:
#444
No response
Malta (MT) also seems to be missing from the EURO_COUNTRIES
list.
getRequestBody()
isn't added to the request in setLinkOfLabels()
rendering it unable to return A6 pdf links
Due to php's version constrict in composer.json, the MyParcel SDK v0.2.x will only install on PHP 5.6.5 and later minor releases, but will not install on PHP 7.0 and above.
Is there a reason PHP 7.0 and above are excluded?
As seen on https://blog.myparcel.nl/digitale-postzegel
Hi Reindert,
According to the API Documentation, chapter 6.A.4, example 3 "NL Insured", the insured amount should be injected in cents, and be either 5000, 25000, 50000 or 500000.
But when I view the code in the SDK, Model\MyParcelConsignment::setInsurance() accepts the Insured amount in whole euros, and the function also accepts values between 1000 and 4500 euros, in steps of 500.
These values are not enforced when setInsurance gets called; therefore I'd still be able to inject invalid values like "1Aje83", which would eventually lead to an insurance for just € 1,-
Would it be an option to enhance setInsurance to also check for a valid Insurance value, and add a note in the SDK-documentation that the Insurance value should be provided in whole euros?
Perhaps the API documentation should be updated as well, if the 1000-4500 range should be supported...
When the E-mail address of the customer is not known, it is not possible to send a parcel through the SDK; API replies "E-mail should not be null".
In some cases, customers have not provided an e-mail address with their order, but the parcel should still be shipped through MyParcel. Eg. Phone sale or Counter sale with no direct pickup possibilities.
Is it possible to default MyParcelConsignment::email to <empty_string> instead of null, so these shipments can be accepted by the API? Or otherwise write an extra check on adding a Consignment to MyParcelCollection whether the E-mail address is still null?
I am generating the shipment ids with createConcepts and then retrieving them with getConsignmentsByReferenceId and getMyParcelConsignmentId
Then, I'm storing the shipment ids with the order data in the database.
Later on, I want to allow the merchant to print the label of several orders using the shipment id stored in each order data (to avoid creating a new concept).
So I have this function:
private function _getLabel($shipment_ids) { $config = hikashop_config(); $myParcelCollection = (new MyParcelCollection()) ->setUserAgent('HikaShop', $config->get('version')); if(!is_array($shipment_ids)) $shipment_ids = array($shipment_ids); // NOTE: We had to change that function to be public in the SDK $myParcelCollection->setLabelFormat($this->plugin_options['positions']); $request = (new MyParcelRequest()) ->setUserAgent($myParcelCollection->getUserAgent()) ->setRequestParameters( $this->plugin_options['api_key'], implode(';', $shipment_ids) . '/' . $myParcelCollection->getRequestBody(), MyParcelRequest::REQUEST_HEADER_RETRIEVE_LABEL_LINK ) ->sendRequest('GET', MyParcelRequest::REQUEST_TYPE_RETRIEVE_LABEL); return MyParcelRequest::REQUEST_URL . $request->getResult('data.pdfs.url'); }
But I had to change setLabelFormat to public in the SDK as I couldn't find any alternative to provide the shipment ids myself to the SDK to generate the label in the format I want.
Could this be changed ? I don't see any drawback in making that function public.
Or maybe a function could be added to get a label generated from an array of shipment ids ?
Hi,
When I try to add the weight to MyParcelCustomsItem, the weight on the generated COMMERCIAL INVOICE turns into kilograms.
MyParcelCustomsItem()->setWeight(600) turns into 600kg on the commercial invoice.
I tried to use 0.6, but this turns into 0kg.
I think there is a bug here.
I'm using version 3.1
Due to multiple reasons Unit Tests are unable to run succesfully, if I try to run them.
There is no setter method for street_additional_info
.
Also, if the additional info is included within the streetname (streetname."\n".info
) and the additional info + streetname length does not exceed MAX_STREET_LENTH
; it will be included in the streetname. This causes it to be displayed twice on the label (after the streetname (even without a space between the streetname and the additional info) and below the streetname).
Currently, it seems to be impossible to set the Pickup information for PakjeGemak shipments through the SDK. Is there already a planning to implement PakjeGemak support through the SDK?
SplitStreet is not working for the following address:
Bankastraat 23 - II
MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment::setPhone()
has a nullable return type, but can never return null
.
->setApiKey('mijnapikey') ->setReferenceId("$order_id") ->setCountry('NL') ->setPerson("$naam") ->setFullStreet("$adres") ->setPostalCode("$postcode") ->setCity("$plaats") ->setEmail("$email") ->setPackageType(2);
Hoe voeg ik een postbus toe voor de belgische bezoekers en een PostNL abroad package type
A quick question. Is the PostNL field 'Extra veld straat' available? I can fill it on the website but the field seems to be missing in the api. Is this correct or do i mis something?
Bij het downloaden van de labels is de PDF altijd in landscape formaat, de printer print in portrait. Het is dus altijd gokken op welke plek (1,2,3,4) een label geplaatst moet worden..
Mogelijkheid tot kiezen afdrukstand
No response
No response
MyParcelNL\Sdk\src\Helper\MyParcelCollection::setUserAgent()
has been marked as deprecated. Suggested replacement is setCustomUserAgent()
, but this methods does not exist.
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.