gilberto-torrezan / gwt-views Goto Github PK
View Code? Open in Web Editor NEWA simple but powerful View controller for GWT
License: MIT License
A simple but powerful View controller for GWT
License: MIT License
It would be cool if gwt-views (optionaly) support "Google-Style" History URLs:
They work with "segments" instead of "key-value" parameters.
It would be very easy to implement: Somewhere the user has to define with style he wants, depending on that style, the URLToken only need to parse the url in a different style.
I've tried a "dirty hack" to implement it by overriding URLToken. This doesn't work cause com.github.gilbertotorrezan.gwtviews.rebind.NavigationManagerGenerator uses URLToken instead of my "overriden" URLToken class (lines 100 / 166 / 279 / 184) ;)
This is my "dirty hack" i've tried:
public class SegmentsURLToken extends URLToken {
private List<String> fSegments;
/**
* Creates a new URLToken using the current state of the application.
*/
public SegmentsURLToken() {
super();
}
/**
* Creates a new URLToken using the provided token.
*
* @param completeToken
* The History token to be parsed
*/
public SegmentsURLToken(String completeToken) {
super(completeToken);
}
/**
* Clones a URLToken, copying the id and all parameters.
*
* @see #clone()
*/
public SegmentsURLToken(URLToken source) {
super(source);
if (source instanceof SegmentsURLToken) {
this.fSegments = new ArrayList<>(((SegmentsURLToken) source).getSegments());
}
}
@Override
public void setToken(String completeToken) {
this.fSegments = new ArrayList<>();
String[] splitted = completeToken.split("/"); //$NON-NLS-1$
if (splitted.length > 0) {
setId(splitted[0]);
for (int i = 1; i < splitted.length; i++) {
this.fSegments.add(splitted[i]);
}
} else {
super.setToken(completeToken);
}
}
public List<String> getSegments() {
return this.fSegments;
}
@Override
public String toString() {
if (this.fSegments != null && this.fSegments.size() > 0) {
StringBuilder builder = new StringBuilder(getId());
for (String segment : this.fSegments) {
builder.append("/").append(segment); //$NON-NLS-1$
}
return builder.toString();
}
return super.toString();
}
}
How can I integrate with Google Gin or any other dependency injection framework?
Thanks.
In this view I don't have a default constructor but I'm using constructor injection.
@View(value = "login", publicAccess = true, defaultView = true, usesViewContainer = false,
injector = BackOfficeInjector.class, injectorMethod = "getLoginView")
public class LoginView extends Composite {
@Inject
public LoginView(Alert alert) {
Binder ui = GWT.create(Binder.class);
initWidget(ui.createAndBindUi(this));
}
Compiling module pt.ipb.candidaturas.bo.BackOffice
[INFO] Computing all possible rebind results for 'com.github.gilbertotorrezan.gwtviews.client.INavigationManager'
[INFO] Rebinding com.github.gilbertotorrezan.gwtviews.client.INavigationManager
[INFO] Invoking generator com.github.gilbertotorrezan.gwtviews.rebind.NavigationManagerGenerator
[INFO] [WARN] LoginView must have an empty constructor to be a valid View.
[INFO] [ERROR] No default view page defined!
[INFO] [ERROR] Errors in 'com/github/gilbertotorrezan/gwtviews/client/NavigationManager.java'
[INFO] [ERROR] Line 40: Failed to resolve 'com.github.gilbertotorrezan.gwtviews.client.INavigationManager' via deferred binding
[INFO] [WARN] For the following type(s), generated source was never committed (did you forget to call commit()?)
[INFO] [WARN] com.github.gilbertotorrezan.gwtviews.client.INavigationManagerImpl
[INFO] Unification traversed 11291 fields and methods and 957 types. 932 are considered part of the current module and 932 had all of their fields and methods traversed.
Hi,
I have two view containers, one for users and one for admins. Both containers have different designs.
I have a not found view that is displayed inside the default container (the container for users). How can I have the same view displayed inside the admin container? Can I use the same view in different containers?
@View(value = "404", notFoundView = true)
public class NotFoundView extends Composite {
}
Thanks
Hi,
Here's another one. I cannot set a viewContainer like this
@View(value = "home", injector = DemoInjector.class, viewContainer = MainViewContainer.class)
The NavigationManagerGenerator complains about not being a valid ViewContainer.
INFO] GET /recompile/demo
[INFO] Job com.github.natros.gwtviews.demo.Demo_1_0
[INFO] starting job: com.github.natros.gwtviews.demo.Demo_1_0
[INFO] Compiling module com.github.natros.gwtviews.demo.Demo
[INFO] Computing all possible rebind results for 'com.github.gilbertotorrezan.gwtviews.client.INavigationManager'
[INFO] Rebinding com.github.gilbertotorrezan.gwtviews.client.INavigationManager
[INFO] Invoking generator com.github.gilbertotorrezan.gwtviews.rebind.NavigationManagerGenerator
[INFO] [ERROR] com.github.natros.gwtviews.demo.client.views.MainViewContainer is not a valid ViewContainer for View com.github.natros.gwtviews.demo.client.views.home.HomeView.
[INFO] [ERROR] Errors in 'com/github/gilbertotorrezan/gwtviews/client/NavigationManager.java'
[INFO] [ERROR] Line 40: Failed to resolve 'com.github.gilbertotorrezan.gwtviews.client.INavigationManager' via deferred binding
[INFO] [WARN] For the following type(s), generated source was never committed (did you forget to call commit()?)
[INFO] [WARN] com.github.gilbertotorrezan.gwtviews.client.INavigationManagerImpl
[INFO] Unification traversed 16271 fields and methods and 1534 types. 1501 are considered part of the current module and 1501 had all of their fields and methods traversed.
[INFO] [ERROR] Compiler returned false
[INFO] [WARN] recompile failed
[INFO] [WARN] continuing to serve previous version
You can test here
https://github.com/natros/gwt-views-demo
Hi Gilberto, I've got a situation using gwt-views and I'm wondering if you could comment. The short version is that I think I need access to the Ginjector through a static method, but here's the situation:
Previously, I created a static injector in my EntryPoint and did this stuff there. I'd like to follow the same pattern, but I can't seem to access or set the injector that is used to manage set the components of the views.
Do you have any ideas about I could accomplish a similar thing and still be within the framework?
Thanks!
E
Dependency injection it's not working for ViewContainer
@ViewContainer(injector = DemoInjector.class)
public class MainViewContainer extends Composite implements HasViews {
}
[INFO] Job com.github.natros.gwtviews.demo.Demo_1_0
[INFO] starting job: com.github.natros.gwtviews.demo.Demo_1_0
[INFO] Compiling module com.github.natros.gwtviews.demo.Demo
[INFO] Computing all possible rebind results for 'com.github.gilbertotorrezan.gwtviews.client.INavigationManagerImpl.MainViewContainerPresenter'
[INFO] Rebinding com.github.gilbertotorrezan.gwtviews.client.INavigationManagerImpl.MainViewContainerPresenter
[INFO] Invoking generator com.github.gilbertotorrezan.gwtviews.rebind.PresenterGenerator
[INFO] [ERROR] Error loading the injector class "com.github.natros.gwtviews.demo.client.gin.DemoInjector": java.lang.NullPointerException
the view is null in PresentGenerator
injectorMethod = getInjectorMethod(logger, injectorType, view.injectorMethod(), className);
Just in case you want to try:
https://github.com/natros/gwt-views-demo
Thank you.
Hi,
There are 30-40 gwt modules we created. They are used in servlets/jsps. So, a page refresh is required to use the modules.
Does this project help in using the gwt modules with out doing page refreshes.
See the link for the turducken pattern
http://www.slideshare.net/RobertKeane1/turducken-divide-and-conquer-large-gwt-apps-with-multiple-teams
Thanks
Hi,
I can't use maven so i copied all the dependencies to the classpath:
But finally SDM output this error and i don't know how to fix it:
com.arcbees.analytics.shared.GaAccount is not a binding annotation. Please annotate it with @BindingAnnotation.
Here is SDL log:
Turning off precompile in incremental mode.
Super Dev Mode starting up
workDir: c:\dev\superdevmodeworkdir
2018-08-24 20:17:36.313:INFO::main: Logging initialized @1413ms
Loading Java files in es.mycompany.netcom.mobile.Mobile.
Ignored 20 units with compilation errors in first pass.
Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
Module setup completed in 2580 ms
[WARN] unable to delete 'c:\dev\superdevmodeworkdir\es.mycompany.netcom.mobile.Mobile\compile-1' (skipped)
[ERROR] unable to create directory: c:\dev\superdevmodeworkdir\es.mycompany.netcom.mobile.Mobile\compile-1
Loading Java files in es.mycompany.netcom.mobile.Mobile.
Ignored 20 units with compilation errors in first pass.
Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
Module setup completed in 827 ms
2018-08-24 20:17:38.811:INFO:oejs.Server:main: jetty-9.2.z-SNAPSHOT
2018-08-24 20:17:38.830:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@63c274b4{/,null,AVAILABLE}
2018-08-24 20:17:38.842:INFO:oejs.ServerConnector:main: Started ServerConnector@611ca657{HTTP/1.1}{127.0.0.1:9876}
2018-08-24 20:17:38.842:INFO:oejs.Server:main: Started @3944ms
The code server is ready at http://127.0.0.1:9876/
GET /recompile/mobile
Job es.mycompany.netcom.mobile.Mobile_1_0
starting job: es.mycompany.netcom.mobile.Mobile_1_0
[ERROR] unable to create directory: c:\dev\superdevmodeworkdir\es.mycompany.netcom.mobile.Mobile\compile-2
binding: user.agent=safari
Compiling module es.mycompany.netcom.mobile.Mobile
Ignored 20 units with compilation errors in first pass.
Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
Computing all possible rebind results for 'com.github.gilbertotorrezan.gwtviews.client.analytics.UniversalAnalyticsTrackerGinjector'
Rebinding com.github.gilbertotorrezan.gwtviews.client.analytics.UniversalAnalyticsTrackerGinjector
Invoking generator com.google.gwt.inject.rebind.GinjectorGenerator
[ERROR] An exception was caught and reported. Message: com.arcbees.analytics.shared.GaAccount is not a binding annotation. Please annotate it with @BindingAnnotation.
java.lang.IllegalArgumentException: com.arcbees.analytics.shared.GaAccount is not a binding annotation. Please annotate it with @BindingAnnotation.
at com.google.inject.internal.util.$Preconditions.checkArgument(Preconditions.java:113)
at com.google.inject.Key.ensureIsBindingAnnotation(Key.java:366)
at com.google.inject.Key.strategyFor(Key.java:353)
at com.google.inject.Key.get(Key.java:264)
at com.google.inject.internal.AbstractBindingBuilder.annotatedWithInternal(AbstractBindingBuilder.java:74)
at com.google.inject.internal.ConstantBindingBuilderImpl.annotatedWith(ConstantBindingBuilderImpl.java:44)
at com.google.gwt.inject.rebind.adapter.AnnotatedConstantBindingBuilderAdapter.annotatedWith(AnnotatedConstantBindingBuilderAdapter.java:33)
at com.arcbees.analytics.client.AnalyticsModule.configure(AnalyticsModule.java:125)
at com.google.gwt.inject.client.AbstractGinModule.configure(AbstractGinModule.java:46)
at com.google.gwt.inject.rebind.adapter.GinModuleAdapter.configure(GinModuleAdapter.java:57)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.gwt.inject.rebind.adapter.BinderAdapter.install(BinderAdapter.java:74)
at com.google.gwt.inject.client.AbstractGinModule.install(AbstractGinModule.java:83)
at com.github.gilbertotorrezan.gwtviews.client.analytics.UniversalAnalyticsTrackerModule.configure(UniversalAnalyticsTrackerModule.java:43)
at com.google.gwt.inject.client.AbstractGinModule.configure(AbstractGinModule.java:46)
at com.google.gwt.inject.rebind.adapter.GinModuleAdapter.configure(GinModuleAdapter.java:57)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.spi.Elements.getElements(Elements.java:101)
at com.google.inject.spi.Elements.getElements(Elements.java:92)
at com.google.gwt.inject.rebind.BindingsProcessor.createBindingsForModules(BindingsProcessor.java:201)
at com.google.gwt.inject.rebind.BindingsProcessor.process(BindingsProcessor.java:102)
at com.google.gwt.inject.rebind.GinjectorGeneratorImpl.generate(GinjectorGeneratorImpl.java:79)
at com.google.gwt.inject.rebind.GinjectorGenerator.generate(GinjectorGenerator.java:74)
at com.google.gwt.core.ext.IncrementalGenerator.generateNonIncrementally(IncrementalGenerator.java:40)
at com.google.gwt.dev.javac.StandardGeneratorContext.runGeneratorIncrementally(StandardGeneratorContext.java:745)
at com.google.gwt.dev.cfg.RuleGenerateWith.realize(RuleGenerateWith.java:103)
at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:78)
at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:262)
at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:251)
at com.google.gwt.dev.PrecompilationContextCreator$1.getAllPossibleRebindAnswers(PrecompilationContextCreator.java:86)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.createStaticRebindExpression(UnifyAst.java:519)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.createRebindExpression(UnifyAst.java:487)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.maybeHandleMagicMethodCall(UnifyAst.java:415)
at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.visit(UnifyAst.java:402)
at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:265)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118)
at com.google.gwt.dev.jjs.ast.JCastOperation.traverse(JCastOperation.java:76)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118)
at com.google.gwt.dev.jjs.ast.JDeclarationStatement.traverse(JDeclarationStatement.java:49)
at com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:88)
at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:331)
at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:94)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:139)
at com.google.gwt.dev.jjs.ast.JIfStatement.traverse(JIfStatement.java:53)
at com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:88)
at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:331)
at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:94)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:139)
at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:135)
at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:83)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:786)
at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:778)
at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
at com.google.gwt.dev.jjs.impl.UnifyAst.mainLoop(UnifyAst.java:1401)
at com.google.gwt.dev.jjs.impl.UnifyAst.exec(UnifyAst.java:896)
at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.unifyJavaAst(JavaToJavaScriptCompiler.java:1410)
at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.constructJavaAst(JavaToJavaScriptCompiler.java:1222)
at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:1140)
at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:255)
at com.google.gwt.dev.Precompile.precompile(Precompile.java:255)
at com.google.gwt.dev.Precompile.precompile(Precompile.java:202)
at com.google.gwt.dev.Precompile.precompile(Precompile.java:143)
at com.google.gwt.dev.Compiler.compile(Compiler.java:204)
at com.google.gwt.dev.codeserver.Recompiler.doCompile(Recompiler.java:362)
at com.google.gwt.dev.codeserver.Recompiler.compile(Recompiler.java:175)
at com.google.gwt.dev.codeserver.Recompiler.recompile(Recompiler.java:134)
at com.google.gwt.dev.codeserver.Outbox.recompile(Outbox.java:135)
at com.google.gwt.dev.codeserver.JobRunner.recompile(JobRunner.java:113)
at com.google.gwt.dev.codeserver.JobRunner.access$000(JobRunner.java:37)
at com.google.gwt.dev.codeserver.JobRunner$2.run(JobRunner.java:90)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
[ERROR] Errors in 'com/github/gilbertotorrezan/gwtviews/client/analytics/UniversalAnalyticsTracker.java'
[ERROR] Line 49: Failed to resolve 'com.github.gilbertotorrezan.gwtviews.client.analytics.UniversalAnalyticsTrackerGinjector' via deferred binding
[WARN] For the following type(s), generated source was never committed (did you forget to call commit()?)
[WARN] com.github.gilbertotorrezan.gwtviews.client.analytics.com_github_gilbertotorrezan_gwtviews_client_analytics_UniversalAnalyticsTrackerGinjectorImpl
Computing all possible rebind results for 'es.mycompany.netcom.mobile.client.about.AboutView.AboutViewUiBinder'
Rebinding es.mycompany.netcom.mobile.client.about.AboutView.AboutViewUiBinder
Invoking generator com.google.gwt.uibinder.rebind.UiBinderGenerator
[ERROR] Cannot parse value: "green darken-3" as type gwt.material.design.client.constants.Color: <m:MaterialLink href='https://github.com/gilberto-torrezan/feel-vision' iconType='LINK' target='_blank' text='Project on GitHub' textColor='green darken-3'> (:49)
[ERROR] Errors in 'es/mycompany/netcom/mobile/client/about/AboutView.java'
[ERROR] Line 22: Failed to resolve 'es.mycompany.netcom.mobile.client.about.AboutView.AboutViewUiBinder' via deferred binding
Computing all possible rebind results for 'es.mycompany.netcom.mobile.client.FeelVisionContainer.FeelVisionContainerUiBinder'
Rebinding es.mycompany.netcom.mobile.client.FeelVisionContainer.FeelVisionContainerUiBinder
Invoking generator com.google.gwt.uibinder.rebind.UiBinderGenerator
[ERROR] Cannot parse value: "green darken-3" as type gwt.material.design.client.constants.Color: <m:MaterialNavBar activates='sideBar' addStyleNames='{style.navBar}' backgroundColor='green darken-3' ui:field='navBar'> (:60)
[ERROR] Errors in 'es/mycompany/netcom/mobile/client/FeelVisionContainer.java'
[ERROR] Line 28: Failed to resolve 'es.mycompany.netcom.mobile.client.FeelVisionContainer.FeelVisionContainerUiBinder' via deferred binding
[WARN] For the following type(s), generated source was never committed (did you forget to call commit()?)
[WARN] es.mycompany.netcom.mobile.client.about.AboutView_AboutViewUiBinderImpl
[WARN] es.mycompany.netcom.mobile.client.FeelVisionContainer_FeelVisionContainerUiBinderImpl
Unification traversed 2260 fields and methods and 878 types. 65 are considered part of the current module and 108 had all of their fields and methods traversed.
[WARN] Some stale types ([es.mycompany.netcom.mobile.client.MobileEntryPoint$11, es.mycompany.netcom.mobile.client.MobileEntryPoint$lambda$2$Type, es.mycompany.netcom.mobile.client.MobileEntryPoint$10, es.mycompany.netcom.mobile.client.MobileEntryPoint$9, es.mycompany.netcom.mobile.client.MobileEntryPoint$8, es.mycompany.netcom.mobile.client.MobileEntryPoint$7, es.mycompany.netcom.mobile.client.MobileEntryPoint$6, es.mycompany.netcom.mobile.client.MobileEntryPoint$5, es.mycompany.netcom.mobile.client.MobileEntryPoint$4, es.mycompany.netcom.mobile.client.MobileEntryPoint$lambda$1$Type, es.mycompany.netcom.mobile.client.MobileEntryPoint$3, es.mycompany.netcom.mobile.client.MobileEntryPoint$2, es.mycompany.netcom.mobile.client.MobileEntryPoint$1, es.mycompany.netcom.mobile.client.MobileEntryPoint$lambda$3$Type, es.mycompany.netcom.mobile.client.MobileEntryPoint$lambda$0$Type]) were not reprocessed as was expected. This is either a compiler bug or a Generator has legitimately stopped creating these types.
[ERROR] Compiler returned false
[WARN] recompile failed
[WARN] continuing to serve previous version
Can you get me some help here please ?
Hello,
Using gradle, gwt-user (v2.6) gets pulled into my classpath, I believe this is from the Universal Analytics dependency. I can exclude it manually, but it creates a nasty conflict when running. It takes a minute to track down.
I was wondering if we could decouple this in the next build? Especially with 2.8 so close!
Thanks,
E
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.