java -Dhttp.proxyHost=<host> -Dhttp.proxyPort=<port> -Dhttps.proxyHost=<host> -Dhttps.proxyPort=<port> -jar ...
Git各种操作
Linux bash下未配置git ssh, 使用http clone时反复弹出用户名密码输入框
使用内存缓存(cache), 默认超时时间是15分钟.
git config --global credential.helper cache
可配置超时时间为1小时, 单位是秒
git config --global credential.helper 'cache --timeout=3600'
配置了git ssh, 但远程地址是http协议
配置git使用ssh来替代http
git config --global --add url."git@github:".insteadOf https://github.com/
修改了 .gitmodules 但是没有生效
需要先同步submodule变更到git, 再执行其他命令
git submodule sync
参考
SSH各种操作
SSH使用HTTP代理
一句话命令行形式:
ssh -o "ProxyCommand=nc -X connect -x 代理主机:代理端口 %h %p" 目标主机 -p 目标SSH端口
配置文件形式 ~/.ssh/config
1 | Host 目标机名称 |
通过跳板机登录SSH (多跳登录)
一句话命令行形式
ssh -J user@<JumpHost:JumpPort> user@<TargetHost:TargetPort>
配置文件形式
1 | Host 跳板机 |
端口转发 (SSH隧道)
端口转发会引起安全问题, 企业IT部门可能会禁止使用.
正向端口转发: listen在本地, 请求本地相当于请求远程接口
ssh -fNL 本地端口:转发目标IP:转发目标端口 user@<host:port>
注意, 转发目标IP是相对远程主机而言的. 如果想请求远程主机本身, 使用127.0.0.1
反向端口转发: listen在远端, 请求远端相当于请求本地接口. 服务器的sshd配置(/etc/ssh/sshd_config)需包含GatewayPorts yes或GatewayPorts clientspecified才能监听在0.0.0.0上, 否则只能监听在127.0.0.1上.
ssh -fNR [允许的远端来源IP:]远端监听端口:转发目标IP:转发目标端口 user@<host:port>
注意, 此处转发目标IP是相对本地主机而言的. 如果想请求本地主机, 使用127.0.0.1
-f 运行在后台
-N 不执行任何命令, 仅用于转发数据.
利用SSH搭建Socks5代理
ssh -D 本地代理监听端口 -fCN user@<host:port>
-C 进行数据压缩
SSH Agent
ForwardAgent生效时, 本机的root用户和目标机上的root用户均有权限使用此agent, 因此确保仅在可信的目标主机上启用此功能.
启动ssh-agent: eval `ssh-agent`
停止ssh-agent: eval `ssh-agent -k` , 直接kill掉对应的进程也可以. 注意清除环境变量中的SSH_AUTH_SOCK 和 SSH_AGENT_PID.
添加私钥到agent: ssh-add 不带参数则添加默认的私钥到agent. 若要添加其他私钥, 则直接将文件名作为参数即可.
查看agent中包含的key公钥: ssh-add -L
查看agent中包含的key私钥: ssh-add -l
锁定agent: ssh-add -x
解锁agent: ssh-add -X
登录到其他主机, 并允许在对应主机上使用本机的agent:
一句话: ssh -A user@<host:port>
配置文件:
1 | Host 目标机名称 |
查看本机的SSH Host Key
1 | sudo ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key |
参考
Docker限制容器Swap使用
无法为Docker添加SWAP使用限制? 报错 WARNING: No swap limit support
TL;DR: vim /etc/default/grub
添加这一行 GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1" (如果已经有了就追加在后面)
sudo update-grub && sudo reboot 必须重启才能生效.
参考
Runtime options with Memory, CPUs, and GPUs
moby/moby #4250: “WARNING: No {swap,memory} limit support” Ubuntu LTS (Precise)
如何在Java/Spring中异步高并发
搜了一下,如果是传统的那种基于线程+阻塞IO的方式,有配置参数可以控制最大线程并发数量,另外还有线程池的做法. 参见: Spring @Async limit number of threads
如果是非阻塞IO的做法,需要使用 Spring 5. 一种是 Spring MVC (Servlet)模式, 另一种是 Spring WebFlux模式.
参见 Understanding Spring Reactive: Servlet 3.1/Spring MVC Non-Blocking IO
Understanding Spring Reactive: Introducing Spring WebFlux
Java Mono, Flux相关知识: Java反应式框架Reactor中的Mono和Flux
Webflux中可以用WebClient异步发起对其他服务的请求: Spring5 Webflux之Webclient使用
Java里的Promise: CompletableFuture. 参见Promise
Promise
那Mono
看这种链式调用, 脑壳痛: How do I wait for a List
也许…换门语言, 比如Kotlin里的Corotine就很棒!
Kotlin的异步编程(基于协程): Asynchronous programming techniques
但很可惜,Java编译器不支持这种操作,所以在不动bytecode/编译链的情况下,基本上没可能在Java里实现协程了。Can I take advantage of Kotlin’s Coroutines by using them in Java code?
Minecraft Java Edition 开服教程 (2021)
老三样
BlessingSkinServer, 推荐使用 LiteServer Project皮肤站
服务端
支持MC 1.16.5和高版本Forge (36.2.0+). 目前看和一些mod之间有冲突. 但仍属于比较好的选择.
支持MC 1.16.5, 但历史上曾有过再发布和未经告知即删除mod的举动, 有较大安全隐患.
支持MC 1.16.5. 但没能成功安装, 排查是从loliserver指定的服务器下载资源文件失败.
运行时
AdoptOpenJDK 11 LTS / 16
NodeJS 14 LTS / 16
或者使用面板 (镜像中已包含推荐的环境):
服务端插件
EssentialsX 常用命令 (tpa, home, back等)
LuckPerms 权限管理
Vault 经济前置插件
BanItem 禁用物品
ServerRestorer 服务器自动备份
Tips
禁用Mod版本检查缩短启动时间
修改 .minecraft/config/fml.toml 文件, 将 versionCheck 设为 false.
注: 某些mod可能内置了版本更新检测/赞助者列表拉取逻辑, 这些是不能通过此项设置关闭的.
1 | # Enable forge global version checking |
祖传启动参数
参考 JVM Tuning: Optimized G1GC for Minecraft - Aikar’s Thoughts
1 | #!/bin/bash |
git partial clone 部分克隆
参考 https://git-scm.com/docs/partial-clone
与git clone --depth 1这样的浅拷贝方案不同, partial clone可以做到获取某次提交中只与某个文件子树相关的提交内容. 大部分场景下应该都用不到这种功能, 一般都是那种Monorepo(Monolithic repository)因为把所有项目都放到同一个仓库的不同文件夹下才有的特殊需求.
常见ElasticSearch API
查看符合某个模式的索引, 输出标头, 并按照索引大小倒序排列. 参考 cat indices API
1 | GET _cat/indices/some-*20210806*?v&s=ss:desc |
查看某个索引的设置
1 | GET /some-index-20210806/_settings |
查看符合某个模式的模板设置
1 | GET _template/some-index-* |
查看某个索引下分片的分布情况, 输出表头.
1 | GET _cat/shards/some-index-20210806?v |
查看集群设置
1 | GET /_cluster/settings |
查看集群中正在进行的任务. 例如reindex
1 | GET /_tasks?detailed=true&actions=*reindex |
终止集群中某个正在进行的任务,根据上一条中查到的任务ID. 参考:Task Management API
1 | POST _tasks/nodeID:taskID/_cancel |
删除某个索引
1 | DELETE /some-index-20210806 |
调整某个模板设置(举例)
1 | PUT /_template/some-template-1 |
