Git
复制 // --- 回退 merge
// 查看 操作记录,找到要回退的版本号
$ git reflog
3973c178 (HEAD - > test, origin/test ) HEAD@{ 0}: merge feature-34: Merge made by the 'recursive' strategy.
58ed7d9b HEAD@{ 1 }: checkout: moving from feature-34 to test
09140632 (origin/feature-34, feature-34 ) HEAD@{ 2}: commit:
....
// 执行 git reset
$ git reset --hard HEAD^
// or
$ git reset --hard HEAD@{ 2 }
// or
$ git reset --hard 09140632
//// 另外还可以使用 git revert
// ---
git merge
git rebase
// The error is resolved by toggling the allow-unrelated-histories switch.
// https://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error
git pull origin master --allow-unrelated-histories
Gradle
使用 Gradle 构建 Spring 的项目,关于 Spring 的配置依赖
复制 // https://www.jianshu.com/p/01588c396a29
// buildscript
buildscript {
repositories {
maven {
// url 'https://repo.spring.io/libs-milestone'
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath("io.spring.gradle:dependency-management-plugin:1.0.9.RELEASE")
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:1.4.17")
classpath("gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0")
}
}
apply plugin: 'org.springframework.boot'
// 会提供 bootJar task
apply plugin: 'java'
apply plugin: 'groovy'
// 当使用了该插件,Spring Boot的插件会自动地从你使用的Spring Boot
// 版本里导入spring-boot-dependencies bom
// 在声明依赖时,不需要带版本号
apply plugin: 'io.spring.dependency-management'
// ---
// ext 可以用来扩展属性
ext['slf4j.version'] = '1.7.20'
// or
ext {
slf4jVersion = '1.7.20'
}
// bootJar
// springBoot
// maven 插件发布
// maven-publish 发布
复制 $ ./gradlew wrapper --gradle-version=6.2.1 --distribution-type=all
OpenAPI Site
Maven
Shell
复制 # 判断文件目录是否存在
dir = "/tmp/workspace"
if [ ! -d "$dir" ]; then
# mkdir /myfolder
# ...
fi
# 判断文件是否存在并具备可执行权限
folder = "/bin/bash"
if [ ! -x "$folder" ]; then
# exec ...
fi
# -f 参数判断 $file 是否存在
file = "/tmp/lock"
if [ ! -f "$file" ]; then
touch "$file"
fi
# -n 判断一个变量是否有值
var = ""
if [ ! -n "$var" ]; then
echo "$var is empty"
exit 0
fi
# 判断两个变量是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
# 更多参考 https://www.cnblogs.com/jjzd/p/6397495.html
awk and sed
复制 # 删除最后一个字段
$ minikube kubectl -- get pods -l app=redis-cluster -o jsonpath= '{range.items[*]}{.status.podIP}:6379 ' | awk '{$NF="";print}'
# File Content as below, file.txt:
$ cat file.txt
Mike Harrington:[510] 548-1278:250:100 :25
Christian Dobbins:[408] 538-2358:155:90 :78
Susan Dalsass:[206] 654-6279:250:60 :49
Archie McNichol:[206] 548-1348:250:100 :200
$ awk -F: 'OFS=":"{$NF="";print}' file.txt
Mike Harrington:[510] 548-1278:250:100 :
Christian Dobbins:[408] 538-2358:155:90 :
Susan Dalsass:[206] 654-6279:250:60 :
Archie McNichol:[206] 548-1348:250:100 :
# 删除最后一个分隔符
$ awk -F: 'OFS=":"{$NF="";print}' file.txt | sed 's/:$//g'
Mike Harrington:[510] 548-1278:250:100
Christian Dobbins:[408] 538-2358:155:90
Susan Dalsass:[206] 654-6279:250:60
Archie McNichol:[206] 548-1348:250:100
复制 # https://stackoverflow.com/questions/6047648/associative-arrays-error-declare-a-invalid-option
# 查看 bash 的版本
bash --version
# 使用 array 实现 hashmap 的功能
# 在 bash v3 版本中不支持 hashmap 的声明
array = (
'hello::world.'
'nice::to meet you'
)
for index in "${array[ @ ]}" ; do
KEY = "${index %%::* }"
VALUE = "${index ##*:: }"
echo "$KEY - $VALUE"
done
# 在 bash v4 中支持 map
declare -A hashmap
hashmap[ "key" ] = "value"
hashmap[ "key2" ] = "value2"
echo -e "${hashmap[\"key\"]}"
for key in ${ ! hashmap[ @ ]}; do echo $key; done
for value in ${hashmap[ @ ]}; do echo $value; done
Java Libs
Lombok
开发工具
阿里巴巴程序员常用的开发工具
应用实时监控工具 ARMS,提供前端、应用、自定义监控,可快速构建实时的应用性能和业务监控能力;应用端监控接入
Docsite , 中文版文档 ,一款集官网、文档、博客和社区为一体的静态开源站点的解决方案,具有简单易上手、上手不撒手的特质,同时支持 react 和静态渲染、PC端和移动端、支持中英文国际化、SEO、markdown文档、全局站点搜索、站点风格自定义、页面自定义等功能。
云效开发者工具 KT ,简化在 Kubernetes 下进行联调测试的复杂度,提高基于Kubernetes的研发效率;教程 ,这是一款好工具
架构可视化 AHAS ,为 K8s 等容器环境提供了架构可视化的功能,同时,具有故障注入式高可用能力评测和一键流控降级等功能,可以快速低成本的提升应用可用性
数据库连接池 Druid ,Java 语言下的数据库连接池,它能够提供强大的监控和扩展功能
项目模版
关于项目模版,有一个 cookiecutter 的项目。
比较有用的项目模版: 1. cookiecutter golang 2. cookiecutter-data-science
实践
UML
Vagrant
HashiCorp Vagrant provides the same, easy workflow regardless of your role as a developer, operator, or designer. It leverages a declarative configuration file which describes all your software requirements, packages, operating system configuration, users, and more.
Vagrant 是一个非常好用的工具,仅仅声明一个定义文件就可以获得一个相同的环境;在开发阶段利用 Vagrant 可以获得相同的开发环境,屏蔽不同环境带来的差异;Vagrant 底层是依赖于 VM 虚拟机的能力
使用 Vagrant 时,如何自动映射以及同步宿主机和虚拟机之间的目录和文件?
在 Vagrantfile 中声明 config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: ".git/"
,rsync 默认开启了 rsync__auto=true
,但是如果需要自动双向同步修改后的内容,需要在宿主机上运行 vagrant rsync-auto
Makefile
KanBan 看板
kanban 的本质是一个朴素的思想:在制品(work in progress, WIP)必须被限制;