Compare commits
15
Commits
2b2745d1ab
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39254f1497 | ||
|
|
6ec51762dd | ||
|
|
e886c76c14 | ||
|
|
012e8ed87a | ||
|
|
04faca660a | ||
|
|
4224b80991 | ||
|
|
4432c47524 | ||
|
|
c605823567 | ||
|
|
80f229f9e2 | ||
|
|
a59f444f86 | ||
|
|
ae1152be1e | ||
|
|
88a4910def | ||
|
|
edf950b423 | ||
|
|
3a1e386929 | ||
|
|
e16165bfef |
@@ -5,5 +5,195 @@ author: 文永达
|
||||
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg
|
||||
---
|
||||
|
||||
# 选择器与属性
|
||||
|
||||
## 基本语法结构
|
||||
|
||||
CSS的规则通常长这样:
|
||||
```css
|
||||
选择器 {
|
||||
属性: 值;
|
||||
}
|
||||
```
|
||||
|
||||
## 元素选择器
|
||||
|
||||
举个例子,如果我们想把网页上所有的`<h1>`标题变成红色:
|
||||
|
||||
```css
|
||||
h1 {
|
||||
color: red;
|
||||
}
|
||||
```
|
||||
|
||||
- `h1` 是 **选择器**(选中所有 h1 标签)。
|
||||
- `color` 是 **属性**(我们要改颜色)。
|
||||
- `red` 是 **值**(改成红色)。
|
||||
|
||||
这叫 **元素选择器**,因为它选中了所有叫 `h1` 的元素。没问题,我们继续!🚀
|
||||
|
||||
为了确保你完全掌握了刚才的逻辑,我先揭晓一下刚才小练习的答案。要把 `<p>` 标签的文字变成蓝色,代码是这样的:
|
||||
|
||||
CSS
|
||||
|
||||
假设你的 HTML 里有这样一个段落标签:
|
||||
|
||||
```html
|
||||
<p>我是一个普通的段落。</p>
|
||||
```
|
||||
|
||||
如果想把这个段落的文字颜色改成 **蓝色 (blue)**
|
||||
|
||||
```css
|
||||
p {
|
||||
color: blue;
|
||||
}
|
||||
```
|
||||
|
||||
很简单对吧?这叫 **元素选择器**,因为它选中了所有叫 `p` 的元素。
|
||||
|
||||
------
|
||||
|
||||
🔥 进阶:如何只选中“某一个”?
|
||||
|
||||
在实际做网页时,我们通常不希望**所有**的段落都长得一样。比如,你可能希望有一个段落是特别的“警告信息”。
|
||||
|
||||
这时候,我们需要给 HTML 标签起个“名字”或者贴个“标签”。
|
||||
|
||||
1. **类 (Class)**:
|
||||
- **作用**:就像给一群人穿上同样的制服。多个元素可以共用同一个 class。
|
||||
- **CSS 写法**:用 `.` (小圆点) 开头。
|
||||
2. **ID**:
|
||||
- **作用**:就像身份证号。整个页面里,一个 ID 只能给一个元素用,是唯一的。
|
||||
- **CSS 写法**:用 `#` (井号) 开头。
|
||||
|
||||
## 类选择器
|
||||
|
||||
假设我们的 HTML 代码是这样的:
|
||||
|
||||
```html
|
||||
<p class="alert">注意:这是一个警告!</p>
|
||||
|
||||
<p>我只是一个路人甲。</p>
|
||||
```
|
||||
|
||||
如果我们只想选中那个带有 `alert` 类的段落,把它的颜色变成 **红色 (red)**,CSS 选择器应该怎么写?
|
||||
|
||||
**提示**:记得 Class 选择器要用 `.` 开头哦。
|
||||
|
||||
```css
|
||||
.alert {
|
||||
color: red;
|
||||
}
|
||||
```
|
||||
|
||||
## ID 选择器
|
||||
|
||||
比 Class 更“独一无二”的:**ID**。
|
||||
|
||||
在 CSS 里,我们要用 **井号 (#)** 来代表 ID。
|
||||
|
||||
```html
|
||||
<h1 id="main-title">欢迎来到我的主页</h1>
|
||||
```
|
||||
|
||||
如果我们想把这个标题的 **字体大小 (font-size)** 设置为 **40px**,你应该怎么写这段 CSS?
|
||||
|
||||
**提示**:记得 ID 要用 `#` 开头哦。
|
||||
|
||||
```css
|
||||
#main-title {
|
||||
font-size: 40px;
|
||||
}
|
||||
```
|
||||
|
||||
## 后代选择器 (Descendant Selector)
|
||||
|
||||
**根据“位置”来选元素**。
|
||||
|
||||
有时候,你不想选中“所有的 `a` 标签”,你只想选中“侧边栏 (Sidebar) 里的 `a` 标签”。这就需要用到**后代选择器**。
|
||||
|
||||
**语法规则**: 我们在两个选择器之间加一个 **空格 (Space)**,表示“里面的”意思。
|
||||
|
||||
```css
|
||||
/* 选中所有在 div 里面的 p 标签 */
|
||||
div p {
|
||||
color: green;
|
||||
}
|
||||
```
|
||||
|
||||
- `div` 是父元素(外面的)。
|
||||
|
||||
- `p` 是子元素(里面的)。
|
||||
|
||||
- 中间的**空格**很关键!
|
||||
|
||||
假设我们有下面这段 HTML,里面有两个链接,但我们只想修改在 `.nav` 里面的那个链接:
|
||||
|
||||
```html
|
||||
<div class="nav">
|
||||
<a href="#">我是导航菜单</a>
|
||||
</div>
|
||||
|
||||
<a href="#">我是普通链接</a>
|
||||
```
|
||||
|
||||
选中 **`.nav` 里面的 `a` 标签**,并把它的颜色改成 **橙色 (orange)**。
|
||||
|
||||
**提示**:记得利用空格来表示层级关系哦!
|
||||
|
||||
```css
|
||||
.nav a {
|
||||
color: orange;
|
||||
}
|
||||
```
|
||||
|
||||
## 伪类 (Pseudo-classes)
|
||||
|
||||
现在你已经能控制元素“静止”时的样子了,接下来我们要让网页变得更有**互动感**。我们要学习的是 **伪类 (Pseudo-classes)**。
|
||||
|
||||
最常用的一个伪类是 `:hover`。
|
||||
|
||||
- **作用**:它是指“当鼠标**悬停**在元素上时”的那个瞬间。
|
||||
- **语法**:在选择器后面紧跟着写 `:hover` (注意:冒号前面**不能**有空格)。
|
||||
|
||||
```css
|
||||
/* 例子:所有按钮在鼠标放上去时,背景变黑 */
|
||||
button:hover {
|
||||
background-color: black;
|
||||
}
|
||||
```
|
||||
|
||||
```html
|
||||
<div class="nav">
|
||||
<a href="#">我是导航菜单</a>
|
||||
</div>
|
||||
|
||||
<a href="#">我是普通链接</a>
|
||||
```
|
||||
|
||||
要求: 当鼠标**悬停**在 `.nav` 里面的 `a` 标签上时,把它的**文字颜色**变成 **绿色 (green)**。
|
||||
|
||||
**提示**:你需要把刚才学的“后代选择器”和现在的“伪类”结合起来写哦!
|
||||
|
||||
```css
|
||||
.nav a:hover {
|
||||
color: green;
|
||||
}
|
||||
```
|
||||
|
||||
# 盒模型
|
||||
|
||||
既然你已经学会了怎么给元素“上色”,接下来我们要学怎么控制它们的“身材”和“距离”。
|
||||
|
||||
在 CSS 的世界里,**所有的元素(无论是图片、段落还是标题)本质上都是一个矩形的盒子**。
|
||||
|
||||
我们要控制这个盒子,主要靠这四个属性(由内向外):
|
||||
|
||||
1. **内容 (Content)**:盒子的核心,就是文字或图片本身。
|
||||
2. **内边距 (Padding)**:内容和边框之间的空间。就像快递盒子里的气泡膜,保护内容不紧贴着纸箱壁。
|
||||
3. **边框 (Border)**:盒子的边缘。
|
||||
4. **外边距 (Margin)**:盒子和其他盒子之间的距离。就像人与人之间的社交距离。
|
||||
|
||||
## CSS Text(文本)
|
||||
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
---
|
||||
title: Claude Code
|
||||
date: 2026-02-27 14:05:22
|
||||
tags: [AI, 效率工具]
|
||||
categories: 开发工具
|
||||
---
|
||||
|
||||
## 简介
|
||||
|
||||
Claude Code 是 Anthropic 官方推出的 CLI 工具,让你在终端中直接使用 Claude AI 助手完成软件工程任务。
|
||||
|
||||
## 安装
|
||||
|
||||
### 通过 npm 安装
|
||||
|
||||
确保已安装 Node.js(推荐 v18+ 版本),然后使用 npm 全局安装:
|
||||
|
||||
```bash
|
||||
npm install -g @anthropic-ai/claude-code
|
||||
```
|
||||
|
||||
或者使用 yarn:
|
||||
|
||||
```bash
|
||||
yarn global add @anthropic-ai/claude-code
|
||||
```
|
||||
|
||||
使用 pnpm:
|
||||
|
||||
```bash
|
||||
pnpm add -g @anthropic-ai/claude-code
|
||||
```
|
||||
|
||||
### 验证安装
|
||||
|
||||
```bash
|
||||
claude -v
|
||||
```
|
||||
|
||||
## 配置
|
||||
|
||||
### 1. 获取 API Key
|
||||
|
||||
访问 [Anthropic Console](https://console.anthropic.com/) 注册账号并获取 API Key。
|
||||
|
||||
### 2. 配置 API Key
|
||||
|
||||
有两种方式配置 API Key:
|
||||
|
||||
**方式一:环境变量(推荐)**
|
||||
|
||||
在命令行中设置环境变量:
|
||||
|
||||
```bash
|
||||
# Windows PowerShell
|
||||
$env:ANTHROPIC_API_KEY="your-api-key-here"
|
||||
|
||||
# Windows CMD
|
||||
set ANTHROPIC_API_KEY=your-api-key-here
|
||||
|
||||
# macOS/Linux
|
||||
export ANTHROPIC_API_KEY="your-api-key-here"
|
||||
```
|
||||
|
||||
**方式二:配置文件**
|
||||
|
||||
```json
|
||||
{
|
||||
"env": {
|
||||
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
|
||||
"ANTHROPIC_BASE_URL": "https://coding.dashscope.aliyuncs.com/apps/anthropic",
|
||||
"ANTHROPIC_MODEL": "qwen3.5-plus"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
配置文件位置:
|
||||
- Windows: `%USERPROFILE%\.claude\settings.json`
|
||||
- macOS/Linux: `~/.claude\settings.json`
|
||||
|
||||
### 3. 配置模型
|
||||
|
||||
可以指定使用的 Claude 模型:
|
||||
|
||||
```bash
|
||||
# 使用最新模型
|
||||
claude --model claude-opus-4-6
|
||||
|
||||
# 使用 Sonnet 模型
|
||||
claude --model claude-sonnet-4-6
|
||||
|
||||
# 使用 Haiku 模型
|
||||
claude --model claude-haiku-4-5-20251001
|
||||
```
|
||||
|
||||
## 常用命令
|
||||
|
||||
| 命令 | 说明 |
|
||||
|------|------|
|
||||
| `claude` | 启动交互式对话 |
|
||||
| `claude -p "问题"` | 直接提问并获取答案 |
|
||||
| `claude --model <模型名>` | 指定模型 |
|
||||
| `claude --version` | 查看版本 |
|
||||
| `claude --help` | 查看帮助 |
|
||||
|
||||
## MCP 配置
|
||||
|
||||
MCP (Model Context Protocol) 允许 Claude 连接外部服务和工具。
|
||||
|
||||
### 添加 MCP Server
|
||||
|
||||
```bash
|
||||
# 添加 fetch MCP 服务(用于网页内容抓取)
|
||||
claude mcp add fetch -- uvx mcp-server-fetch
|
||||
```
|
||||
|
||||
### 常用 MCP 服务
|
||||
|
||||
| 服务 | 命令 | 说明 |
|
||||
|------|------|------|
|
||||
| fetch | `claude mcp add fetch -- uvx mcp-server-fetch` | 网页内容抓取 |
|
||||
| filesystem | `claude mcp add filesystem -- npx -y @anthropic-ai/mcp-server-filesystem` | 文件系统访问 |
|
||||
| git | `claude mcp add git -- npx -y @anthropic-ai/mcp-server-git` | Git 操作 |
|
||||
|
||||
配置好的 MCP 配置文件实例 `~/.claude.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"context7": {
|
||||
"command": "cmd",
|
||||
"args": [
|
||||
"/c",
|
||||
"npx",
|
||||
"-y",
|
||||
"@upstash/context7-mcp@latest"
|
||||
],
|
||||
"env": {
|
||||
"DEFAULT_MINIMUM_TOKENS": "10000"
|
||||
}
|
||||
},
|
||||
"Sequential Thinking": {
|
||||
"command": "cmd",
|
||||
"args": [
|
||||
"/c",
|
||||
"npx",
|
||||
"-y",
|
||||
"@modelcontextprotocol/server-sequential-thinking"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
"Playwright": {
|
||||
"command": "cmd",
|
||||
"args": [
|
||||
"/c",
|
||||
"npx",
|
||||
"-y",
|
||||
"@executeautomation/playwright-mcp-server"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
"Fetch": {
|
||||
"command": "cmd",
|
||||
"args": [
|
||||
"/c",
|
||||
"uvx",
|
||||
"mcp-server-fetch"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
"MySQL": {
|
||||
"command": "cmd",
|
||||
"args": [
|
||||
"/c",
|
||||
"uvx",
|
||||
"--from",
|
||||
"mysql-mcp-server",
|
||||
"mysql_mcp_server"
|
||||
],
|
||||
"env": {
|
||||
"MYSQL_HOST": "127.0.0.1",
|
||||
"MYSQL_PORT": "3306",
|
||||
"MYSQL_USER": "root",
|
||||
"MYSQL_PASSWORD": "123456",
|
||||
"MYSQL_DATABASE": "db"
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 查看已配置的 MCP
|
||||
|
||||
```bash
|
||||
claude mcp list
|
||||
```
|
||||
|
||||
### 移除 MCP
|
||||
|
||||
```bash
|
||||
claude mcp remove <服务名>
|
||||
```
|
||||
|
||||
## 使用示例
|
||||
|
||||
```bash
|
||||
# 启动交互模式
|
||||
claude
|
||||
|
||||
# 直接提问
|
||||
claude -p "解释一下什么是闭包"
|
||||
|
||||
# 分析代码文件
|
||||
claude -p "这个函数有什么问题" ./src/index.js
|
||||
|
||||
# 使用特定模型
|
||||
claude --model claude-opus-4-6 -p "帮我重构这段代码"
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- API 调用会产生费用,请合理使用
|
||||
- 建议将 API Key 设置为环境变量避免每次输入
|
||||
- 不同模型的价格和能力有所不同,根据需要选择
|
||||
+99
-1
@@ -747,6 +747,15 @@ Build Cache 12 0 0B 0B
|
||||
|
||||
执行 **docker system prune -a** 命令之后,Docker 占用的磁盘空间减少了很多
|
||||
|
||||
```shell
|
||||
du -sh /var/lib/docker/containers/* | sort -rh | head -5
|
||||
cd /var/lib/docker/containers/eb52fa7d62ce52ab7a6153636a0ec89c7c8dce6f1a94dc86b2fbf0702368e82
|
||||
|
||||
truncate -s 0 *-json.log
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 手动清理 Docker 镜像/容器/数据卷
|
||||
|
||||
对于旧版的 Docker(版本 1.13 之前),是没有 docker system 命令的,因此需要进行手动清理。这里给出几个常用的命令
|
||||
@@ -771,10 +780,41 @@ docker volume rm $(docker volume ls -qf dangling=true)
|
||||
|
||||
## 限制容器的日志大小
|
||||
|
||||
防止它再次爆满
|
||||
|
||||
配置 Docker 全局日志轮转策略
|
||||
|
||||
**编辑/新建 Docker 配置文件**:`/etc/docker/daemon.json`
|
||||
|
||||
**添加 log-opts 配置**: (限制每个容器日志最大 100MB,最多保留 3 个文件)
|
||||
|
||||
```json
|
||||
{
|
||||
"log-driver": "json-file",
|
||||
"log-opts": {
|
||||
"max-size": "100m",
|
||||
"max-file": "3"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
(注意:如果文件里已有其他配置,请确保 JSON 格式正确,不要漏掉逗号)
|
||||
|
||||
**重启 Docker 服务**:
|
||||
|
||||
```shell
|
||||
systemctl daemon-reload
|
||||
systemctl restart docker
|
||||
```
|
||||
|
||||
注意:此配置只对**新建**的容器生效。对于现有的 `1a28bcc...` 容器,你需要将其删除并重新运行 (`docker rm` -> `docker run`) 才能应用新策略。
|
||||
|
||||
## 清理容器日志
|
||||
|
||||
Docker 的所有相关文件,包括镜像、容器等都保存在 **/var/lib/docker** 目录中:
|
||||
|
||||
```shell
|
||||
du -hs /var/lib/docker/
|
||||
du -sh /var/lib/docker/
|
||||
29G /var/lib/docker/
|
||||
```
|
||||
|
||||
@@ -786,6 +826,18 @@ du -hs /var/lib/docker/
|
||||
truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log
|
||||
```
|
||||
|
||||
也可以清空文件内容,需要root权限
|
||||
|
||||
```shell
|
||||
# 方法 1:使用 echo 重定向(推荐)
|
||||
sh -c "echo '' > /var/lib/docker/containers/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189-json.log"
|
||||
|
||||
# 或者 方法 2:使用 cat /dev/null
|
||||
sh -c "cat /dev/null > /var/lib/docker/containers/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189-json.log"
|
||||
```
|
||||
|
||||
**原理:** 这会将文件的大小截断为 0,但保持文件的 inode(文件句柄)不变。Docker 进程可以继续向这个文件写入新日志,而你立即获得释放的空间。
|
||||
|
||||
## 重启 Docker
|
||||
|
||||
当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据[Docker disk usage](https://github.com/moby/moby/issues/12265)提到过的建议,我重启了 Docker,发现**磁盘使用率从 83%降到了 19%**。根据高手[指点](https://github.com/moby/moby/issues/12265#issuecomment-316303769),这应该是与内核 3.13 相关的 BUG,导致 Docker 无法清理一些无用目录:
|
||||
@@ -803,6 +855,52 @@ uname -r
|
||||
|
||||
如果你的内核版本也是 3.13,而且清理磁盘没能成功,不妨重启一下 Docker。当然,这个晚上操作比较靠谱。
|
||||
|
||||
# Docker 迁移
|
||||
|
||||
## 从Docker迁移到Podman
|
||||
|
||||
```bash
|
||||
# 迁移步骤概要
|
||||
# 1. 安装Podman
|
||||
sudo apt-get install podman
|
||||
|
||||
# 2. 迁移Docker配置
|
||||
podman system migrate
|
||||
|
||||
# 3. 迁移镜像(如需要)
|
||||
docker save myimage | podman load
|
||||
|
||||
# 4. 创建别名(可选)
|
||||
echo "alias docker=podman" >> ~/.zshrc
|
||||
source ~/.zshrc
|
||||
|
||||
# 5. 验证功能等效性
|
||||
podman run --rm hello-world
|
||||
```
|
||||
|
||||
## 从Docker迁移到nerdctl
|
||||
|
||||
```bash
|
||||
# 迁移步骤概要
|
||||
# 1. 安装containerd和nerdctl
|
||||
sudo apt-get install containerd.io
|
||||
sudo nerdctl install
|
||||
|
||||
# 2. 配置nerdctl
|
||||
sudo cp /etc/docker/daemon.json /etc/nerdctl/nerdctl.toml
|
||||
|
||||
# 3. 迁移镜像(如需要)
|
||||
docker save myimage | sudo nerdctl load
|
||||
|
||||
# 4. 更新脚本和CI/CD流程
|
||||
# 将所有'docker'命令替换为'nerdctl'
|
||||
|
||||
# 5. 验证功能等效性
|
||||
nerdctl run --rm hello-world
|
||||
```
|
||||
|
||||
|
||||
|
||||
# Docker 实例
|
||||
|
||||
## Docker 启动 MariaDB
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
---
|
||||
title: Git Cherry-Pick
|
||||
date: 2025-12-11 23:02:39
|
||||
tags:
|
||||
---
|
||||
|
||||
# Git Cherry-Pick 详解文档
|
||||
|
||||
## 1. 概述
|
||||
|
||||
`git cherry-pick` 是 Git 中一个强大的命令,用于**将一个或多个指定的提交(commits)从一个分支“摘取”并应用到当前分支上**。它不会合并整个分支,而是只复制你指定的提交变更。
|
||||
|
||||
> 简单理解:**“只拿我想要的改动,不拿整个分支”**。
|
||||
|
||||
## 2. 基本语法
|
||||
|
||||
```bash
|
||||
git cherry-pick <commit-hash>
|
||||
git cherry-pick <commit1> <commit2> ...
|
||||
git cherry-pick <start-commit>^..<end-commit> # 摘取一个范围(含 start 和 end)
|
||||
```
|
||||
|
||||
- `<commit-hash>`:要摘取的提交的完整或简短哈希值
|
||||
- 可以一次指定多个提交,Git 会按顺序逐个应用
|
||||
- 提交顺序很重要:默认按你提供的顺序执行(不是按时间顺序)
|
||||
|
||||
## 3. 典型使用场景
|
||||
|
||||
### ✅ 场景 1:修复补丁快速移植
|
||||
|
||||
> 在 `dev` 分支上修复了一个严重 bug,需要紧急同步到 `release` 分支,但 `dev` 上还有其他未测试功能不能合并。
|
||||
|
||||
```bash
|
||||
git checkout release
|
||||
git cherry-pick a1b2c3d # 仅应用修复提交s
|
||||
```
|
||||
|
||||
### ✅ 场景 2:从 feature 分支提取部分功能
|
||||
|
||||
> 某个功能分支开发了多个特性,但当前只希望上线其中一部分。
|
||||
|
||||
### ✅ 场景 3:从其他远程仓库(如上游)选取特定提交
|
||||
|
||||
> 例如你 fork 了一个开源项目,原项目修复了某个问题,你想只拿这个修复。
|
||||
|
||||
## 4. 工作流程示例
|
||||
|
||||
假设你有两个分支:`main` 和 `feature`
|
||||
|
||||
```bash
|
||||
# 当前在 main 分支
|
||||
git checkout main
|
||||
|
||||
# 查看 feature 分支的提交历史
|
||||
git log feature --oneline
|
||||
# 输出:
|
||||
# abc1234 Add login feature
|
||||
# def5678 Fix typo
|
||||
# ghi8901 Update README
|
||||
|
||||
# 只想把 "Fix typo" 提交应用到 main
|
||||
git cherry-pick def5678
|
||||
```
|
||||
|
||||
执行后,`main` 分支会产生一个**新的提交**(哈希不同),但内容与 `def5678` 相同。
|
||||
|
||||
> ⚠️ 注意:cherry-pick 会创建**新提交**(new commit with new hash),不是“移动”原提交。
|
||||
|
||||
## 5. 常用选项
|
||||
|
||||
|
||||
|
||||
| 选项 | 说明 |
|
||||
| --------------------- | ------------------------------------------------------------ |
|
||||
| `-n` 或 `--no-commit` | 应用变更但**不自动提交**,只暂存改动(便于手动调整后提交) |
|
||||
| `-e` 或 `--edit` | 在提交前打开编辑器,允许修改提交信息 |
|
||||
| `-x` | 在提交信息末尾自动添加 `(cherry picked from commit ...)`,用于追踪来源(推荐用于公共仓库) |
|
||||
| `--ff` | 如果当前分支是目标提交的直接后代,则 fast-forward(极少用) |
|
||||
| `--abort` | 放弃整个 cherry-pick 操作,回到操作前状态 |
|
||||
| `--continue` | 解决冲突后继续执行剩余的 cherry-pick |
|
||||
|
||||
## 6. 冲突处理
|
||||
|
||||
如果 cherry-pick 的变更与当前分支有冲突:
|
||||
|
||||
1. Git 会暂停操作,并提示冲突文件
|
||||
|
||||
2. 手动解决冲突(像 merge 一样)
|
||||
|
||||
3. 使用 `git add <file>` 标记冲突已解决
|
||||
|
||||
4. 执行:
|
||||
|
||||
```bash
|
||||
git cherry-pick --continue
|
||||
```
|
||||
|
||||
5. 如果想放弃:
|
||||
|
||||
```bash
|
||||
git cherry-pick --abort
|
||||
```
|
||||
|
||||
## 7. 注意事项与最佳实践
|
||||
|
||||
### ⚠️ 不要滥用 cherry-pick
|
||||
|
||||
- 频繁 cherry-pick 会导致提交历史混乱、重复提交
|
||||
- 优先考虑 `git merge` 或 `git rebase` 来保持清晰历史
|
||||
|
||||
### ✅ 使用 `-x` 标记来源
|
||||
|
||||
```bash
|
||||
git cherry-pick -x abc1234
|
||||
```
|
||||
|
||||
生成的提交信息会包含来源,便于追溯。
|
||||
|
||||
### ✅ 范围摘取时注意顺序
|
||||
|
||||
```bash
|
||||
# 正确:从旧到新
|
||||
git cherry-pick A^..C # 包含 A, B, C(按时间顺序)
|
||||
|
||||
# 错误:顺序颠倒可能导致冲突
|
||||
git cherry-pick C B A
|
||||
```
|
||||
|
||||
### ✅ 摘取前先 fetch
|
||||
|
||||
如果从远程分支摘取,务必先:
|
||||
|
||||
```bash
|
||||
git fetch origin
|
||||
# 或
|
||||
git fetch your-remote-name
|
||||
```
|
||||
|
||||
### ✅ 避免在公共分支上 cherry-pick 后 force push
|
||||
|
||||
这会导致协作混乱。
|
||||
|
||||
## 8. 与类似命令对比
|
||||
|
||||
|
||||
|
||||
| 命令 | 作用 | 是否创建新提交 | 是否保留历史 |
|
||||
| ----------------- | -------------- | ---------------------------- | -------------------- |
|
||||
| `git cherry-pick` | 摘取指定提交 | ✅ 是 | ❌ 不保留原分支上下文 |
|
||||
| `git merge` | 合并整个分支 | ✅(通常是一个 merge commit) | ✅ 保留完整历史 |
|
||||
| `git rebase` | 变基,重放提交 | ✅(新提交) | ✅ 但线性化历史 |
|
||||
|
||||
## 9. 实用技巧
|
||||
|
||||
### 摘取多个连续提交
|
||||
|
||||
```bash
|
||||
# 摘取从 A 到 C 的所有提交(包含 A 和 C)
|
||||
git cherry-pick A^..C
|
||||
```
|
||||
|
||||
### 仅应用改动,稍后提交
|
||||
|
||||
```bash
|
||||
git cherry-pick -n abc1234
|
||||
# 修改文件或拆分提交
|
||||
git add .
|
||||
git commit -m "Custom message"
|
||||
```
|
||||
|
||||
### 查看哪些提交尚未被 cherry-pick(用于同步)
|
||||
|
||||
```bash
|
||||
git log origin/main..feature --oneline
|
||||
# 列出 feature 有但 main 没有的提交
|
||||
```
|
||||
|
||||
## 10. 总结
|
||||
|
||||
`git cherry-pick` 是一个**精准、灵活但需谨慎使用**的工具,适用于:
|
||||
|
||||
- 紧急修复移植
|
||||
- 选择性功能集成
|
||||
- 跨仓库补丁同步
|
||||
|
||||
> 📌 **原则:用完即走,不作为日常集成手段。**
|
||||
@@ -429,3 +429,75 @@ pipeline {
|
||||
}
|
||||
```
|
||||
|
||||
# Jenkins Node(节点)
|
||||
|
||||
## 创建 Windows 服务
|
||||
|
||||
使用 **WinSW (Windows Service Wrapper)**
|
||||
|
||||
### 1. 下载 WinSW
|
||||
|
||||
- 请访问 WinSW 的官方发布页面: https://github.com/winsw/winsw/releases
|
||||
- 下载最新的 `.exe` 文件。鉴于是 Windows 服务器,请下载 **`WinSW-x64.exe`**。(如果系统是 32 位的,才下载 `WinSW-x86.exe`)。
|
||||
|
||||
### 2. 准备文件
|
||||
|
||||
1. 将下载的 `WinSW-x64.exe` 文件复制到工作目录:`D:\common_components\jenkins-agent`。
|
||||
2. **(关键)重命名:** 在该目录中,将 `WinSW-x64.exe` 重命名为 `jenkins-agent-admin.exe`。(这个名字可以自定,但 `.xml` 必须同名)
|
||||
3. 确保从 Jenkins 下载的 `agent.jar` 文件也在此目录中。
|
||||
|
||||
现在,`D:\common_components\jenkins-agent` 文件夹中**至少**应该有这两个文件:
|
||||
|
||||
- `jenkins-agent-admin.exe`
|
||||
- `agent.jar`
|
||||
|
||||
### 3. 创建 XML 配置文件
|
||||
|
||||
1. 在**同一目录** (`D:\common_components\jenkins-agent`) 中,创建一个**新的文本文件**。
|
||||
|
||||
2. 将这个新文件重命名为 **`jenkins-agent-admin.xml`**。(**注意:** 它的名字必须和 `.exe` 文件的名字完全一样,只是扩展名不同)。
|
||||
|
||||
3. 用记事本或任何文本编辑器打开 `jenkins-agent-admin.xml`,然后将**以下所有内容**完整地复制并粘贴进去:
|
||||
```xml
|
||||
<service>
|
||||
<id>jenkins-agent-admin</id>
|
||||
|
||||
<name>Jenkins Agent (Admin)</name>
|
||||
|
||||
<description>此服务以管理员权限运行 Jenkins JNLP 代理。</description>
|
||||
|
||||
<executable>java</executable>
|
||||
|
||||
<arguments>-jar "%BASE%\agent.jar" -jnlpUrl http://192.168.6.1:23123/computer/windows%2Dadmin%2Dagent/jenkins-agent.jnlp -secret *********84158aed83c119f8f53b579db8a315a4e9bda61687cbdd088e***7 -workDir "D:\common_components\jenkins-agent"</arguments>
|
||||
|
||||
<workingdirectory>D:\common_components\jenkins-agent</workingdirectory>
|
||||
|
||||
<log mode="rotate"/>
|
||||
</service>
|
||||
```
|
||||
|
||||
### 4. 安装服务
|
||||
|
||||
1. 再次打开一个**管理员**命令提示符 (cmd)。
|
||||
|
||||
2. `cd` 到工作目录:
|
||||
|
||||
```cmd
|
||||
D:
|
||||
cd D:\common_components\jenkins-agent
|
||||
```
|
||||
|
||||
3. 运行重命名的 `.exe` 文件,并附带 `install` 命令:
|
||||
```cmd
|
||||
jenkins-agent-admin.exe install
|
||||
```
|
||||
|
||||
### 5. 设置登录帐户
|
||||
|
||||
这是**必须**的步骤,和之前一样:
|
||||
|
||||
1. 打开 "服务" (`services.msc`)。
|
||||
2. 找到新安装的服务,名字是 **"Jenkins Agent (Admin)"**(这是在 `.xml` 中设置的)。
|
||||
3. 右键点击 -> **"属性"** -> **"登录"** 选项卡。
|
||||
4. 选择 **"此帐户"**,并输入**Windows 管理员用户名和密码**。
|
||||
5. 点击 "应用" -> "确定"
|
||||
|
||||
+219
-1
@@ -243,6 +243,12 @@ du -Sh / | sort -rh | head -n10
|
||||
|
||||
# 只看大小在 GB 范围内的所有文件
|
||||
du -ah / | grep "[0-9]G\b"
|
||||
|
||||
# 查看各目录占用(从根目录开始,排序显示)
|
||||
du -sh /* 2>/dev/null | sort -rh | head -20
|
||||
|
||||
# 重点查看 /var 目录
|
||||
du -sh /var/* 2>/dev/null | sort -rh | head -20
|
||||
```
|
||||
|
||||
## 进程管理
|
||||
@@ -1416,6 +1422,36 @@ UUID=0EAB-5879 /boot/efi vfat umask=0077,shortname=win
|
||||
systemctl daemon-reload
|
||||
```
|
||||
|
||||
### NTFS -> ext4
|
||||
|
||||
确认目标分区
|
||||
|
||||
扎到要格式化的分区名称(例如 `/dev/sda1`)。
|
||||
|
||||
```bash
|
||||
lsblk -f
|
||||
```
|
||||
|
||||
卸载分区
|
||||
|
||||
如果该分区已经挂载(MOUNTPOINT 列有路径),必须先将其卸载才能格式化。
|
||||
|
||||
```bash
|
||||
sudo umount /dev/sda1
|
||||
```
|
||||
|
||||
执行格式化命令
|
||||
|
||||
```bash
|
||||
sudo mkfs.ext4 /dev/sda1
|
||||
```
|
||||
|
||||
验证结果
|
||||
|
||||
```bash
|
||||
lsblk -f
|
||||
```
|
||||
|
||||
## 挂载卷
|
||||
|
||||
### Windows 网络共享位置
|
||||
@@ -1448,6 +1484,18 @@ mount -t cifs -o username=user,password=backup //192.168.0.1/备份 /mnt/wdshare
|
||||
//192.168.0.1/备份 /mnt/wdshare/ cifs username=user,password=backup 0 0
|
||||
```
|
||||
|
||||
`:wq`保存好,使用以下命令使修改生效
|
||||
|
||||
```shell
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
一键挂载上
|
||||
|
||||
```shell
|
||||
sudo mount -a
|
||||
```
|
||||
|
||||
### NTFS 分区
|
||||
|
||||
#### 可读可写
|
||||
@@ -2929,6 +2977,81 @@ git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$H
|
||||
dnf groupinstall "Development Tools" -y
|
||||
```
|
||||
|
||||
#### robbyrussell
|
||||
|
||||
显示路径每一级的首字母和最后一级目录的全名
|
||||
|
||||
默认主题只显示路径最后一级名字,其他的一些主题可能显示完整路径,但那太长了。我只发现主题 fishy 是这样显示的,这也和 fish 命令行相同。
|
||||
|
||||
配置
|
||||
|
||||
```shell
|
||||
vim ~/.oh-my-zsh/themes/robbyrussell.zsh-theme
|
||||
```
|
||||
|
||||
添加一个函数
|
||||
|
||||
```shell
|
||||
_fishy_collapsed_wd() {
|
||||
local i pwd
|
||||
pwd=("${(s:/:)PWD/#$HOME/~}")
|
||||
if (( $#pwd > 1 )); then
|
||||
for i in {1..$(($#pwd-1))}; do
|
||||
if [[ "$pwd[$i]" = .* ]]; then
|
||||
pwd[$i]="${${pwd[$i]}[1,2]}"
|
||||
else
|
||||
pwd[$i]="${${pwd[$i]}[1]}"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
echo "${(j:/:)pwd}"
|
||||
}
|
||||
```
|
||||
|
||||
在 PROMPT 那一行,把表示目录的 `%c` (其他主题可能是 `%C`,`%~` ,`%2` 等)改成 `$(_fishy_collapsed_wd)`,重启 zsh 即可。
|
||||
|
||||
显示用户
|
||||
|
||||
在 PROMPT 前适当加上 `%{$fg_bold[blue]%}${USER}` 即可。左边的是在设置颜色。
|
||||
|
||||
显示上一条命令返回值
|
||||
|
||||
这个默认主题,当返回值为 0 时箭头为绿色,非 0 时为红色,我想让他非 0 时显示返回值。
|
||||
|
||||
解决方案:PROMPT 适当位置加上 `%?`,记得不要写成 `$?` 因为后者只显示第一个数字(好像是这样,我没仔细查过)。
|
||||
|
||||
最终配置
|
||||
|
||||
```shell
|
||||
if [ `id -u` -eq 0 ];then
|
||||
PROMPT="%(?:%{$fg_bold[red]%}root %{$fg_bold[green]%}➜ :%{$fg_bold[red]%}root %{$fg_bold[red]%}%? ➜ )"
|
||||
else
|
||||
PROMPT="%(?:%{$fg_bold[blue]%}${USER} %{$fg_bold[green]%}➜ :%{$fg_bold[blue]%}${USER} %{$fg_bold[red]%}%? ➜ )"
|
||||
fi
|
||||
|
||||
_fishy_collapsed_wd() {
|
||||
local i pwd
|
||||
pwd=("${(s:/:)PWD/#$HOME/~}")
|
||||
if (( $#pwd > 1 )); then
|
||||
for i in {1..$(($#pwd-1))}; do
|
||||
if [[ "$pwd[$i]" = .* ]]; then
|
||||
pwd[$i]="${${pwd[$i]}[1,2]}"
|
||||
else
|
||||
pwd[$i]="${${pwd[$i]}[1]}"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
echo "${(j:/:)pwd}"
|
||||
}
|
||||
PROMPT+=' %{$fg[yellow]%}$(_fishy_collapsed_wd)%{$reset_color%} $(git_prompt_info)'
|
||||
|
||||
|
||||
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[blue]%}git:(%{$fg[yellow]%}"
|
||||
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
|
||||
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗"
|
||||
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"
|
||||
```
|
||||
|
||||
### 插件
|
||||
|
||||
> `oh-my-zsh` 已经内置了 `git` 插件,内置插件可以在 `~/.oh-my-zsh/plugins` 中查看,下面介绍一下我常用的插件,更多插件可以在 [awesome-zsh-plugins](https://github.com/unixorn/awesome-zsh-plugins) 里查看。
|
||||
@@ -3313,4 +3436,99 @@ snap install --classic certbot
|
||||
ln -s /snap/bin/certbot /usr/bin/certbot
|
||||
```
|
||||
|
||||
### 范
|
||||
## 安装 frp
|
||||
|
||||
### 配置服务端 (frps) 为服务
|
||||
|
||||
在公网服务器上部署服务端
|
||||
|
||||
创建 Systemd 服务文件
|
||||
|
||||
```bash
|
||||
sudo vim /etc/systemd/system/frps.service
|
||||
```
|
||||
|
||||
写入配置内容
|
||||
|
||||
```toml
|
||||
[Unit]
|
||||
# 服务描述
|
||||
Description=FRP Server Daemon
|
||||
# 在网络服务启动后才启动
|
||||
After=network.target syslog.target
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
# 启动命令:请修改为你的 frps 和配置文件实际路径
|
||||
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
|
||||
# 退出后自动重启
|
||||
Restart=on-failure
|
||||
RestartSec=5s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
启动并设置开机自启
|
||||
|
||||
```bash
|
||||
# 重载 systemd 配置
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 启动 frps 服务
|
||||
sudo systemctl start frps
|
||||
|
||||
# 设置开机自启
|
||||
sudo systemctl enable frps
|
||||
|
||||
# 查看运行状态
|
||||
sudo systemctl status frps
|
||||
```
|
||||
|
||||
### 配置客户端 (frpc) 为服务
|
||||
|
||||
在内网机器上部署客户端
|
||||
|
||||
创建 Systemd 服务文件
|
||||
|
||||
```bash
|
||||
sudo vim /etc/systemd/system/frpc.service
|
||||
```
|
||||
|
||||
写入配置内容
|
||||
|
||||
```toml
|
||||
[Unit]
|
||||
Description=FRP Client Daemon
|
||||
After=network.target syslog.target
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
# 启动命令:请修改为你的 frpc 和配置文件实际路径
|
||||
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml
|
||||
# 这里的 restart 非常重要,防止因为断网导致客户端停止运行
|
||||
Restart=on-failure
|
||||
RestartSec=5s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
启动并设置开机自启
|
||||
|
||||
```bash
|
||||
# 重载 systemd 配置
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 启动 frpc 服务
|
||||
sudo systemctl start frpc
|
||||
|
||||
# 设置开机自启
|
||||
sudo systemctl enable frpc
|
||||
|
||||
# 查看运行状态
|
||||
sudo systemctl status frpc
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,269 @@
|
||||
---
|
||||
title: Podman
|
||||
date: 2025-11-26 13:38:42
|
||||
tags:
|
||||
|
||||
---
|
||||
|
||||
# Podman命令
|
||||
|
||||
Podman 是一个无守护进程(Daemonless)的容器引擎,它在大致功能上与 Docker 兼容。这意味着**大多数 Docker 命令你可以直接把 `docker` 换成 `podman` 来使用**。
|
||||
|
||||
---
|
||||
|
||||
## 基础与别名 (Tips)
|
||||
|
||||
如果你习惯了 Docker,可以直接在 Shell 中设置别名,这样你就不用改变肌肉记忆了:
|
||||
|
||||
```bash
|
||||
alias docker=podman
|
||||
```
|
||||
|
||||
## 容器生命周期管理 (Container Lifecycle)
|
||||
|
||||
这些命令用于创建、启动、停止和删除容器。
|
||||
|
||||
- 运行容器 (最常用)
|
||||
```bash
|
||||
# -d: 后台运行, -p: 端口映射, --name: 指定名称
|
||||
podman run -d --name my-nginx -p 8080:80 nginx:latest
|
||||
```
|
||||
|
||||
- 查看容器列表
|
||||
```bash
|
||||
podman ps # 仅查看正在运行的容器
|
||||
podman ps -a # 查看所有容器(包括已停止的)
|
||||
```
|
||||
|
||||
- 启动/停止/重启
|
||||
```bash
|
||||
podman start <容器ID或名称>
|
||||
podman stop <容器ID或名称>
|
||||
podman restart <容器ID或名称>
|
||||
```
|
||||
|
||||
- 进入容器内部
|
||||
```bash
|
||||
#以交互模式进入容器的 bash/sh
|
||||
podman exec -it <容器ID或名称> /bin/bash
|
||||
```
|
||||
|
||||
- 删除容器
|
||||
```bash
|
||||
podman rm <容器ID或名称>
|
||||
podman rm -f <容器ID或名称> # 强制删除正在运行的容器
|
||||
```
|
||||
|
||||
- 查看日志
|
||||
```bash
|
||||
podman logs -f <容器ID或名称> # -f 实时跟踪日志输出
|
||||
```
|
||||
|
||||
## 镜像管理 (Image Management)
|
||||
|
||||
- 拉取镜像
|
||||
```bash
|
||||
podman pull <镜像名>
|
||||
# 例如: podman pull docker.io/library/alpine:latest
|
||||
```
|
||||
|
||||
- 查看本地镜像
|
||||
```bash
|
||||
podman images
|
||||
```
|
||||
|
||||
- 删除镜像
|
||||
```bash
|
||||
podman rmi <镜像ID或名称>
|
||||
```
|
||||
|
||||
- 构建镜像
|
||||
```bash
|
||||
# 在当前目录根据 Dockerfile 构建
|
||||
podman build -t my-app:v1 .
|
||||
```
|
||||
|
||||
- 给镜像打标签 (Tag)
|
||||
```bash
|
||||
podman tag <源镜像ID> <新名称>:<标签>
|
||||
```
|
||||
|
||||
## Pod 管理 (Podman 特色)
|
||||
|
||||
Podman 的一大特色是支持 **Pod**(类似于 Kubernetes 的 Pod 概念),即一个 Pod 里可以包含多个共享网络和存储的容器。
|
||||
|
||||
- 创建一个空 Pod
|
||||
```bash
|
||||
# 创建一个带有端口映射的 Pod
|
||||
podman pod create --name my-pod -p 8080:80
|
||||
```
|
||||
|
||||
- 在 Pod 中运行容器
|
||||
```bash
|
||||
# 将容器加入到上面创建的 pod 中
|
||||
podman run -d --pod my-pod --name container-in-pod nginx
|
||||
```
|
||||
|
||||
- 查看 Pod 列表
|
||||
```bash
|
||||
podman pod ps
|
||||
```
|
||||
|
||||
- 停止/删除 Pod
|
||||
```bash
|
||||
podman pod stop <Pod名称>
|
||||
podman pod rm <Pod名称>
|
||||
```
|
||||
|
||||
## 高级功能与系统集成 (Advanced)
|
||||
|
||||
这是 Podman 最强大的地方,特别适合运维管理。
|
||||
|
||||
- **生成 Systemd 配置文件** (非常实用) Podman 可以直接生成 systemd unit 文件,让普通用户也能通过 `systemctl` 管理容器自启。
|
||||
|
||||
```bash
|
||||
# 为正在运行的容器生成 service 文件
|
||||
podman generate systemd --name <容器名称> --files --new
|
||||
```
|
||||
|
||||
- **Kubernetes 互操作性**
|
||||
|
||||
- **导出 YAML:** 将现有容器导出为 K8s 的 YAML 定义。
|
||||
|
||||
```bash
|
||||
podman generate kube <容器或Pod名称> > my-pod.yaml
|
||||
```
|
||||
|
||||
- **运行 YAML:** 直接在 Podman 中运行 K8s 的 YAML 文件。
|
||||
|
||||
```bash
|
||||
podman play kube my-pod.yaml
|
||||
```
|
||||
|
||||
- 清理系统
|
||||
```bash
|
||||
# 删除所有停止的容器、未使用的网络和悬空的镜像
|
||||
podman system prune
|
||||
```
|
||||
|
||||
- 查看系统信息
|
||||
```bash
|
||||
podman info # 查看详细的存储、运行环境信息
|
||||
podman version # 查看版本
|
||||
```
|
||||
|
||||
|
||||
# Podman换源
|
||||
|
||||
> Podman 是一个无守护进程的容器引擎,用于在 Linux 系统上开发、管理和运行 OCI 容器。与 Docker 类似,Podman 也支持配置镜像源来加速容器镜像的拉取。
|
||||
|
||||
## Linux 系统配置
|
||||
|
||||
### 方法一:全局配置(推荐)
|
||||
|
||||
创建或编辑 Podman 的全局配置文件:
|
||||
|
||||
```shell
|
||||
sudo mkdir -p /etc/containers
|
||||
sudo tee /etc/containers/registries.conf <<-'EOF'
|
||||
unqualified-search-registries = ["docker.io"]
|
||||
[[registry]]
|
||||
prefix = "docker.io"
|
||||
location = "docker.io"
|
||||
[[registry.mirror]]
|
||||
location = "docker.1ms.run"
|
||||
[[registry.mirror]]
|
||||
location = "docker.1panel.live"
|
||||
[[registry.mirror]]
|
||||
location = "docker.m.ixdev.cn"
|
||||
[[registry.mirror]]
|
||||
location = "hub.rat.dev"
|
||||
[[registry.mirror]]
|
||||
location = "docker.xuanyuan.me"
|
||||
[[registry.mirror]]
|
||||
location = "dockerproxy.net"
|
||||
[[registry.mirror]]
|
||||
location = "docker-registry.nmqu.com"
|
||||
[[registry.mirror]]
|
||||
location = "hub.amingg.com"
|
||||
[[registry.mirror]]
|
||||
location = "docker.amingg.com"
|
||||
[[registry.mirror]]
|
||||
location = "docker.hlmirror.com"
|
||||
[[registry.mirror]]
|
||||
location = "hub1.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "hub2.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "hub3.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "hub4.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "docker.m.daocloud.io"
|
||||
[[registry.mirror]]
|
||||
location = "docker.kejilion.pro"
|
||||
[[registry.mirror]]
|
||||
location = "hub.1panel.dev"
|
||||
[[registry.mirror]]
|
||||
location = "docker.apiba.cn"
|
||||
[[registry.mirror]]
|
||||
location = "proxy.vvvv.ee"
|
||||
EOF
|
||||
```
|
||||
|
||||
### 方法二:用户级配置
|
||||
|
||||
为当前用户创建配置文件:
|
||||
|
||||
```shell
|
||||
mkdir -p ~/.config/containers
|
||||
tee ~/.config/containers/registries.conf <<-'EOF'
|
||||
unqualified-search-registries = ["docker.io"]
|
||||
[[registry]]
|
||||
prefix = "docker.io"
|
||||
location = "docker.io"
|
||||
[[registry.mirror]]
|
||||
location = "docker.1ms.run"
|
||||
[[registry.mirror]]
|
||||
location = "docker.1panel.live"
|
||||
[[registry.mirror]]
|
||||
location = "docker.m.ixdev.cn"
|
||||
[[registry.mirror]]
|
||||
location = "hub.rat.dev"
|
||||
[[registry.mirror]]
|
||||
location = "docker.xuanyuan.me"
|
||||
[[registry.mirror]]
|
||||
location = "dockerproxy.net"
|
||||
[[registry.mirror]]
|
||||
location = "docker-registry.nmqu.com"
|
||||
[[registry.mirror]]
|
||||
location = "hub.amingg.com"
|
||||
[[registry.mirror]]
|
||||
location = "docker.amingg.com"
|
||||
[[registry.mirror]]
|
||||
location = "docker.hlmirror.com"
|
||||
[[registry.mirror]]
|
||||
location = "hub1.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "hub2.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "hub3.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "hub4.nat.tf"
|
||||
[[registry.mirror]]
|
||||
location = "docker.m.daocloud.io"
|
||||
[[registry.mirror]]
|
||||
location = "docker.kejilion.pro"
|
||||
[[registry.mirror]]
|
||||
location = "hub.1panel.dev"
|
||||
[[registry.mirror]]
|
||||
location = "docker.apiba.cn"
|
||||
[[registry.mirror]]
|
||||
location = "proxy.vvvv.ee"
|
||||
EOF
|
||||
```
|
||||
|
||||
# Docker 迁移
|
||||
|
||||
## Docker Desktop
|
||||
|
||||
@@ -4,6 +4,135 @@ date: 2023-10-07 11:25:08
|
||||
tags:
|
||||
---
|
||||
|
||||
# PowerShell 7 使用 Oh My Posh 来美化命令行
|
||||
|
||||
## 安装 PowerShell 7
|
||||
|
||||
`PowerShell 7` 指的不是系统自带的 `powershell` ,而是新下载的(微软官方出品),当然这个教程也适用于系统自带的 `powershell`
|
||||
|
||||
微软官方文档地址:https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2
|
||||
下载地址:https://github.com/PowerShell/PowerShell/releases
|
||||
或者可通过 Winget 方式下载安装
|
||||
|
||||
```powershell
|
||||
winget search --id Microsoft.PowerShell
|
||||
```
|
||||
|
||||
Output
|
||||
|
||||
```powershell
|
||||
Name Id Version Source
|
||||
---------------------------------------------------------------
|
||||
PowerShell Microsoft.PowerShell 7.5.4.0 winget
|
||||
PowerShell Preview Microsoft.PowerShell.Preview 7.6.0.5 winget
|
||||
```
|
||||
|
||||
使用 `--id` 参数安装 PowerShell 或 PowerShell 预览版
|
||||
|
||||
```powershell
|
||||
winget install --id Microsoft.PowerShell --source winget
|
||||
```
|
||||
|
||||
```powershell
|
||||
winget install --id Microsoft.PowerShell.Preview --source winget
|
||||
```
|
||||
|
||||
## 安装 Oh My Posh
|
||||
|
||||
官方文档地址:https://ohmyposh.dev/
|
||||
|
||||
最好在管理员模式下运行 `powershell`
|
||||
|
||||
下载安装,在 `powershell` 命令行中输入
|
||||
|
||||
```powershell
|
||||
winget install oh-my-posh
|
||||
```
|
||||
|
||||
在 `powershell` 命令行中输入下面命令,打开 `$Profile` 进行设置,如果系统提示不存文件,是否创建,请点击创建
|
||||
|
||||
```powershell
|
||||
notepad $Profile
|
||||
```
|
||||
|
||||
将以下命令添加到 `$Profile` 文件中
|
||||
|
||||
```powershell
|
||||
oh-my-posh init pwsh | Invoke-Expression
|
||||
```
|
||||
|
||||
应用修改,则直接在命令行中执行 `. $Profile` ,如果出现错误等问题,请尝试关闭所有 `powershell` 命令窗口,重新打开,一般都会正常显示
|
||||
|
||||
### 配置环境变量
|
||||
|
||||
配置 `POSH_THEMES_PATH` 环境变量,最好配置成系统级别的,路径在 `C:\Users\<当前登录用户>\AppData\Local\Programs\oh-my-posh\themes` 下面。
|
||||
|
||||
### 更改主题
|
||||
|
||||
在 `powerShell` 命令行中输入 `Get-ChildItem $env:POSH_THEMES_PATH` 来获取所有的已安装主题
|
||||
|
||||
**预览主题(官方推荐方式):** 由于在终端里一次性渲染所有主题会很卡,官方建议直接去网页上看截图,然后记住名字即可。
|
||||
|
||||
- **[Oh My Posh 官方主题预览页 (Themes)](https://ohmyposh.dev/docs/themes)**
|
||||
|
||||
编辑 `$Profile` 文件
|
||||
|
||||
```powershell
|
||||
notepad $Profile
|
||||
```
|
||||
|
||||
把 `oh-my-posh init pwsh ...` 的部分後面加上 `--config "$env:POSH_THEMES_PATH/{主題名稱}.omp.json"`。
|
||||
将其内部文字改为:
|
||||
|
||||
```powershell
|
||||
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/montys.omp.json" | Invoke-Expression
|
||||
```
|
||||
|
||||
## 扩展模块
|
||||
|
||||
### PowerShellGet
|
||||
|
||||
> [PowerShellGet](https://github.com/PowerShell/PowerShellGet) 是 Windows 平台上的包管理器,主要用于管理 PowerShell 模块,但也支持其他类型的包。
|
||||
|
||||
以系统管理员权限打开**PowerShell**终端,执行以下命令:
|
||||
|
||||
```powershell
|
||||
Install-Module -Name PowerShellGet -Force
|
||||
```
|
||||
|
||||
### [posh-git](https://github.com/dahlbyk/posh-git)
|
||||
|
||||
> [posh-git](https://github.com/dahlbyk/posh-git)是一款用于 Windows 系统的 PowerShell 扩展模块,它主要为 Git 提供了更加丰富且人性化的命令行界面体验。
|
||||
|
||||
以系统管理员权限打开**PowerShell**终端,执行以下命令:
|
||||
|
||||
```powershell
|
||||
PowerShellGet\Install-Module posh-git -Scope CurrentUser -Force
|
||||
```
|
||||
|
||||
### [PSReadLine](https://github.com/PowerShell/PSReadLine)
|
||||
|
||||
> [PSReadLine](https://github.com/PowerShell/PSReadLine)用于增强命令行编辑体验的模块,提供语法高亮/命令预测/历史记录管理以及提供了丰富的快捷键和编辑命令。
|
||||
|
||||
以系统管理员权限打开**PowerShell**终端,执行以下命令:
|
||||
|
||||
```powershell
|
||||
Install-Module PSReadLine -Force
|
||||
```
|
||||
|
||||
## 编辑oh-my-posh配置文件
|
||||
|
||||
打开**PowerShell**终端,执行以下命令编辑配置文件 `code $PROFILE`:
|
||||
|
||||
```powershell
|
||||
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete #Tab键会出现自动补全菜单
|
||||
Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
|
||||
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward #上下方向键箭头,搜索历史中进行自动补全
|
||||
|
||||
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/jandedobbeleer.omp.json" | Invoke-Expression
|
||||
Import-Module posh-git # git的自动补全
|
||||
```
|
||||
|
||||
# 文件
|
||||
|
||||
## 新建文件
|
||||
@@ -33,6 +162,52 @@ Set-Content my.ini -value ""
|
||||
New-Item data -ItemType Directory
|
||||
```
|
||||
|
||||
# 目录
|
||||
|
||||
|
||||
|
||||
# 查询版本
|
||||
|
||||
```powershell
|
||||
$PSVersionTable
|
||||
```
|
||||
|
||||
在输出的信息中,查看 **`PSVersion`** 这一行。
|
||||
|
||||
**示例输出解读:**
|
||||
|
||||
- **Major**: 主版本号(如 5 或 7)。
|
||||
- **Minor**: 次版本号。
|
||||
- 如果显示 `5.1.xxxxx`,这是 Windows 自带的 **Windows PowerShell**。
|
||||
- 如果显示 `7.x.x`,这是跨平台的 **PowerShell (Core)**。
|
||||
|
||||
仅查看版本号(简洁)
|
||||
|
||||
如果你不需要其他详细信息,只想看版本号,可以使用这个命令:
|
||||
|
||||
```powershell
|
||||
$PSVersionTable.PSVersion
|
||||
```
|
||||
|
||||
或者使用宿主查询命令(虽然通常一致,但在某些特殊宿主环境下可能不同):
|
||||
|
||||
```powershell
|
||||
(Get-Host).Version
|
||||
```
|
||||
|
||||
从 CMD (命令提示符) 查看
|
||||
|
||||
如果你当前在 CMD 窗口,不想进入 PowerShell 也能查看:
|
||||
|
||||
```powershell
|
||||
powershell -command "$PSVersionTable.PSVersion"
|
||||
```
|
||||
|
||||
### 补充说明:常见的两个主要版本
|
||||
|
||||
- **Windows PowerShell 5.1**:这是 Windows 10 和 Windows 11 默认自带的版本(蓝色背景图标)。微软已不再为其开发新功能,仅进行维护。
|
||||
- **PowerShell 7.x**:这是微软目前主推的跨平台版本(黑色背景图标),性能更强,功能更多。
|
||||
|
||||
# 做 sudo 命令
|
||||
|
||||
在Windows系统上sudo对应的就是管理员权限了。
|
||||
|
||||
@@ -77,3 +77,32 @@ import pcRequestspcRequestsc=pcRequestsc.__name__
|
||||
```shell
|
||||
'pcRequests'
|
||||
```
|
||||
|
||||
# UV
|
||||
|
||||
## Python版本管理(安装和管理Python解释器)
|
||||
|
||||
| 命令 | 说明 |
|
||||
| ----------------------------- | -------------------------------------- |
|
||||
| uv python list | 查看可用和已安装的Python 版本 |
|
||||
| uv python install | 安装 Python 版本 |
|
||||
| uv python find | 查找已安装的 Python信息 |
|
||||
| uv python pin | 将当前项目固定使用特定 Python 版本 |
|
||||
| uv python uninstall | 卸载 Python 版本 |
|
||||
| uv python install --reinstall | 重新安装Python,适用于Python版本的更新 |
|
||||
|
||||
## 项目管理(创建和开发带有 `pyproject.toml`的Python 项目)
|
||||
|
||||
| **命令** | **说明** |
|
||||
| ---------- | ------------------------------------------------------------ |
|
||||
| uv init | 创建新 Python 项目并初始化该项目 |
|
||||
| uv add | 为项目添加依赖,安装软件包并将依赖声明写入`pyproject.toml`文件 |
|
||||
| uv remove | 从项目移除依赖,移除软件包并将依赖从文件`pyproject.toml`中移除 |
|
||||
| uv sync | 同步项目依赖到环境 |
|
||||
| uv lock | 为项目依赖创建锁文件 |
|
||||
| uv run | 在项目环境中运行命令 |
|
||||
| uv export | 将项目的锁文件导出为其他格式 |
|
||||
| uv tree | 查看项目依赖树 |
|
||||
| uv build | 构建项目为分发包 |
|
||||
| uv publish | 发布项目到包索引 |
|
||||
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: Subversion
|
||||
date: 2025-11-27 09:46:04
|
||||
tags:
|
||||
---
|
||||
|
||||
# TortoiseSVN
|
||||
|
||||
## 日志缓存问题
|
||||
|
||||
> 修改日志后,在日志信息里还是显示原来的日志,但是点击编辑日志弹窗内显示的就是修改后的日志。
|
||||
|
||||
修改已经成功提交到了服务器(这就是为什么点“编辑”能看到新内容),但 TortoiseSVN 的“显示日志”列表为了提高速度,读取的是本地电脑上的**旧缓存数据**,没有去服务器重新拉取。
|
||||
|
||||
可以按照以下步骤解决这个问题:
|
||||
|
||||
这是一个非常典型的 **TortoiseSVN 日志缓存(Log Cache)** 问题。
|
||||
|
||||
简单来说,您的修改已经成功提交到了服务器(这就是为什么点“编辑”能看到新内容),但 TortoiseSVN 的“显示日志”列表为了提高速度,读取的是本地电脑上的**旧缓存数据**,没有去服务器重新拉取。
|
||||
|
||||
您可以按照以下步骤解决这个问题:
|
||||
|
||||
### 方法一:强制刷新(最快解决)
|
||||
|
||||
在“显示日志(Show Log)”的窗口界面中:
|
||||
|
||||
1. 直接按下键盘上的 **`F5`** 键。
|
||||
2. 或者点击窗口底部的 **“刷新(Refresh)”** 按钮。
|
||||
3. 如果还是不行,尝试按 **`Shift + F5`** 或 **`Ctrl + F5`**(强制从服务器重新拉取所有日志)。
|
||||
|
||||
通常这样操作后,列表中的文字就会更新为修改后的内容。
|
||||
|
||||
### 方法二:清除日志缓存(如果方法一无效)
|
||||
|
||||
如果刷新后依然显示旧日志,说明本地缓存文件可能卡住了,需要手动清理:
|
||||
|
||||
1. 在任意文件夹右键,选择 **TortoiseSVN** -> **设置 (Settings)**。
|
||||
2. 在左侧菜单中找到 **已保存数据 (Saved Data)**。
|
||||
3. 在右侧面板中找到 **日志信息(显示日志对话框) (Log messages)** 这一栏。
|
||||
4. 点击旁边的 **“清除 (Clear)”** 按钮。
|
||||
5. 点击确定,然后重新打开“显示日志”窗口,TortoiseSVN 会被迫从服务器重新下载最新的日志数据。
|
||||
@@ -133,3 +133,5 @@ irm https://massgrave.dev/get | iex
|
||||
- `-o"D:"`: 这是指定**目标解压目录**。所有从压缩包中解压出来的内容都会放到这个目录下。
|
||||
- **注意:** `-o` 后面直接跟目标文件夹的完整路径,不带 `*`。
|
||||
- `"source\repos\ruoyi-ai\*"`: 这是**压缩包内部想要解压的目录名称**。请确保这个名称与压缩包内的实际目录名完全一致(大小写敏感)。
|
||||
|
||||
# Windows Server 2019
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
---
|
||||
title: Windows Terminal
|
||||
date: 2025-12-12 09:31:56
|
||||
tags:
|
||||
---
|
||||
|
||||
# SSH
|
||||
|
||||
## 生成 SSH 密钥
|
||||
|
||||
1. SSH 秘钥默认储存在账户的主目录下的 ~/.ssh 目录
|
||||
如:`C:\Users\用户\.ssh\`
|
||||
|
||||
查看是否包含id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之类成对的文件),有`.pub 后缀的文件`就是**公钥**,另一个文件则是密钥。
|
||||
|
||||
如果有这两个文件,则跳过1.2;如果没有这两个文件,甚至.ssh目录也没有,则需要用ssh-keygen 来创建
|
||||
|
||||
2. ###### 生成密钥信息
|
||||
|
||||
在`.ssh 目录`下右键打开[Git Bash](https://so.csdn.net/so/search?q=Git Bash&spm=1001.2101.3001.7020)(.ssh目录不存在,则在任一目录下操作,或者手动创建该目录)
|
||||
|
||||
3. ###### 生成密钥
|
||||
|
||||
> ssh-keygen -t rsa -C "注释信息(一般为邮箱your_email@youremail.com)"
|
||||
|
||||
4. 在~/.ssh/下会生成两个文件,id_rsa和id_rsa.pub
|
||||
|
||||
> id_rsa是私钥
|
||||
>
|
||||
> id_rsa.pub是公钥
|
||||
|
||||
5. 启动 **PuTTY Key Generator**
|
||||

|
||||
|
||||
6. 选择之前生成的id_rsa
|
||||

|
||||
|
||||
7. 出现如下,选择 **Save private key** 保存秘钥
|
||||

|
||||
|
||||
8. 保存到 ~/.ssh 目录即可
|
||||

|
||||
|
||||
## 配置 SSH
|
||||
|
||||
1. 确认 .ssh 目录位置
|
||||
|
||||
SSH 的配置文件通常位于当前用户目录下的 `.ssh` 文件夹中。
|
||||
|
||||
- **路径通常是:** `C:\Users\你的用户名\.ssh\`
|
||||
|
||||
你可以按 `Win + R`,输入 `%USERPROFILE%\.ssh` 并回车。
|
||||
|
||||
- **如果文件夹存在:** 直接进入。
|
||||
- **如果文件夹不存在:** 打开命令提示符(CMD)或 PowerShell,输入 `mkdir .ssh` 创建它。
|
||||
|
||||
2. 创建 config 文件
|
||||
|
||||
在 `.ssh` 文件夹内,创建一个名为 `config` 的文件。
|
||||
|
||||
- **注意:** 文件名必须是 `config`,**没有任何后缀名**(不要叫 `config.txt`)。
|
||||
- **创建方法:** 在文件夹内右键 -> 新建文本文档 -> 命名为 `config` -> 删除 `.txt` 后缀 -> 确认修改。
|
||||
|
||||
3. 编辑 config 文件
|
||||
使用任意文本编辑器(如记事本、VS Code、Notepad++)打开该文件,按照以下格式添加内容。
|
||||
基础语法结构
|
||||
|
||||
```
|
||||
Host 别名
|
||||
HostName 主机IP或域名
|
||||
Port 端口号 (如果是默认22端口可省略)
|
||||
User 用户名
|
||||
IdentityFile 私钥路径 (如果是密码登录可省略)
|
||||
PreferredAuthentications publickey
|
||||
```
|
||||
|
||||
4. 远程 Linux 服务器配置 ssh 公钥
|
||||
```bash
|
||||
vim ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
内容使用**PuTTY Key Generator**,**Load Private Key** 后显示的 **Public key**,内容换行追加即可
|
||||
|
||||
|
||||
|
||||
5. 测试连接
|
||||
|
||||
```powershell
|
||||
ssh <你的Host别名>
|
||||
# 例如: ssh myserver
|
||||
```
|
||||
|
||||
## 访问 Windows SSH 客户端和 SSH 服务器
|
||||
|
||||
最新版本的 Windows 10 和 Windows 11 包含基于 OpenSSH(一个使用 SSH 协议进行远程登录的连接工具)的内置 SSH 服务器和客户端。 OpenSSH 加密客户端与服务器之间的所有流量,从而遏止窃听、连接劫持和其他攻击。
|
||||
|
||||
默认情况下,OpenSSH 客户端和 OpenSSH 服务器位于以下目录:`C:\Windows\System32\OpenSSH`。 你还可以检查它是否存在于“Windows 设置”>“系统”>“可选功能”中,然后在添加的功能中搜索“OpenSSH”。
|
||||
|
||||

|
||||
|
||||
## 创建档案
|
||||
|
||||
你可以通过执行 `ssh user@machine` 在命令提示符下启动 SSH 会话,系统将提示你输入密码。 可以将 `commandline` 设置添加到配置文件对象的 `list` 内的 [settings.json 文件](https://learn.microsoft.com/zh-cn/windows/terminal/install#settings-json-file) 中的配置文件,以创建在启动时执行此项的 Windows 终端配置文件。
|
||||
|
||||
```json
|
||||
{
|
||||
"icon": "C:\\Windows\\System32\\wsl.exe",
|
||||
"name": "user@machine ssh profile",
|
||||
"commandline": "ssh user@machine"
|
||||
}
|
||||
```
|
||||
|
||||
## 指定起始目录
|
||||
|
||||
若要指定 Windows 终端调用的 ssh 会话的起始目录,可以使用以下命令:
|
||||
|
||||
```json
|
||||
{
|
||||
"commandline": "ssh -t bob@foo \"cd /data/bob && exec bash -l\""
|
||||
}
|
||||
```
|
||||
|
||||
`-t` 标志强制执行伪终端分配。 这可用于在远程计算机上执行任意基于屏幕的程序,例如实现菜单服务。 将需要使用转义双引号,因为 bourne 外壳派生物不会为单引号中的字符串执行任何额外分析。
|
||||
@@ -0,0 +1,476 @@
|
||||
---
|
||||
title: curl 命令完全指南
|
||||
date: 2026-03-27 10:10:35
|
||||
tags:
|
||||
- curl
|
||||
- Linux
|
||||
- Windows
|
||||
- API测试
|
||||
---
|
||||
|
||||
## 简介
|
||||
|
||||
curl (Client for URLs) 是一个强大的命令行工具,用于传输数据。它支持多种协议(HTTP、HTTPS、FTP等),是开发者和运维人员必备的工具之一。
|
||||
|
||||
## 安装
|
||||
|
||||
### Linux
|
||||
|
||||
大多数 Linux 发行版已预装 curl:
|
||||
|
||||
```bash
|
||||
# Debian/Ubuntu
|
||||
sudo apt install curl
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum install curl
|
||||
|
||||
# Arch Linux
|
||||
sudo pacman -S curl
|
||||
|
||||
# 验证安装
|
||||
curl --version
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
**方式一:Windows 10/11 自带**
|
||||
Windows 10 1803+ 和 Windows 11 已内置 curl。
|
||||
|
||||
**方式二:手动安装**
|
||||
1. 访问 https://curl.se/windows/ 下载
|
||||
2. 解压到 `C:\tools\curl`
|
||||
3. 添加到系统 PATH 环境变量
|
||||
|
||||
**方式三:使用包管理器**
|
||||
```powershell
|
||||
# winget
|
||||
winget install curl
|
||||
|
||||
# Chocolatey
|
||||
choco install curl
|
||||
|
||||
# Scoop
|
||||
scoop install curl
|
||||
```
|
||||
|
||||
## 基础用法
|
||||
|
||||
### GET 请求
|
||||
|
||||
```bash
|
||||
# 基本 GET 请求
|
||||
curl https://api.example.com/users
|
||||
|
||||
# 带查询参数
|
||||
curl "https://api.example.com/users?page=1&limit=10"
|
||||
|
||||
# 只显示响应头
|
||||
curl -I https://api.example.com
|
||||
|
||||
# 显示响应头和响应体
|
||||
curl -i https://api.example.com
|
||||
|
||||
# 跟随重定向
|
||||
curl -L https://example.com/redirect
|
||||
```
|
||||
|
||||
### POST 请求
|
||||
|
||||
```bash
|
||||
# 发送 JSON 数据(请求体)
|
||||
curl -X POST https://api.example.com/users \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "张三", "email": "zhangsan@example.com"}'
|
||||
|
||||
# 发送表单数据
|
||||
curl -X POST https://api.example.com/login \
|
||||
-d "username=admin&password=123456"
|
||||
|
||||
# 发送文件
|
||||
curl -X POST https://api.example.com/upload \
|
||||
-F "file=@/path/to/file.jpg"
|
||||
|
||||
# 发送多部分表单(文件+字段)
|
||||
curl -X POST https://api.example.com/upload \
|
||||
-F "file=@/path/to/file.jpg" \
|
||||
-F "name=张三" \
|
||||
-F "description=用户头像"
|
||||
```
|
||||
|
||||
### PUT / PATCH / DELETE 请求
|
||||
|
||||
```bash
|
||||
# PUT 请求(完整更新)
|
||||
curl -X PUT https://api.example.com/users/1 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "李四", "email": "lisi@example.com"}'
|
||||
|
||||
# PATCH 请求(部分更新)
|
||||
curl -X PATCH https://api.example.com/users/1 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "李四"}'
|
||||
|
||||
# DELETE 请求
|
||||
curl -X DELETE https://api.example.com/users/1
|
||||
```
|
||||
|
||||
## 常用选项详解
|
||||
|
||||
| 选项 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| `-X` | 指定请求方法 | `-X POST` |
|
||||
| `-H` | 添加请求头 | `-H "Authorization: Bearer token"` |
|
||||
| `-d` | 发送数据 | `-d '{"key":"value"}'` |
|
||||
| `-F` | 上传文件/表单 | `-F "file=@photo.jpg"` |
|
||||
| `-u` | 基础认证 | `-u user:pass` |
|
||||
| `-I` | 只获取响应头 | `curl -I url` |
|
||||
| `-i` | 显示响应头和内容 | `curl -i url` |
|
||||
| `-L` | 跟随重定向 | `curl -L url` |
|
||||
| `-o` | 保存到文件 | `-o output.json` |
|
||||
| `-O` | 使用远程文件名保存 | `-O` |
|
||||
| `-s` | 静默模式 | `-s` |
|
||||
| `-v` | 显示详细信息 | `-v` |
|
||||
| `-k` | 忽略 SSL 证书验证 | `-k` |
|
||||
| `-x` | 使用代理 | `-x http://proxy:8080` |
|
||||
| `--connect-timeout` | 连接超时(秒) | `--connect-timeout 10` |
|
||||
| `-m` | 最大请求时间(秒) | `-m 30` |
|
||||
|
||||
## 替代 Postman 的完整方案
|
||||
|
||||
### 1. 认证请求
|
||||
|
||||
```bash
|
||||
# Bearer Token 认证
|
||||
curl -H "Authorization: Bearer your_token_here" \
|
||||
https://api.example.com/data
|
||||
|
||||
# Basic Auth 认证
|
||||
curl -u "username:password" \
|
||||
https://api.example.com/data
|
||||
|
||||
# API Key 认证(Header 方式)
|
||||
curl -H "X-API-Key: your_api_key" \
|
||||
https://api.example.com/data
|
||||
|
||||
# API Key 认证(Query 参数方式)
|
||||
curl "https://api.example.com/data?api_key=your_api_key"
|
||||
```
|
||||
|
||||
### 2. 处理 Cookie
|
||||
|
||||
```bash
|
||||
# 保存 Cookie 到文件
|
||||
curl -c cookies.txt https://api.example.com/login \
|
||||
-d "username=admin&password=123456"
|
||||
|
||||
# 使用已保存的 Cookie
|
||||
curl -b cookies.txt https://api.example.com/profile
|
||||
|
||||
# 同时读写 Cookie
|
||||
curl -b cookies.txt -c cookies.txt https://api.example.com/action
|
||||
|
||||
# 直接设置 Cookie
|
||||
curl -H "Cookie: session=abc123; token=xyz789" \
|
||||
https://api.example.com/data
|
||||
```
|
||||
|
||||
### 3. 美化 JSON 输出
|
||||
|
||||
```bash
|
||||
# 使用 jq 美化(Linux/macOS)
|
||||
curl -s https://api.example.com/users | jq
|
||||
|
||||
# 使用 Python 美化(跨平台)
|
||||
curl -s https://api.example.com/users | python -m json.tool
|
||||
|
||||
# Windows PowerShell 方式
|
||||
curl -s https://api.example.com/users | ConvertFrom-Json | ConvertTo-Json -Depth 10
|
||||
```
|
||||
|
||||
### 4. 保存请求集合
|
||||
|
||||
创建一个 `api-requests.sh` 文件:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# API 请求集合 - 类似 Postman Collection
|
||||
|
||||
BASE_URL="https://api.example.com"
|
||||
TOKEN="your_token_here"
|
||||
|
||||
# 获取用户列表
|
||||
get_users() {
|
||||
curl -s "$BASE_URL/users" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H "Content-Type: application/json"
|
||||
}
|
||||
|
||||
# 创建用户
|
||||
create_user() {
|
||||
curl -s -X POST "$BASE_URL/users" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "张三", "email": "zhangsan@example.com"}'
|
||||
}
|
||||
|
||||
# 获取单个用户
|
||||
get_user() {
|
||||
local id=$1
|
||||
curl -s "$BASE_URL/users/$id" \
|
||||
-H "Authorization: Bearer $TOKEN"
|
||||
}
|
||||
|
||||
# 调用示例
|
||||
case "$1" in
|
||||
users) get_users | jq ;;
|
||||
create) create_user | jq ;;
|
||||
user) get_user "$2" | jq ;;
|
||||
*) echo "用法: $0 {users|create|user <id>}" ;;
|
||||
esac
|
||||
```
|
||||
|
||||
使用方式:
|
||||
```bash
|
||||
chmod +x api-requests.sh
|
||||
./api-requests.sh users
|
||||
./api-requests.sh create
|
||||
./api-requests.sh user 1
|
||||
```
|
||||
|
||||
### 5. 环境变量配置
|
||||
|
||||
```bash
|
||||
# 创建 .env 文件(添加到 .gitignore)
|
||||
# .env
|
||||
API_BASE_URL=https://api.example.com
|
||||
API_TOKEN=your_token_here
|
||||
|
||||
# 在脚本中使用
|
||||
source .env
|
||||
|
||||
curl -H "Authorization: Bearer $API_TOKEN" \
|
||||
"$API_BASE_URL/users"
|
||||
```
|
||||
|
||||
### 6. 环境切换
|
||||
|
||||
创建多环境配置:
|
||||
|
||||
```bash
|
||||
# environments.sh
|
||||
get_env() {
|
||||
case "$1" in
|
||||
dev)
|
||||
BASE_URL="https://dev-api.example.com"
|
||||
TOKEN="$DEV_TOKEN"
|
||||
;;
|
||||
staging)
|
||||
BASE_URL="https://staging-api.example.com"
|
||||
TOKEN="$STAGING_TOKEN"
|
||||
;;
|
||||
prod)
|
||||
BASE_URL="https://api.example.com"
|
||||
TOKEN="$PROD_TOKEN"
|
||||
;;
|
||||
*)
|
||||
echo "未知环境: $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 使用
|
||||
source environments.sh
|
||||
get_env dev
|
||||
curl -H "Authorization: Bearer $TOKEN" "$BASE_URL/users"
|
||||
```
|
||||
|
||||
### 7. 测试脚本示例
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# API 测试脚本
|
||||
|
||||
BASE_URL="https://api.example.com"
|
||||
TOKEN="test_token"
|
||||
|
||||
echo "=== 测试用户 API ==="
|
||||
|
||||
# 测试获取用户
|
||||
echo "1. GET /users"
|
||||
response=$(curl -s -w "\n%{http_code}" "$BASE_URL/users" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
http_code=$(echo "$response" | tail -n1)
|
||||
body=$(echo "$response" | head -n -1)
|
||||
|
||||
if [ "$http_code" -eq 200 ]; then
|
||||
echo "✅ 成功 (HTTP $http_code)"
|
||||
echo "$body" | jq
|
||||
else
|
||||
echo "❌ 失败 (HTTP $http_code)"
|
||||
echo "$body"
|
||||
fi
|
||||
|
||||
# 测试创建用户
|
||||
echo -e "\n2. POST /users"
|
||||
response=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/users" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "测试用户"}')
|
||||
http_code=$(echo "$response" | tail -n1)
|
||||
body=$(echo "$response" | head -n -1)
|
||||
|
||||
if [ "$http_code" -eq 201 ]; then
|
||||
echo "✅ 成功 (HTTP $http_code)"
|
||||
else
|
||||
echo "❌ 失败 (HTTP $http_code)"
|
||||
fi
|
||||
```
|
||||
|
||||
## Windows 特殊处理
|
||||
|
||||
### PowerShell 中的引号问题
|
||||
|
||||
PowerShell 对单引号和双引号有特殊处理,推荐以下方式:
|
||||
|
||||
```powershell
|
||||
# 方式一:使用双引号,内部双引号用反引号转义
|
||||
curl -X POST https://api.example.com/users `
|
||||
-H "Content-Type: application/json" `
|
||||
-d "{`"name`": `"张三`"}"
|
||||
|
||||
# 方式二:使用单引号包裹 JSON(推荐)
|
||||
curl -X POST https://api.example.com/users `
|
||||
-H "Content-Type: application/json" `
|
||||
-d '{"name": "张三"}'
|
||||
|
||||
# 方式三:从文件读取数据
|
||||
curl -X POST https://api.example.com/users `
|
||||
-H "Content-Type: application/json" `
|
||||
-d "@request.json"
|
||||
```
|
||||
|
||||
### Windows CMD 中的处理
|
||||
|
||||
```cmd
|
||||
# 使用双引号,内部双引号用反斜杠转义
|
||||
curl -X POST https://api.example.com/users ^
|
||||
-H "Content-Type: application/json" ^
|
||||
-d "{\"name\": \"张三\"}"
|
||||
|
||||
# 或使用文件
|
||||
curl -X POST https://api.example.com/users ^
|
||||
-H "Content-Type: application/json" ^
|
||||
-d "@request.json"
|
||||
```
|
||||
|
||||
### 创建 request.json 文件
|
||||
|
||||
对于复杂的请求体,推荐使用文件:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "张三",
|
||||
"email": "zhangsan@example.com",
|
||||
"roles": ["admin", "user"],
|
||||
"settings": {
|
||||
"theme": "dark",
|
||||
"language": "zh-CN"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -X POST https://api.example.com/users \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @request.json
|
||||
```
|
||||
|
||||
## 实用技巧
|
||||
|
||||
### 1. 测量请求时间
|
||||
|
||||
```bash
|
||||
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
|
||||
-o /dev/null -s https://api.example.com
|
||||
```
|
||||
|
||||
### 2. 下载文件并显示进度
|
||||
|
||||
```bash
|
||||
curl -O --progress-bar https://example.com/large-file.zip
|
||||
```
|
||||
|
||||
### 3. 断点续传
|
||||
|
||||
```bash
|
||||
curl -C - -O https://example.com/large-file.zip
|
||||
```
|
||||
|
||||
### 4. 限速下载
|
||||
|
||||
```bash
|
||||
# 限制为 1MB/s
|
||||
curl --limit-rate 1M -O https://example.com/file.zip
|
||||
```
|
||||
|
||||
### 5. 批量下载
|
||||
|
||||
```bash
|
||||
# 下载多个文件
|
||||
curl -O https://example.com/file1.zip -O https://example.com/file2.zip
|
||||
|
||||
# 使用序列
|
||||
curl -O https://example.com/file[1-10].jpg
|
||||
|
||||
# 使用字母序列
|
||||
curl -O https://example.com/file[a-z].jpg
|
||||
```
|
||||
|
||||
### 6. 调试请求
|
||||
|
||||
```bash
|
||||
# 显示完整请求/响应信息
|
||||
curl -v https://api.example.com
|
||||
|
||||
# 输出详细信息到文件
|
||||
curl --trace-ascii debug.txt https://api.example.com
|
||||
```
|
||||
|
||||
## curl vs Postman 对比
|
||||
|
||||
| 功能 | curl | Postman |
|
||||
|------|------|---------|
|
||||
| 安装 | 系统内置/轻量 | 需下载安装 |
|
||||
| 脚本化 | ✅ 原生支持 | ❌ 需导出 |
|
||||
| 自动化 | ✅ 易于集成 CI/CD | 需 Newman |
|
||||
| 资源占用 | 极低 | 较高 |
|
||||
| 可视化 | ❌ 无 | ✅ 有 |
|
||||
| 学习曲线 | 较陡 | 平缓 |
|
||||
| 环境管理 | 手动配置 | 图形界面 |
|
||||
| 团队协作 | Git + 脚本 | 云同步 |
|
||||
| 价格 | 免费 | 免费版有限制 |
|
||||
|
||||
## 快速参考
|
||||
|
||||
```bash
|
||||
# 最常用的命令模板
|
||||
curl -X [METHOD] [URL] \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '[JSON_DATA]' | jq
|
||||
|
||||
# 常用组合
|
||||
curl -s -X POST $URL -H $HEADERS -d $DATA | jq # 静默 POST,美化输出
|
||||
curl -I $URL # 检查响应头
|
||||
curl -L -I $URL # 跟随重定向并显示头
|
||||
curl -v $URL # 调试模式
|
||||
curl -u user:pass $URL # Basic Auth
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
curl 是一个功能强大的 HTTP 客户端工具,通过脚本化和命令行参数可以完全替代 Postman 进行 API 测试。虽然缺少可视化界面,但其轻量、可自动化、易于集成的特点使其成为开发者和 DevOps 的首选工具。
|
||||
|
||||
掌握 curl 能让你在没有图形界面的服务器环境中也能灵活地进行 API 调试和测试,是每个开发者必备的技能。
|
||||
@@ -138,6 +138,26 @@ brew services start colima
|
||||
colima start
|
||||
```
|
||||
|
||||
### 卸载
|
||||
|
||||
```shell
|
||||
colima stop
|
||||
```
|
||||
|
||||
```shell
|
||||
colima delete
|
||||
```
|
||||
|
||||
```shell
|
||||
brew uninstall colima
|
||||
```
|
||||
|
||||
```shell
|
||||
rm -rf ~/.colima
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 运行时
|
||||
|
||||
初始启动时,Colima会使用默认为Docker的用户指定的运行时启动。
|
||||
@@ -298,6 +318,33 @@ git clone https://github.com/dracula/iterm.git ~/.dotfiles/iTerm-Settings/them
|
||||
5. 重启终端
|
||||
关闭当前正在使用的所有终端窗口(无论是系统自带的 Terminal 还是 iTerm2),然后重新打开一个新的终端窗口。 这样做是为了让终端重新加载 `PATH` 环境变量,从而识别到新安装的 `code` 命令。
|
||||
|
||||
## HBuilderX
|
||||
|
||||
### 常见问题
|
||||
|
||||
使用cli脚本创建uniapp 运行时报错“cli项目运行依赖本地的Nodejs环境,请先安装并配置到系统环境变量后重试。”
|
||||
|
||||
编辑~/.bash_profile
|
||||
|
||||
```bash
|
||||
vim ~/.bash_profile
|
||||
```
|
||||
|
||||
打开之后新增
|
||||
|
||||
```bash
|
||||
#nvm环境
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
|
||||
```
|
||||
|
||||
保存退出后执行
|
||||
|
||||
```bash
|
||||
source ~/.bash_profile
|
||||
```
|
||||
|
||||
# 系统设置
|
||||
|
||||
## 键盘
|
||||
@@ -316,3 +363,42 @@ git clone https://github.com/dracula/iterm.git ~/.dotfiles/iTerm-Settings/them
|
||||
sudo spctl --master-disable
|
||||
```
|
||||
|
||||
## 开启开发者模式
|
||||
|
||||
macOS每次在IDE开启debug的时候,都会出现Developer Tools Access的弹窗。
|
||||
|
||||

|
||||
|
||||
### 解决方案
|
||||
|
||||
我们只需要启用开发者模式即可
|
||||
|
||||
打开终端输入下边命令:
|
||||
|
||||
```shell
|
||||
# 查看状态
|
||||
DevToolsSecurity --status
|
||||
# 输入密码,修改为enable,即可用
|
||||
DevToolsSecurity --enable
|
||||
# 输入密码,修改为disable,即关闭
|
||||
DevToolsSecurity --disable
|
||||
```
|
||||
|
||||
# 快捷键
|
||||
|
||||
## 创建虚拟桌面
|
||||
|
||||
Control + 上箭头
|
||||
|
||||
## 切换虚拟桌面
|
||||
|
||||
Control + 左右箭头
|
||||
|
||||
## 访问 Mission Control
|
||||
|
||||
F3
|
||||
|
||||
## 隐藏或显示程序呜
|
||||
|
||||
Option + Command + D
|
||||
|
||||
|
||||
+363
-2
@@ -347,6 +347,195 @@ modelscope download --model 'Qwen/Qwen2-7b' --include '*.json' --local_dir './lo
|
||||
echo 'export MODELSCOPE_CACHE=/AI/modelscope/hub' >> ~/.bashrc
|
||||
```
|
||||
|
||||
# hugging face
|
||||
|
||||
## 模型下载
|
||||
|
||||
### 安装
|
||||
|
||||
`conda` 创建虚拟环境
|
||||
|
||||
```bash
|
||||
conda create -n hf-mirror python=3.12
|
||||
```
|
||||
|
||||
`conda` 激活虚拟环境
|
||||
|
||||
```bash
|
||||
conda activate hf-mirror
|
||||
```
|
||||
|
||||
安装包
|
||||
|
||||
```bash
|
||||
pip install -U "huggingface_hub"
|
||||
```
|
||||
|
||||
### 命令行下载
|
||||
|
||||
### Download a single file
|
||||
|
||||
```bash
|
||||
hf download cyankiwi/Nemotron-Orchestrator-8B-AWQ-8bit --local-dir /AI/hf/models/cyankiwi/Nemotron-Orchestrator-8B-AWQ-8bit
|
||||
```
|
||||
|
||||
-
|
||||
|
||||
# Code-forge
|
||||
|
||||

|
||||
|
||||
**先说结论(适用于企业/商用环境)**
|
||||
|
||||
- **Anaconda(defaults 源)不能免费商用**:在公司/商业场景下使用 Anaconda 的默认源通常需要付费许可。
|
||||
- **Miniconda + conda-forge 能用,但要彻底移除 defaults,并避免在 base 开发**:否则仍可能触发 Anaconda 许可风险。
|
||||
- **最稳妥方案:Miniforge + conda-forge**:安装即默认使用 conda-forge,规避 defaults,合规且轻量。
|
||||
|
||||
> 简单理解:不是“conda 这款工具”收费,而是“使用 Anaconda/Defaults 源的二进制分发”涉及商业许可;改用 **conda-forge** 社区源即可规避许可问题。
|
||||
|
||||
## 彻底卸载现有 Anaconda/Miniconda
|
||||
|
||||
> 目标:清掉默认源、配置与 shell 残留,避免后续“误连 defaults”。
|
||||
|
||||
1. 查看 conda 安装路径(含各环境)
|
||||
|
||||
```bash
|
||||
conda info --base
|
||||
```
|
||||
|
||||
2. 删除用户侧配置与缓存
|
||||
|
||||
```bash
|
||||
rm -rf ~/.condarc ~/.conda ~/.continuum
|
||||
```
|
||||
|
||||
3. 清理 shell 初始化残留
|
||||
|
||||
在 `~/.bashrc`、`~/.bash_profile`、`~/.zshrc` 中搜索并删除与 `conda init`、`anaconda` 相关的初始化片段,保存后重新加载:
|
||||
|
||||
```bash
|
||||
source ~/.zshrc # 或 source ~/.bashrc
|
||||
```
|
||||
|
||||
1. Windows 清理(如之前安装过 Anaconda/Miniconda)
|
||||
|
||||
- 通过“应用和功能”卸载 Anaconda/Miniconda。
|
||||
- 删除用户目录:`C:\\Users\\<你的用户名>\\.conda`、`C:\\Users\\<你的用户名>\\.continuum`、`C:\\Users\\<你的用户名>\\.condarc`(若存在)。
|
||||
- 检查“环境变量”中与 Anaconda/Miniconda 相关的 Path 条目并移除。
|
||||
|
||||
## 安装 Miniforge
|
||||
|
||||
> Miniforge 默认只使用 conda-forge,装好即合规、可商用。
|
||||
|
||||
- 发布页(选择你的平台与架构):
|
||||
`https://github.com/conda-forge/miniforge/releases`
|
||||
|
||||
### macOS/Linux检查
|
||||
|
||||
```bash
|
||||
conda list --show-channel-urls | grep -v "^#" | awk '{print $4}' | sort | uniq -c
|
||||
```
|
||||
|
||||

|
||||
|
||||
### Windows检查
|
||||
|
||||
```powershell
|
||||
conda list --show-channel-urls | Where-Object {
|
||||
$_ -notmatch '^#'
|
||||
} | ForEach-Object {
|
||||
($_ -split '\s+')[3]
|
||||
} | Sort-Object | Group-Object | Select-Object Count,Name
|
||||
```
|
||||
|
||||

|
||||
|
||||
到这里,「Miniforge」+「conda-forge」的安装就`已经完成了`!因为「Miniforge」`默认的就是「conda-forge」源`。
|
||||
|
||||
## 将通道固定为 conda-forge(严格优先)
|
||||
|
||||
> 如果你此前用过 Miniconda,请务必执行本小节以彻底规避 defaults。
|
||||
|
||||
```bash
|
||||
# 移除 defaults(如不存在会提示,无妨)
|
||||
conda config --remove channels defaults || true
|
||||
# 仅使用 conda-forge,并设置严格优先级
|
||||
conda config --add channels conda-forge
|
||||
conda config --set channel_priority strict
|
||||
# 查看当前配置
|
||||
conda config --show | sed -n '/channels:/,/^$/p'
|
||||
```
|
||||
|
||||
建议:不要在 `base` 环境中开发,创建独立环境更干净:
|
||||
|
||||
```bash
|
||||
conda create -n ai python=3.11 -y
|
||||
conda activate ai
|
||||
```
|
||||
|
||||
## 验证是否仍引用 Anaconda 源
|
||||
|
||||
> 下面的命令会统计当前环境中每个包来自哪个 channel,方便确认是否“纯 conda-forge”。
|
||||
|
||||
macOS/Linux:
|
||||
|
||||
```bash
|
||||
conda list --show-channel-urls | grep -v "^#" | awk '{print $4}' | sort | uniq -c
|
||||
```
|
||||
|
||||
Windows:
|
||||
|
||||
```powershell
|
||||
conda list --show-channel-urls | Where-Object {
|
||||
$_ -notmatch '^#'
|
||||
} | ForEach-Object {
|
||||
($_ -split '\s+')[3]
|
||||
} | Sort-Object | Group-Object | Select-Object Count,Name
|
||||
```
|
||||
|
||||
若输出仅包含 `conda-forge`,说明你的环境是合规的;若还出现 `defaults`/`anaconda`,请返回第三节重新清理并创建新环境。
|
||||
|
||||
## 常见问题(FAQ)
|
||||
|
||||
- Q:Miniconda + conda-forge 能不能商用?
|
||||
A:可以,但务必移除 `defaults`,并新建环境后再安装依赖。历史 `base` 或旧环境中若残留来自 `defaults` 的包,仍可能存在许可风险。更稳妥的做法是直接使用 **Miniforge**。
|
||||
|
||||
- Q:为什么不在 base 环境开发?
|
||||
A:base 常被用于初始化与管理,历史上最容易“混入” defaults 包。独立环境可保证依赖与渠道的可控性与可复现性。
|
||||
|
||||
- Q:国内下载慢怎么办?
|
||||
A:可配置 conda-forge 的国内镜像(如清华镜像站),并保持 `channel_priority strict`,避免回落到 defaults。
|
||||
|
||||
- Q:已有项目如何迁移?
|
||||
A:导出依赖、切换通道、重建环境:
|
||||
|
||||
```bash
|
||||
conda env export --from-history > env.yml
|
||||
# 按第三节配置通道为 conda-forge 后
|
||||
conda env create -n ai-new -f env.yml
|
||||
conda activate ai-new
|
||||
```
|
||||
|
||||
## 参考命令清单(便捷复用)
|
||||
|
||||
```bash
|
||||
# 卸载相关(macOS/Linux)
|
||||
conda info --base
|
||||
rm -rf ~/.condarc ~/.conda ~/.continuum
|
||||
# Miniforge 安装(示例)
|
||||
curl -LO https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
|
||||
bash Miniforge3-MacOSX-arm64.sh -b -p $HOME/miniforge3
|
||||
source "$HOME/miniforge3/bin/activate" && conda init zsh &&
|
||||
exec $SHELL
|
||||
# 仅使用 conda-forge(严格优先)
|
||||
conda config --remove channels defaults || true
|
||||
conda config --add channels conda-forge
|
||||
conda config --set channel_priority strict
|
||||
# 创建与使用环境
|
||||
conda create -n ai python=3.11 -y
|
||||
conda activate ai
|
||||
```
|
||||
|
||||
# Anaconda
|
||||
|
||||
>
|
||||
@@ -533,13 +722,15 @@ source ~/.zshrc
|
||||
|
||||
>
|
||||
|
||||
## 安装
|
||||
## 全局
|
||||
|
||||
### 安装
|
||||
|
||||
```shell
|
||||
pip install jupyter
|
||||
```
|
||||
|
||||
## 运行
|
||||
### 运行
|
||||
|
||||
```shell
|
||||
jupyter notebook
|
||||
@@ -547,6 +738,176 @@ jupyter notebook
|
||||
jupyter notebook --allow-root
|
||||
```
|
||||
|
||||
## Conda 虚拟环境
|
||||
|
||||
### 安装
|
||||
|
||||
#### 使用 nb_conda_kernels 添加所有环境
|
||||
|
||||
```bash
|
||||
conda activate my-conda-env # this is the environment for your project and code
|
||||
conda install ipykernel
|
||||
conda deactivate
|
||||
|
||||
conda activate base # could be also some other environment
|
||||
conda install nb_conda_kernels
|
||||
jupyter notebook
|
||||
```
|
||||
|
||||
#### 配置密码(适用于 Jupyter 7+ / JupyterLab 4+)
|
||||
|
||||
在 安装有 jupyter 包的终端中运行
|
||||
|
||||
```bash
|
||||
jupyter server password
|
||||
```
|
||||
|
||||
然后按提示输入并确认密码。
|
||||
Jupyter 会自动将加密后的密码写入配置文件(通常是 `~/.jupyter/jupyter_server_config.json`)。
|
||||
|
||||
#### 生成并编辑配置文件
|
||||
|
||||
**生成配置文件**(如果还没有):
|
||||
|
||||
```bash
|
||||
jupyter notebook --generate-config
|
||||
```
|
||||
|
||||
(对于新版本):
|
||||
|
||||
```bash
|
||||
jupyter server --generate-config
|
||||
```
|
||||
|
||||
**编辑配置文件**(通常是 `~/.jupyter/jupyter_server_config.py` 或 `jupyter_notebook_config.py`)
|
||||
|
||||
```python
|
||||
c = get_config()
|
||||
|
||||
# 允许远程访问
|
||||
c.ServerApp.ip = '0.0.0.0' # 注意:新版本用 ServerApp 而非 NotebookApp
|
||||
|
||||
# 禁用自动打开浏览器
|
||||
c.ServerApp.open_browser = False
|
||||
|
||||
# 设置端口(可选)
|
||||
c.ServerApp.port = 8888
|
||||
|
||||
# (可选)设置工作目录
|
||||
c.ServerApp.root_dir = '/path/to/your/notebooks'
|
||||
|
||||
# (可选)允许通过 token 或密码登录(设了密码后 token 会失效)
|
||||
c.ServerApp.token = '' # 禁用 token(如果已设密码)
|
||||
c.ServerApp.password_required = True
|
||||
```
|
||||
|
||||
> 🔔注意:**Jupyter 新版本中 `NotebookApp` 已被 `ServerApp` 取代**,所以配置项要使用 `c.ServerApp.xxx`。
|
||||
|
||||
### 启动 Jupyter
|
||||
|
||||
```bash
|
||||
jupyter notebook --ip=0.0.0.0 --port=5600 --no-browser
|
||||
```
|
||||
|
||||
或直接:
|
||||
|
||||
```bash
|
||||
jupyter lab --ip=0.0.0.0 --port=5600 --no-browser
|
||||
```
|
||||
|
||||
### 注册服务
|
||||
|
||||
#### 创建 systemd 服务文件
|
||||
|
||||
创建服务文件(以用户 `user` 为例,替换为你的实际用户名):
|
||||
|
||||
```bash
|
||||
sudo vim /etc/systemd/system/jupyter-lab.service
|
||||
```
|
||||
|
||||
内容如下(**关键:使用绝对路径 + conda run**):
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Jupyter Lab Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=user
|
||||
WorkingDirectory=/home/user
|
||||
Environment=PATH=/home/user/miniforge3/envs/jupyter-env/bin:/home/user/miniforge3/condabin:/usr/local/bin:/usr/bin:/bin
|
||||
ExecStart=/home/user/miniforge3/envs/jupyter-env/bin/jupyter lab --ip=0.0.0.0 --port=7745 --no-browser
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
#### 重载 systemd 并启用服务
|
||||
|
||||
```bash
|
||||
# 重载 systemd 配置
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 启动服务
|
||||
sudo systemctl start jupyter-lab
|
||||
|
||||
# 设置开机自启
|
||||
sudo systemctl enable jupyter-lab
|
||||
|
||||
# 查看状态和日志
|
||||
sudo systemctl status jupyter-lab
|
||||
journalctl -u jupyter-lab -f
|
||||
```
|
||||
|
||||
|
||||
|
||||
# UV
|
||||
|
||||
**优点:**
|
||||
|
||||
- 极快的速度(比 pip 快 10-100 倍)
|
||||
- 自动管理 Python 版本
|
||||
- 内置虚拟环境管理
|
||||
- 现代化工具,Rust 编写
|
||||
- 无需单独安装 Python
|
||||
|
||||
## 安装
|
||||
|
||||
```bash
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
```
|
||||
|
||||
## 创建项目并自动安装 Python
|
||||
|
||||
```bash
|
||||
uv init myproject
|
||||
cd myproject
|
||||
uv python install 3.12 # 自动下载安装 Python 3.12
|
||||
uv venv # 创建虚拟环境
|
||||
source .venv/bin/activate
|
||||
```
|
||||
|
||||
## 安装包(使用 pyproject.toml)
|
||||
|
||||
```bash
|
||||
# 创建项目
|
||||
uv init langchain-project
|
||||
cd langchain-project
|
||||
|
||||
# 添加依赖
|
||||
uv add langchain==1.0.0
|
||||
uv add langchain-core==1.0.0
|
||||
uv add langchain-community==1.0.0
|
||||
uv add langchain-openai # 可选
|
||||
```
|
||||
|
||||
|
||||
|
||||
# UnSloth
|
||||
|
||||
# vLLM
|
||||
|
||||
@@ -502,14 +502,10 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
$htmlDom.toggle('hide-aside')
|
||||
},
|
||||
toggleSakuraBtn: () => {
|
||||
const toggleBtn = document.getElementById('toggle_sakura_btn');
|
||||
if (toggleBtn) {
|
||||
// toggleBtn.addEventListener('click', function () {
|
||||
const sakuraEffect = document.getElementById('canvas_sakura');
|
||||
if (sakuraEffect) {
|
||||
sakuraEffect.style.display = (sakuraEffect.style.display === 'none' || sakuraEffect.style.display === '') ? 'block' : 'none';
|
||||
}
|
||||
// });
|
||||
const isHidden = window.getComputedStyle(sakuraEffect).display === 'none';
|
||||
sakuraEffect.style.display = isHidden ? 'block' : 'none';
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user