thomdietrich / home-assistant-addons Goto Github PK
View Code? Open in Web Editor NEWAutoSSH Home Assistant Addon - alternative to cloud or VPN: Permanent port forwarding
License: MIT License
AutoSSH Home Assistant Addon - alternative to cloud or VPN: Permanent port forwarding
License: MIT License
they did it again :)
Always fun....
home-assistant/operating-system#2246
home-assistant/operating-system#2259
Hi
I have autossh version 1.0.0 installed. I updated to HA OS 2022.6.0, and I'm not longer able to login to my remote server (which didn't changed).
I get the following log:
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug1: Connecting to xxx.xxx.xxx.xxx [xxx.xxx.xxx.xxx] port 22.
debug1: Connection established.
debug1: identity file /data/ssh_keys/autossh_rsa_key type 0
debug1: identity file /data/ssh_keys/autossh_rsa_key-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.8
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1
debug1: compat_banner: match: OpenSSH_6.6.1 pat OpenSSH_6.6.1* compat 0x04000002
debug1: Authenticating to xxx.xxx.xxx.xxx:22 as 'xxx'
debug1: load_hostkeys: fopen /root/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: SSH2_MSG_KEXINIT sent
autossh 1.4g
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: [email protected]
debug1: kex: host key algorithm: ssh-ed25519
debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none
debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: SSH2_MSG_KEX_ECDH_REPLY received
debug1: Server host key: ssh-ed25519 SHA256:OoJ8yuspp/3ZXRyDt15uP4VatNRLuaVqLf4wQBUxMbE
debug1: load_hostkeys: fopen /root/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: Host 'xxx.xxx.xxx.xxx' is known and matches the ED25519 host key.
debug1: Found key in /root/.ssh/known_hosts:1
debug1: rekey out after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey in after 134217728 blocks
debug1: Will attempt key: /data/ssh_keys/autossh_rsa_key RSA SHA256:9cMPtntARkdzSoQghRLUfXlAXPFIBryhMJXEs4e1Mu4 explicit
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: publickey
debug1: Offering public key: /data/ssh_keys/autossh_rsa_key RSA SHA256:9cMPtntARkdzSoQghRLUfXlAXPFIBryhMJXEs4e1Mu4 explicit
debug1: send_pubkey_test: no mutual signature algorithm
debug1: Next authentication method: password
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
Permission denied, please try again.
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
Permission denied, please try again.
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: No more authentication methods to try.
[email protected]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
It seems RSA is no longer supported by installed SSH:
https://www.linuxadictos.com/en/openssh-8-8-arrives-saying-goodbye-to-ssh-rsa-support-bug-fixes-and-more.html
I tried to generate ed25519 SSH keys adding "-t ed25519" to "other SSH options" in AutoSSH configuration but it keeps generating a RSA key...
[17:02:42] INFO: Deleting existing key pair due to set 'force_keygen'
[17:02:42] WARNING: Do not forget to unset 'force_keygen' in your add-on configuration
[17:02:42] INFO: No previous key pair found
Generating public/private rsa key pair.
Your identification has been saved in /data/ssh_keys/autossh_rsa_key
Your public key has been saved in /data/ssh_keys/autossh_rsa_key.pub
The key fingerprint is:
SHA256:oevdF7AikQHnJFBf2FhFQuR2gN5sbV47SAVo4xAjuWw hassio-setup-via-autossh
The key's randomart image is:
+---[RSA 4096]----+
| .o=o=XB++. |
| .B*+=o . |
| . ooO+o.. |
| E +o=o= . |
| . .oS+ = . |
| ... + + |
| .. . o |
| . . . . |
| . . .. |
+----[SHA256]-----+
[17:02:48] INFO: The public key is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDj9h7Rd51zDICYaK/KK1+apKc3OohdCFXkxlrKobSQycUw9Qfztn9s9PsHJkcOIS8oGIuYJMsyajW7hOBUCf5AXkUTgOiV4mP6Nu/dHlxl5C5HvbU5el19ref68hKwJJksPKd/OYgVGjn9v3um4BuxpH9gqLXqK9bCpCOPULGXzwvmM7xonzJc8T8Seh+dXBi+LXq6vJKzPTdNJFf9zHINbUCpDeoG/HZCSbNLrjW2yT5bj+BPtsnXbhap6/9oOBztVboFMeT2lwJ48oPUdoAmAgZ/gvgc4q97f1hecXCUxOHp1HAWDMffOBV4n0YbzUv8ywLVJJlozcjay4rYlDeFBuaQUD3yLxy16Yg2f1tGcyCAEyHSaWEsIohHi4G/IIL3CWldTwhNNBBe03tSbNty6UcGm74nwLDjVSjwnVLkYQjOKZOPYTE0HFI+iS9xL3y/ZMxBa2SGNiC5r1YmPhwbdWfKXcpdmb1mgNFK31y+Lo+osEG+7oNDwLITOizEelKJSWd+lYbMLGPs4nyaUduisbxIJcsiBdlwIToQv5y+XfRk6/gXb64hC4YUHyKEOQIDzbbgfWvIRGJUG7Lsi3OdJQGWadbalB15h71tep24Z2RkknSUgStx7clUWQaFHopBO26o1vmwD79akYZdvah2iOZ1IJbD3V1bZ2YvpAbfCQ== hassio-setup-via-autossh
[17:02:48] WARNING: Add this key to '~/.ssh/authorized_keys' on your remote server now!
[17:02:48] WARNING: Please restart add-on when done. Exiting...
How can I solve this?
Thanks in advance!
I put this info just for reference because I already solved the problem.
On my setup I use on remote server a docker container with the "linuxserver/openssh-server:latest" image and Traefik as a reverse proxy server to serve the internal http service to a public URL like https://homeassistant.mydomain.com.
My local HA instance is on a Raspberry Pi 3 with hass. The IP was set by dynamic IP from the internal router DHCP.
After the first installation & configuration everything was working perfectly, but some days later I began to get those "400: Bad Request" errors when trying to access my public HA address.
I discovered then that my local HA has changed his IP address and that this change wasn't reflected in the configuration.yaml on the [http] section, variable "trusted_proxies".
Replacing the IP with the new one, did solved the problem.
Maybe on the documentation should be mentioned that there is also this "trusted proxy" configuration setting in configuration.yaml
I was using this addon to have remote access to my HA installation - it was working great! Until around 5th of July 2022 - probably linked to the update of the OpenSSH to version 9 (maybe?).
Right now the addon is not able to connect to the server anymore. The weird thing is that the connection is actually established and then disconnected. The best of my understanding the server claims that the user disconnected, and the client says that it is the server fault... Lost now... Here are the logs:
Server logs:
Jul 8 21:34:37 balder sshd[66272]: Unable to negotiate with 109.133.143.15 port 36230: no matching host key type found. Their offer: [email protected] [preauth]
Jul 8 21:34:37 balder sshd[66273]: Unable to negotiate with 109.133.143.15 port 36232: no matching host key type found. Their offer: [email protected] [preauth]
Jul 8 21:34:37 balder sshd[66279]: Accepted publickey for ha from 109.133.143.15 port 36234 ssh2: ED25519 SHA256:45mBPrf/4Jej6tLiVRp3J5y1UdkGdRMmGISHoRqE1Us
Jul 8 21:34:37 balder nologin[66282]: Attempted login by ha on /dev/pts/3
Jul 8 21:34:37 balder sshd[66281]: Received disconnect from 109.133.143.15 port 36234:11: disconnected by user
Jul 8 21:34:37 balder sshd[66281]: Disconnected from user ha 109.133.143.15 port 36234
Client (autossh) logs:
[23:35:26] INFO: Executing command: /usr/bin/autossh -M 0 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=no -o ExitOnForwardFailure=yes -p 22 -t -t -i /data/ssh_keys/autossh_rsa_key [email protected] -R 127.0.0.1:8123:172.17.0.1:8123 -v
autossh 1.4g
OpenSSH_9.0p1, OpenSSL 1.1.1o 3 May 2022
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to 95.179.134.83 [95.179.134.83] port 22.
debug1: Connection established.
debug1: identity file /data/ssh_keys/autossh_rsa_key type 3
debug1: identity file /data/ssh_keys/autossh_rsa_key-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_9.0
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.9 FreeBSD-20200214
debug1: compat_banner: match: OpenSSH_7.9 FreeBSD-20200214 pat OpenSSH* compat 0x04000000
debug1: Authenticating to 95.179.134.83:22 as 'ha'
debug1: load_hostkeys: fopen /root/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ssh-ed25519
debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none
debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: SSH2_MSG_KEX_ECDH_REPLY received
debug1: Server host key: ssh-ed25519 SHA256:s4XDZ7q60usITEoOSOa6b+XSqUVU5a8BgPxThCLejN8
debug1: load_hostkeys: fopen /root/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: Host '95.179.134.83' is known and matches the ED25519 host key.
debug1: Found key in /root/.ssh/known_hosts:1
debug1: rekey out after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey in after 134217728 blocks
debug1: Will attempt key: /data/ssh_keys/autossh_rsa_key ED25519 SHA256:45mBPrf/4Jej6tLiVRp3J5y1UdkGdRMmGISHoRqE1Us explicit
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: /data/ssh_keys/autossh_rsa_key ED25519 SHA256:45mBPrf/4Jej6tLiVRp3J5y1UdkGdRMmGISHoRqE1Us explicit
debug1: Server accepts key: /data/ssh_keys/autossh_rsa_key ED25519 SHA256:45mBPrf/4Jej6tLiVRp3J5y1UdkGdRMmGISHoRqE1Us explicit
Authenticated to 95.179.134.83 ([95.179.134.83]:22) using "publickey".
debug1: Remote connections from 127.0.0.1:8123 forwarded to local address 172.17.0.1:8123
debug1: ssh_init_forwarding: expecting replies for 1 forwards
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: filesystem
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: client_input_hostkeys: searching /root/.ssh/known_hosts for 95.179.134.83 / (none)
debug1: client_input_hostkeys: searching /root/.ssh/known_hosts2 for 95.179.134.83 / (none)
debug1: client_input_hostkeys: hostkeys file /root/.ssh/known_hosts2 does not exist
debug1: Remote: /usr/home/ha/.ssh/authorized_keys:2: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
debug1: Remote: /usr/home/ha/.ssh/authorized_keys:2: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
debug1: remote forward success for: listen 127.0.0.1:8123, connect 172.17.0.1:8123
debug1: forwarding_success: all expected forwarding replies received
debug1: ssh_tty_make_modes: no fd or tio
debug1: client_global_hostkeys_private_confirm: server used untrusted RSA signature algorithm ssh-rsa for key 0, disregarding
Learned new hostkey: ECDSA SHA256:XycGYDpcQ25tjPJUW5IQ+NfG4FhIsFTkmilMP2yUHZg
Adding new key for 95.179.134.83 to /root/.ssh/known_hosts: ecdsa-sha2-nistp256 SHA256:XycGYDpcQ25tjPJUW5IQ+NfG4FhIsFTkmilMP2yUHZg
debug1: update_known_hosts: known hosts file /root/.ssh/known_hosts2 does not exist
Last login: Fri Jul 8 21:34:37 2022 from 15.143-133-109.adsl-dyn.isp.belgacom.be
FreeBSD 12.3-RELEASE-p5 GENERIC
Welcome to FreeBSD!
Release Notes, Errata: https://www.FreeBSD.org/releases/
Security Advisories: https://www.FreeBSD.org/security/
FreeBSD Handbook: https://www.FreeBSD.org/handbook/
FreeBSD FAQ: https://www.FreeBSD.org/faq/
Questions List: https://lists.FreeBSD.org/mailman/listinfo/freebsd-questions/
FreeBSD Forums: https://forums.FreeBSD.org/
Documents installed with the system are in the /usr/local/share/doc/freebsd/
directory, or can be installed later with: pkg install en-freebsd-doc
For other languages, replace "en" with a language code like de or fr.
Show the version of FreeBSD installed: freebsd-version ; uname -a
Please include that output and any error messages when posting questions.
Introduction to manual pages: man man
FreeBSD directory layout: man hier
Edit /etc/motd to change this login announcement.
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
This account is currently not available.
debug1: channel 0: free: client-session, nchannels 1
Connection to 95.179.134.83 closed.
Transferred: sent 2708, received 4128 bytes, in 0.1 seconds
Bytes per second: sent 47946.6, received 73088.5
debug1: Exit status 1
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
Any idea how to solve it?
Hey, I like your addon!
I used the Tunnel for both ways to access a remote SQL and InfluxDB. So I put -N -L 3306:100.66.66.12:3306 -L 8086:100.66.66.2:8086
to other_ssh_options
and set 127.0.0.1 to db_url and influx connection. I know its a bit hacky but pretty simple usage as its in use in small remote hut with weak connection.
It worked very well until 'recently'. It looks like the ports arn't exposed anymore, inside the container it works. Alltrought I don't see any breaking changes but didn't digged into it. Any advice? or idea for improovment?
After a power outage where both the router and my remote home assistant instance is restarted, the addon will not always be able to connect at startup, because the internet connection is not working yet. I have enabled the watchdog, and this causes it to reconnect multiple (10?) times, but at last, it just gives up, and the addon is stopped. Thus I cannot reach the instance, and have to physically restart it. I guess this should not happen - is there a maximum retries configuration for the watchdog, or is this caused by something else?
Last log messages:
ssh: Could not resolve hostname some.xample.comm: Name does not resolve
[15:35:50] ERROR: SSH service can't be reached on remote server
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
I have installed the addon on Home assistant Core 2022.5.4 and when i start It i see error "s6-overlay-suexec: fatal: can only run as pid 1" in log
Hello,
I am using the Localhost.run service because its free.
Here is my configuration -
hostname: localhost.run
ssh_port: 22
username: autossh
remote_forwarding:
- localhost.run:80:192.168.79.79:8123
other_ssh_options: '-v'
force_keygen: false
Even though the connection works, but, I can not find the subdomain name from the log details.
==============================================================
Welcome to localhost.run!
Follow your favourite reverse tunnel at [https://twitter.com/localhost_run].
**You need a SSH key to access this service.**
If you get a permission denied follow Gitlab's most excellent howto:
https://docs.gitlab.com/ee/ssh/
*Only rsa and ed25519 keys are supported*
To set up and manage custom domains go to https://admin.localhost.run/
More details on custom domains (and how to enable subdomains of your custom
domain) at https://localhost.run/docs/custom-domains
To explore using localhost.run visit the documentation site:
https://localhost.run/docs/
==============================================================
** your connection id is 4de07fb0-777c-43e0-9ec4-589d360XXXXXX, please mention it if you send me a message about an issue. **
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /data/ssh_keys/autossh_rsa_key RSA SHA256:HL7Z3tI+X/iCe1V5AjLxx0cPthbzTSdJbQX8KCHdt2g explicit
debug1: Server accepts key: /data/ssh_keys/autossh_rsa_key RSA SHA256:HL7Z3tI+X/iCe1V5AjLxx0cPthbzTSdJbQX8KCHdt2g explicit
debug1: Authentication succeeded (publickey).
Authenticated to localhost.run ([54.161.197.247]:22).
debug1: Remote connections from localhost.run:80 forwarded to local address 192.168.79.79:8123
debug1: Entering interactive session.
debug1: pledge: network
debug1: remote forward success for: listen localhost.run:80, connect 192.168.79.79:8123
debug1: All remote forwarding requests processed
As you can see, I can't get the subdomain name!
The log ends there.....
Hi,
After a recent update to HASSOS 9.4, this addon forwarding stopped working. I found this line in the logs:
connect_to 172.17.0.1 port 8123: failed.
so I changed my config line in the addon to 172.30.32.1 (guessed that from running ha network info
when sshing to the server):
remote_forwarding:
- 127.0.0.1:8124:172.30.32.1:8123
# - 127.0.0.1:8124:172.17.0.1:8123 # this used to work until 9.4
and it started to work again, not entirely sure why. Reporting here just in case someone else runs into this issue and maybe to update the docs as well?
After updating Home Assistant to the 2022.12, the reverse proxy can't established a connection...
Here is the logs :
connect_to 172.17.0.1 port 8443: failed. debug1: channel 0: free: 192.168.16.2, nchannels 7 debug1: channel 1: connection failed: Operation timed out
I didn't change anything in my configuration before and after the HA update.
Do you have an idea ?
I'm unable to add this repository to my HA, and I suspect it's because there needs to be a repository.yaml ?
Hi!
I had previously installed this add-on, but I had problems updating it to latest version.
I uninstalled it and then installed it again, and I got the following error:
The command '/bin/ash -o pipefail -c chmod a+x /run.sh' returned a non-zero code: 1
I have Home Assistant OS, updated to latest version.
Home Assistant 2023.2.0
Supervisor 2023.01.1
Operating System 9.5
Frontend 20230201.0 - latest
Do you have any clue what the problem would be?
Thanks in advance
We had a power outage today. This lead to a weird constellation in which the autossh-addon wasn't able to connect and stopped after the run script was finished.
I assume there are similar causes for connection issues and I would like to ensure that the addon never stops trying to reconnect.
I see three options to fix this:
home-assistant-addons/autossh/run.sh
Line 83 in 01dce2b
exit 1
?Option 3 is my favorite overall.
What do you think?
Hi,
I have Home Assistant 2021.8.8 as a docker Raspbian managed by portainer.
I tried installing AutoSSH in HA. I added your repository to the addon store, then I selected it and clicked on install button, but it failed:
Failed to to call /addons/5da1ffb2_autossh/install - The command '/bin/ash -o pipefail -c apk add --no-cache tzdata jq openssh vim curl autossh' returned a non-zero code: 3
Then I opened a terminal in portainer, and tried:
bash-5.1# apk add --no-cache tzdata jq openssh vim curl autossh
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/armv7/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/armv7/APKINDEX.tar.gz
(1/7) Installing autossh (1.4g-r1)
(2/7) Installing openssh-sftp-server (8.4_p1-r3)
(3/7) Installing openssh-server-common (8.4_p1-r3)
(4/7) Installing openssh-server (8.4_p1-r3)
(5/7) Installing openssh (8.4_p1-r3)
(6/7) Installing xxd (8.2.2320-r0)
(7/7) Installing vim (8.2.2320-r0)
Executing busybox-1.32.1-r6.trigger
OK: 146 MiB in 187 packages
bash-5.1#
It seems it works, but not using the install button. Do you know what can I do to fix this?
Thanks in advance,
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.