fonimus / ssh-shell-spring-boot Goto Github PK
View Code? Open in Web Editor NEWSpring shell in spring boot application over ssh
Home Page: https://github.com/fonimus/spring-boot-ssh-shell
License: Apache License 2.0
Spring shell in spring boot application over ssh
Home Page: https://github.com/fonimus/spring-boot-ssh-shell
License: Apache License 2.0
Hi,
did you ever managed to open a ssh connection to your service and immediately execute a command?
In my case, I have a microservice (running in k8s). I want do set up a CronJob, which should do something like
sshpass --p password ssh -o StrictHostKeyChecking=no me@myk8sapp mycommand
Even without this CronJob part if I'm trying to connect manually from my terminal (see code block below) the result is the same.
It should open a new ssh connection and run 'mycommand'. But it's not working for me.
Actually I'm still using version 1.8, and iin this version the result is a continuous exception message and if I'm waiting a bit there we're running OOM
`λ ssh [email protected] -p 8022 "help"
Password authentication
Password:
Please type help
to see available commands
java.lang.NullPointerException
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
java.lang.NullPointerException
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
java.lang.NullPointerException
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
java.lang.NullPointerException
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
java.lang.NullPointerException
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
java.lang.NullPointerException
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.`
This is caused 'deep' into 'jline/InteractiveShellApplicationRunner.java:115', where it tries to get the terminals type (which is null -> NPE):
jline/utils/AttributedCharSequence.java:57
windows = terminal.getType().toLowerCase(Locale.ENGLISH) .startsWith(AbstractWindowsTerminal.TYPE_WINDOWS);
If I use your newer release 2.0, there is no NPE anymore in this case, but the command is not executed anyways. Also its 'strange', that the styling is not applied in this case, so if I connection 'normally' there is tab completion, highliting and styling (e.g. red text if command is misspelled), but if I connection with inital command then this command is not executed, and other features like tab completion and highlighting/styles are not working.
Have you any idea how to solve this?
Thanks,
Jan
Create own PromptProvider
for example:
@Component
public class UsernamePromptProvider implements PromptProvider {
@Override
public AttributedString getPrompt() {
...
return new AttributedString(username + "::>", DEFAULT.foreground(RED));
}
}
Actual:
sshPromptProvider
used https://github.com/fonimus/ssh-shell-spring-boot/blob/master/starter/src/main/java/com/github/fonimus/ssh/shell/SshShellAutoConfiguration.java#L174Expected:
UsernamePromptProvider
as PromptProvider
I'm not able to pass command on ssh connect.
ssh root@localhost "help"
Is there a way to get this work?
Hi all,
first of all, I'd like to thank you for this procject, it seems to be a very useful continuation of springs shell project.
But after using it a few days, I start wondering why the PostProcessor interface does not allow other return types as String
. Is there any reason, espacially since the TypePostProcessorResultHandler handle results as Object
. DOn't you think, that it would be much easier to allow Objects as return Type or maybe even better something generic like
public interface PostProcessor<TIn, TOut> {
String getName();
TOut process(TIn result, List<String> parameters) throws PostProcessorException;
}
With this change it would be a lot easier to chain post processors, since it's currently not possible to do stuff like:
my-command parameter1 parameter2 | postprocessor1 returnAsDate | postprocessor2readDateAndConvert2OtherTimezone
BR,
JaR
Hello!
I know that this is more generic question but i cant figure out how to change the default directory where the @shellMethod tries to find files and provide autocompletion for files. For security reasons I want to set a default directory where user place their scripts and this should not be in project home directory.
Thank you!
I was looking for a way to access the LANG
environment variable passed to SshShellCommandFactory
via a org.apache.sshd.server.Environment
from the SSH client and stored as a private sshEnv
field in SshShellRunnable
so I could returned localized messages in my app, but wasn't finding a way to do that.
I was working under some time constrains and ended up extending SshShellCommandFactory
so I could capture the SSH environment and then return it later, which allows me to get the locale of the client. I wondered if you actually had a way to get the SSH environment easily that I missed?
hello,
I hope you are doing well. I like to ask you if there is way to disable the cbc mode cipher encryption in Apache Mina SSHD Java library used in ssh-shell-spring-boot.
This can be done like this
SshServer sshServer = SshServer.setUpDefaultServer();
ServerBuilder serverBuilder = sshServer.builder();
List ciphers = serverBuilder.ciphers();
ciphers.removeIf(cipher -> cipher.contains("/cbc/"));
sshServer.setServerBuilder(serverBuilder);
sshServer.start();
Is there a way to expose the server used in your library (https://github.com/fonimus/ssh-shell-spring-boot/blob/main/starter/src/main/java/com/github/fonimus/ssh/shell/SshShellConfiguration.java)
and add the above configuration ?
Thank you
Thanasis
Description:
The local shell is not usable when adding the ssh shell dependency
How to reproduce:
Have both these dependencies on your project:
<dependency>
<groupId>com.github.fonimus</groupId>
<artifactId>ssh-shell-spring-boot-starter</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-starter</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
Then try to use the local shell, it will not work, but the remote shell will. If you remove the ssh shell dependency it will still work
Hello,
I hope i am finding you happy and well :) I have a problem that you might be able to help me. After I upgraded spring boot parent to 2.7.5 and ssh-shell-spring-boot-starter to 2.0.2 and made some code changes that were needed my app works fine but i get this strange error in my logs :
No command found for '--spring.config.location=C:/Users/barekas/Documents/Repos/ztc_cli_connector/src/cli/target/cliServer-bin/cliServer/config/application-dev.yml'
org.springframework.shell.CommandNotFound: No command found for '--spring.config.location=C:/Users/barekas/Documents/Repos/ztc_cli_connector/src/cli/target/cliServer-bin/cliServer/config/application-dev.yml'
at org.springframework.shell.Shell.evaluate(Shell.java:231)
at com.github.fonimus.ssh.shell.ExtendedShell.evaluate(ExtendedShell.java:112)
at com.github.fonimus.ssh.shell.ExtendedShell.run(ExtendedShell.java:102)
at com.github.fonimus.ssh.shell.ExtendedShell.run(ExtendedShell.java:75)
at org.springframework.shell.jline.NonInteractiveShellRunner.run(NonInteractiveShellRunner.java:104)
at org.springframework.shell.DefaultShellApplicationRunner.run(DefaultShellApplicationRunner.java:65)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at com.cli.CliStarter.main(CliStarter.java:122)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Also i get some nullpointer exception in my integration tests ...
It seems that it has some problem with my application properties file. Any clue ?
Do you need some info from my application.yml file ?
Thank you,
Thanasis
Hello again :)
I am trying to obtain the password from the objects referenced above. I have tried with this code helper.getAuthentication().getCredentials().toString() but it does not fetch something. I call this from the overidden onEvent(SshShellEvent sshShellEvent) of a SessionListener class that implements SshShellListener.
I need to know the password of the succesful logins.
Is there a way to do this ?
Thank you!
Thanasis
Hello,
I hope you are doing well! I have upgraded my project to spring-boot-starter-parent 2.7.5 and ssh-shell-spring-boot-starter to 2.0.2.
I have done changes needed in order to work propely but after testing my app i have found out that pasting commands work as before in windows environments but in linux the app behaves strangely.
If you paste a command (although it works perfectlty if you write it or if you build it through autocompletion) it does not work until you press enter multiple times. Then after some time it executes the command and prints all these enters.
Is this something known ?
Thank you,
Thanasis
Hello again :)
I am trying to perform ssh tunneling to another machine without exiting ssh-shell but with no success :( is there any feature added or an old one that i miss that i can use? if not is this possible with any other way ?
Thank you very much!
Thanasis
When I set to false, I have an issue
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 2 of constructor in com.vp.hotit.sshd.CommentsCommand required a bean of type 'com.github.fonimus.ssh.shell.SshShellHelper' that could not be found.
- Bean method 'sshShellHelper' not loaded because @ConditionalOnProperty (ssh.shell.enable=true) found different value in property 'ssh.shell.enable'
Action:
Consider revisiting the entries above or defining a bean of type 'com.github.fonimus.ssh.shell.SshShellHelper' in your configuration.
Hi @fonimus ,
Thank you very much for your advice.
Now I am facing a problems about managing sessions. I have to develop an managing feature for administrator, which can show all active sessions and can force shutdown them by their id.
Could you tell me which class can handle this action?
I am looking forward to hearing from you. Thanks a lot.
My settings are:
ssh.shell.enable = false
ssh.shell.port = 9018
ssh.shell.user = root
ssh.shell.password = abc123
ssh.shell.prompt.text = vpid-shell>
The application fail to start:
***************************
APPLICATION FAILED TO START
***************************
Description:
The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| history defined in class path resource [org/springframework/shell/jline/JLineShellAutoConfiguration$HistoryConfiguration.class]
↑ ↓
| org.springframework.shell.jline.JLineShellAutoConfiguration (field private org.springframework.shell.Shell org.springframework.shell.jline.JLineShellAutoConfiguration.shell)
↑ ↓
| shell
↑ ↓
| historyCommand defined in class path resource [org/springframework/shell/standard/commands/StandardCommandsAutoConfiguration.class]
└─────┘
Hi @fonimus ,
Sorry if I bothered you. When I use the history command, I expected all commands which I had typed in this session or this account will be shown. But it's not working like that. If you use another account (ex. user), you can see everything what the admin type before. (All of history was stored in sshShellHistory file.
I don't think it is right when we shared this information for all users.
What do you think about this case?
Hi an issue on sshd core has been introduced with 2.9.0 causing a no such method error for Java 8. Version 2.9.1 should fix the issue.
https://github.com/apache/mina-sshd/blob/master/docs/changes/2.9.1.md
Thank you in advance to fix the dependencies in your project.
Moreove are you aware that new spring shell enables by default an interactive front bocking JVM using spring MVC ? May be you should inform the uses to disable this feature using spring mvc (spring.shell.interactive.enabled=false
)?
Hello again and sorry for raising another issue :)
I am trying to get the username of the user that is connected inside a shell method.
I am using a custom authentication bean @bean("customAuthManager") similar to the one you used in the complete example.
Question 1) How can i get the username inside a shell method ?
Question 2) New users (manager.createUser(User.withUsername("user").password(encoder.encode("thanasis")).roles("USER").build()); ) can be created only on application startup or they can be created dynamically also later in app lifecycle ?
Thank you very much
Hello!
I hope you are doing well and enjoying summer :) I would like your support on the following query.
How to see which ssh algorith is used and how can I change the ssh algorithm ?
Thank you,
Thanasis
Hello,
Sorry for raising another issue but it seems that I need your support again :)
I am trying to get remote interactive session to another machine when user gives a specific ShellMethod that performs ssh tunneling.
For the tunneling part I am using this library : https://github.com/Nordstrom/Remote-Session/blob/master/src/main/java/com/nordstrom/remote/SshUtils.java
I need to provide the InputStream and the OutputStream from SSH-Spring-shell library to the remote session library. Everything works well but upon typing all characters appear 2 times but are send to remote 1 time as they should be.
Here is the simple code I using to implement this :
@ShellMethod("CM_with_nordstrom")
public String ssh_to_cm() throws IOException {
InputStream is = ((SshContext) SshShellCommandFactory.SSH_THREAD_CONTEXT.get()).getTerminal().input();//System.in;
OutputStream os = ((SshContext) SshShellCommandFactory.SSH_THREAD_CONTEXT.get()).getTerminal().output();//System.out;
SshUtils.shell("ssh://root:password@ip", is, os);
return "Ssh tunnel to CM ended";
}
I am setting the Streams correctly ? Any ideas why this duplicaton happens only if I execute this ssh tunneling on top of SSh-Spring-shell library and only if I set the input-output streams as above?
Thank you,
Thanasis
Hi,
I create this issue to report an error on the auto configuration part for the tag 1.5.4.
Here the project compilation
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 10.483 s <<< FAILURE! - in com.github.fonimus.ssh.shell.basic.DemoApplicationWebTest
[ERROR] testApplicationStartup Time elapsed: 0.037 s <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'scriptCommand' defined in URL [jar:file:/C:/workspace/ssh-shell-spring-boot/starter/target/ssh-shell-spring-boot-starter-1.5.4.jar!/com/github/fonimus/ssh/shell/commands/ScriptCommand.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.github.fonimus.ssh.shell.ExtendedShell' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.github.fonimus.ssh.shell.ExtendedShell' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
It seems that you need to update the autoconfiguration to return an ExtendedShell instead of a ExtendedShell.
Moreover there is a cycle injection between the extendedShell and the ScriptCommand. You may been to interface the run or @lazy the injection inside the scriptCommand ?
The strange things is tyour travis build is ok but me and teammates are unable to use it.
Another issue is the integration, with classpath resources inside a real jar the process is not able to retrieve the data.
Caused by: java.io.FileNotFoundException: class path resource [pub_keys] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/C:/m2repo/xxx/xxx/xxx/foo.jat!/pub_keys
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217) ~[spring-core-5.3.3.jar:5.3.3]
Because, the release was not in maven central, I added yours inside our nexus instance. Please this this with a brand new 1.5.5 :) ?
Hi it will be great, if possible that the property authorized-public-keys-file
becomes a Resource to be able to configure for example authorized keys from a remote hosted file or a package file inside a jar.
BR.
Hi @fonimus ,
I hope you're doing well. Now I am trying to use the execution via file feature. But it seems we can only use the file on the server host.
I wanna ask you could I use file from client side to use?
Thanks and best regards.
How to exclude unneeded built-in commands?
For example jvm-env, jvm-properties etc?
I tried to do the following but without luck:
@ComponentScan(excludeFilters = @ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE, value = {
SystemCommand.class,
StacktraceCommand.class,
ThreadCommand.class
}))
@SpringBootApplication
public class Application {
//...
}
Hi @fonimus ,
Firstly thank you for this awesome library. It is very beautiful and easy to carry out.
Now I need to detect the ip address of client which request to ssh and the sessionID when connect successful. Please help me the solution.
Thank you!
Hello,
I hope you are doing well!
What is the best way to connect through ssh outside a container to the ssh-shell-spring-boot service that is running inside the container ?
Thank you!
Thanasis
Hello!
I am trying to disable the script built in command. I have successfully managed to disable the help command, but same approach does not seem to work for the other builtInCommands.
I have tried in my main the following :
String[] disabledCommands = {"--spring.shell.command.history.enabled=false"};
String[] fullArgs = StringUtils.concatenateStringArrays(args, disabledCommands);
....
springApplication.run(fullArgs);
The above works for the help command but not for the script.
Do you know maybe why?
Thank you,
Thanasis
We are trying to use ssh-shell-spring-boot in our project but faced with the following situation - when we exit from the ssh shell (with commands 'quit' or 'exit') then the application throws exception java.io.IOException
.
When we start the second ssh shell and quit it, then application throws org.apache.sshd.common.channel.WindowClosedException
.
Moreover, when we try to quit the first ssh shell then it hangs and application throws java.io.IOException
with message 'Stream Closed'.
In addition, after these exceptions, if we resize the terminal window then application logs warning messages:
StandardEnvironment : Failed (LastErrorException) to signal WINCH to listener=com.github.fonimus.ssh.shell.SshShellCommandFactory$$Lambda$653/1512951254@4930b272: [9] Bad file descriptor
Please see the attached screencast for details.
These exceptions are thrown on Linux environment. On Windows they are not thrown but shell hangs as well.
The OWASP dependency check maven plugin detects this vulnerability in the latest version (1.8.0) of ssh-shell-spring-boot:
https://nvd.nist.gov/vuln/detail/CVE-2022-27772
This can be fixed by bumping spring-shell-starter to 2.1.0
Hi,
I am waitting when the version 1.3.0 release on maven repository. Could you release it?
Thanks and best regards.
Currently save get the color of results or post processors
Hello,
Thank you for this great library :) I would like to request your help on how to configure the basic demo in way, so that different thread handles each ssh connection.
Thank you very much,
Thanasis
Hello again,
And sometimes sporadically i have noticed that this call
long key = sshShellEvent.getSessionId();
returns different value for the active sessions compared to
the ones found here sshShellSessionManager.listSessions()
(When this happens usualy it goes one number forward )
Thank you,
Thanasis
Hi,
At the moment it looks if I configure a command group to be enable=false (e.g. ssh.shell.commands.system.enable=false) that only impacts the availability. there seems to be no way to hide a command group. I'd like to be able to optionally hide a command group as (for example) the system commands are too low level for some types of users and only serve to confuse them.
(I realise spring shell in general frown on hiding command groups but I think there is a case for it here and that it can be done in such a way that it doesn't impact existing users who are happy to see everything by default)
is there some way to do this I've missed?
I wrote a basic local patch (see below) to do this with ConditionalOnProperty but rather than overloading the meaning of "enable" I've added an explicit "hide" attribute to CommandProperties (defaulting to false) so no existing users should be impacted unless they want to explicitly use this feature.
So for example setting the attribute:
ssh.shell.commands.system.hide=true
means "don't show the system command group"
all feedback welcome or alternative suggestions on how to do this.
Thanks.
Hello,
After upgrading to version 2.0.2 import org.springframework.shell.standard.ValueProviderSupport class can not be resolved anymore.
Is this a bug or is it intentionally done ? If yes, what is the most close alternative to this ?
Thank you!
Thanasis
Sometimes, Banner is quite annoying. 😄
Hello,
I hope you are doing well!
Is there any way to make @ShellOption optional?
Thank you!
Thanasis
Hi, any chance 1.7.0 release could be posted to maven central?
thanks!
I use gradle to build project, without spring-boot-starter-web, and without jackson-databind in dependencies, application fail to start with exception:
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_162] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_162] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) ~[na:1.8.0_162] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_162] ... 116 common frames omitted
IMO, 'jackson-databind' is a required dependency
Hello,
I tryed to import your lib but it seems to have a circular dependecy into it.
I use spring boot version 2.6.2
***************************
APPLICATION FAILED TO START
***************************
Description:
The dependencies of some of the beans in the application context form a cycle:
sshShellConfiguration defined in URL [jar:file:/root/.gradle/caches/modules-2/files-2.1/com.github.fonimus/ssh-shell-spring-boot-starter/1.7.0/2b5916b3bbaa08598ead00ba072cb12ec352772d/ssh-shell-spring-boot-starter-1.7.0.jar!/com/github/fonimus/ssh/shell/SshShellConfiguration.class]
↓
sshShellCommandFactory defined in URL [jar:file:/root/.gradle/caches/modules-2/files-2.1/com.github.fonimus/ssh-shell-spring-boot-starter/1.7.0/2b5916b3bbaa08598ead00ba072cb12ec352772d/ssh-shell-spring-boot-starter-1.7.0.jar!/com/github/fonimus/ssh/shell/SshShellCommandFactory.class]
↓
sshShell defined in class path resource [com/github/fonimus/ssh/shell/SshShellAutoConfiguration.class]
┌─────┐
| org.springframework.shell.result.ResultHandlerConfig
└─────┘
Did there is something to configure and/or to exclude to avoid this ?
Thanks in advance
The workflow release.yml is referencing action s4u/maven-settings-action using references v2.4.0. However this reference is missing the commit 5935b2506fdb5912d2dbbd167716193890e2fabd which may contain fix to the some vulnerability.
The vulnerability fix that is missing by actions version could be related to:
(1) CVE fix
(2) upgrade of vulnerable dependency
(3) fix to secret leak and others.
Please consider to update the reference to the action.
On the first invocation the command task-single
throws an NPE.
java.lang.NullPointerException
at com.github.fonimus.ssh.shell.commands.TasksCommand.tasksSingle(TasksCommand.java:326)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
at org.springframework.shell.Shell.evaluate(Shell.java:180)
at com.github.fonimus.ssh.shell.ExtendedShell.evaluate(ExtendedShell.java:102)
at com.github.fonimus.ssh.shell.ExtendedShell.run(ExtendedShell.java:92)
at com.github.fonimus.ssh.shell.ExtendedShell.run(ExtendedShell.java:70)
at com.github.fonimus.ssh.shell.SshShellRunnable.run(SshShellRunnable.java:222)
at java.base/java.lang.Thread.run(Thread.java:829)
Reading the code this is due to a field access is done and not the method that initialize the thread executor field.
For clean view, it may be nice to be able, with a configuration, to hide non active command instead of print them with the '*' prefix.
The configuration seems to be ignored to configure the name/location of the "spring-shell.log" file (always on the directory of the JVM.
Hello,
I hope you are doing well. I like to request your support on how exactly this helper.getSshSession().getSessionId(); can be used.
It seems that this return a byte array and not a long number.
Thank you,
Thanasis
Hello,
I hope that you are doing well!
I am trying to create some integration tests for my app that is ssh-shell-spring-boot based.
I used the following code in order to try to execute commands and capture the responses.
https://github.com/fonimus/ssh-shell-spring-boot/blob/master/starter/src/test/java/com/github/fonimus/ssh/shell/JavaConnect.java
Through the JavaConnect.java code I am able to succesfully login to ssh app, I am getting the banner I have configured and the prompt but the command help is not being executed.
Any clue why ?
Thank you!
Thanasis
Hi @fonimus ,
I am using your library to build a Spring Shell and it was very good when I used SSH tool like Putty to connect my Shell.
But when I build another Java app as SSH client, follows this tutorial , I got an Exception "java.lang.NumberFormatException" at class SshShellRunnable.
It seems you want to detect size of client's tool, but when I build Java app, there is no size for that.
Could you give me an advice?
Thanks and best regards.
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.