查看JAVA阻塞方法
1 | jstack -l 1 | awk -v RS='' '/BLOCKED/' | sort | uniq -c | awk '$1 >= 5' | sort -nr |
时间之外的往事
查看JAVA阻塞方法
1 | jstack -l 1 | awk -v RS='' '/BLOCKED/' | sort | uniq -c | awk '$1 >= 5' | sort -nr |
虽然Nginx从源码编译也很简单,但是建议新手还是使用系统预构建的包。
CentOS/RHEL/ Oracle Linux/AlmaLinux/Rocky Linux
1 | sudo yum install epel-release |
Debian/Ubuntu
1 | sudo apt-get update |
查看版本号
1 | nginx -v |
nginx version: nginx/1.23.2
查看版本及配置
1 | nginx -V |
1 | nginx version: nginx/1.23.2 |
这里我们主要关注--prefix和--conf-path配置
--prefix=/usr/share/nginx和--conf-path=/etc/nginx/nginx.conf
prefix 决定了nginx里相对路径配置的路径前缀。
conf-path 决定了nginx配置文件位置。不同的Linux发行版配置文件位置都可能不一样,可以通过这个配置快速定位配置位置。
需要从私有仓库拉取一个老版本的 Docker 镜像,直接 docker pull 报错:
1 | docker pull hub.shuyun.com/newbi4/app:4.8.16-420260330170921 |
1 | Error response from daemon: unsupported manifest media type and no default available: application/json |
镜像的 manifest 格式是 application/json,而新版 Docker (25+) 只接受标准的 application/vnd.docker.distribution.manifest.v2+json 等格式,直接拒绝了。
这个问题通常出现在以下场景:
本质上是客户端与 registry 之间的格式协商失败。
skopeo 是一个专门用于镜像搬运的工具,对各种 manifest 格式兼容性很强,可以在不同存储之间复制镜像。
skopeo 不支持 Windows 原生安装,在 WSL 中安装即可:
1 | wsl |
skopeo 可以直接读取 Docker 的登录凭证,如果已经在 WSL 中 docker login 过就不需要再登录。否则手动登录:
1 | skopeo login hub.shuyun.com -u docker -p docker |
先保存为 tar 文件,再用 docker load 导入:
1 | skopeo copy --src-tls-verify=false docker://hub.shuyun.com/newbi4/app:4.8.16-420260330170921 docker-archive:/tmp/app.tar |
然后导入 Docker:
1 | docker load -i /tmp/app.tar |
docker load 只是解压导入 tar 包中的镜像层,不走 registry API 协商,所以不受 manifest 格式限制。
注意:不要用
docker-daemon:作为目标,WSL 中的 skopeo 版本可能因为 Docker Engine API 版本不匹配而报错:client version 1.22 is too old. Minimum supported API version is 1.44
走docker-archive+docker load是最稳的方案。
在 WSL 中执行 docker login 时可能报错:
1 | error saving credentials: error storing credentials - err: fork/exec /usr/bin/docker-credential-desktop.exe: exec format error |
这是因为 WSL 继承了 Windows 侧 Docker 的 ~/.docker/config.json,其中 credsStore 指向了 Windows 的凭据管理器。
解决方法是把 credsStore 置空:
1 | sed -i 's/"credsStore": "desktop"/"credsStore": ""/' ~/.docker/config.json |
之后重新 docker login 即可,凭证会以 base64 明文存在 config.json 中。
如果之前在 Windows 侧 docker login 过但忘记了密码,凭证存在 Windows 凭据管理器中(credsStore: "desktop")。
控制面板的凭据管理器界面可以看到条目但密码可能无法直接显示。可以通过 PowerShell 调用 Win32 API 读取:
1 | Add-Type -Namespace Win32 -Name Credman -MemberDefinition @' |
将以上内容保存为 .ps1 文件执行,即可拿到用户名和密码。
如果只是想从镜像中提取某个文件,不需要创建或启动容器,直接解压 tar 包即可。
Docker 镜像本质上是分层的 tar 包,docker load 用的 tar 文件里包含了每一层的 layer.tar。
1 | mkdir -p /tmp/app_extracted |
解压后会看到多个 *.tar 文件,每个对应镜像的一层。按大小排序找到应用层:
1 | ls -lhS /tmp/app_extracted/*.tar |
1 | 列出层内文件 |
文件会被解压到 /tmp/var/lib/jetty/webapps/ROOT.war。
如果是在 Windows 侧操作,可以通过 UNC 路径访问 WSL 中的文件:
\\wsl.localhost\Ubuntu-22.04\tmp\app_extracted\
汇总一下从零开始的完整流程:
1 | 1. 进入 WSL |
新版 Docker 对 manifest 格式校验越来越严格,遇到老镜像无法直接 pull 时,skopeo 是最靠谱的替代方案。核心思路就是绕开 Docker 客户端的格式校验,用 skopeo 先存为 tar,再通过 docker load 导入。整个过程中 Windows + WSL 环境下还需要注意 credential helper 和凭据管理器的兼容问题。
Windows 11 内置了 OpenSSH,只需要几条 PowerShell 命令就能开启 SSH Server,方便远程管理。本文记录完整的安装、配置流程,以及一个常见的启动失败问题的解决方案。
macOS 自带的终端工具够用,但”够用”和”好用”之间差了一个 Homebrew。本文介绍 9 个经过实战检验的 CLI 工具,覆盖文件浏览、内容搜索、目录跳转、版本管理等日常高频场景,帮你把终端效率拉满。
Windows 的 PowerShell 功能强大但默认体验朴素,装上这 9 个工具后完全是另一个世界。本文以 Scoop 为包管理器,介绍文件浏览、内容搜索、目录跳转、版本管理等日常高频场景的现代 CLI 工具,所有配置均针对 PowerShell 编写。
Excel 2013及之前版本打开CSV都是使用系统默认编码,Excel 2016开始支持UTF8-BOM格式的CSV。
考虑到系统的兼容性,早期的系统基本都是使用GBK编码输出CSV。
但是当英文操作系统打开GBK编码格式的CSV就会显示乱码,同时GBK不支持一些偏僻字还有emoji。
1 | // 使用字节流 outputStream 时 |
OGNL 支持使用单引号和双引号来表达字符串,但是使用单引号且只有一个字符会被识别为字符(Character)。字符串和字符比较时会先转化为 double 再比较就导致标题里遇到的异常。
1 | <if test="sessionId != null and sessionId != '' and sessionId!='*'"> |
1 | <if test='sessionId != null and sessionId != "" and sessionId != "*"'> |
1 | <if test="sessionId != null and sessionId != '' and sessionId!='*'.toString()"> |
根据org.apache.ibatis.ognl.OgnlOps#compareWithConversion方法。非数字类型的比较会通过 Comparable 接口或者 Enum 的 compareTo 方法比较,非数字类型尝试和数字类型比较时会先转化为 double 类型再比较。Character 是数字数字类型(根据 getNumericType 方法)。
1 |
|
| 表类型 | UPDATE | DELETE | INSERT INTO | INSERT OVERWRITE | 分区 | 创建方式 |
|---|---|---|---|---|---|---|
| 普通表 |
❌ | ❌ | ✅ | ✅ | ✅ | |
| Transactional Table | ✅ | ✅ | ✅ | ✅ | ✅ | TBLPROPERTIES (“transactional”=”true”) |
| Delta Table |
✅ | ✅ | ✅ | ✅ | ✅ | Transactional 基础之上指定 PRIMARY KEY |
| 聚簇表 | ❌ | ❌ | ⚠️(不支持追加) | ✅ | ✅ | CLUSTERED BY… INTO n buckets |