greendelta / olca-app Goto Github PK
View Code? Open in Web Editor NEWSource code of openLCA
Home Page: openlca.org
License: Mozilla Public License 2.0
Source code of openLCA
Home Page: openlca.org
License: Mozilla Public License 2.0
It would be nice if openLCA, following the analysis calculation, would list all flows that are linked to the product system under consideration which were not considered by the LCIA method with which the calculation was performed.
JavaScript alert: TypeError: java.openModel is not a function. (In 'java.openModel(angular.toJson(item.descriptor))', 'java.openModel' is undefined)
This probably occurs only in newer JVM versions but maybe it would be anyhow good to replace the current usage view with the same view as in the search results (also because #15 is solved now).
A product system in openLCA can contain thousands of processes and links between these processes. For a product input in a process, there can be multiple processes that have this product as output (or for waste outputs, multiple waste treatment processes which take this waste as input). The auto-complete function in openLCA has several options for selecting the correct provider. However, there can be multiple providers which are equivalent regarding these options in the database and openLCA just links the first best processes in this case. This can lead to unexpected results (e.g. the co-product electricity of a waste treatment process is selected as the provider of the main electricity input of another process). Because of the huge amount of processes and links in a system it is later hard to find such linking problems in the model graph.
Add the database checks to identify the linking options that are applicable for a product system:
Add an interactive user interface that can be used to select providers for product inputs and waste outputs during the creation of a product system:
Check connections
to the auto-link options of the product system dialogPreferred process type
is disabled (it is selected then manually)Provider linking
options remain active and are considered in the connection checksWhen the Check connections
option is active and there are multiple providers for a product input or waste output a dialog with the following features will pop up:
Ignore default providers
is active than this will also select the povider for the exchanges where another default provider is selected in the respective process, otherwise not)Some database conversions are failing. This is due to the inability of the conversion to "Update to database schema v6" (Subtask of the "Creation of data quality system"). In fact, in the openLCA Update Manager window, it is impossible to select the "Update to database schema v6" option.
This results in 2 unexpected errors:
When building the matrices for the calculation a flow is mapped to a single matrix row. Multiple instances of the same flow are then aggregated by adding up the values for these flows. In this aggregation causal allocation factors (exchange ID is set to 0
-> no causal factor can be found) and also uncertainty distributions get lost (-> the problem here is the calculation of an aggregated uncertainty distribution).
Removing processes from a product system is not functioning correctly.
One would expect the at least one if not both of the statements below to remove all processes from a product system.
olca.getSystem("rice").getProcesses().clear()
olca.getSystem("rice").getprocesses().removeAll(olca.getSystem("rice").getProcesses())
log.info(str(olca.getSystem("rice").getProcesses().isEmpty()))
Currently the output is false (processes are present).
System: Windows 10 64-bit
OLCA version: 1.5.0 beta1
Affected models that need to be synced during import:
Because there is version concurrence between json-ld files and openLCA client it would be great to have some kind of client version number in the json-ld metadata.
Problem:
Create a process in openLCA -> export it with the Excel export -> modify it in Excel and import it into the same database -> there are now two processes with the same UUID in the database
The user should be able to decide whether to keep the existing process in the database or to replace it with the version from the Excel file. Therefore, we need some kind of user interface. However, it gets complicated when a process should be replaced that is already used in a product system as the old links may not valid anymore with the new version (when the product or waste flows changed in the process). An option would be to not allow to replace such a process in this case showing a message like A process that is already used in a product system cannot be replaced
.
Currently it throws a NullPointerException:
java.lang.NullPointerException
at org.openlca.app.db.Database.getIndexUpdater(Database.java:39)
at org.openlca.app.wizards.io.ILCDImportWizard.performFinish(ILCDImportWizard.java:48)
at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:853)
at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:438)
at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:619)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:832)
at org.eclipse.jface.window.Window.open(Window.java:808)
at org.eclipse.ui.internal.handlers.WizardHandler$Import.executeHandler(WizardHandler.java:158)
at org.eclipse.ui.internal.handlers.WizardHandler.execute(WizardHandler.java:290)
at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:294)
Error from log.html:
737050 | JavaFX Application Thread | ERROR | org.openlca.app.navigation.actions.DeleteModelAction | failed to delete category Category {modelType=PROCESS, refId=1b044fcc-06a7-32e6-8072-abaa636328ef, name=North Carolina} |
---|---|---|---|---|
org.mapdb.DBException$EngineGetVoid: Recid passed to Engine.get() does not exist. Possible data corruption! at org.mapdb.StoreDirect.indexValGet(StoreDirect.java:1565) at org.mapdb.StoreWAL.indexValGet(StoreWAL.java:433) at org.mapdb.StoreWAL.get2(StoreWAL.java:643) at org.mapdb.Store.get(Store.java:253) at org.mapdb.Engine$CloseOnJVMShutdown.get(Engine.java:453) at org.mapdb.DB$4.run(DB.java:205) at org.mapdb.DB$4.run(DB.java:199) at org.mapdb.SerializerPojo.serializeUnknownObject(SerializerPojo.java:460) at org.mapdb.SerializerBase.serialize(SerializerBase.java:1000) at org.mapdb.SerializerBase.serialize(SerializerBase.java:946) at org.mapdb.HTreeMap$1.serialize(HTreeMap.java:143) at org.mapdb.HTreeMap$1.serialize(HTreeMap.java:127) at org.mapdb.Store.serialize(Store.java:304) at org.mapdb.StoreCached.flushWriteCacheSegment(StoreCached.java:389) at org.mapdb.StoreWAL.commitFullWALReplay(StoreWAL.java:838) at org.mapdb.StoreWAL.commit(StoreWAL.java:726) at org.mapdb.Engine$CloseOnJVMShutdown.commit(Engine.java:487) at org.mapdb.DB.commit(DB.java:2621) at org.openlca.app.cloud.index.DiffIndex.commit(DiffIndex.java:182) at org.openlca.app.db.IndexUpdater.delete(IndexUpdater.java:82) at org.openlca.app.db.DatabaseListener.modelDeleted(DatabaseListener.java:52) at org.openlca.core.database.Notifiable.notifyDelete(Notifiable.java:37) at org.openlca.core.database.RootEntityDao.delete(RootEntityDao.java:48) at org.openlca.app.navigation.actions.DeleteModelAction.delete(DeleteModelAction.java:214) at org.openlca.app.navigation.actions.DeleteModelAction.delete(DeleteModelAction.java:187) at org.openlca.app.navigation.actions.DeleteModelAction.run(DeleteModelAction.java:143) at org.eclipse.jface.action.Action.runWithEvent(Action.java:473) at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565) at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:397) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4428) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4238) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3817) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1150) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1039) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at org.openlca.app.rcp.RcpApplication.start(RcpApplication.java:16) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590) at org.eclipse.equinox.launcher.Main.run(Main.java:1499) |
The format of the Geographies.xml
file from https://geography.ecoinvent.org/ is a bit different than the version that was originally available on the ecoinvent website -> the KML is currently not imported from this file.
Currently even a simple "Hello World" script requires that a database is opened. Also it would be helpful if it would be more obvious how to execute a script (maybe an execute button directly in the editor).
See this issue here: GreenDelta/openlca-python-tutorial#1
When trying to rebuild a product system's supply chain, the application crashes, as soon as the product system should be saved.
Version: 1.4.1
Database: MySQL
Steps to reproduce:
The error only happens after the supply chain was deleted in the "Model Graph"-tab. If I create an empty product system (don't connect processes) and build the supply chain in the Model Graph-tab, it works fine.
Hard to reproduce because it works for me :(
Currently parameter and function names can only start with a letter (see the grammar definition here)
We should also allow _
, $
(something else?) as first character
When I want to evaluate my Product System "HS10 Fair" (just a small one), I always get an "Unexpected Error during Evaluation". It worked once but now it refused. I did a small change in between, don't know what exacty, but to me the model seems to be o.k.
Can you find out the reason?
See attached: Log Messages, Configuration, and Project (.zolca) in a ZIP
Environment:
This could be shown in a separate page of the flow editor.
We already write the default provider links as extension attributes into the ILCD format but they are not yet imported.
also the size of the Excel workbook can be reduced a lot if we keep zero value cells blank instead of writing zeros into them
Building the HTML pages from source currently does not work with Node.js 7.* (it works with Node.js 6.*)
This is related to #29: we need to check the amounts to correctly assign them in the import.
Show where parameters in a database are used (the Usage
menu is currently not shown for parameters in the navigation tree).
Is there a release available for Mac yet? If so, where could I download?
thanks!
Hello,
Do you have assess the use of the jblas library that promises high performance for matrix computation?
https://github.com/mikiobraun/jblas
https://mikiobraun.github.io/jblas/javadoc/index.html
openLCA stores connection properties of databases in the databases.json
file in the openLCA workspace folder. Somehow it is possible to create null
entries for connections in openLCA which are then stored in this file. This leads to problems when creating or importing databases (because the names of the other connections are checked).
This is also a good example why we should always check for null
values ...
Since openLCA 1.7.? the first connection to a database is very flow. It was
much faster in openLCA 1.6.x (< 3 seconds in 1.6.3 and > 30 seconds in 1.7.2)
for an empty(!) database). We did not yet (probably) found the source of
this issue, possible reasons are were:
We switched to newer libraries for Derby (was 10.13.1.1 in openLCA 1.6.3 and is
now 10.14.2.0 in openLCA 1.7.2). With Derby 10.13.1.1, opening a database that
was created with Derby 10.14.2.0 gives the following error:
Caused by: ERROR XSLAN: Database at <folder> has an incompatible format
with the current version of the software. The database was created by or
upgraded by version 10.14.
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.impl.store.raw.log.LogToFile.readControlFile(Unknown Source)
at org.apache.derby.impl.store.raw.log.LogToFile.boot(Unknown Source)
Thus, we would have a problem if we need to switch back to 10.13.1.1. However,
with 10.13.1.1 the connection time in openLCA 1.7.2 is even a bit slower. Also,
the direct database connection via the Derby driver does not seems to be the
problem. Running the code below outside of openLCA (as plain Maven project)
and within the RcpActivator
of openLCA gives the following times:
First connection | Last connection | Mean | |
---|---|---|---|
outside of openLCA | 745 ms | 60 ms | 144 ms |
within openLCA | 1,431 ms | 28 ms | 169 ms |
String dbPath = System.getProperty("user.home")
+ "/openLCA-data-1.4/databases";
File dbDir = new File(dbPath);
List<Long> times = new ArrayList<>();
for (File folder : dbDir.listFiles()) {
System.out.println("Test databases " + folder.getName());
long start = System.currentTimeMillis();
String url = "jdbc:derby:"+ folder.getAbsolutePath().replace('\\', '/');
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select count(*) from tbl_actors");
rs.next();
int count = rs.getInt(1);
System.out.println(" > " + count + " actors in DB");
rs.close();
stmt.close();
con.close();
long time = (System.currentTimeMillis() - start);
times.add(time);
System.out.println(" > Needed " + time + " ms");
try {
DriverManager.getConnection(url + ";shutdown=true");
} catch (Exception e) {
}
}
double mean = times.stream().reduce(0L, (a, b) -> a + b)
.doubleValue() / times.size();
System.out.println("Average time " + mean + " ms");
With openLCA 1.7, we switched to Eclipse 4.7.3 as new target platform and a new
PDE export related build for Windows. However, for macOS and Linux we still
build against the Eclipse 4.4 with delta pack etc. because the new build has
several problems with macOS and Linux. However, the old build still works for
Windows but there is no performance difference when using the old platform in
openLCA 1.7.
For EclipseLink, we switched from 2.6.4 in openLCA 1.6.3 to 2.7.3 in openLCA
1.7.2. Using the 2.6.4 also does not improve the performance. However,
running the code below shows that the problem is JPA and openLCA context related
(in the example code we directly create the persistence manager from scratch
etc.):
First connection | Last connection | Mean | |
---|---|---|---|
outside of openLCA | 2,259 ms | 89 ms | 272 ms |
within openLCA | 29,663 ms | 3,589 ms | 5,214 ms |
String dbPath = System.getProperty("user.home")
+ "/openLCA-data-1.4/databases";
File dbDir = new File(dbPath);
List<Long> times = new ArrayList<>();
for (File folder : dbDir.listFiles()) {
System.out.println("Test databases " + folder.getName());
long start = System.currentTimeMillis();
String url = "jdbc:derby:" + folder.getAbsolutePath().replace('\\', '/');
Map<Object, Object> map = new HashMap<>();
map.put("javax.persistence.jdbc.url", url);
map.put("javax.persistence.jdbc.driver", "org.apache.derby.jdbc.EmbeddedDriver");
map.put("eclipselink.classloader", Main.class.getClassLoader());
map.put("eclipselink.target-database", "Derby");
EntityManagerFactory factory = new PersistenceProvider()
.createEntityManagerFactory("openLCA", map);
EntityManager em = factory.createEntityManager();
Object count = em.createQuery("select count(a.id) from Actor a")
.getSingleResult();
System.out.println(" > " + count + " actors in DB");
em.close();
long time = (System.currentTimeMillis() - start);
times.add(time);
System.out.println(" > Needed " + time + " ms");
try {
factory.close();
DriverManager.getConnection(url + ";shutdown=true");
} catch (Exception e) {
}
}
double mean = times.stream().reduce(0L, (a, b) -> a + b)
.doubleValue() / times.size();
System.out.println("Average time " + mean + " ms");
Yes, it is. The connection to a MySQL database in openLCA 1.7.2 takes ~15
seconds and is twice as fast as a connection to a Derby database. However,
compared to a connection in openLCA 1.6.3 this is still quite slow.
Switching to GeoTools 19.1 from 10.3 in openLCA 1.7 resulted in many additional
libraries especially related to the SWT renderer that somehow uses (nearly) all
of the libraries from the JAI-EXT
project. Just removing these JAI-EXT libraries brings back the old performance.
Switching back to GeoTools 10.3 reduces the number of maven dependencies from
122 to 84 libraries resulting in an initial database connection time that is
10 times faster (so the number of libraries does not seem to be related to
the connection time but there is probably another reason for this issue related
to these libraries). It seems that there is no loss in functionality when we
use the 10.3 version so we will just do that to solve this issue.
EDIT: Today, we,ve updated our system to OS X 10.11. And although I could trigger the bug once by clicking around like mad, it seems that it doesn't happen anymore in daily use. So this bug may be closed, because it just happens on a distinct combination of OS and openLCA.
The bug described below was happening on OS X 10.9 with openLCA 1.4.1:
This Bug happens always when trying to insert both a data documentor and a data generator to a process on the administrative Information tab. It also happens often when inserting a publication source subsequently. I'm running openLCA 1.4.1, mac version.
Steps to reproduce:
After closing the second window, the GUI update seems somehow broken. You will have to klick the actor name and OK button twice. Also saving right afterwards seems to take ages unless you klick the save button twice. After saving the dataset, the GUI behaves normally again.
something is going wrong with the UI threads ...
Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = ModalContext
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
at javafx.scene.web.WebEngine.checkThread(WebEngine.java:1216)
at javafx.scene.web.WebEngine.executeScript(WebEngine.java:980)
at org.openlca.app.rcp.plugins.PluginManager.refresh(Unknown Source)
at org.openlca.app.rcp.plugins.PluginManager.access$1(Unknown Source)
at org.openlca.app.rcp.plugins.PluginManager$JsHandler.lambda$2(Unknown Source)
at org.openlca.app.App.lambda$0(Unknown Source)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:122)
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007fbf386c34cf, pid=19932, tid=140459264104192
#
# JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [ld-linux-x86-64.so.2+0xc4cf] _dl_rtld_di_serinfo+0x2dbf
#
# Core dump written. Default location: /home/user/Downloads/openLCA/core or core.19932
#
# An error report file with more information is saved as:
# /home/user/Downloads/openLCA/hs_err_pid19932.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
Is there somewhere to upload a core dump?
Running elementary luna (Ubuntu 14.04).
You must widen the tool window to fully read flow names and even then, not all seem to be listed (e.g., using standard reference data, there are 5 dimethyl sulfate flows but only 2 are available as options for replacing and it is unclear from which subcompartments these flows originate—even with the window widened as much as possible)
Due to a change in how the files are packed, zolca archives created on windows, use backslash as path separator. when these are extracted on linux, the files have wrong paths
The ILCD format has some defined fields and enumeration values for data quality information. For process data sets, we can map this information to the openLCA implementation of data quality systems:
When importing ILCD process data sets with data quality information, create a DQ entry for the process and link it to the ILCD-DQS
Display user friendly DQI labels (instead of numbers) if the DQ system supports this
Note that the DQ information are stored under the review element of an ILCD process data set and there can be multiple review elements in a data set. If this is the case, we import the DQ information of the first review.
Please include the compiled jblas-1.2.4.jar in the binary distribution
Some browser features (JavaScript calls) cause a JVM crash on Linux 64bit (Lubuntu). This can be reproduced by opening the KML map editor as an example. Pages like the start page work.
Error log:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f951596b4cf, pid=2958, tid=140278291138304
#
# JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02 mixed mode linux-amd64
compressed oops)
# Problematic frame:
# C [ld-linux-x86-64.so.2+0xc4cf] _dl_rtld_di_serinfo+0x2dbf
#
If processes are exported into ILCD, import of an ILCD file into a new database causes flow locations to be lost.
As a collaboration server repository owner/editor, I am able to commit process and flow deletions. However, when logged in as a public viewer to the same repository, the old processes and flows are visible but have no content (i.e., fields are blank).
e.g. by supporting formulas for allocation factors
see this discussion
I was following your instructions regarding "Within Eclipse right-click on the olca-app-runtime/build.xml file and select Run as.../Ant build. This will download the RCP platform on which openLCA is built"
I made a product system without connecting processes, then build a supply chain using the Model graph editor, but do not have the option to save the product system.
Currently, it is possible to copy items from various openLCA tables (parameters, inputs and outputs, results) to Excel but it is only possible to paste process parameter items from Excel back to openLCA. In this task, the clipboard format of some key data tables will be improved so that copy and paste functions between openLCA and Excel (or other spreadsheet software that supports tabular clipboards) but also between these tables within openLCA will be supported. This will be implemented for the following tables:
When entering formulas some kind of IntelliSense parameter names would be very helpful in the following locations:
It would be nice to have the ability to copy, save, and/or print the Diff Window when fetching changes (as a change log).
I converted a data set with allocation factors from version 1.3 to 1.4 using the database conversion plug-in provided. I noticed that the allocation factors were incorrect (some were zeroed out) after conversion. I exported the affected processes as ecospold1 files and imported them individually into version 1.4 to correct the issue.
@sebastian-greve @NicolasDumoulin @MartinPluta @aciroth
What kind of learning helped you to contribute better to this project?
Could you share any personal learning experiences if possible?
I would love to invest time and contribute to this project!
Could you recommend any concepts/online courses in I could do in order to contribute to OpenLCA? I
can help make a "Dummy's Guide to the World of LCA & Open LCA"/ Wiki :)
I am trying to contribute as a part of my Data Science Project in Bangalore, India.
Any inputs from your end would be helpful :)
see here:
Also, instead of first packaging these entries and then removing them it would be probably better to use ZipUtil.packEntries or something like this to exclude them when creating the package
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.