Coder Social home page Coder Social logo

valkyrie-rcp's Introduction

Valkyrie RCP

Valkyrie-RCP’s mission is to provide an elegant way to build highly-configurable, GUI-standards-following rich-client applications faster by leveraging the Spring Framework, and a rich library of UI factories and support classes. Initial focus is on providing support for Swing applications but a goal of Valkyrie-RCP is to be view agnostic as much as possible.

The goal of Valkyrie-RPC is to provide a viable option for developers that need a platform and a best-practices guide for constructing Swing applications quickly.

DISCLAIMER

I’m not the author of this framework, neither related to the author, so please thanks lievendoclo for his work.

What is it ?

A fork of Valkyrie RCP, which is itself an evolution of Spring Rich Client.

The Valkyrie documentation is available here.

License

This project is licensed under the Apache License Version 2.0.

Unless explicitly stated otherwise all files in this repository are licensed under the Apache Software License 2.0

Why ?

Because the original project seems to be dead :(

And so, what’s new ?

  • Removed the @Configurable system, no longer is AspectJ needed to use Valkyrie RCP
  • Fixed RCP-613
  • Fixed RCP-622
  • Fixed RCP-634
  • Started on integrating Jide Docking into the framework. Not yet production-ready.
  • Upgraded Spring dependencies to lastest version

How to get the released versions ?

Maven

Just add this to your pom.xml file:

The dependencies:

<dependency>
    <groupId>org.valkyriercp</groupId>
    <artifactId>valkyrie-rcp-core</artifactId>
    <version>2.0</version>
</dependency>

Gradle

The dependencies:

dependencies {
        compile group: 'org.valkyriercp', name:'valkyrie-rcp-core', version:'2.0'
}

How do I get my IDE to work and run samples

IntelliJ IDEA 12+

Just open the project in IntelliJ using the build.gradle file.

I found a bug, what can I do ?

Feel free to fork this repo, and make a pull request. Ideally, write a test !

How to build

Just clone the repository, and then use a ./gradlew build command.
The build uses the Gradle wrapper, so you don’t need a local Gradle install.

Documentation

To build the documentation with gradle, you’ll need to navigate to the valkyrie-rcp-manual folder and issue a gradle reference
command. If you want a zip with the documentation, use gradle build.

The documentation is provided as a single html, multi-page html and PDF.

Greetings

Big thanks to lievendoclo for his work on this !

valkyrie-rcp's People

Contributors

bravegag avatar cmadsen avatar lievendoclo avatar ndeverge avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

valkyrie-rcp's Issues

NPE in RefreshableValueHolder ctor

import java.util.Collections;
import org.valkyriercp.binding.value.support.RefreshableValueHolder;
import org.valkyriercp.rules.closure.Closure;

public class TestRefreshableValueHolder {
    public static void main(String[] args) {
        RefreshableValueHolder refreshableAssetTypeValueHolder = new RefreshableValueHolder(
                new Closure() {
                    @Override
                    public Object call(Object object) {
                        return Collections.EMPTY_LIST;
                    }
                }, true, false);
    }
}

Exception in thread "main" java.lang.NullPointerException
at org.valkyriercp.binding.value.support.AbstractValueModel.hasValueChanged(AbstractValueModel.java:141)
at org.valkyriercp.binding.value.support.ValueHolder.setValue(ValueHolder.java:40)
at org.valkyriercp.binding.value.support.RefreshableValueHolder.refresh(RefreshableValueHolder.java:75)
at org.valkyriercp.binding.value.support.RefreshableValueHolder.(RefreshableValueHolder.java:50)
at dk.navicon.valkyrie.test.TestRefreshableValueHolder.main(TestRefreshableValueHolder.java:12)

Port into Valkyrie the nice Help support of Spring RCP

Hello,

The nice quick support for Help documentation was apparently not ported into Valkyrie. I mean the implementation of org.springframework.richclient.command.support.HelpContentsCommand.

The configuration in the original Spring RCP implementation was:


This by convention would look for the appropriate files and create a nice accessible help documentation.

PS: I'm interested in contributing to the project, I need to build a new GUI from scratch on top of a good architecture and Valkyrie is the best I could find. Let me know whether is ok to get write access.

Spring 4 support

Hi!
I noticed that you have migrated to Spring 4 which is really great. Is there a date when you will release the version with Spring 4?

Problem with same view multiple times

I'm trying to find a way to show the same view but with different input object at the same time to make comparisons. I can't find a way to do this. There is any way to do this?

Thanks in advance

Closing with application.close()

Hey, i dont want to fork the project just for this, i have made some changes but are personal ones, like remove all logging dependencies and just use commons-logging and log4j, but i dont think anyone are interested in that.

Ok the issue is with closing the app from close method in the DefaultApplication. Spring 3 has a new feature (well i dont know if it is new) where all beans by default are inferred by a dispose method called close (with no arguments). So spring register that dispose method in application bean, then when we call application.close(), it closes the windowManager, and then the context. Context is then marked as being closed but when it disposes the bean 'application' (because of the inferred method) close method is called again, fetching beans that does not exist, creating them but without injecting autowired properties, so a null pointer exception is raised.

The solution is simple, just marking the destroyMethof in the application bean declaration empty, like this:

@bean(destroyMethod="")
@OverRide public Application application() {
return new DefaultApplication();
}

I did not know how to override that behavior, if in the overriden method i put the annotation @bean again, spring register two beans with the same id, the last processed wins, but the last is the declared in the abstract class, so we do not resolve anything.

I do not check if other beans with close method in valkyrie have the same issues, it perhaps not, but i let you know if i found something.

Thanks for reading this and for my bad english.

About my pull request and another stuff

Hey, i would like to be a collaborator of this project because i like it very much, but as ndeverge i have no much time, it is possible?

What will happen with my pull request? i know it is very simple but dont like see there over and over.

Software license and groupId

Hi there,

I just realized that the groupId is "dk.navicon" which points to a private company in Denmark. Does it really make sense to do that? I mean this is an open source software no? What is the license for this fork? I expected it to be Apache licensed since it is a derivative work from an Apache Licensed software no? I don't want to find myself by surprise having to pay royalties to navicon :P

Best regards,
Giovanni

Add MDI support

After a lot of trial and error I realize it is not really possible to have MDI out of the box. The furthest I could get was setting a MultiViewPageDescriptor as part of my application lifecycle but this only means I simply have a SDI application with multiple views and not really JInternalFrames when I activate a view using: applicationConfig.windowManager().getActiveWindow().getPage().showView(ViewID);

Migrating from Spring RCP to Valkyrie RCP

I'm trying to migrate from Spring to Valkyrie and I'm having some difficulties with some of the changes, especially with those considering Application and ApplicationServicesLocator.
So, what is the correct way to get a reference to the current application instance and also, what is the correct way to get a reference to ApplicationConfig (which seems to be the replacement for ApplicationServicesLocator)?
In my Spring RCP implementation, I have extended the Application class and use the instance() method on many static getters. ApplicationServicesLocator is also used quite a lot.

And if there's anything else I should now about migrating to Valkyrie, that would of course be most helpful. Especially if there's anything that's related to how the application is initialized. The current implementation uses ClassPathXmlApplicationContext to create the ApplicationContext from the XML configs and XML configs are also where the application bean has been defined.

Quick start pom.xml for Valkyrie-RCP dependant app

After some struggle creating a new application on top of Valkyrie-RCP I realize it is quite hairy to setup and have all the configurations/aspectj waivers etc etc aligned with Valkyrie-RCP. The cause of all exceptions and troubles I have had are because the guesswork around setting the new pom.xml . Looking at e.g. sample simple is easy because it inherits all the settings, dependencies and plugins from the parent pom but starting up correctly a new App on top of Valkyrie-RCP is nothing like trivial.

I also tried generating a new project using Valkyrie RCP archetype to copy its pom.xml but it also fails with +/- the same kind of error I get:

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 263: 116
Choose dk.navicon:valkyrie-rcp-archetype version:
1: 1.1
2: 1.2-SNAPSHOT
Choose a number: 2: 2
Define value for property 'groupId': : test
Define value for property 'artifactId': : test
Define value for property 'version': 1.0-SNAPSHOT: : 1.2-SNAPSHOT
Define value for property 'package': test: :
Confirm properties configuration:
groupId: test
artifactId: test
version: 1.2-SNAPSHOT
package: test
Y: :

/Users/bravegag/code/test$ tree
.
├── pom.xml
├── src
│   └── main
│   ├── java
│   │   └── test
│   │   ├── ApplicationRunner.java
│   │   ├── SimpleApplicationConfig.java
│   │   └── SimpleCommandConfig.java
│   └── resources
│   ├── META-INF
│   │   └── valkyrie
│   │   └── context.xml
│   └── logback.xml
└── target
├── classes
│   ├── META-INF
│   │   └── valkyrie
│   │   └── context.xml
│   ├── builddef.lst
│   ├── logback.xml
│   └── test
│   ├── ApplicationRunner.class
│   ├── SimpleApplicationConfig.class
│   └── SimpleCommandConfig.class
└── generated-sources
└── annotations

14 directories, 12 files
/Users/bravegag/code/test$ mvn clean install exec:java -Dexec.mainClass="test.test.ApplicationRunner"
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Valkyrie Project Archetype 1.2-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ test ---
[INFO] Deleting /Users/bravegag/code/test/target
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ test ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ test ---
[INFO] Compiling 3 source files to /Users/bravegag/code/test/target/classes
[INFO]
[INFO] --- aspectj-maven-plugin:1.3.1:compile (default) @ test ---
[ERROR] can't determine superclass of missing type org.springframework.transaction.interceptor.TransactionAspectSupport
when batch building BuildConfig[null] #Files=3 AopXmls=#0
[Xlint:cantFindType]
[ERROR] can't determine superclass of missing type org.springframework.aop.interceptor.AsyncExecutionAspectSupport
when batch building BuildConfig[null] #Files=3 AopXmls=#0
[Xlint:cantFindType]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.510s
[INFO] Finished at: Fri May 10 17:19:32 CEST 2013
[INFO] Final Memory: 14M/528M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.3.1:compile (default) on project test: Compiler errors:
[ERROR] error can't determine superclass of missing type org.springframework.transaction.interceptor.TransactionAspectSupport
[ERROR] when batch building BuildConfig[null] #Files=3 AopXmls=#0
[ERROR] [Xlint:cantFindType]
[ERROR] error can't determine superclass of missing type org.springframework.aop.interceptor.AsyncExecutionAspectSupport
[ERROR] when batch building BuildConfig[null] #Files=3 AopXmls=#0
[ERROR] [Xlint:cantFindType]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

NPE when trying to show page

Hi!
I get a NPE for getPage().getId().equals() in AbstractApplicationWindow, the "id" is not set and I can't understand how to do it.
Here is the config:

@bean
public PageDescriptor triggerViewPage() {
VLDockingPageDescriptor pageDescriptor = new VLDockingPageDescriptor();
pageDescriptor.setViewDescriptors(Arrays.asList(new String[]{"triggerView"}));
pageDescriptor.setId("testPage1");
return pageDescriptor;
}
@bean
public ViewDescriptor triggerView() {
VLDockingViewDescriptor view = new VLDockingViewDescriptor("triggerView", TriggerView.class);
return view;
}


pageDescriptor.setId("testPage1") doesn't seem to have any effect, would be helpful with a example with pages in "VLDockingSampleApplicationConfig".

AbstractApplicationWindow:
..
..
@OverRide
public void showPage(String pageId) {
if (pageId == null)
throw new IllegalArgumentException("pageId == null");

    if (getPage() == null || !getPage().getId().equals(pageId)) {
        showPage(createPage(this, pageId));
    } else {
        // asking for the same page, so ignore
    }
}

Remove @Configurable from code

With the migration of Spring 3.0 we changed the servicelocator in favor of Spring's @configurable system. In hindsight, this may not have been the right call. This makes testing quite difficult without a Spring container and it requires the build and IDE to support compile-time weaving of aspects.

My alternative would be to add a repository class that has a static reference to the applicationconfig that is assigned at startup of the application. This static reference can then be used to use managed services in non-managed beans.

ApplicationConfig NULL in view

Hi!

Was really happy when I discovered that there was as Spring 3.X version och Spring Richclient, so a big thank you to this project.
I have converted an application from 1.X (with heavy xml-config) and have managed to get the app up and running, but when I try to show a view I get a NPE in createControl() for:

chkDisplayOnlyErrors = getApplicationConfig().componentFactory().createCheckBox("Visa endast fel");

Been trying to figure this out for almost a day now, but can't find the answer.
I have in my opinion, the same config as in http://grepcode.com/project/repo1.maven.org/maven2/dk.navicon/valkyrie-rcp-vldocking-sample/.

Here is a print screen of the view class object taken while debugging createControl(), I find it strange that the applicationConfig is null for thew view object, which is the source of the NPE.

image

Sorry if this is the wrong forum for questions..

ValkyrieRepository race condition

ValkyrieRepository must have been initialized in the spring context before any ActionCommand as they call ValkyrieRepository.getInstance()... via the constructor / afterPropertiesSet(). Otherwise, ValkyrieRepository.getInstance() will hang on the latch.
The test suite actually hangs on the latch on some occasions.
Currently I have no idea for a solution myself. Don't know if there are some clever container tricks, e.g. load a minimal ValkyrieRepository context first and then add the "main" context as a child context to that or something similar in that direction.

NPE executing any of the sample apps

Hello,

I have a clone of master from today and all builds fine except two missing jars that I have to install manually:

$M2_HOME/bin/mvn -e install:install-file -Dfile=./l2fprod-common-7.3-20070317.jar -DartifactId=l2fprod-common-all -DgroupId=com.l2fprod -Dversion=7.3 -Dpackaging=jar

$M2_HOME/bin/mvn -e install:install-file -Dfile=./vldocking-2.1.4.jar -DartifactId=vldocking -DgroupId=com.vlsolutions -Dversion=2.1.4 -Dpackaging=jar -Dpom=vldocking-2.1.4.pom

I'm on Mac OS X and have the following environment:

/Users/bravegag/Dropbox/code/valkyrie-rcp-master$ $M2_HOME/bin/mvn -version
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 14:51:28+0100)
Maven home: /opt/noarch/maven/3.0.5
Java version: 1.6.0_45, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.7.5", arch: "x86_64", family: "mac"

When I run the valkyrie-rcp-showcase-sample (also happens for other samples) via Eclipse I get intermittently the following NPE:

9:25,360 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:19:25,360 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:/Users/bravegag/Dropbox/code/valkyrie-rcp-master/valkyrie-rcp-core/target/test-classes/logback-test.xml]
11:19:25,438 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:19:25,444 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
11:19:25,448 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
11:19:25,510 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:19:25,510 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:19:25,510 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:19:25,511 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - ROOT level set to WARN
11:19:25,511 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]

3457 [main] ERROR org.valkyriercp.application.exceptionhandling.AbstractLoggingExceptionHandler - Uncaught throwable handled.
java.lang.IllegalStateException: Application start thrown an exception: null
at org.valkyriercp.application.support.ApplicationLauncher.launchMyRichClient(ApplicationLauncher.java:265) ~[classes/:na]
at org.valkyriercp.application.support.ApplicationLauncher.(ApplicationLauncher.java:130) ~[classes/:na]
at org.valkyriercp.application.support.ApplicationLauncher.(ApplicationLauncher.java:102) ~[classes/:na]
at org.valkyriercp.sample.showcase.ShowcaseRunner.main(ShowcaseRunner.java:8) ~[classes/:na]
java.lang.NullPointerException: null
at org.valkyriercp.dialog.CompositeDialogPage.addPage(CompositeDialogPage.java:81) ~[classes/:na]
at org.valkyriercp.dialog.CompositeDialogPage.addForm(CompositeDialogPage.java:94) ~[classes/:na]
at org.valkyriercp.security.LoginCommand.doExecuteCommand(LoginCommand.java:50) ~[classes/:na]
at org.valkyriercp.command.support.ActionCommand.execute(ActionCommand.java:170) ~[classes/:na]
at org.valkyriercp.application.config.support.DefaultApplicationLifecycleAdvisor.onCommandsCreated(DefaultApplicationLifecycleAdvisor.java:83) ~[classes/:na]
at org.valkyriercp.application.support.AbstractApplicationWindow.(AbstractApplicationWindow.java:46) ~[classes/:na]
at org.valkyriercp.application.support.AbstractApplicationWindow.(AbstractApplicationWindow.java:37) ~[classes/:na]
at org.valkyriercp.application.support.DefaultApplicationWindow.(DefaultApplicationWindow.java:14) ~[classes/:na]
at org.valkyriercp.application.support.DefaultApplicationWindowFactory.createApplicationWindow(DefaultApplicationWindowFactory.java:30) ~[classes/:na]
at org.valkyriercp.application.support.DefaultApplication.createNewWindow(DefaultApplication.java:83) ~[classes/:na]
at org.valkyriercp.application.support.DefaultApplication.openWindow(DefaultApplication.java:72) ~[classes/:na]
at org.valkyriercp.application.support.DefaultApplication.start(DefaultApplication.java:56) ~[classes/:na]
at org.valkyriercp.application.support.ApplicationLauncher$1.run(ApplicationLauncher.java:256) ~[classes/:na]
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199) ~[na:1.6.0_45]
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:708) ~[na:1.6.0_45]
at java.awt.EventQueue.access$400(EventQueue.java:82) ~[na:1.6.0_45]
at java.awt.EventQueue$2.run(EventQueue.java:669) ~[na:1.6.0_45]
at java.awt.EventQueue$2.run(EventQueue.java:667) ~[na:1.6.0_45]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_45]
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) ~[na:1.6.0_45]
at java.awt.EventQueue.dispatchEvent(EventQueue.java:678) ~[na:1.6.0_45]
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) ~[na:1.6.0_45]
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) ~[na:1.6.0_45]
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) ~[na:1.6.0_45]
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) ~[na:1.6.0_45]
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) ~[na:1.6.0_45]
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) ~[na:1.6.0_45]

Autowired properties on inner classes

I dont know if this is the right place to public this question, but i dont know where to ask it.
I am a active user of spring-rcp, and now i want to learn valkyrie. It has many changes that are not documented, not only in functionality but in concepts too. I dont not understand all of them very well until know, but writing and debugging code is a fact that i am doing.

My question is more about spring framework. Now in valkyrie almost all properties in Forms, Views, Widgets, Dialogs, etc are autowired, and if i remember correctly the bean must be managed to be a candidate for that purpose, this tell us that we need to define all as managed beans growing our configuration classes to the infinite. Also this restrict us to define inner classes, which i use a lot. That's one part, the second one is that spring allow us to annotate an object with @configurable, which says that this lets the container to treat that objects as managed without being one, in other words, inject properties, notify of aware interfaces, events, etc. Based on the doc, this is possible using aop overriden the new operator for a factory class and then instantiate the classes (that's what i understood). Ok until here everything is fine, but then i ecounter this:

  • in the LogginCommand, the execute method declares an inner class of a dialog for showing credentials capture component, and the autowired properties are injected fine.
  • when i declare an inner class in some view i can not get these properties to get autowired, not even forms or commands.

So what is the difference? why that behaviour? Can anybody explain it? I am misunderstanding something?

By now, i will make work-around for dialog, but i'd appreciate any help to get me in the correct path.

thanks for your time.

ApplicationListener doesn't work at all for prototype and @Configurable beans

As e.g., AbstractObjectTable is configurable this is a problem in Valkyrie-RPC as well.

When an AbstractObjectTable is created spring will issue a warning like

37502 [main] WARN org.springframework.context.support.AbstractApplicationContext$ApplicationListenerDetector - Inner bean 'x.y.z.SummaryTable' implements ApplicationListener interface but is not reachable for event multicasting by its containing ApplicationContext because it does not have singleton scope. Only top-level listener beans are allowed to be of non-singleton scope.

See

https://jira.springsource.org/browse/SPR-9391

and

https://jira.springsource.org/browse/SPR-9387

For more information.

Every time an event is published in the spring context a new instance of the AbstractObjectTable (e.g. SummaryTable) will be created. To verify just put a break point in the constructor of the table and then publish some events.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.