跳到主要内容

curl 参数和使用

· 阅读需 2 分钟
素明诚
Full stack development

基本参数介绍

注意curl 命令中的参数是区分大小写的

参数描述
-A 或 --user-agent在请求中设置 User-Agent。
-b 或 --cookie传递 cookie 到服务器或从文件中读取 cookie 数据。
-c 或 --cookie-jar把服务器发送的所有 cookies 写入这个文件。
-d 或 --data发送 POST 请求的数据。
-e 或 --referer在请求中包含一个 'referer' 头,用来模拟用户从指定的链接访问。
-F 或 --form模拟提交表单。
-H 或 --header添加自定义头部到请求中。
-i 或 --include输出时包括协议头信息。
-I 或 --head只获取文档的 HTTP 头部。
-k 或 --insecure允许 curl 执行“不安全”的 SSL 连接和传输。
-L 或 --location跟随重定向。
-o 或 --output将输出保存到文件而不是打印到标准输出。
-O 或 --remote-name使用 URL 的最后一部分作为文件名保存下载的文件。
-s 或 --silent静默模式。不输出任何东西。
-T 或 --upload-file上传文件。
-u 或 --user使用指定的用户和密码进行认证。
-v 或 --verbose让 curl 提供更多信息,用于调试。
-X 或 --request指定请求的命令(如 GET、POST)。
-# 或 --progress-bar使用进度条显示文件传输进度。

获取网页内容并保存到文件

curl -o google.html http://www.google.com

这里使用 -o 参数将 www.google.com 的首页内容保存到 google.html 文件中。

发送 POST 请求

curl -d "username=example&password=secret" http://www.google.com/login

使用 -d 参数提供表单数据,向 www.google.com/login 发送 POST 请求。

添加请求头

curl -H "Content-Type: application/json" -H "Authorization: Bearer TOKEN" http://www.google.com/api

使用 -H 添加自定义请求头,这里添加了 Content-TypeAuthorization 两个头部信息。

使用 HTTPS 并忽略证书验证

curl -k https://localhost/api

使用 -k 参数忽略 SSL 证书验证,适用于开发环境或自签名证书的情况。

wget 基本用法

· 阅读需 2 分钟
素明诚
Full stack development

wget 命令中的参数也是区分大小写的。这是大多数 UNIX 和 Linux 命令行工具的通用特性

wget 参数列表

参数描述
-O 或 --output-document指定下载文件的存储名字。
-c 或 --continue断点续传,继续未完成的下载。
-r 或 --recursive递归下载,例如下载整个网站。
-l 或 --level限定递归下载的深度。
--no-parent递归下载时,不下载父目录中的链接。
-i 或 --input-file从文件中读取 URL 列表进行批量下载。
--limit-rate限制下载速度,例如 --limit-rate=100k 限制速度为每秒 100KB。
--no-clobber避免下载重复的文件,即如果文件已存在则不会再次下载。
--http-user 和 --http-password用于网站需要认证的下载。
-q 或 --quiet安静模式,不输出任何东西。
--show-progress显示下载进度条。
--header向请求中添加 HTTP 头部,如 --header "Cookie: name=value"。

基本下载

下载单个文件,并保存为原始名称

wget http://example.com/somefile.txt

下载并重命名文件

下载文件并以不同的名称保存

wget -O myfile.txt http://example.com/somefile.txt

递归下载网站

下载整个网站,限制目录深度为 3

wget -r -l 3 http://example.com

断点续传

如果下载中断,可以使用断点续传继续下载

wget -c http://example.com/bigfile.zip

限制下载速度

下载文件时限制带宽

wget --limit-rate=200k http://example.com/bigfile.zip

配置 Git 走本地代理

· 阅读需 1 分钟
素明诚
Full stack development

配置 Git 使用 SOCKS5 代理

如果您的软件代理是 SOCKS5 代理,可以通过以下命令配置 Git 使用 SOCKS5 代理(假设代理地址是127.0.0.1,端口是7890

git config --global http.proxy 'socks5://127.0.0.1:7890'
git config --global https.proxy 'socks5://127.0.0.1:7890'

配置 Git 使用 HTTP 代理

如果您使用的是 HTTP 代理,配置方法类似(假设代理地址是127.0.0.1,端口是7890

git config --global http.proxy 'http://127.0.0.1:7890'
git config --global https.proxy 'http://127.0.0.1:7890'

验证配置

配置完成后,您可以通过查看 Git 配置来验证代理设置是否成功

git config --global --get http.proxy
git config --global --get https.proxy

取消代理配置

如果您想取消 Git 的代理配置,可以使用以下命令

git config --global --unset http.proxy
git config --global --unset https.proxy

配置后 clone 项目会更快一些

72dfc04f3d66b3140b841d5d22f33670

Linux nano 优化配置 nanorc 提升效率和舒适度

· 阅读需 2 分钟
素明诚
Full stack development

打开或创建.nanorc 文件

打开终端输入

nano ~/.nanorc

编辑.nanorc 文件以添加配置

.nanorc 文件中,您可以添加一系列的配置命令来优化使用体验

启用语法高亮

include "/usr/share/nano/*.nanorc"

加载系统中所有预定义的语法高亮配置。

启用自动缩进

set autoindent

显示行号

set linenumbers

常显示光标位置

set constantshow

开启软换行

set softwrap

设置制表符宽度

set tabsize 4

这会将制表符宽度设置为 4 个空格。这个设置在编辑代码时尤其有用,因为它可以确保代码的缩进一致。

替换制表符为空格

set tabstospaces

这个设置会将您按下的制表符自动转换为空格,这是编写某些语言(如 Python)代码时推荐的做法。

禁用备份文件的创建

unset backup

默认情况下,nano 可能会创建备份文件。使用这个命令可以阻止创建带有 ~ 后缀的备份文件。

设置鼠标支持

set mouse

这使您可以使用鼠标进行选择和滚动操作,尽管这在一些终端环境中可能不完全支持。

自定义高亮 您可以为特定的文件类型定义自定义的语法高亮规则。

例如,为 Python 文件添加高亮规则

syntax "python" "\.py$"
color brightyellow "(if|else|for|break|continue|return|in|not|is)"
color brightblue "(def|class|from|import|as)"
color green "#.*"

这将设置关键字、函数名和注释的颜色。

保存并关闭.nanorc 文件

完成编辑后,按 Ctrl+O 来保存文件。

Enter 确认文件名。

Ctrl+X 退出 nano

nano 快捷键使用指南

· 阅读需 2 分钟
素明诚
Full stack development
功能快捷键说明
退出Ctrl+X退出 nano 编辑器。如果文档未保存,会提示是否保存更改。
保存文件Ctrl+O保存当前文件。通常会提示确认文件名和保存位置。
帮助Ctrl+G显示帮助窗口,列出所有的快捷键及其功能。
查找文字Ctrl+W打开查找模式,输入后按 Enter 搜索指定文字。
跳至行首Ctrl+A移动光标至当前行的开始。
跳至行尾Ctrl+E移动光标至当前行的结束。
剪切行Ctrl+K剪切整行文字到剪贴板,可用于移动或删除行。
粘贴行Ctrl+U粘贴剪贴板上的内容到光标位置。
撤销Alt+U撤销最近的编辑操作。在较新版本的 nano 中可用。
重做Alt+E重做最近被撤销的编辑操作。在较新版本的 nano 中可用。
读取文件Ctrl+R插入另一个文件的内容到当前编辑位置。
替换文字Ctrl+\替换文档中的文字,首先输入待替换的文字,然后输入新的内容。
标记文本Ctrl+^标记文本(开始或结束选择区域),用于复制或剪切操作。
复制文本Alt+^复制选中的文本到剪贴板。
光标跳转Ctrl+_跳转到指定的行号和列号。
重新排版段落Ctrl+J对当前段落进行格式化操作。
搜索下一个Alt+W继续向下搜索最近一次查找的关键词。
显示位置信息Ctrl+C显示当前光标的行号和列号,以及文件状态信息。

在终端中使用 nano filename 命令打开或创建文件 filename

PM2 常用命令

· 阅读需 2 分钟
素明诚
Full stack development

PM2 常用命令

命令描述示例
pm2 start启动应用程序pm2 start app.js
pm2 list列出所有由 PM2 管理的进程pm2 list
pm2 stop停止应用程序pm2 stop app_name
pm2 restart重启应用程序pm2 restart app_name
pm2 delete删除应用程序pm2 delete app_name
pm2 reload重载应用程序,零停机时间pm2 reload app_name
pm2 status显示每个进程的状态pm2 status
pm2 monit监控当前管理的所有应用程序pm2 monit
pm2 logs显示所有进程的日志pm2 logs
pm2 flush清空所有日志文件pm2 flush
pm2 describe提供应用程序的详细信息pm2 describe app_name
pm2 scale调整应用程序的实例数量pm2 scale app_name +3
pm2 update保存当前的进程列表,并在重启后恢复pm2 update
pm2 save保存当前的进程列表pm2 save
pm2 resurrect重新加载保存的进程列表pm2 resurrect
pm2 startup生成并配置启动脚本以在系统启动时启动 PM2 管理的应用pm2 startup

注意事项

启动应用pm2 start app.js 启动名为 app.js 的应用。你还可以指定应用的实例数量,例如:pm2 start app.js -i 4 代表启动 4 个实例。

查看状态pm2 status 可以查看每个由 PM2 管理的进程的状态,包括内存和 CPU 的使用情况。

日志管理pm2 logs 可以实时查看所有进程的日志输出。使用 pm2 logs app_name 可以查看特定应用的日志。

配置启动脚本pm2 startup 命令会生成一个系统启动时用来启动 PM2 和它的进程的启动脚本。这对于确保在服务器重启后自动重启应用程序非常有用。

Chrome http 获取麦克风

· 阅读需 1 分钟
素明诚
Full stack development

谷歌浏览器地址栏输入

chrome://flags/#unsafely-treat-insecure-origin-as-secure

设置 IP 地址并且启用

f6ef4dc1affa10203794f8d98eafca91

多个地址

http://10.20.201.215:30001,http://172.22.220.89:30001

重启浏览器

点击右下角的 Relaunch

Go 中的 atomic 的使用场景

· 阅读需 4 分钟
素明诚
Full stack development

atomic 的最佳实践和使用场景

计数器和统计信息

原子包常用于实现高性能的计数器或统计数据收集,例如计算网站访问量、服务调用次数等。因为这些操作通常涉及单个变量的简单增减,使用原子操作比引入互斥锁更为高效。

var visitors int64
// 每次用户访问时,增加访客数量
atomic.AddInt64(&visitors, 1)

状态标志管理

在多线程环境中,使用原子操作来检查或设置状态标志可以避免使用锁,特别是在状态变化不频繁,但检查频繁的场景。

var state int32
// 设置状态
atomic.StoreInt32(&state, 1)
// 检查状态
if atomic.LoadInt32(&state) == 1 {
// 执行某些操作
}

无锁数据结构

在实现无锁数据结构,如无锁队列、无锁栈等时,原子操作是必不可少的工具。这些数据结构通常用在高性能或实时系统中,可以显著减少线程阻塞。

type AtomicInt struct {
value int64
}

func (a *AtomicInt) Increment() {
atomic.AddInt64(&a.value, 1)
}

func (a *AtomicInt) Get() int64 {
return atomic.LoadInt64(&a.value)
}

不建议使用的场景

复杂状态或多变量协同

当操作涉及到多个变量或者状态较为复杂的同步时,仅使用原子操作往往无法有效管理。例如,需要根据多个变量的值决定逻辑流程的情况,使用互斥锁可能是更好的选择,因为它们可以同时保护多个变量。

// 错误用法:尝试使用原子操作同步多个变量
var a, b int32
atomic.AddInt32(&a, 1)
atomic.AddInt32(&b, 1)
// 无法保证 a 和 b 的增加操作是同步发生的

复杂的业务逻辑

如果业务逻辑需要条件同步,涉及多步骤验证或者复合状态变化,使用原子操作会使代码复杂且难以维护。在这些场景中,使用更高级的同步机制(如通道、锁或条件变量等)通常更加合适。

高频度的写操作

原子操作确保了单个操作的原子性,即在操作过程中不会被其他线程打断。这通过硬件级别的支持完成,通常是通过一种称为“比较并交换”(Compare-and-Swap, CAS)的操作。当你有多个线程试图同时修改同一个变量时,每个线程都会尝试执行 CAS 操作:

  1. 读取当前值:线程首先读取目标变量的当前值。
  2. 计算新值:基于当前值,线程计算新的值。
  3. 比较并交换:如果目标变量的当前值与步骤 1 中读到的值相同,CAS 操作会将新值写入变量。如果不同,说明在此期间内其他线程已经修改了变量,当前线程的操作失败,通常会重试。

频繁的写操作引发的问题

当大量线程频繁尝试更新同一个变量时,以下问题可能发生

  • 争用高:每个线程都尝试修改数据,但由于 CAS 的工作机制,只有一个线程的修改能成功,其他线程需要重试。这导致了高争用,多个线程不断重试,浪费 CPU 资源。
  • 性能瓶颈:尽管原子操作比锁的开销小,但当争用非常激烈时,线程频繁进行无效的重试,这会成为系统性能的瓶颈。
  • 线程饥饿:在极端的争用场景中,某些线程可能会长时间地成功不了操作,导致线程饥饿。

所以在确保线程安全的同时,优化系统的整体性能,避免因原子操作的过度使用而导致的性能瓶颈。atomic 包在处理简单的同步需求时非常有用,尤其适合于轻量级的操作,比如状态标志或计数器。

docker-compose 配置卷示例

· 阅读需 2 分钟
素明诚
Full stack development

示例

version: '3.8'

services:
mysql:
image: mysql:8.0.36
container_name: tcm-mysql
environment:
MYSQL_ROOT_PASSWORD: 123114
MYSQL_DATABASE: tcm_department_syndrome # 设置数据库名称
ports:
- "3306:3306"
volumes:
- my_db:/var/lib/mysql
restart: always

redis:
image: redis:6.2.6
container_name: tcm-redis
ports:
- "6379:6379"
volumes:
- my_redis:/data
restart: always

volumes:
my_db:
my_redis:

卷驱动(Volume Driver)

本地驱动local 表示使用 Docker 自带的本地卷驱动来管理卷。这是最常见的卷驱动,用于在宿主机的文件系统上创建和管理卷。

其他驱动选项:Docker 还支持其他类型的卷驱动,例如 azuregcpaws 等,这些驱动允许你将数据存储在远程的云存储服务上。

命名卷位置

在 Docker 中,命名卷 my_dbmy_redis 用于数据持久化,确保数据不会因为容器的删除而丢失。命名卷通常存储在 Docker 的默认卷存储位置,这个位置依赖于 Docker 在宿主机上的安装配置。

对于 Linux 系统

Docker 通常将卷数据存储在 /var/lib/docker/volumes/ 目录下。你可以在该目录下找到以卷名命名的子目录,例如:

  • /var/lib/docker/volumes/my_db/_data 用于 mysql 服务的数据。
  • /var/lib/docker/volumes/my_redis/_data 用于 redis 服务的数据。

查看卷的实际位置

使用 Docker 命令来查找每个卷的确切存储位置

docker volume inspect my_db
docker volume inspect my_redis

fd4f966765ca36274af8a8435f7ec47a

pyenv 常用命令

· 阅读需 1 分钟
素明诚
Full stack development

脚本安装

https://github.com/sumingcheng/py-utils/blob/main/pyenv/install_pyenv.sh## 常用命令

安装 Python 版本: 使用 pyenv install 命令来安装一个特定的 Python 版本。例如,要安装 Python 3.11.5,你可以运行

pyenv install  3.11.5

可以使用 pyenv install --list 查看所有可安装的版本。

设置全局 Python 版本: 通过 pyenv global 命令来设置系统的全局 Python 版本。例如

pyenv global  3.11.5

这将使 Python 3.11.5 成为系统默认的 Python 版本。

设置局部 Python 版本: 在特定目录下使用 pyenv local 命令来设置该目录使用的 Python 版本。例如,在某个项目目录下运行

pyenv local 3.11.5

这将为当前目录及其子目录设置 Python 3.7.4 为默认版本。

查看当前使用的 Python 版本: 使用 pyenv version 命令查看当前的 Python 版本和来源(是全局的还是局部的)。

查看所有已安装的 Python 版本: 使用 pyenv versions 命令查看系统中已安装的所有 Python 版本。

注意事项

环境变量配置: 确保你的 shell 配置文件(如 .bashrc.zshrc)中正确设置了 pyenv 的环境变量。通常这包括

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"