vault backup: 2026-04-18 02:10:45
This commit is contained in:
136
Archive/Collection/KMP算法.md
Normal file
136
Archive/Collection/KMP算法.md
Normal file
@@ -0,0 +1,136 @@
|
||||
---
|
||||
tags:
|
||||
- kmp
|
||||
aliases:
|
||||
type:
|
||||
- Source
|
||||
status:
|
||||
- 💤 Archived
|
||||
star: false
|
||||
date:
|
||||
---
|
||||
KMP(Knuth-Morris-Pratt)算法是一种用于字符串匹配的算法,它能在O(n+m)的时间复杂度内完成字符串的匹配,其中n是主串的长度,m是模式串的长度。这个算法是由Donald Knuth、Vaughan Pratt和Vaughan Morris在1970年共同发明的。
|
||||
|
||||
KMP算法的主要思想是利用已经匹配过的信息,避免再次从头开始匹配。具体来说,KMP算法在匹配失败后,能够知道模式串中有一部分字符是与主串匹配的,因此不需要重新匹配这些字符。
|
||||
|
||||
KMP算法的关键在于构造一个“部分匹配表”(也称为“失败函数”或“跳转表”),这个表记录了模式串中每个位置的最长公共前后缀的长度。在匹配过程中,如果发生了匹配失败,就可以根据这个表来确定下一步应该比较的位置,从而避免了不必要的比较。
|
||||
|
||||
KMP算法的具体实现过程如下:
|
||||
|
||||
1. 构造部分匹配表。对于模式串中的每个位置i(1≤i≤m),计算以该位置结尾的最长公共前后缀的长度,并将结果存储在部分匹配表的第i个位置。这个计算过程可以通过动态规划来实现。
|
||||
|
||||
2. 进行字符串匹配。从主串的第一个字符和模式串的第一个字符开始比较,如果相等,则继续比较下一个字符;如果不相等,则根据部分匹配表来确定下一步应该比较的位置。重复这个过程,直到匹配成功或者遍历完整个主串。
|
||||
|
||||
KMP算法的时间复杂度为O(n+m),其中n是主串的长度,m是模式串的长度。这个算法在实际应用中非常广泛,特别是在需要频繁进行字符串匹配的场景中,如搜索引擎、文本编辑器等。
|
||||
|
||||
下面是一个用C语言实现的KMP(Knuth-Morris-Pratt)字符串匹配算法的示例代码。这个示例中,我们实现了KMP算法来在一个主字符串(text)中查找一个模式字符串(pattern)的所有出现位置。
|
||||
|
||||
```c
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
// 函数原型声明
|
||||
|
||||
void computeLPSArray(char *pat, int M, int *lps);
|
||||
void KMPSearch(char *pat, char *txt);
|
||||
|
||||
int main() {
|
||||
char text[] = "ABABDABACDABABCABAB";
|
||||
char pattern[] = "ABABCABAB";
|
||||
printf("Text: %s\n", text);
|
||||
printf("Pattern: %s\n", pattern);
|
||||
KMPSearch(pattern, text);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
// 计算LPS(最长公共前后缀)数组
|
||||
|
||||
void computeLPSArray(char *pat, int M, int *lps) {
|
||||
|
||||
int len = 0; // 最长公共前后缀的长度
|
||||
|
||||
lps[0] = 0; // lps[0] 总是0
|
||||
|
||||
int i = 1;
|
||||
|
||||
while (i < M) {
|
||||
|
||||
if (pat[i] == pat[len]) {
|
||||
|
||||
len++;
|
||||
|
||||
lps[i] = len;
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
if (len != 0) {
|
||||
|
||||
len = lps[len - 1];
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
lps[i] = 0;
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// KMP字符串匹配算法
|
||||
|
||||
void KMPSearch(char *pat, char *txt) {
|
||||
|
||||
int M = strlen(pat);
|
||||
|
||||
int N = strlen(txt);
|
||||
|
||||
int lps[M];
|
||||
|
||||
int j = 0; // 模式串的索引
|
||||
|
||||
// 计算LPS数组
|
||||
|
||||
computeLPSArray(pat, M, lps);
|
||||
|
||||
int i = 0; // 文本串的索引
|
||||
|
||||
while (i < N) {
|
||||
|
||||
if (pat[j] == txt[i]) {
|
||||
|
||||
j++;
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
|
||||
if (j == M) {
|
||||
printf("Pattern found at index %d \n", i - j);
|
||||
j = lps[j - 1];
|
||||
}
|
||||
else if (i < N && pat[j] != txt[i]) {
|
||||
if (j != 0)
|
||||
j = lps[j - 1];
|
||||
else
|
||||
i = i + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
在这个示例中,`computeLPSArray`函数计算了模式串的最长公共前后缀数组(LPS数组),而`KMPSearch`函数使用这个数组来在文本串中查找模式串。当找到匹配时,它会打印出模式串在主字符串中的起始索引。
|
||||
|
||||
你可以编译并运行这段代码来测试KMP算法。请确保你的编译器支持C语言标准,并且已经正确设置了编译环境。
|
||||
|
||||
内容由AI大模型生成,仅供参考
|
||||
357
Archive/Collection/Markdown语法.md
Normal file
357
Archive/Collection/Markdown语法.md
Normal file
@@ -0,0 +1,357 @@
|
||||
---
|
||||
tags:
|
||||
- markdown
|
||||
aliases:
|
||||
type:
|
||||
- Source
|
||||
status:
|
||||
- 💤 Archived
|
||||
star: false
|
||||
date:
|
||||
---
|
||||
# **语法速查表**
|
||||
|
||||
| 功能 (Feature) | Markdown 语法 (Syntax) | 效果预览 (Result) |
|
||||
| :--- | :--- | :--- |
|
||||
| 一级标题 | `# 标题内容` | 最大的标题 |
|
||||
| 二级标题 | `## 标题内容` | |
|
||||
| 三级标题 | `### 标题内容` | (依此类推,可到六级) |
|
||||
| --- | --- | --- |
|
||||
| **加粗** | `**需要加粗的文字**` | **需要加粗的文字** |
|
||||
| *斜体* | `*需要倾斜的文字*` | *需要倾斜的文字* |
|
||||
| ***加粗并斜体*** | `***又粗又斜的文字***` | ***又粗又斜的文字*** |
|
||||
| ~~删除线~~ | `~~被删除的文字~~` | ~~被删除的文字~~ |
|
||||
| --- | --- | --- |
|
||||
| 无序列表 | `- 列表项` 或 `* 列表项` | • 列表项 |
|
||||
| 有序列表 | `1. 列表项一`<br>`2. 列表项二` | 1. 列表项一<br>2. 列表项二 |
|
||||
| 任务列表(待办) | `- [ ] 未完成的任务`<br>`- [x] 已完成的任务` | ☐ 未完成的任务<br>☑ 已完成的任务 |
|
||||
| --- | --- | --- |
|
||||
| > 引用 | `> 这是一段引用的文字` | > 这是一段引用的文字 |
|
||||
| `行内代码` | `` `code` `` | 用于突出显示单个变量或命令 |
|
||||
| 代码块 | ```` ```python `<br>`print("Hello, World!")`<br>` ``` ```` | 用于显示多行代码片段 |
|
||||
| --- | --- | --- |
|
||||
| 链接 | `[链接显示的文字](https://obsidian.md)` | [链接显示的文字](https://obsidian.md) |
|
||||
| 图片 | `` | (在笔记中会直接显示图片) |
|
||||
| 水平分割线 | `---` 或 `***` | 一条横跨整个页面的线 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
> [!note]+ 标题
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 井号加空格,几个井号就是几级标题,一级标题字体最大。
|
||||
> # 一级标题
|
||||
> ## 二级标题
|
||||
> ```
|
||||
|
||||
# 标题 1
|
||||
|
||||
## 标题 2
|
||||
|
||||
### 标题 3
|
||||
|
||||
#### 标题 4
|
||||
|
||||
##### 标题 5
|
||||
|
||||
###### 标题 6
|
||||
|
||||
---
|
||||
|
||||
> [!note]+ 文本
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 两个星号是加粗:**我是加粗字体**
|
||||
> 一个型号是斜体:*我是斜体*
|
||||
> 三个星号,或者三个下划线是粗斜体:***我是粗斜体***,___我是粗斜体___
|
||||
> 两个等号是高亮:==我是高亮==
|
||||
> 两个波浪线是删除:~~我是删除~~
|
||||
> ```
|
||||
|
||||
## 文本
|
||||
|
||||
普通文本
|
||||
|
||||
**段落粗体文本**
|
||||
|
||||
*段落斜体文本*
|
||||
|
||||
==高亮==
|
||||
|
||||
~~删除~~
|
||||
|
||||
***粗斜体***
|
||||
___粗斜体___
|
||||
~~删除~~
|
||||
|
||||
|
||||
---
|
||||
|
||||
> [!note]+ 列表
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 无序列表:减号/加号/星号 + 空格,三个符号哪个都可以,但是建议用减号。 - 列表项1
|
||||
> 有序列表:数字+点+空格:1. 列表项
|
||||
> 输入完一个列表项后,打回车可以继续下一个列表项
|
||||
> 列表嵌套:使用tab可以让列表缩进,使用shift+tab可以取消缩进。
|
||||
>
|
||||
> 任务列表:方括号里面一个空格或者叉,空格代表未完成,叉代表已完成。
|
||||
> [x] 任务 1
|
||||
> [ ] 任务 2
|
||||
> Task插件可以使已完成的任务后面自动显示完成时间。
|
||||
>
|
||||
>任务列表并非原始的、John Gruber 定义的 Markdown 标准语法。然而,它已经成为一种被广泛接受和支持的 Markdown 扩展语法,许多现代的 Markdown 编辑器和笔记应用也都采纳了这种任务列表语法,因为它非常直观和实用。
|
||||
> ```
|
||||
## 列表
|
||||
**无序列表**
|
||||
- 列表项 1
|
||||
- 列表项 2
|
||||
- 列表项 2.1
|
||||
- 列表项 2.2
|
||||
- 列表项 3
|
||||
|
||||
**有序列表**
|
||||
1. 列表项 a
|
||||
2. 列表项 b
|
||||
1. 列表项 b1
|
||||
2. 列表项 b2
|
||||
3. 列表项 c
|
||||
|
||||
**任务列表**
|
||||
- [ ] 任务 1
|
||||
- [ ] 任务 2
|
||||
- [ ] 嵌套任务 2.1
|
||||
- [ ] 嵌套任务 2.2
|
||||
- [ ] 任务 3
|
||||
|
||||
---
|
||||
|
||||
## 段落
|
||||
> [!note]+ 段落
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 引用:大于号+空格:> 我是引用
|
||||
> 嵌套引用:多个大于号,每多一个大于号,代表深一层嵌套
|
||||
> 分割线:三个减号然后回车:---
|
||||
> 强制换行 (Soft Break / Line Break):在同一段落内强制开始一个新行,而不是开始一个新段落。使用方法:在一行的末尾输入两个或更多的空格,然后按回车键。
|
||||
> 备选方法:(如果 Markdown 解析器支持 HTML):直接使用 HTML 的 <br> 标签。
|
||||
>
|
||||
> ```
|
||||
|
||||
引用语法:
|
||||
> 引用了一段名人名言
|
||||
>> 嵌套引用
|
||||
>>> 俄罗斯套娃
|
||||
|
||||
强制换行:
|
||||
|
||||
这是第一行文字(假设末尾有两个空格)
|
||||
第二行
|
||||
|
||||
|
||||
分割线:
|
||||
|
||||
---
|
||||
|
||||
> [!note]+ 链接
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> [普通链接](https://www.bing.com/)
|
||||
> [普通链接带标题](https://www.bing.com/ "普通链接带标题")
|
||||
> 直接链接:<https://github.com>
|
||||
> 锚点链接:1. 在文稿起草阶段,还没确定具体网址,但可以先给出网址标题。2. 同一篇文章需要重复出现同一个网址时.
|
||||
> 使用方法:[网址标题][网址名]
|
||||
> 然后在其他地方(一般是文章最后)给出网址名的地址:[网址名]:https://www.bing.com/
|
||||
> [锚点链接][anchor-id]
|
||||
> [anchor-id]: http://www.this-anchor-link.com/
|
||||
>
|
||||
> ```
|
||||
|
||||
## 链接
|
||||
|
||||
[普通链接](https://www.bing.com/)
|
||||
|
||||
直接链接:<https://github.com>
|
||||
|
||||
[锚点链接][锚点名称123]
|
||||
|
||||
[锚点名称123]: http://www.this-anchor-link.com/
|
||||
|
||||
|
||||
|
||||
---
|
||||
> [!note]+ 脚注
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 方括号内,上箭头,外加脚注名称(一般为标号)
|
||||
> 本句话要加脚注[^01]
|
||||
> [^01]:这是解释脚注 01的内容
|
||||
> ```
|
||||
|
||||
## 脚注
|
||||
|
||||
1. 要添加脚注的话[^01]
|
||||
2. 第二个要添加脚注的话[^02]
|
||||
|
||||
[^01]:脚注内容一
|
||||
[^02]:脚注内容二
|
||||
|
||||
|
||||
|
||||
---
|
||||
> [!note]+ 图片
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 图片语法与链接类似,只是在前面多一个感叹号!。
|
||||
> 示例:
|
||||
> 替代文本:当图片无法显示时展示的文字,也有助于屏幕阅读器。
|
||||
> 图片路径:可以是网络图片的 URL,也可以是本地文件的相对或绝对路径。
|
||||
> 可选的图片标题:鼠标悬停在图片上时显示的提示文字。
|
||||
>
|
||||
> 带链接的图片 (Clickable Images):
|
||||
> 使用方法:将图片的 Markdown 语法作为链接的“链接文本”部分。
|
||||
> [](链接地址)
|
||||
> [](https://www.bing.com/)
|
||||
> 点击即可跳转到bing.com,哪怕图片找不到,点击依然跳转到链接。
|
||||
> ```
|
||||
## 图片
|
||||
|
||||

|
||||
|
||||
[](https://www.bing.com/)
|
||||
|
||||
|
||||
---
|
||||
|
||||
> [!note]+ 表格
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 表头: 用竖线 | 分隔单元格内容。
|
||||
> 分隔行: 用竖线 | 分隔,并使用至少三个减号 - 来创建每个单元格的分隔线。可以通过在减号前后添加冒号 : 来控制该列的对齐方式:
|
||||
> 左对齐 (默认)::--- (或 :-)
|
||||
> 居中对齐::---: (或 :-:)
|
||||
> 右对齐:---: (或 -:)
|
||||
> 内容行 (Content Rows): 用竖线 | 分隔单元格内容。
|
||||
> 最外层的竖线 | 是可选的,但为了美观和清晰,建议加上。
|
||||
> ```
|
||||
|
||||
## 表格
|
||||
|
||||
| 名字 | 姓氏 | 电子邮件 |
|
||||
| ------ | ------- | -------------------------- |
|
||||
| John | Doe | john.doe@example.com |
|
||||
| Muffin | Poppies | muffin.poppies@example.com |
|
||||
| Jane | Doe | jane.doe@example.com |
|
||||
|
||||
| 左对齐 | 居中对齐 | 右对齐 |
|
||||
| :----- | :------: | -----: |
|
||||
| AAA | BBB | CCC |
|
||||
|
||||
---
|
||||
|
||||
> [!note]+ 代码
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 行内代码用一个点包裹,代码块用三个点包裹,点是键盘上数字1左边的点。
|
||||
> 代码块可以指定代码语言,比如python、javascript,直接加在三个点后面即可。
|
||||
> 对于 Markdown 中的语言标识符(例如 javascript),通常不区分大小写。这意味着 javascript、JavaScript 和 JAVASCRIPT 应该产生相同的语法高亮效果。不过,最佳实践是使用小写形式。但这也可能取决于具体的 Markdown 解析器。
|
||||
>
|
||||
> Mermaid代码可以生成各种图标,感兴趣的可以单独学习Mermaid语法。
|
||||
> ```
|
||||
|
||||
## 代码
|
||||
|
||||
**行内代码**
|
||||
变量 `myvar` 被设置为值 `100`。
|
||||
|
||||
**代码块**
|
||||
|
||||
|
||||
```python
|
||||
import numpy as np
|
||||
def calc(a):
|
||||
return np.sqrt(a)*3
|
||||
|
||||
test = calc(12)
|
||||
```
|
||||
|
||||
Mermaid代码:
|
||||
```mermaid
|
||||
graph TD
|
||||
A[开始] --> B(处理);
|
||||
B --> C{条件?};
|
||||
C -- 是 --> D[操作1];
|
||||
C -- 否 --> E[操作2];
|
||||
D --> F[结束];
|
||||
E --> F;
|
||||
```
|
||||
|
||||
|
||||
# [[Obsidian]]特有或增强的Markdown 功能
|
||||
|
||||
> [!note]+ 双链
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 1. [[笔记文件名]]:链接到仓库内的另一篇笔记。使用方法:用双层方括号 [[]] 包裹笔记的文件名 (无需 .md 后缀)。示例:[[我的待办事项]]
|
||||
> 2. [[笔记文件名#标题名]]:链接到另一篇笔记中的特定标题。使用方法:在文件名后加 # 和目标标题的文本。示例:[[Markdown 语法详解#10. 表格]]
|
||||
> 3. [[笔记文件名|自定义显示文本]]:链接到另一篇笔记,但显示自定义的链接文字。使用方法:在文件名后加 | 和希望显示的文本。示例: [[2024-05-27 Daily Note|昨天的日记]]
|
||||
> 4. ![[笔记文件名]]:将另一篇笔记的全部内容嵌入到当前笔记中。使用方法:与图片嵌入类似,但使用双层方括号,并以 ! 开头。示例: ![[常用代码片段]]
|
||||
> 5. ![[笔记文件名#标题名]]:将另一篇笔记中特定标题下的内容嵌入。使用方法:在文件名后跟特定标题。示例: ![[会议记录#行动项]]
|
||||
> 6. ![[笔记文件名#^块ID]]:嵌入笔记中被 \^块ID 标记的特定块(段落、列表项等)。使用方法:先在源笔记中,在你想要引用的段落或列表项的末尾添加一个块引用ID,格式为 ^yourBlockID (例如 ^task123)。然后在目标笔记中用 ![[源笔记文件名#^yourBlockID]] 来嵌入它。示例:在 "任务列表.md" 中: - [ ] 完成报告 ^reportTask,然后在当前笔记中嵌入: ![[任务列表#^reportTask]]
|
||||
> ```
|
||||
## 双链
|
||||
注意:这里使用反斜杠,是为了让Obsidian不把他识别为一个双链,否则Dashboard就会被认为是一个双链,从而在关系图谱中看到这个Dashboard节点。
|
||||
内部链接: \[[Dashboard]]
|
||||
|
||||
---
|
||||
> [!note]+ 标签
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 以井号 # 开头,后跟标签名称。标签名不能包含空格,可以用 - 或 _ 连接多词标签 (如 #读书笔记 或 #project-alpha)。标签可以放在笔记的任意位置,包括 YAML Frontmatter 中的 tags 字段。
|
||||
> ```
|
||||
## 标签
|
||||
标签: #dashboard #notes
|
||||
|
||||
---
|
||||
|
||||
> [!note]+ 数学与公式
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> Obsidian 内置了对 KaTeX 的支持,用于渲染 LaTeX 数学公式。
|
||||
> $行内数学公式$:将公式嵌入到文本行中。
|
||||
> 使用方法:用一对美元符号 $ 包裹 LaTeX 公式。
|
||||
> $$块级数学公式$$:将公式在单独的块中居中显示。
|
||||
> 使用方法:两对美元符号包裹
|
||||
> ```
|
||||
|
||||
## 数学与公式
|
||||
|
||||
$$g=g_0 \frac{R^2}{\left( R + z \right)^2} = \frac{g_0}{\left(1 + z/R \right)^2} $$
|
||||
|
||||
其中,
|
||||
$g$ = 指定距离处的相对引力。
|
||||
$g_0$ = \[[Surface Gravity |物体的表面引力]]。
|
||||
$R$ = 物体的半径。(通常是物体的赤道半径)。
|
||||
$z$ = 物体表面以上的距离。
|
||||
|
||||
---
|
||||
|
||||
> [!note]+ 引用块
|
||||
> ```
|
||||
> 注意:所有符号都是英文输入法下的符号
|
||||
> 使用方法: 引用块 (>) 之后紧跟 [!类型]。类型可以是 note, abstract, info, todo, tip, success, question, warning, failure, danger, bug, example, quote 等。
|
||||
> 可选标题**: 在 [!类型] 后可以添加自定义标题文本。
|
||||
> 可折叠**: 在类型后加减号 - (如 [!INFO]-) 可使标注默认折叠,加加号 + (如 [!INFO]+) 可使其默认展开 (通常默认就是展开)。
|
||||
> ```
|
||||
|
||||
## 引用块 (Callouts)
|
||||
|
||||
> [!note]+ 笔记引用块
|
||||
> 这是一个笔记引用块...
|
||||
|
||||
> [!warning]- 警示引用块
|
||||
> 这是一个警示引用块...
|
||||
98
Archive/Collection/PID控制算法.md
Normal file
98
Archive/Collection/PID控制算法.md
Normal file
@@ -0,0 +1,98 @@
|
||||
---
|
||||
tags:
|
||||
- pid
|
||||
aliases:
|
||||
type:
|
||||
- Source
|
||||
status:
|
||||
- 💤 Archived
|
||||
star: false
|
||||
date:
|
||||
---
|
||||
以下是一个简单的C语言实现PID控制算法的程序示例:
|
||||
|
||||
```c
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
// PID控制器结构体
|
||||
|
||||
typedef struct {
|
||||
|
||||
double kp; // 比例系数
|
||||
|
||||
double ki; // 积分系数
|
||||
|
||||
double kd; // 微分系数
|
||||
|
||||
double previous_error; // 上一次的误差
|
||||
|
||||
double integral; // 误差积分
|
||||
|
||||
} PIDController;
|
||||
|
||||
// PID计算函数
|
||||
|
||||
double PID_Compute(PIDController* pid, double setpoint, double actual_value, double dt) {
|
||||
|
||||
double error = setpoint - actual_value;
|
||||
|
||||
pid->integral += error * dt;
|
||||
|
||||
double derivative = (error - pid->previous_error) / dt;
|
||||
|
||||
double output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative;
|
||||
|
||||
pid->previous_error = error;
|
||||
|
||||
return output;
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
// 初始化PID控制器
|
||||
|
||||
PIDController pid;
|
||||
|
||||
pid.kp = 1.0;
|
||||
|
||||
pid.ki = 0.1;
|
||||
|
||||
pid.kd = 0.01;
|
||||
|
||||
pid.previous_error = 0.0;
|
||||
|
||||
pid.integral = 0.0;
|
||||
|
||||
// 模拟控制过程
|
||||
|
||||
double setpoint = 100.0; // 设定目标值
|
||||
|
||||
double actual_value = 0.0; // 实际值
|
||||
|
||||
double dt = 0.1; // 时间间隔
|
||||
|
||||
double output; // PID输出
|
||||
|
||||
for (int i = 0; i < 100; i++) {
|
||||
|
||||
output = PID_Compute(&pid, setpoint, actual_value, dt);
|
||||
|
||||
actual_value += output; // 假设输出直接控制实际值
|
||||
|
||||
printf("Time: %d, Actual Value: %f, Error: %f, Output: %f\n", i, actual_value, setpoint - actual_value, output);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
这个示例程序定义了一个`PIDController`结构体,包含了PID控制器的参数(比例系数`kp`、积分系数`ki`、微分系数`kd`)以及状态变量(上一次的误差`previous_error`和误差积分`integral`)。`PID_Compute`函数根据设定目标值、实际值和时间间隔计算PID输出。在`main`函数中,我们初始化了一个PID控制器,并模拟了一个控制过程,其中PID输出直接控制实际值。
|
||||
|
||||
请注意,这只是一个简单的示例程序,实际应用中可能需要根据具体需求进行调整和优化。此外,PID控制算法还需要考虑一些边界条件和特殊情况,例如积分饱和、微分先行等。因此,在实际应用中,建议根据具体需求进行深入研究和实践。
|
||||
|
||||
内容由AI大模型生成,仅供参考
|
||||
255
Archive/Collection/YAML用法.md
Normal file
255
Archive/Collection/YAML用法.md
Normal file
@@ -0,0 +1,255 @@
|
||||
---
|
||||
tags:
|
||||
- yaml
|
||||
aliases:
|
||||
type:
|
||||
- Source
|
||||
status:
|
||||
- 💤 Archived
|
||||
star: false
|
||||
date:
|
||||
---
|
||||
**YAML (YAML Ain't Markup Language) 是一种以数据为中心、对人类友好的数据序列化语言。它因其简洁和高可读性而备受青睐,尤其是在配置文件和知识管理领域。**
|
||||
|
||||
### 1. YAML的应用场景
|
||||
#### 作为Markdown知识笔记的元数据
|
||||
##### 什么是YAML Front Matter?
|
||||
|
||||
- **定义:** 它是添加到文件第一行的一系列纯文本属性,用于在Markdown等文件中添加元数据。
|
||||
- **别称:** 也常被称为 front matter、页眉、前页、扉页、前言。
|
||||
- **作用:** 它是一种人类可读、文件级的元数据,为笔记本身添加了结构化的信息,使得软件可以基于这些信息进行强大的自动化处理,例如分类、查询和筛选。
|
||||
|
||||
|
||||
在Obsidian、Joplin等众多工具中,YAML Front Matter是核心功能。它为一篇笔记提供了超越其正文内容的“身份信息”。
|
||||
|
||||
**示例:** 在一篇Obsidian笔记的开头,你可以这样定义元数据。
|
||||
|
||||
```yaml
|
||||
---
|
||||
title: "我的Obsidian使用技巧"
|
||||
date: 2025-08-21
|
||||
tags: [Obsidian, 知识管理, YAML]
|
||||
aliases: [Obsidian技巧, 如何使用Obsidian]
|
||||
---
|
||||
```
|
||||
|
||||
#### 作为AI提示词的格式
|
||||
|
||||
当构建复杂的AI提示词(Prompt)时,需要一种能够清晰组织指令、变量和上下文的格式。YAML在这方面表现出色。
|
||||
|
||||
| 格式 | 优点 | 缺点 | 适用场景 |
|
||||
| ------------ | ------------------------------------------------------------ | -------------------------------------- | -------------------------------------- |
|
||||
| **YAML** | 结构清晰,可读性高,易于手写和维护,适合表达复杂的层级关系。 | 语法依赖严格的缩进,对新手不友好。 | 复杂的、多参数的、需要模板化的AI任务。 |
|
||||
| **Markdown** | 自由流畅,接近自然语言,适合编写故事或对话型提示词。 | 结构性差,难以定义精确的配置参数。 | 文学创作、角色扮演、简单的问答。 |
|
||||
| **JSON** | 机器解析极为友好,语法严格,不易产生歧义,是API交互的标准。 | 手写繁琐,括号和引号过多,可读性较差。 | 程序化的API调用,自动化工作流。 |
|
||||
|
||||
#### 作为配置文件
|
||||
|
||||
YAML是许多现代软件和工具首选的配置文件格式,因为它能清晰地表达复杂的配置结构。
|
||||
|
||||
- **智能家居自动化:** 在流行的开源智能家居平台 Home Assistant 中,用户主要通过编辑YAML文件(如 configuration.yaml)来设置自动化场景。例如,“当太阳下山时,自动打开客厅的灯”或者“当传感器检测到湿度低于40%时,开启加湿器”这样的规则,都是通过YAML来定义的。
|
||||
|
||||
- **PC游戏的插件与Mod:** 许多PC游戏(尤其是沙盒类游戏如《我的世界》Minecraft)的服务器插件或Mod,都使用YAML文件作为配置文件。服务器的管理员或玩家可以通过修改这些 .yml 文件,来调整游戏规则、设置商店物品价格、或者自定义玩家加入时的欢迎信息,而无需编写任何代码。
|
||||
|
||||
|
||||
### 2. YAML的基础语法
|
||||
#### <mark style="background: #FFF3A3A6;">核心规则</mark>
|
||||
|
||||
1. **格式**:采用“关键词: 值”的键值对形式(关键词 英文冒号 空格 值)。
|
||||
样例:
|
||||
```yaml
|
||||
views:
|
||||
- type: table
|
||||
name: 表格
|
||||
order:
|
||||
- file.name
|
||||
- file.fullname
|
||||
- file.tags
|
||||
- file.folder
|
||||
```
|
||||
2. **空格与缩进**:YAML 的语法对缩进和空格**极其敏感**,这是其结构的核心。理解并遵守这些规则是正确编写 YAML 的关键。
|
||||
- **使用空格进行缩进**:通过空格缩进来表示数据的层级关系和嵌套。
|
||||
- **严禁使用 Tab 键**:只能使用空格进行缩进,绝不能使用 Tab 键。混合使用或单独使用 Tab 键都会导致解析错误。
|
||||
- **缩进需保持一致**:同一层级的元素必须左侧对齐(即保持相同的缩进量)。通常推荐使用 2 个或 4 个空格作为一级缩进。
|
||||
- **冒号和短横线后的空格**:
|
||||
- 键值对的冒号 (:) 后面必须跟一个空格。
|
||||
- 列表项的短横线 (-) 后面必须跟一个空格。
|
||||
|
||||
#### 基本数据结构
|
||||
|
||||
YAML 主要由三种基本数据结构组成:纯量(Scalars)、序列(Sequences/Lists)和映射(Mappings/Dictionaries)。
|
||||
|
||||
##### 1. 纯量 (Scalars)
|
||||
|
||||
纯量是单个的、不可分割的值,是 YAML 中最基本的数据单元。
|
||||
|
||||
- **字符串 (String)**
|
||||
- 默认无需引号:my_string: Hello YAML
|
||||
- 单引号 ('):不会转义特殊字符,所有内容视为字面量。
|
||||
- 双引号 ("):会转义特殊字符,例如 \n 会被解析为换行符。
|
||||
- **数字 (Number)**:包括整数和浮点数。
|
||||
- **布尔值 (Boolean)**:true 或 false。
|
||||
- **空值 (Null)**:使用 null 或 ~ 表示。
|
||||
|
||||
**示例代码:**
|
||||
```yaml
|
||||
# 字符串
|
||||
string_value: Hello YAML
|
||||
quoted_string: "This is a string with a \n newline."
|
||||
|
||||
# 数字
|
||||
integer_value: 1024
|
||||
float_value: 3.14159
|
||||
|
||||
# 布尔值
|
||||
is_active: true
|
||||
is_enabled: false
|
||||
|
||||
# 空值
|
||||
empty_value: null
|
||||
another_empty: ~
|
||||
```
|
||||
|
||||
##### 2. 序列 (Sequences / Lists)
|
||||
|
||||
序列是一组有序的值,类似于编程语言中的数组或列表。每个列表项由一个短横线 (-) 和一个空格开头。
|
||||
|
||||
**示例代码:**
|
||||
```yaml
|
||||
# 一个简单的水果列表
|
||||
fruits:
|
||||
- Apple
|
||||
- Orange
|
||||
- Strawberry
|
||||
|
||||
# 也可以使用行内(inline)格式
|
||||
fruits_inline: [Apple, Orange, Strawberry]
|
||||
```
|
||||
|
||||
##### 3. 映射 (Mappings / Dictionaries)
|
||||
|
||||
映射是键值对(key-value)的集合,类似于编程语言中的字典或哈希表。
|
||||
|
||||
**示例代码:**
|
||||
```yaml
|
||||
# 描述一个用户的基本信息
|
||||
user:
|
||||
name: John Doe
|
||||
age: 30
|
||||
email: john.doe@example.com
|
||||
|
||||
# 也可以使用行内(inline)格式
|
||||
user_inline: {name: Jane Doe, age: 28}
|
||||
```
|
||||
|
||||
#### 复合结构:数据嵌套
|
||||
|
||||
以上三种基本结构可以自由组合,形成复杂的数据结构。这是 YAML 强大功能的核心体现。
|
||||
|
||||
**示例代码:**
|
||||
```yaml
|
||||
# 一个用户列表,每个用户都是一个包含详细信息的映射
|
||||
users:
|
||||
# 第一个用户
|
||||
- name: Alice
|
||||
age: 28
|
||||
is_admin: true
|
||||
roles: # "roles" 的值是一个序列
|
||||
- editor
|
||||
- publisher
|
||||
# 第二个用户
|
||||
- name: Bob
|
||||
age: 35
|
||||
is_admin: false
|
||||
roles:
|
||||
- viewer
|
||||
```
|
||||
|
||||
#### 多行文本
|
||||
**字面量块 `|`**:保留每一个换行。适合要“按原样呈现”的文本。
|
||||
```yaml
|
||||
about: |
|
||||
第一行
|
||||
第二行
|
||||
第三行
|
||||
```
|
||||
解析后:`"第一行\n第二行\n第三行\n"`(注意末尾有 1 个换行,因为默认是clip-保留一个结尾换行(\n),但丢掉多余的尾随空行)。
|
||||
|
||||
**折叠块** `>`:把换行折叠为空格(空行保留为换行)
|
||||
```yaml
|
||||
about: >
|
||||
这一段
|
||||
被写成了多行
|
||||
但会折叠成一行显示
|
||||
|
||||
空行用来分段
|
||||
分段之间会出现真正的换行
|
||||
```
|
||||
解析后:`"这一段 被写成了多行 但会折叠成一行显示\n\n空行用来分段 分段之间会出现真正的换行\n"`
|
||||
(你看到:单个换行被折成空格;空行保留为 `\n`;末尾仍有一个换行,因为clip-保留一个结尾换行(\n),但丢掉多余的尾随空行)
|
||||
|
||||
#### 注释
|
||||
|
||||
使用井号 (#) 进行单行注释。从 # 开始到该行末尾的所有内容都会被忽略。
|
||||
```yaml
|
||||
# 这是一个注释,它将被解析器忽略。
|
||||
key: value # 这也是一个行内注释。
|
||||
```
|
||||
|
||||
|
||||
### 3. YAML在Obsidian中的实践
|
||||
|
||||
在Obsidian中,YAML元数据是实现知识库从简单笔记集合升级为强大个人数据库的关键。它为每篇笔记赋予了结构化的“属性”,使得自动化管理和知识发现成为可能。
|
||||
|
||||
#### 从YAML Front Matter到“属性”视图
|
||||
|
||||
最初,YAML元数据需要手动在笔记顶端的`---`分隔符之间编写。为了降低使用门槛并提升体验,Obsidian推出了核心的“**属性**”(Properties)功能。
|
||||
|
||||
* **可视化界面**:你不再需要手动输入YAML代码,可以通过一个直观的界面在笔记顶部添加、编辑或删除属性。这个界面提供了文本、数字、日期、复选框和列表等多种属性类型,并会自动补全已存在的属性名和值,极大地保证了数据的一致性。
|
||||
* **源码对应**:你在属性界面上的所有操作,都会实时、准确地转换成笔记源文件顶部的标准YAML Front Matter。你随时可以切换到“源码模式”查看和编辑底层的YAML代码。
|
||||
|
||||
#### Obsidian原生支持的特殊属性
|
||||
|
||||
Obsidian会对一些特定的YAML属性赋予特殊功能,让它们与软件的核心功能深度集成。
|
||||
|
||||
| 属性 (Property) | 功能描述 (Description) | 格式要求 (Format Requirement) |
|
||||
| :--- | :--- | :--- |
|
||||
| `tags` | 定义笔记的标签,会自动被Obsidian的“标签面板”识别和索引。 | 必须是列表(Array)格式。 |
|
||||
| `aliases` | 为笔记设置一个或多个“别名”,方便通过别名进行链接和搜索。 | 必须是列表(Array)格式。 |
|
||||
| `cssclasses` | 为当前笔记应用一个或多个自定义的CSS样式片段,实现特定的视觉效果。 | 必须是列表(Array)格式。 |
|
||||
|
||||
> **重要更新**:从Obsidian 1.4版本开始,官方统一并强制要求这些原生属性必须使用复数形式(`tags`, `aliases`, `cssclasses`),并且它们的值必须是列表格式。
|
||||
|
||||
|
||||
#### 设计你的个人化元数据系统
|
||||
|
||||
YAML的真正威力在于自定义。通过建立一套规范的元数据体系,你可以为自己的知识库量身打造强大的分类和检索系统。
|
||||
|
||||
| 实践建议 (Practice) | 目的与描述 (Purpose & Description) | 示例 (Example) |
|
||||
| :--- | :--- | :--- |
|
||||
| **规范命名** | 为了便于Dataview等插件查询,建议属性名全部使用小写,并用下划线代替空格。 | `creation_date` |
|
||||
| **笔记分类** | 使用`type`或`category`属性来定义笔记的类型,这是进行分类查询的基础。 | `type: book` |
|
||||
| **状态追踪** | 使用`status`属性来管理笔记的生命周期或项目的进度。 | `status: seedling` (想法) |
|
||||
| **建立关联** | 除了使用`[[链接]]`,你还可以用属性来定义更明确的关系。 | `author: [[作者A]]` |
|
||||
|
||||
#### 通过Obsidian插件,让你的元数据“活”起来
|
||||
|
||||
你精心维护的YAML属性,通过插件可以实现知识的自动化组织与呈现。
|
||||
|
||||
| 插件 (Plugin) | 核心功能 (Core Function) | 应用实例 (Application Example) |
|
||||
| :--- | :--- | :--- |
|
||||
| **Dataview** | 使用简单的查询语言(DQL)从整个知识库中筛选、排序和展示笔记,自动生成动态的笔记列表和表格。 | 创建一个“动态首页”,自动汇总所有 `status: in-progress` 的任务。 |
|
||||
| **Bases** | (官方插件) 提供一个可视化的、类似Notion数据库的界面(表格、看板等)来浏览和批量编辑笔记的元数据。 | 以看板视图来管理所有 `type: project` 的笔记,并拖动卡片来改变它们的 `status` 属性。 |
|
||||
| **Metadata Menu** | 极大地增强了属性的编辑体验,可以为属性预设可选值或创建依赖关系,实现更高效、规范的元数据录入。 | 为`status`属性设置固定的下拉菜单选项:"待办"、"进行中"、"完成"。 |
|
||||
|
||||
|
||||
|
||||
|
||||
### 4. YAML的编辑器或格式化工具
|
||||
|
||||
|
||||
| 工具 | 类型 | 主要功能 |
|
||||
| ----------------------- | -------------- | ------------------------------------------------------------------ |
|
||||
| **VS Code + YAML 插件** | 桌面编辑器 | 语法高亮、自动补全、实时错误校验、代码折叠、格式化。 |
|
||||
| **Online YAML Parsers** | 在线工具,例如[YAML Checker - The YAML Syntax Validator](https://yamlchecker.com/) | 快速验证YAML语法是否正确,进行格式化和美化,适合临时检查。 |
|
||||
| **Prettier** | 代码格式化工具,例如[Prettier · Opinionated Code Formatter · Prettier](https://prettier.io/) | 通过插件支持YAML,可以在项目中统一代码风格,实现保存时自动格式化。 |
|
||||
12
Archive/Collection/linux命令.md
Normal file
12
Archive/Collection/linux命令.md
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
tags:
|
||||
aliases:
|
||||
type:
|
||||
- Concept
|
||||
status:
|
||||
- 🌿 Incubating
|
||||
star: false
|
||||
date:
|
||||
---
|
||||
# 一些好用的Linux命令
|
||||
- source 用来重新加载配置文件 ^2b32fc
|
||||
49
Archive/Collection/连~都忘记了的小知识.md
Normal file
49
Archive/Collection/连~都忘记了的小知识.md
Normal file
@@ -0,0 +1,49 @@
|
||||
---
|
||||
tags:
|
||||
- 小知识
|
||||
aliases:
|
||||
- 知识备忘录
|
||||
type:
|
||||
- Concept
|
||||
status:
|
||||
- 🌿 Incubating
|
||||
star: false
|
||||
date:
|
||||
---
|
||||
- 字符类型数字转整形数字要 `-'0'`
|
||||
```c
|
||||
char arr[10];
|
||||
for(int i = 0;i < strlen(arr);i++)
|
||||
num = num * 10 + arr[i] - '0';
|
||||
```
|
||||
- Linux重新加载配置文件命令
|
||||
```shell
|
||||
shource ~/.bashrc #重载bashrc文件
|
||||
```
|
||||
- Linux写脚本
|
||||
```shell
|
||||
vim mount_hgfs
|
||||
sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other #填入命令
|
||||
chmod +x mount_hgfs #增加执行权限
|
||||
mv mount_hgfs /bin #移动到/bin路径下 以后使用 mount_hgfs 直接执行
|
||||
```
|
||||
- C语言`&&`运算符的左值为假时,右值不进行计算,同理`||`运算符左值为真右值不进行计算
|
||||
- 按位异或`^,a ^ b = c , a ^ c = b , b ^ c = a;`,可用于进行数的交换(省去中间值)
|
||||
- C语言左移`<<`就是与2的x次方相乘,右移为相除
|
||||
- 简便运算后有括号`a *= 5+8 ==> a = a * (5 + 8)`,赋值运算符的优先级很低
|
||||
- C语言中` ... `表示范围赋值
|
||||
```c
|
||||
int arr[10] = {[0 ...3] = 24, [6 ...9] = 12};
|
||||
//or
|
||||
switch (num)
|
||||
{
|
||||
case 90 ...100:
|
||||
printf("LEVEL: A \n");
|
||||
break;
|
||||
default:
|
||||
printf("What are you doing baby ? \n");
|
||||
break;
|
||||
}
|
||||
```
|
||||
- 函数的名称与数组的名称一样,是函数的首地址
|
||||
- `a[i][j] ≡ *(*(a+i)+j) ≡ *(a[i]+j) ≡ (*(a+i))[j]`
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
star: false
|
||||
---
|
||||
这是一个测试这是一个测试
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
tags:
|
||||
- empty
|
||||
aliases: empty
|
||||
type:
|
||||
- Daily
|
||||
- Concept
|
||||
- Task
|
||||
- Source
|
||||
- Meta
|
||||
- Archive
|
||||
status:
|
||||
- 💤 Archived
|
||||
star: false
|
||||
date: 2026/4/18
|
||||
---
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
tags:
|
||||
- empty
|
||||
aliases: empty
|
||||
type:
|
||||
- Daily
|
||||
- Concept
|
||||
- Task
|
||||
- Source
|
||||
- Meta
|
||||
- Archive
|
||||
status:
|
||||
- 💤 Archived
|
||||
star: false
|
||||
date: 2026/4/18
|
||||
---
|
||||
134
Archive/配置备忘/Typecho插件Aplayer使用教程.md
Normal file
134
Archive/配置备忘/Typecho插件Aplayer使用教程.md
Normal file
@@ -0,0 +1,134 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- typecho插件
|
||||
- typecho
|
||||
- aplayer
|
||||
type:
|
||||
- Source
|
||||
status:
|
||||
- 💤 Archived
|
||||
star: false
|
||||
date:
|
||||
---
|
||||
# APlayer-Typecho-Plugin
|
||||
Typecho plugin for a beautiful html5 music player https://github.com/DIYgod/APlayer
|
||||
|
||||
[Demo](http://blog.izgq.net/archives/456/)
|
||||
|
||||
## 介绍
|
||||
1. 通过简短的代码在文章或页面中插入漂亮的Html5播放器
|
||||
2. 自动解析lrc链接,可根据歌曲名和歌手名自动查找封面并生成缓存
|
||||
3. 支持网易云音乐单曲、歌单、专辑、歌手id的解析
|
||||
4. 与APlayer保持同步更新
|
||||
|
||||
## 声明
|
||||
本插件仅供个人学习研究使用,请勿将其用作商业用途,音乐版权归网易云音乐 music.163.com 所有。
|
||||
|
||||
## 安装
|
||||
安装前请确保插件中的cache目录可写(保存缓存用,否则会让博客加载缓慢)
|
||||
|
||||
主机需支持curl扩展,否则将可能不能自动查找封面、解析网易云音乐id、从https的url中获取歌词(file_get_contents在不支持openssl的主机中不能打开https链接)
|
||||
|
||||
Download ZIP, 解压,将 APlayer-Typecho-Plugin-master 重命名为 APlayer ,之后上传到你博客中的 /usr/plugins 目录,在后台启用即可
|
||||
|
||||
## 使用方法
|
||||
在文章或页面中加入下方格式的短代码即可
|
||||
|
||||
#### 调用格式
|
||||
|
||||
##### 单曲播放:
|
||||
```
|
||||
[player 属性1="值1" 属性2="值2" 属性3="值3" /]
|
||||
or
|
||||
[player 属性1="值1" 属性2="值2" 属性3="值3"][lrc]歌词[/lrc][/player]
|
||||
```
|
||||
|
||||
<mark style="background: #FFB86CA6;">example:</mark>
|
||||
```
|
||||
[player url="http://xxx.com/xxx.mp3" artist="Someone" title="Title" showlrc="false"/]
|
||||
|
||||
[player url="http://xxx.com/xxx.mp3" artist="Someone" title="Title"][lrc][00:00.00]Test lyrics[/lrc][/player]
|
||||
|
||||
网易云音乐:
|
||||
[player id="29947420"/]
|
||||
|
||||
```
|
||||
|
||||
|
||||
##### 多首歌曲:
|
||||
|
||||
```
|
||||
[player 属性1="值1" 属性2="值2" 属性3="值3"]
|
||||
[mp3 歌曲属性1="值1" 歌曲属性2="值2" 歌曲属性3="值3"/]
|
||||
[mp3 歌曲属性1="值1" 歌曲属性2="值2" 歌曲属性3="值3"][lrc]歌词[/lrc][/mp3]
|
||||
[/player]
|
||||
```
|
||||
|
||||
<mark style="background: #FFF3A3A6;">example:</mark>
|
||||
```
|
||||
[player theme="#e6d0b2" autoplay='1']
|
||||
[mp3 url="http://xxx.com/xxx.mp3" artist="Someone" title="Title"/]
|
||||
[mp3 url="http://xxx.com/xxx.mp3" artist="Someone" title="Title"][lrc][00:00.00]Test lyrics[/lrc][/mp3]
|
||||
[mp3 id="29947420"/] //网易云音乐歌曲id直接解析
|
||||
[/player]
|
||||
```
|
||||
|
||||
##### 网易云音乐解析示例:
|
||||
```
|
||||
[player id='346069,346080,29947420'/] //一次加入三首歌
|
||||
[player id='11362719' type='collect'/] //歌单
|
||||
[player id='3684' type='artist'/] //艺人热门五十首
|
||||
[player id='3084335' type='album'/] //专辑
|
||||
|
||||
```
|
||||
|
||||
如果要阻止代码解析成为播放器的话,用[]包裹[player]标签即可
|
||||
|
||||
```
|
||||
[[player id='3084335' type='album'/]]
|
||||
|
||||
输出:
|
||||
[player id='3084335' type='album'/]
|
||||
```
|
||||
|
||||
#### 用到的shortcode标签
|
||||
```
|
||||
[player] :整个播放器的标签,里面可用下面提到的所有属性
|
||||
[mp3] :可以用歌曲属性和网易云音乐属性,用于嵌套在[player]标签内部添加音乐
|
||||
[lrc] :用以添加文本的歌词,可嵌套在[mp3],[player]标签内部;只有当其父标签只定义一首歌的时候才起作用
|
||||
```
|
||||
|
||||
#### 关于各个标签的属性
|
||||
播放器配置(只能在[player]标签中使用):
|
||||
```
|
||||
showlrc: 当showlrc的值为 0 或 false 时,不显示歌词,否则将按照歌曲有无歌词来判断是否输出歌词
|
||||
autoplay: 是否自动播放,默认为 false (注:由于移动端浏览器限制,此功能在移动端浏览器将不起作用)
|
||||
theme: 设置主题颜色(十六进制),默认为 '#e6d0b2'
|
||||
```
|
||||
歌曲的属性(可在[mp3]或[player]中使用,不能用于修改整个歌单的属性):
|
||||
```
|
||||
url: mp3文件的链接,必需
|
||||
lrc: 歌词的lrc链接,非必需
|
||||
lrcoffset: 歌词整体提前时间(ms)若这个值为负数则为歌词整体延后的时间
|
||||
title: 歌曲的标题,若值为空则显示 Unknown
|
||||
artist: 歌曲的艺术家,若值为空则显示 Unknown
|
||||
cover: 封面图片链接,非必需,若该值为图片链接则按照链接加载封面图,若没有此属性则会按照title和artist自动从豆瓣api中查找封面图,若值为 false 则不自动查找封面,显示默认封面图片
|
||||
```
|
||||
网易云音乐(与歌曲属性用法一样)
|
||||
```
|
||||
id: 歌曲/歌单/专辑/艺人的id ,如果是歌曲的话可用 , 分隔歌曲id一次插入多首歌曲
|
||||
type: 用以判断id的类型,分为4种:song:歌曲,album:专辑,artist:艺人,collect:歌单
|
||||
```
|
||||
|
||||
### 清空歌词,播放列表、封面图片url的缓存
|
||||
|
||||
前往插件设置页面点击红色清空缓存按钮即可
|
||||
|
||||
## 支持作者
|
||||
如果你觉得这个项目对您有所帮助,不妨考虑小额支持我一下
|
||||
[支持作者](http://blog.izgq.net/donate.html)
|
||||
|
||||
## LICENSE
|
||||
|
||||
MIT © [zgq354](https://github.com/zgq354/)
|
||||
Reference in New Issue
Block a user