ztkmkoo / dss Goto Github PK
View Code? Open in Web Editor NEWAsynchronous distributed server system (dss)
License: MIT License
Asynchronous distributed server system (dss)
License: MIT License
See io.github.ztkmkoo.dss.core.network.rest.DssRestChannel
public class DssRestChannel {
public DssRestChannel() {
}
public Channel bind(ServerBootstrap serverBootstrap, DssRestChannelProperty dssRestChannelProperty, DssRestChannelInitializer dssRestChannelInitializer) throws InterruptedException {
Objects.requireNonNull(serverBootstrap);
Objects.requireNonNull(dssRestChannelProperty);
Objects.requireNonNull(dssRestChannelInitializer);
return ((ServerBootstrap)((ServerBootstrap)serverBootstrap.channel(NioServerSocketChannel.class)).handler(new LoggingHandler(LogLevel.DEBUG))).childHandler(dssRestChannelInitializer).bind(dssRestChannelProperty.getHost(), dssRestChannelProperty.getPort()).sync().channel();
}
}
It config netty loglevel default as debug level.
By the way, i can config the log level in the service project with create new logback.xml file(so we can see thenetty debug log), but it is necessary to make config log level possible.
How bout implementing a new log level enumeration mapping netty log level(io.netty.handler.logging.LogLevel) and let's pass the parameter to DssRestServer constructure.
https://github.com/ztkmkoo/dss/network/dependencies
if we set the dependency version in prpoerty, the github dependency not read it.
I dont know if it is a bug.
1, add the version directly to the dependency. => it is hard to manage the library versions
2. report bug or fix the bug (reporting here maybe https://github.community/ )
3. googling the solution
4. some way
resolve non static path(like request param or path variable in spring framework)
Lets rest server can run with ssl certificate(like https protocol).
Let netty channel works with ssl context.
Please discuss about upgrading junit version 4 to 5, and if need please commit codes.
After upgrade, make sure all the origin tests run.
The version of jdk is 1.8 now,
Try to upgrade to jdk 11.
test gitter.
will close it after test.
Describe the bug
The http rest response is not expected value. for dss-0.0.2.
my test code:
public class Application {
public static void main(String[] args) throws InterruptedException {
DssRestServer dssRestServer = new DssRestServer("127.0.0.1", 8181);
dssRestServer
.addDssRestService(new MyService())
.addDssRestService(new YourService());
dssRestServer.start();
}
}
public class MyService implements DssRestActorService {
public String getName() {
return "myService";
}
public String getPath() {
return "/my/service";
}
public DssRestMethodType getMethodType() {
return DssRestMethodType.GET;
}
public DssRestContentInfo getConsume() {
return DssRestContentInfo.APPLICATION_JSON_UTF8;
}
public DssRestContentInfo getProduce() {
return DssRestContentInfo.APPLICATION_JSON_UTF8;
}
public DssRestServiceResponse handling(DssRestServiceActorCommandRequest commandRequest) {
final String myName = commandRequest.getContent();
final MyServiceResponse response = new MyServiceResponse();
response.setResult("My service is " + myName + " service");
return response;
}
}
Expected behavior
Expected response like
{
"result" : "My service is Kebron service"
}
Desktop (please complete the following information):
I have tried following the Project Tutorial(KR) in wiki but it didn't work.
I set up the project like this
dss-server
0.3.0.0
<- which is previous version
dss-server
0.3.1.0
<- which is current version
dss-server
0.0.3
<- which is guided version in Project Tutorial(KR)
but all of them is not work.
this is error log
"C:\Program Files\Java\jdk-11.0.7\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.3\lib\idea_rt.jar=55031:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\door6\Desktop\contributon\dss\dss-server\target\classes;C:\Users\door6\Desktop\contributon\dss\dss-core\target\classes;C:\Users\door6.m2\repository\io\netty\netty-all\4.1.45.Final\netty-all-4.1.45.Final.jar;C:\Users\door6.m2\repository\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;C:\Users\door6.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;C:\Users\door6.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;C:\Users\door6.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\door6.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\door6.m2\repository\com\typesafe\akka\akka-actor-typed_2.13\2.6.3\akka-actor-typed_2.13-2.6.3.jar;C:\Users\door6.m2\repository\org\scala-lang\scala-library\2.13.1\scala-library-2.13.1.jar;C:\Users\door6.m2\repository\com\typesafe\akka\akka-actor_2.13\2.6.3\akka-actor_2.13-2.6.3.jar;C:\Users\door6.m2\repository\com\typesafe\config\1.4.0\config-1.4.0.jar;C:\Users\door6.m2\repository\org\scala-lang\modules\scala-java8-compat_2.13\0.9.0\scala-java8-compat_2.13-0.9.0.jar;C:\Users\door6.m2\repository\com\typesafe\akka\akka-slf4j_2.13\2.6.3\akka-slf4j_2.13-2.6.3.jar;C:\Users\door6.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar io.github.ztkmkoo.dss.server.rest.DssRestServer
22:50:38,851 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
22:50:38,852 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
22:50:38,854 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Users/door6/Desktop/contributon/dss/dss-server/target/classes/logback.xml]
22:50:39,057 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
22:50:39,059 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
22:50:39,073 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
22:50:39,189 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
22:50:39,189 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
22:50:39,189 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
22:50:39,191 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
22:50:39,191 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
22:50:39,192 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
22:50:39,195 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@1fe20588 - Registering current configuration as safe fallback point
2020-07-21 22:50:40 [INFO ] [Slf4jLogger.scala]applyOrElse(104) : Slf4jLogger started
2020-07-21 22:50:40 [INFO ] [DssRestServer.java]start(69) : Create actor system: akka://system
2020-07-21 22:50:40 [INFO ] [DssRestChannelInitializer.java]dssRestChannelInitializer(121) : Setup dssRestChannelInitializer
2020-07-21 22:50:40 [INFO ] [DssRestChannelInitializer.java]newAllocatedDssRestHandler(57) : freeHandlerQueue is empty. try to initialize new one: rest-handler-1
2020-07-21 22:50:40 [WARN ] [DssRestMasterActor.java]dssRestPathResolver(35) : Service list is empty
2020-07-21 22:50:40 [INFO ] [DssRestChannelInitializer.java]newAllocatedDssRestHandler(57) : freeHandlerQueue is empty. try to initialize new one: rest-handler-2
2020-07-21 22:50:40 [INFO ] [DssRestHandler.java]dssRestHandler(201) : Setup dssRestHandler: rest-handler-1
2020-07-21 22:50:40 [INFO ] [DssRestHandler.java]dssRestHandler(201) : Setup dssRestHandler: rest-handler-2
class DssHttpSimpleHandler extends AbstractDssHttpHandler {
// ...
@Override
protected void handlingHttpRequest(ChannelHandlerContext ctx, HttpRequest request, String content) {
masterActor.tell(new HttpMessages.Request(ctx, request.uri(), content));
}
// ...
}
Tell master actor the non serializable object.
Please resolve it.
dss-server -> dss-core::0.0.1-SNAPSHOT
but dss-core::0.0.1-SNAPSHOT not deployed to maven central..
So the tutorial project could not find artifact io.github.ztkmkoo:dss-core:jar:0.0.1-SNAPSHOT..
for deploy to maven central, i add maven-gpg-plugin to dss-server module.
There are 2 issue format now.
And its so bad..
Please re-design the format and add some new useful format.
Add jdbc data access layer interface.
In nowaday dss system, we need impletment singleton DAO(data access object) and call it in service actor.
It is so inefficient that add a data acess layer interface and user implement it, at last we run the data access actor in the background can work greate.
update readme.md (old milestone info)
maven central.
Ref https://jojoldu.tistory.com/161 => https://central.sonatype.org/pages/ossrh-guide.html
Some codes do not follow the code style guide rule.
Find the mistake and patch it.
Here is the code style rule in korean.
https://github.com/ztkmkoo/dss/wiki/Code-Style(KR)
According to #35,
the package name(group id) should be changed to ensure greater consistency.
Project lombok is very useful java library helps us automatically plugs into your editor and build tools.
https://projectlombok.org/
But, there are some known problems. (like @DaTa annotations, so dangerous sometimes)
Try to add an config to make it safe.
Just append tutorial link (EN + KR) to README.md
Recently, i know the github pakcage function (https://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-apache-maven-for-use-with-github-packages). It is like maven central repository, but much easier.
I'm not sure it is safe(it was a beta version last year), but it is worth to do.
On sonarqube service, the version of Java (1.8.0_252) you have used to run this analysis is deprecated and we will stop accepting it from October 2020.
So we have upgrade the jdk after #63
https://sonarcloud.io/documentation/upcoming/
The version of Java installed in the scanner environment should be upgraded to at least Java 11 by October 2020. Pre-11 versions of Java are already deprecated and scanners using them will stop functioning after October 2020. This refers specifically to the JDK or JRE installed and used in the context where your SonarCloud scanner analysis tool is running. This may be your local build environment or your CI service. Should you need some hints on how to do this, please check our help page.
Please add rest server tests to dss-server module.
Check if all the functions works, if not please report the bugs.
You may need to add some http client dependency and complete the test.
Recommended tests:
#54 I tried to make netty and akka work together but failed.
I have an idea that if i design Channel, EventLopp and other class, can make netty channel work on akka actor.
I will make the boss actor and working actor to implement netty bossGroup and workerGroup.
make rest module handling content-type under below:
add CODE_OF_CONDUCT.md file with Contributor Covenant template. Will improve it later some day.
There is a big flaw in this dss server system.
Netty handler have the blocking codes with concurrent hash map.
like io.github.ztkmkoo.dss.core.network.rest.handler.DssRestHandler, i have to handle the Netty ChannelHandlerContext with the concurrent container to handling receive also send action.
Please resolve it.
It would be a big upgrade.
add example sub module to the project.
Describe the bug
@Test
public void testSsl() throws Exception {
final PrivateKey privateKey = loadPrivateKeyFromFile(loadFromTestResources("ssl/private.der"));
final X509Certificate certificate = loadX509CertificateFromFile(loadFromTestResources("ssl/private.crt"));
final SslContext sslContext = SslContextBuilder.forServer(privateKey, SSL_PASSWORD, certificate).build();
final DssRestServer dssRestServer = new DssRestServer("127.0.0.1", 8181, true, sslContext);
dssRestServer
.addDssRestService(new TestService("test", "/hi", DssRestMethodType.GET));
stopDssRestServerAfterActivated(dssRestServer, 10 ,15);
dssRestServer.start();
assertTrue(dssRestServer.isShutdown());
}
When I fork this repository and install, I got error in this test code
-------------------------------------------------------
T E S T S
-------------------------------------------------------
java.io.FileNotFoundException: C:\Users\����??\Documents\GitHub\dss\dss-server\target\jacoco.ex (������ ��θ� ã�� �� �����ϴ�)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at org.jacoco.agent.rt.internal_14f7ee5.output.FileOutput.openFile(FileOutput.java:67)
at org.jacoco.agent.rt.internal_14f7ee5.output.FileOutput.startup(FileOutput.java:49)
at org.jacoco.agent.rt.internal_14f7ee5.Agent.startup(Agent.java:122)
at org.jacoco.agent.rt.internal_14f7ee5.Agent.getInstance(Agent.java:50)
at org.jacoco.agent.rt.internal_14f7ee5.PreMain.premain(PreMain.java:45)
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 sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Running io.github.ztkmkoo.dss.server.rest.DssRestServerTest
10:34:13,857 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
10:34:13,858 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
10:34:13,858 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Users/%ec%84%b8%ec%9d%bc/Documents/GitHub/dss/dss-server/target/classes/logback.xml]
10:34:14,099 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
10:34:14,103 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
10:34:14,161 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
10:34:14,387 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
10:34:14,387 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
10:34:14,387 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
10:34:14,390 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
10:34:14,390 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
10:34:14,392 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
10:34:14,395 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@3954d008 - Registering current configuration as safe fallback point
2020-07-20 10:34:18 [INFO ] [Slf4jLogger.scala]applyOrElse(104) : Slf4jLogger started
2020-07-20 10:34:19 [INFO ] [DssRestServer.java]start(63) : Create actor system: akka://system
2020-07-20 10:34:19 [INFO ] [DssRestChannelInitializer.java]dssRestChannelInitializer(121) : Setup dssRestChannelInitializer
2020-07-20 10:34:19 [INFO ] [DssRestChannelInitializer.java]newAllocatedDssRestHandler(57) : freeHandlerQueue is empty. try to initialize new one: rest-handler-1
2020-07-20 10:34:19 [INFO ] [DssRestChannelInitializer.java]newAllocatedDssRestHandler(57) : freeHandlerQueue is empty. try to initialize new one: rest-handler-2
2020-07-20 10:34:19 [INFO ] [DssRestPathResolver.java]lambda$null$0(62) : Add mapping GET /hi to test
2020-07-20 10:34:19 [INFO ] [DssRestHandler.java]dssRestHandler(201) : Setup dssRestHandler: rest-handler-2
2020-07-20 10:34:19 [INFO ] [DssRestHandler.java]dssRestHandler(201) : Setup dssRestHandler: rest-handler-1
2020-07-20 10:34:23 [INFO ] [DssRestServer.java]stop(95) : Channel try to close. [Active: true][Open: true]
2020-07-20 10:34:23 [INFO ] [DssRestServer.java]stop(101) : Actor system try to terminate
2020-07-20 10:34:23 [INFO ] [DssRestServer.java]start(80) : Shut down worker and boss group gracefully
2020-07-20 10:34:23 [INFO ] [Slf4jLogger.scala]applyOrElse(104) : Slf4jLogger started
2020-07-20 10:34:23 [INFO ] [DssRestChannelInitializer.java]dssRestChannelInitializer(121) : Setup dssRestChannelInitializer
2020-07-20 10:34:23 [INFO ] [DssRestServer.java]start(63) : Create actor system: akka://system
2020-07-20 10:34:23 [INFO ] [DssRestChannelInitializer.java]newAllocatedDssRestHandler(57) : freeHandlerQueue is empty. try to initialize new one: rest-handler-3
2020-07-20 10:34:23 [INFO ] [DssRestChannelInitializer.java]newAllocatedDssRestHandler(57) : freeHandlerQueue is empty. try to initialize new one: rest-handler-4
2020-07-20 10:34:23 [INFO ] [DssRestHandler.java]dssRestHandler(201) : Setup dssRestHandler: rest-handler-3
2020-07-20 10:34:23 [INFO ] [DssRestPathResolver.java]lambda$null$0(62) : Add mapping GET /hi to test
2020-07-20 10:34:23 [INFO ] [DssRestHandler.java]dssRestHandler(201) : Setup dssRestHandler: rest-handler-4
2020-07-20 10:34:23 [INFO ] [DssRestPathResolver.java]lambda$null$0(62) : Add mapping GET /hello to test2
2020-07-20 10:34:24 [INFO ] [DssRestServer.java]lambda$createActorSystem$0(89) : Actor system terminated.
2020-07-20 10:34:24 [INFO ] [DssRestServer.java]stop(95) : Channel try to close. [Active: true][Open: true]
2020-07-20 10:34:24 [INFO ] [DssRestServer.java]stop(101) : Actor system try to terminate
2020-07-20 10:34:24 [INFO ] [DssRestServer.java]start(80) : Shut down worker and boss group gracefully
Tests run: 3, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 10.656 sec <<< FAILURE!
testSsl(io.github.ztkmkoo.dss.server.rest.DssRestServerTest) Time elapsed: 0.019 sec <<< ERROR!
java.io.FileNotFoundException: C:\Users\%ec%84%b8%ec%9d%bc\Documents\GitHub\dss\dss-server\target\test-classes\ssl\private.der (지정된 경로를 찾을 수 없습니다)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at io.github.ztkmkoo.dss.server.rest.DssRestServerTest.loadPrivateKeyFromFile(DssRestServerTest.java:148)
at io.github.ztkmkoo.dss.server.rest.DssRestServerTest.testSsl(DssRestServerTest.java:82)
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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
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.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
java.io.FileNotFoundException: C:\Users\����??\Documents\GitHub\dss\dss-server\target\jacoco.ex (������ ��θ� ã�� �� �����ϴ�)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at org.jacoco.agent.rt.internal_14f7ee5.output.FileOutput.openFile(FileOutput.java:67)
at org.jacoco.agent.rt.internal_14f7ee5.output.FileOutput.writeExecutionData(FileOutput.java:53)
at org.jacoco.agent.rt.internal_14f7ee5.Agent.shutdown(Agent.java:137)
at org.jacoco.agent.rt.internal_14f7ee5.Agent$1.run(Agent.java:54)
2020-07-20 10:34:24 [INFO ] [DssRestServer.java]lambda$createActorSystem$0(89) : Actor system terminated.
Results :
Tests in error:
testSsl(io.github.ztkmkoo.dss.server.rest.DssRestServerTest): C:\Users\%ec%84%b8%ec%9d%bc\Documents\GitHub\dss\dss-server\target\test-classes\ssl\private.der (지정된 경로를 찾을 수 없습니다)
Tests run: 3, Failures: 0, Errors: 1, Skipped: 0
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.