diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 6db1869..6372aa6 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -8,18 +8,18 @@ "type": "tabs", "children": [ { - "id": "53c9f5efa5aa3efd", + "id": "fc295192ba96dde5", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Collection/YoudaoyunNotes/02C语言/04-运算符.md", - "mode": "source", + "file": "Article/Studyroad/vivado_ip.md", + "mode": "preview", "source": false, "backlinks": false }, "icon": "lucide-file", - "title": "04-运算符" + "title": "vivado_ip" } } ] @@ -89,13 +89,13 @@ "state": { "type": "outline", "state": { - "file": "Collection/YoudaoyunNotes/02C语言/04-运算符.md", + "file": "Article/Studyroad/vivado_ip.md", "followCursor": true, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "04-运算符 的大纲" + "title": "vivado_ip 的大纲" } }, { @@ -243,13 +243,44 @@ "pdf-plus:PDF++: 切换自动粘贴": false, "pdf-plus:PDF++: 切换自动对焦": false, "pdf-plus:PDF++: 切换自动复制": false, - "i18n:I18N": false, - "publish:发布更改": false + "i18n:I18N": false } }, - "active": "53c9f5efa5aa3efd", + "active": "fc295192ba96dde5", "lastOpenFiles": [ + "Article/Studyroad/vivado_ip_img/IPCore17.png", + "YueQian/相关网站.md", + "Diary/2026-1/2026-1-23 周五.md", "Collection/YoudaoyunNotes/02C语言/03-数据类型及IO流.md", + "Article/Studyroad/vivado_ip_img/IPCore02.png", + "Article/Studyroad/vivado_ip_img/IPCore03.png", + "Article/Studyroad/vivado_ip_img/IPCore09.png", + "Article/Studyroad/vivado_ip_img/IPCore08.png", + "Article/Studyroad/vivado_ip_img/IPCore06.png", + "Article/Studyroad/vivado_ip_img/IPCore10.png", + "Article/Studyroad/vivado_ip_img/IPCore13.png", + "Article/Studyroad/vivado_ip_img/IPCore16.png", + "Article/Studyroad/vivado_ip_img/IPCore01.png", + "Article/Technology/飞牛搭配mtphotos使用passnet内网穿透服务优雅快速的分享照片访问.md", + "Article/Technology/在ARM架构的Ubuntu中使用Docker Compose部署MTPhotos.md", + "Article/Technology/navidrome.md", + "Article/Technology/Debian从零开始使用pnpm部署项目.md", + "Article/Technology/MarkdownTest.md", + "Article/Technology/NFC_Card.md", + "Article/Technology/安装AD2025学习版.md", + "Article/Technology/通过SSH密钥连接LINUX服务器.md", + "Article/Technology/docker的容器和镜像的删除操作.md", + "Article/Studyroad/vivado_ip.md", + "Page/友情链接.md", + "Page/关于与声明.md", + "README(Acer的冲突副本1_2026-01-23 08-56-09).md", + "Article/Studyroad/vivado_ip_img", + "Article/Record", + "Article/Technology", + "Article/Studyroad", + "Page", + "Article", + "Collection/YoudaoyunNotes/02C语言/04-运算符.md", "Collection/YoudaoyunNotes/02C语言/02-C语言入门.md", "Collection/YoudaoyunNotes/02C语言/14-预处理与文件组织.md", "Collection/YoudaoyunNotes/02C语言/15-静态库与动态库.md", @@ -258,42 +289,10 @@ "Collection/YoudaoyunNotes/02C语言/11-内存管理.md", "Collection/YoudaoyunNotes/02C语言/10-函数进阶.md", "Collection/YoudaoyunNotes/02C语言/09-数组与指针进阶.md", - "Collection/YoudaoyunNotes/02C语言/08-指针.md", - "Collection/YoudaoyunNotes/02C语言/07-数组.md", - "Collection/YoudaoyunNotes/02C语言/06-函数基础.md", - "Collection/YoudaoyunNotes/02C语言/05-控制与分支.md", - "Collection/YoudaoyunNotes/02C语言/04-运算符.md", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE40a76a7d230733292ec04717f3f6f254编程规范.pdf", - "Collection/YoudaoyunNotes/02C语言/01-C语言概述.md", - "Collection/YoudaoyunNotes/02C语言/[01-拓展]printf输出颜色与字体控制.md", - "YueQian/MarkdownNotes/CQ2605/01Linux基础/06_常用Shell命令.md", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEf9401753ae5405e97b73dbc1662bfc9001416f17412c415232ef6faf014cdff5.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEfb6a239bed5b462a85fa7ec4382c92210d7713ba345e0119c37b9a76eb31bf65.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEf54011d029f949fe3f754b46aa3853cbfc1fc8c6aeff83d2c08b1198d0df3ed6.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEf305530c183d4d1682bc4b1fe628e14fstickPicture.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEf043bb345ce02a43791f1afe7466e30dimage.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEed95cb4bf9a6bdd870ada0859f790dcastickPicture.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEebddd934ca1e421cb558c4c92f7d53f3截图.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEeb0dc101742ac85592adc21845b91dab6f8df56f18a43f648269080ac22c4c87.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEea237a3e83f613d86fdfed8580c001c5image.png", - "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEe80dc3d48db078411a57b515668d8e57image.png", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEf8f411dd54c53da227a89fc7031bb0c7terminal_colors.h", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEd71090e9d6659f19f9b36c93099793f4指针与数组作业.doc", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEd160cdba37fb5f6e6e853a57af52b227数组与指针作业.doc", - "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEc2ef36702a6ecf7e2169723a2d147b08结构体测试题.docx", - "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEbbcc325c1c1c565fa7dbe4f13a3f2f9d运算符1.docx", - "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEa2d88b6292b52c177b4bc6323a5bdd07函数作业题.docx", - "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE94606765850c0696e801236ba49014a2函数练习题.docx", - "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE757c8acbaa371ecec8cc55fab8756448运算符测试.docx", - "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE224e5f8aa53ceb5fc88f45d79932378a内存管理测试题.docx", - "Collection/YoudaoyunNotes/01Linux基础/06_常用Shell命令.md", - "Collection/YoudaoyunNotes/01Linux基础/05_网络配置.md", - "Collection/YoudaoyunNotes/01Linux基础/04_命令行编辑与编译.md", - "Collection/YoudaoyunNotes/01Linux基础/03_文件互通.md", - "Collection/YoudaoyunNotes/01Linux基础/02_Linux概述.md", - "Collection/YoudaoyunNotes/01Linux基础/01-开发环境安装.md", - "Collection/YoudaoyunNotes/01Linux基础/00-简介.md", - "Collection/CQ2605/02C语言/[01-拓展]printf输出颜色与字体控制.md", "YueQian/Homework/未命名.canvas", "Excalidraw/未命名.canvas", "未命名.canvas" diff --git a/Article/Studyroad/vivado_ip.md b/Article/Studyroad/vivado_ip.md new file mode 100644 index 0000000..3875186 --- /dev/null +++ b/Article/Studyroad/vivado_ip.md @@ -0,0 +1,112 @@ +# Vivado使用乘法器、除法器IP核实现乘除取余仿真 +### 环境 +Vivado 20.2 +## 添加并配置IP核 +1. 打开vivado,找到对应IP核,如下图 +![](./vivado_ip_img/IPCore01.png) +2. 先双击除法器IP核进入配置页面,如下图 +![](./vivado_ip_img/IPCore02.png) +![](./vivado_ip_img/IPCore03.png) +除法器配置默认即可,点击OK;后弹出界面,点击Generate +如下图即配置完成 +![](./vivado_ip_img/IPCore04.png) +3. 配置乘法器IP核 +![](./vivado_ip_img/IPCore05.png) +上图使用十六位有符号数与十六位无符号数进行运算 +![](./vivado_ip_img/IPCore06.png) +上图输出32位,间隔一个周期得到结果(电脑性能不佳可适当增加) +4. 如下图即配置完成 +![](./vivado_ip_img/IPCore07.png) +## 添加并编写仿真代码文件 +1. 选择一个文件夹,创建例如ipcore_test.v文件 +2. 添加文件到vivado +![](./vivado_ip_img/IPCore08.png) +![](./vivado_ip_img/IPCore09.png) +找到自己创建的.v文件路径并添加 +3. 完成如下图 +![](./vivado_ip_img/IPCore10.png) +4. 复制示例代码 +![](./vivado_ip_img/IPCore11.png) +双击打开.veo 示例代码文件 +![](./vivado_ip_img/IPCore12.png) +复制上图红框中的代码到自己的仿真文件,如下图(我这是外部编辑器,vivado自带编辑器同理) +![](./vivado_ip_img/IPCore13.png) +上图的module与endmodule需要自己添加 +如下图,可以看到,除法器IP核在你自己的代码文件之下,表示被正确调用 +![](./vivado_ip_img/IPCore14.png) +乘法器同理,打开.veo文件复制代码 +![](./vivado_ip_img/IPCore15.png) +![](./vivado_ip_img/IPCore16.png) +示例代码复制完成后如下图,这里我更改了实例名称(u_ 开头,不改没影响) +![](./vivado_ip_img/IPCore17.png) +5. 最后自己补全仿真代码,我这里这样写 +```verilog +`timescale 1ns / 1ps + +module tb_ipcore_test(); + reg clk; //时钟变量 + reg signed [15:0] A; //有符号因数数据 + reg unsigned [15:0] B; //无符号因数数据 + wire signed [31:0] P; //乘法器结果 + + reg dividend_tvalid; //被除数有效使能,高为有效,低为无效 + reg signed [15:0] dividend_tdata; //被除数数据 + reg divisor_tvalid; //除数有效使能,高为有效,低为无效 + reg signed [15:0] divisor_tdata; //除数数据 + wire dout_tvalid; //输出电平,高为正确输出,低为错误输出 + wire [31:0] dout_tdata; //除法器结果 + wire signed [15:0] quotient; //商 + wire signed [15:0] remainder; //余数 + + +mult_gen_0 u_mult_gen_0 ( + .CLK(clk), // input wire CLK + .A(A), // input wire [15 : 0] A + .B(B), // input wire [15 : 0] B + .P(P) // output wire [31 : 0] P +); + +div_gen_0 u_div_gen_0 ( + .aclk(clk), // input wire aclk + .s_axis_divisor_tvalid(divisor_tvalid), // input wire s_axis_divisor_tvalid + .s_axis_divisor_tdata(divisor_tdata), // input wire [15 : 0] s_axis_divisor_tdata + .s_axis_dividend_tvalid(dividend_tvalid), // input wire s_axis_dividend_tvalid + .s_axis_dividend_tdata(dividend_tdata), // input wire [15 : 0] s_axis_dividend_tdata + .m_axis_dout_tvalid(dout_tvalid), // output wire m_axis_dout_tvalid + .m_axis_dout_tdata(dout_tdata) // output wire [31 : 0] m_axis_dout_tdata +); +assign quotient = dout_tdata[31:16]; //除法器16位余数模式,高16位是商,低十六位是余数 +assign remainder = dout_tdata[15:0]; +always #5 clk = ~clk; //10ns周期时钟 + +initial begin + clk = 0; + + A = 16'h7FFF; + B = 16'hFFFF; + dividend_tvalid = 1; + dividend_tdata = 16'h7FFF; + divisor_tvalid = 1; + divisor_tdata = 16'hFFFF; + #300; + + A = 16'h8001; + B = 16'h0001; + dividend_tvalid = 1; + dividend_tdata = 16'h8001; + divisor_tvalid = 1; + divisor_tdata = 16'hFFFF; + #300; + + $finish; +end +endmodule +``` + +6. 结果分析 +选中除B之外的所有变量,调整为有符号的十进制,B调整为无符号的十进制数 +![](./vivado_ip_img/IPCore19.png) +下图可以看到,乘法器得到数据(一开始),在第一个周期得到结果,除法器得到数据,在第二十个周期得到结果 +![](./vivado_ip_img/IPCore18.png) + + diff --git a/Article/Studyroad/vivado_ip_img/IPCore01.png b/Article/Studyroad/vivado_ip_img/IPCore01.png new file mode 100644 index 0000000..ea5480b Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore01.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore02.png b/Article/Studyroad/vivado_ip_img/IPCore02.png new file mode 100644 index 0000000..71bca97 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore02.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore03.png b/Article/Studyroad/vivado_ip_img/IPCore03.png new file mode 100644 index 0000000..2dd1ff8 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore03.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore04.png b/Article/Studyroad/vivado_ip_img/IPCore04.png new file mode 100644 index 0000000..40f94bc Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore04.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore05.png b/Article/Studyroad/vivado_ip_img/IPCore05.png new file mode 100644 index 0000000..51e5062 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore05.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore06.png b/Article/Studyroad/vivado_ip_img/IPCore06.png new file mode 100644 index 0000000..21850d1 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore06.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore07.png b/Article/Studyroad/vivado_ip_img/IPCore07.png new file mode 100644 index 0000000..afe818c Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore07.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore08.png b/Article/Studyroad/vivado_ip_img/IPCore08.png new file mode 100644 index 0000000..3210120 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore08.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore09.png b/Article/Studyroad/vivado_ip_img/IPCore09.png new file mode 100644 index 0000000..68069c4 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore09.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore10.png b/Article/Studyroad/vivado_ip_img/IPCore10.png new file mode 100644 index 0000000..dac2b57 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore10.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore11.png b/Article/Studyroad/vivado_ip_img/IPCore11.png new file mode 100644 index 0000000..0140fdb Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore11.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore12.png b/Article/Studyroad/vivado_ip_img/IPCore12.png new file mode 100644 index 0000000..36f73a5 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore12.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore13.png b/Article/Studyroad/vivado_ip_img/IPCore13.png new file mode 100644 index 0000000..533f07a Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore13.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore14.png b/Article/Studyroad/vivado_ip_img/IPCore14.png new file mode 100644 index 0000000..fdf263d Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore14.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore15.png b/Article/Studyroad/vivado_ip_img/IPCore15.png new file mode 100644 index 0000000..2b2a1a0 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore15.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore16.png b/Article/Studyroad/vivado_ip_img/IPCore16.png new file mode 100644 index 0000000..2a03054 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore16.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore17.png b/Article/Studyroad/vivado_ip_img/IPCore17.png new file mode 100644 index 0000000..8cec9c5 Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore17.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore18.png b/Article/Studyroad/vivado_ip_img/IPCore18.png new file mode 100644 index 0000000..15f303c Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore18.png differ diff --git a/Article/Studyroad/vivado_ip_img/IPCore19.png b/Article/Studyroad/vivado_ip_img/IPCore19.png new file mode 100644 index 0000000..9dfde7f Binary files /dev/null and b/Article/Studyroad/vivado_ip_img/IPCore19.png differ diff --git a/Article/Technology/Debian从零开始使用pnpm部署项目.md b/Article/Technology/Debian从零开始使用pnpm部署项目.md new file mode 100644 index 0000000..eb058bf --- /dev/null +++ b/Article/Technology/Debian从零开始使用pnpm部署项目.md @@ -0,0 +1,48 @@ +## 安装nodejs22+环境 +### 使用使用 NodeSource +首先,添加 NodeSource 的 PPA(个人包存档) +```shell +curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - +``` +然后安装nodejs +```shell +apt-get install -y nodejs +``` +### 使用n管理器 +如果你想使用 n 管理器安装最新版本,可以先安装 n +```shell +npm install -g n +``` +然后使用 n 安装 Node.js 22 +```shell +n 22 +``` +### 验证安装 +安装完成后,可以通过以下命令验证 Node.js 是否安装成功 +```shell +node -v +``` +## 安装pnpm +### 若已安装npm +版本不确定 +```shell +npm install -g pnpm +``` +### 使用独立脚本安装(不用安装nodejs) +Windows PowerShell +```shell +Invoke-WebRequest https://get.pnpm.io/install.ps1 -UseBasicParsing | Invoke-Expression +``` +在POSIX系统上 +```shell +curl -fsSL https://get.pnpm.io/install.sh | sh - +# 或者使用 +# wget -qO- https://get.pnpm.io/install.sh | sh - +``` +安装特定的版本 +在运行安装脚本之前,你可以选择设置环境变量 PNPM_VERSION 来安装特定版本的 pnpm +```shell +curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION= sh - +``` + + diff --git a/Article/Technology/MarkdownTest.md b/Article/Technology/MarkdownTest.md new file mode 100644 index 0000000..629f968 --- /dev/null +++ b/Article/Technology/MarkdownTest.md @@ -0,0 +1,71 @@ +# 这是一级标题 + +## 这是二级标题 + +### 这是三级标题 + +- 无序列表项1 +- 无序列表项2 + - 嵌套无序列表项 +- 无序列表项3 + +1. 有序列表项1 +2. 有序列表项2 +3. 有序列表项3 + + **加粗文本** + + *斜体文本* + + ***加粗斜体文本*** + + ~~删除线文本~~ + + ==高亮文本1== + + 高亮文本2 + + ^上角标^ 角标 ~下角标~ + + 下划线 + + - [ ] 代办 + + - [x] 已办 + + + +> 这是一段引用内容 +> 引用内容可以换行 + +>>引用嵌套 + +行内公式: $f(x)=a-b$ + +公式: +$$ +f(x)=a-b +$$ + +| 表头1 | 表头2 | 表头3 | +|-------|-------|-------| +| 内容1 | 内容2 | 内容3 | +| 内容4 | 内容5 | 内容6 | + +[链接文字](https://example.com) + +`单行代码` + +```python +# 多行代码块 +def hello\_world(): + print("Hello, World!") +``` + +--- + +分割线以上是测试内容 + +分割线以下也是测试内容 + +![图片替代文本](https://picsum.photos/200/300 "随机的图片") \ No newline at end of file diff --git a/Article/Technology/NFC_Card.md b/Article/Technology/NFC_Card.md new file mode 100644 index 0000000..e2de18e --- /dev/null +++ b/Article/Technology/NFC_Card.md @@ -0,0 +1,2 @@ +# 前言 +最近迷上了三角洲 \ No newline at end of file diff --git a/Article/Technology/docker的容器和镜像的删除操作.md b/Article/Technology/docker的容器和镜像的删除操作.md new file mode 100644 index 0000000..278e9a0 --- /dev/null +++ b/Article/Technology/docker的容器和镜像的删除操作.md @@ -0,0 +1,30 @@ +# Docker容器和镜像的删除操作 +## 容器和镜像的关系 +简单来说,镜像是文件,容器是进程。 +容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。 +docker利用容器来运行应用:docker容器是由docker镜像创建的运行实例。 +![容器与镜像](https://i-blog.csdnimg.cn/blog_migrate/1239ccc5a805c44d9ecb6bc844ac9457.jpeg) +### 删除镜像的操作步骤 +#### 一、停止正在运行的镜像创建的容器 +查看正在运行的容器 +```shell +docker ps +``` +停止对应容器 +```shell +docker stop xxx +``` +xxx 是 docker ps 命令出来的容器 CONTAINER ID 的前三位 +删除对应的容器 +```shell +docker rm xxx +``` +查看镜像 +```shell +docker images +``` +同理,yyy 是 docker images 命令出来的镜像 IMAGE ID 的前三位 +删除对应的镜像 +```shell +docker rmi yyy +``` \ No newline at end of file diff --git a/Article/Technology/navidrome.md b/Article/Technology/navidrome.md new file mode 100644 index 0000000..66f8de6 --- /dev/null +++ b/Article/Technology/navidrome.md @@ -0,0 +1,5 @@ +# 启用用户界面中的转码配置 +ND_ENABLETRANSCODINGCONFIG = true + +# 配置ffmpeg路径 +FFmpegPath = "/usr/bin/ffmpeg" \ No newline at end of file diff --git a/Article/Technology/在ARM架构的Ubuntu中使用Docker Compose部署MTPhotos.md b/Article/Technology/在ARM架构的Ubuntu中使用Docker Compose部署MTPhotos.md new file mode 100644 index 0000000..d26ee52 --- /dev/null +++ b/Article/Technology/在ARM架构的Ubuntu中使用Docker Compose部署MTPhotos.md @@ -0,0 +1,166 @@ +# 在ARM架构的Ubuntu中使用Docker Compose部署MTPhotos +## 前言 +之前,我总是使用1panel面板的Docker进行图形化的操作,直到有一天,我遇到了一个需要三个镜像配合的项目——MTPhotos +为什么会使用mtphotos呢,我以前都是使用老电脑装飞牛OS当作NAS使用,但是飞牛OS哪哪都挺好,就是不支持vivo的动态图片,相册里的动态图片是一张jpg一段MP4,看得我脑阔痛;而且用X86的核显老电脑安装飞牛OS,视频转码压根跑不动,如此一来,偌大个飞牛就只用来当云相册用有点心疼电费,我就把目光投向了角落的Nanopi-R5S +好在[友善官方](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R5S/zh "友善官方R5S中文文档")一直在更新R5S的各种固件,有OpenWRT有Ubuntu,有Debian,甚至还有Proxmox的固件,我就准备用Ubuntu装个MTPhotos来试试 +## 准备工作 +### 将R5S刷入ubuntu-noble-core固件 +线刷方便得鸭皮,没有 USBA-A 的线材也可以使用卡刷,具体看上方友善官方文档 +### 装个m.2硬盘进去当docker的镜像盘 +mtphotos有三个镜像文件,需要七八个G +### 安装个[Mobaxtrem汉化版](https://github.com/RipplePiam/MobaXterm-Chinese-Simplified "Mobaxtrem汉化版GitHub仓库")方便文件传输和SSH连接 +SSH用户是 pi 密码也是 +## 正式开始部署 +### 初始化Ubuntu +首先当然是Linux初始化套路 +登录切root用户(懒得加sudo),密码是 pi +```shell +sudo -i +``` +#### 改时区 +```shell +timedatectl set-timezone Asia/Shanghai +``` +#### 换源 +Ubuntu 24.04 换源方式有变 +```shell +vim /etc/apt/sources.list.d/ubuntu.sources +``` +用 # 注释掉之前的所有内容,添加如下内容 +```shell +Types: deb +URIs: http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ +Suites: noble noble-updates noble-security +Components: main restricted universe multiverse +Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg +``` +X86架构不需要添加 URIs 条目后的 -ports +#### 更新 +```shell +apt update && apt upgrade -y +``` +### 挂载m.2硬盘 +安装 curl 和 fdisk +```shell +apt install curl fdisk -y +``` +查看当前m.2硬盘路径 +```shell +fdisk -l +``` +格式化硬盘 +```shell +mkfs.ext4 /dev/nvme0n1 +``` +/dev/nvm10n1 是上一步查看到的对应的m.2硬盘路径 + +获取硬盘UUID +```shell +blkid /dev/nvme0n1 +``` +创建挂载文件夹 +```shell +mkdir /nvme +``` +编辑自动挂载文件 +```shell +vim /etc/fstab +``` +格式如下 +```shell +UUID=xxxx /nvme ext4 defaults 0 0 +``` +xxxx 为 blkid /dev/nvme0n1 命令获取的 UUID="xxxx" 的内容 + +重启 +```shell +reboot +``` +### 安装并启动Docker和Docker compose +更新包管理工具 +```shell +apt-get update +``` +使用官方一键安装脚本配合阿里云镜像一键安装 +```shell +curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun +``` +启动并查看运行状态 +```shell +service docker start +docker version +docker compose version +systemctl status docker +``` +### 配置Docker镜像加速和镜像存放路径 +```shell +vim /etc/docker/daemon.json +``` +按 I 进入编辑模式,配置如下 +```shell +{ + "registry-mirrors": ["https://docker.xuanyuan.me","https://docker.1panel.live"], + "data-root": "/nvme/docker" +} +``` +按 Esc 退出编辑模式,输入 :wq 保存并退出 +重载daemon.json文件 +```shell +systemctl daemon-reload +systemctl restart docker +``` +### 如果一切顺利,那么该安装mtphotos了 +创建个目录 +```shell +mkdir /opt/mtphotos +``` +进入 +```shell +cd /opt/mtphotos +``` +创建并编辑docker-compose.yaml文件 +```shell +vim docker-compose.yaml +``` +按 I 进入编辑模式并填入以下内容 +```yaml +version: "3" + +services: + mtphotos: + image: registry.cn-hangzhou.aliyuncs.com/mtphotos/mt-photos:arm-latest + container_name: mtphotos + restart: unless-stopped + network_mode: host + volumes: + - /opt/mtphotos/config:/config + - /nvme/mtphotos/upload:/upload + environment: + - TZ=Asia/Shanghai + - LANG=C.UTF-8 + dns: + - 114.114.114.114 + depends_on: + - mtphotos_ai + - mtphotos_face_api + mtphotos_ai: + image: registry.cn-hangzhou.aliyuncs.com/mtphotos/mt-photos-ai:arm-latest + container_name: mtphotos_ai + restart: unless-stopped + network_mode: host + environment: + - API_AUTH_KEY=mt_photos_ai_extra + mtphotos_face_api: + image: crpi-gcuyquw9co62xzjn.cn-guangzhou.personal.cr.aliyuncs.com/devfox101/mt-photos-insightface-unofficial:arm-latest + container_name: mtphotos_face_api + restart: unless-stopped + network_mode: host + environment: + - API_AUTH_KEY=mt_photos_ai_extra +``` +按 Esc 退出编辑模式,输入 :wq 保存并退出 +拉取运行 +```shell +docker compose up -d +``` +## 如果一切顺利,那么到此结束 \ No newline at end of file diff --git a/Article/Technology/安装AD2025学习版.md b/Article/Technology/安装AD2025学习版.md new file mode 100644 index 0000000..d5ca624 --- /dev/null +++ b/Article/Technology/安装AD2025学习版.md @@ -0,0 +1,9 @@ +# 安装Altium Designer 25.4.2 Build 15 (x64)学习版 +### 确认文件 +打开Altium Designer 25.4.2 Build 15 (x64).rar压缩包;确认里面有 !Lic 文件夹和 Installer.Exe安装程序, !Lic 文件夹中应有四个 .alf 证书文件和一个shfolder.dll文件以及一个Lic.rar压缩包(防误删备份)。 +### 安装AD +进入解压出的Altium Designer 25.4.2 Build 15 (x64)文件夹,右键以管理员身份运行Installer.Exe安装程序;记住安装的路径,完成安装后退出AD25程序。 +### 添加学习补丁 +进入开始解压出的Altium Designer 25.4.2 Build 15 (x64)文件夹,打开 !Lic 文件夹,复制shfolder.dll和AD25_Pro.alf文件到AD25安装文件夹(没改路径一般是 C:\Program Files\Altium\AD25;内有X2.EXE文件)。 +### 添加证书文件 +打开AD25程序,点击右上角人形图标(Not Signed In)右边的三角形,出现菜单选项选择Licenses选项,点击 Add License -> Add Standalone License File,选择AD25安装路径下粘贴的AD25_Pro.alf文件。 \ No newline at end of file diff --git a/Article/Technology/通过SSH密钥连接LINUX服务器.md b/Article/Technology/通过SSH密钥连接LINUX服务器.md new file mode 100644 index 0000000..068b0af --- /dev/null +++ b/Article/Technology/通过SSH密钥连接LINUX服务器.md @@ -0,0 +1,112 @@ +# SSH舍弃密码,拥抱密钥 +## 前提条件 +使用**ROOT**用户(个人喜好)、客户端使用Windows PowerShell终端、服务端使用Debian12+或是Ubuntu24+ +## 客户端操作 +### 创建密钥对 +随便在哪按 WIN + X 再按 I 打开PowerShell终端 +进入用户的.ssh文件夹 +```shell +cd ~\.ssh +``` +创建密钥对,使用椭圆加密算法,相比RSA更加短小精悍 +```shell +ssh-keygen -t ed25519 +``` +输出Enter file in which to save the key,是对密钥对进行命名,我这里输入test +之后输出Enter passphrase (empty for no passphrase),是对私钥进行加密,输入私钥的密码(不会显示),不设置就按Enter跳过 +然后确认密码,依旧按Enter跳过 +出现一个方框图形,表示创建成功 +之后 ~\.ssh 文件夹中会出现一个 test 私钥文件和一个 test.pub 公钥文件 +至此,客户端的操作暂时结束 + +## 服务端操作 +### 上传公钥至服务器 +#### 创建实例阶段 +在创建实例阶段,如阿里云服务器,可以在**管理设置-登录凭证**中选择密钥对;**登录名**选择root;**密钥**对选择右边创建密钥对 +创建密钥对界面,密钥对名称随意;创建类型选择导入已有密钥对, +在客户端Windows电脑中进入 ~\.ssh文件夹中,找到第一步创建的test.pub,用任意编辑器打开后,复制其内容到公钥内容框中,标签键随意, +然后回到实例创建页面,在密钥对选择刚刚创建的密钥对即可 +#### 已有服务器 +使用SSH密码登录到服务器,切换到ROOT用户 +```shell +sudo -i +``` +##### 复制公钥到服务器 +进入/root/.ssh文件夹 +```shell +cd /root/.ssh +``` +创建或编辑 authorized_keys 文件 +```shell +vim authorized_keys +``` +按 I 进入编辑模式,将公钥内容复制进去 +按 Esc ,输入 :wq 保存并退出 + +##### 编辑SSH-SERVER配置文件 +进入/etc/ssh文件夹 +```shell +cd /etc/ssh +``` +编辑sshd_config文件 +```shell +vim sshd_config +``` +同样按 I 进入编辑模式,并确保下列三个参数如下 +```shell +PermitRootLogin yes #允许使用ROOT用户登录 +PubkeyAuthentication yes #使用密钥对 +PasswordAuthentication no #禁用密码 +``` +按 Esc 退出编辑模式,输入 :wq 保存并退出 +##### 重启SSH-SERVER服务 +一般使用 +```shell +systemctl restart sshd +``` +不行就试试 +```shell +service ssh restart +``` +##### **不要断开SSH连接,防止配置有问题连接不上** +## 使用密钥对进行连接 +### 直接连接 +新开一个PowerShell终端 +```shell +ssh -i ~/.ssh/test root@192.168.21.5 +``` +输出 Enter passphrase for key 提示输入私钥密码(输入的内容不会显示),之前没设置就直接按 Enter ;不出意外就可以连接上了 +### 编辑config文件进行简便连接 + **注意:** 只用使用Windows的终端才能简便连接,使用mobaxterm等ssh软件这个配置是没用的 +在Windows客户端中,进入 ~\.ssh 文件夹 + +```shell +cd ~\.ssh +``` +使用记事本编辑config文件 +```shell +noteapd config +``` +格式如 +```shell +Host test + HostName 192.168.21.5 + IdentityFile ~/.ssh/test + User root +``` +如果端口不是22,则需要加上端口,如ssh使用222端口 +```shell +Host test + HostName 192.168.21.5 + IdentityFile ~/.ssh/test + Port 222 + User root +``` +保存 +然后在PowerShell终端中就可以进行简便连接如 +```shell +ssh test +``` +这里的test是 config 文件 Host 后的字符,可以用Emoji表情 +**注意:** 在使用SSH密钥对克隆GitHub或是其他git相关网站时,Host最好设置为网站的域名,你问为什么?时间的教训罢了~ +## 至此教程结束 \ No newline at end of file diff --git a/Article/Technology/飞牛搭配mtphotos使用passnet内网穿透服务优雅快速的分享照片访问.md b/Article/Technology/飞牛搭配mtphotos使用passnet内网穿透服务优雅快速的分享照片访问.md new file mode 100644 index 0000000..c91cdf4 --- /dev/null +++ b/Article/Technology/飞牛搭配mtphotos使用passnet内网穿透服务优雅快速的分享照片访问.md @@ -0,0 +1,30 @@ +## 依旧前言 +### 瞎比比 +博主在八月下旬去川西耍了一耍(小环线自驾游),也是拍了很多照片,用之前的arm搭建的mtphotos实现图片备份跟共享的还是非常舒服的,但是呢,博主用的是ipv6的网络,朋友们使用流量呢还是很顺滑的,就是连上wifi后呢基本就不行了,现在大部分wifi呢依旧只提供ipv4,而且博主用的还是ddns,众所周知呢,国内服务器没有备案呢是用不了80跟443一类的标准端口的,所以博主跟朋友们分享的链接后面跟了个端口看着就非常的不优雅,正好飞牛和零刻联合出了个小NAS,正好就能解决博主之前的一大堆问题,废话不多说下面是正文。 +### 准备和费用 +1. 飞牛NAS一台(高级内网穿透权益可有可无) +2. 域名(如博主的顶级域名一年几十块)(依旧可有可无) +3. mtphotos(免费试用一个月后续3元一个月,买断118元)(更新频率高,主要是可以支持vivo的动态图片) +4. passnet内网穿透服务(优雅的关键,一月最便宜的是20Mbps速度,50GB流量6块钱,它可以提供域名,就是不那么自由) + +## 正式开始 +### 实现方案 +博主使用的方案呢是mtphotos通过挂载飞牛相册备份文件夹路径,而不是单独再使用文件夹来存放照片;这样只需要飞牛手机端备份一次然后两个相册就能都看到。 +ps:飞牛的相册还是需要继续优化的,我直接把照片复制进对应的备份文件夹中它竟然扫描不出来,不同文件夹中的完全相同的图片,它的重复检查也查不出来;但是mtphotos里是可以检查到的。 +连接呢,使用ipv6(飞牛DDNS域名)加ipv4(passnet内网穿透服务);mtphotos手机端主地址填飞牛的ipv6(DDNS)域名加mtphotos的端口(默认8063),备用地址填内网穿透服务的域名。 +ps:使用ipv4的原因的一个是ipv6的普及度其实并不是很高,特别是各种地方的wifi,我的朋友们的家里的wifi就没有ipv6,这样他们访问还需要切换到手机流量就很麻烦;另一个原因是家里的服务器部署服务默认是没法用标准端口的(80 443),域名后面加一串端口号看到真的不是很舒服。 +### 实现步骤 +#### 本地操作 +一、安装好飞牛OS并成功进入系统;创建好储存空间;在文件管理->我的文件页面创建docker文件夹;创建mtphotos子目录,创建config子子目录。 +二、配置好飞牛自带相册,可以在文件管理中新建备份文件夹,然后在相册设置的文件夹管理中更改一下路径;手机端飞牛相册备份配置页面,备份目录偏好建议选择按设备目录,其他备份设置中的按拍摄日期重命名不要打开,不要打开,不要打开(会导致vivo的动态图片的视频跟图片的名称不一样,会导致mtphotos识别不了动态图片);打开备份,先备份一些照片进去。 +三、点开Docker,选择好存储位置,直接在镜像仓库中搜索mtphotos并下载(500K+那个就是),在本地镜像中找到mt-photos,点三角形创建容器,勾上开机自动启动,下一步中存储位置添加两个路径,选择创建的config文件夹,右边装载路径填写 /config, +再添加路径,选择相册备份的文件夹中的手机的型号那个文件夹上级文件夹也行,右边装载路径填写 /upload;然后下一步完成创建。 +四、浏览器地址栏IP:8063进入mtphotos网页端,初始化mtphotos后,图库管理里面添加图库,文件夹选择 /upload 或者以手机型号命名的文件夹,然后确定后自动回到上级菜单,勾上 仅管理员有权限修改或删除该图库的照片 并选择可使用该图库的用户(自己的账号)然后确定,会自动扫描一次图库。之后在飞牛备份完成所有照片或者新照片后建议手动点击一次扫描图库(mtphotos默认会间隔15min自动扫描一次图库) +#### 配置DDNS和内网穿透 +##### DDNS +进入飞牛网页端,打开系统设置->远程访问->DDNS->新增,上面四项自己填写,外部IPv4地址禁用(大内网地址没啥用),外部IPv6地址自动获取就行;填好后点击测试连接,成功保存。 +##### 内网穿透 +一、打开飞牛应用商店,下载并启用frpc客户端和lucky; +二、点击lucky进入后台,设置选项,根据需要更改安全入口和密码(不改可以选择禁用安全入口设置检查和禁用默认账号密码检查);SSL/TLS证书选项,添加证书,证书备注建议填子域名,添加方式选择ACME,证书颁发机构Let's Encrypt比较快和稳定,验证方式根据自己的域名服务商自己填写,滑动到最下面打开证书映射选项,映射路径自己先在飞牛中创建好,要有写入权限,然后点击添加,等待添加完成,后到飞牛看看对应映射目录下有没有证书文件。 +三、进入passnet网页,隧道管理->隧道列表->创建新隧道,选择一个近一点用户少一点的服务器,隧道名称随意,本地IP一般不用动(需要改动自己应该知道),传输协议选择HTTPS,本地端口没改就是8063,源站协议HTTP,子域名是lucky申请的证书的子域名,顶级域名需要在passnet隧道管理->域名管理中添加并加入白名单,crt证书路径就是lucky映射的后缀为 .crt 的证书文件(在飞牛的文件管理中找到并点击选中文件,更多->详细信息->复制原始路径),key密钥路径同理;提交后在隧道列表中,点击对应隧道,有个蓝底注意事项提醒右边的蓝色点我获取,点击后复制到剪贴板;然后到飞牛,打开frpc,粘贴复制内容,回到passnet隧道列表,对应的隧道显示绿底在线就说明配置成功。 +ps:在配置文件中可以看到服务器地址,需要提前在域名服务商处做好解析。 \ No newline at end of file diff --git a/Page/关于与声明.md b/Page/关于与声明.md new file mode 100644 index 0000000..f59d9a0 --- /dev/null +++ b/Page/关于与声明.md @@ -0,0 +1,48 @@ +## 关于这个博客 +### 🌱 为什么会有这个博客? +这个小小的角落,诞生于 2025 年的一个周末。当时我发现自己在学习和生活中积累了很多零散的思考 —— 可能是一段代码调试的心得、一本好书的批注、一次旅行中的观察,或是对某个社会现象的浅见。 +与其让这些想法淹没在备忘录里,不如搭建一个公开的空间:**既为自己留下可回溯的成长轨迹,也期待与同频的陌生人产生微小的共鸣。** +### 📝 这里会写些什么? +内容没有严格的边界,但始终围绕「真实」和「有用」两个原则: +**技术与工具:**作为一名电子专业大学生,会分享代码优化技巧、实用工具推荐、编程思维训练等(比如最近在研究的嵌入式UI设计、性能调优和 AI 工具等); +**生活观察:**可能是对城市角落的记录、一本旧书的重读感悟,或是关于时间管理、极简生活的实践心得; +**学习笔记:**非专业领域的探索过程,比如摄影入门、数据分析自学、心理学通识等(允许自己写得笨拙,毕竟成长需要试错); +**偶尔的碎碎念:**对热点事件的个人视角,或是某个深夜突然冒出来的奇怪想法(不追求绝对正确,只保证真诚表达)。 +### 👋 关于博主 +你可以叫我布莱特,一个在学习网站搭建的电子专业大学生。 +无聊刷刷视频,打打游戏,偶尔看到有趣的项目,就想动手实践一下。 +如果你在文章里发现错误,或者有不同观点,非常欢迎通过评论区或邮件 zibright@qq.com 指出,真理越辩越明,我不怕被打脸。 +### 📮 如何联系与互动? +**评论区:**所有留言都会尽量回复(除非涉及广告或恶意言论); +**邮件:**适合长对话或合作提议。 +### ✨ 最后想说的话 +这个博客没有商业合作,没有流量焦虑,更不会为了迎合热点说违心的话。它更像一个在线日记本,记录一个普通人的思考与成长。 +如果你觉得某篇文章对你有启发,点个「在看」或分享给朋友,就是对我最大的鼓励。 +感谢你来过,愿我们都能在各自的轨道上,慢慢靠近自己想要的生活。 + + +--------------------------------------------------------- + + +## 声明 +### 本网站兼具个人博客内容分享与资源交流功能,为明确内容责任边界,保障用户与网站权益,特作如下声明: +#### 一、内容性质与适用范围 +博客板块发布的文字、图片、观点等内容,均为作者个人经验与思想的记录,仅代表个人立场,不构成法律、医疗、金融等领域的专业建议,仅供参考交流。 +资源分享板块的内容(包括但不限于文档、工具、素材等),部分来自网络收集或用户上传,仅作为学习交流媒介,不涉及商业用途。 +#### 二、信息准确性与时效性 +作者已尽力核实博客内容的真实性,但不对信息的绝对准确性、完整性作出承诺。因政策调整、知识更新等导致内容过时的,网站无强制更新义务,建议用户结合实际情况验证。 +资源分享板块的文件版本、兼容性等信息可能随技术发展变化,网站不对资源的可用性、安全性提供担保,用户下载前需自行评估风险。 +#### 三、用户使用责任 +任何用户因参考博客内容或使用分享资源产生的决策与行动,其风险由用户自行承担。因内容误差、资源失效等导致的直接或间接损失,网站及作者不承担赔偿责任。 +用户需确保使用分享资源的行为符合法律法规,不得用于侵权、违法活动。若因滥用资源引发纠纷,与网站无关。 +#### 四、知识产权与转载规范 +博客原创内容受版权保护,未经许可,禁止擅自转载、摘编或用于商业用途;转载非原创内容时,已尽力标注来源,如有侵权请联系删除。 +分享资源的版权归原作者所有,网站仅提供临时存储与交流渠道,不拥有所有权。若原作者认为资源侵权,可通过联系方式提交证明,网站将在 24 小时内移除相关内容。 +#### 五、第三方链接与内容 +网站可能包含指向第三方平台的链接,此类链接仅为便利提供,不代表对第三方内容的认可。第三方平台的服务条款、隐私政策与本网站无关,用户访问时需自行承担风险。 +#### 六、禁止性内容与法律责任 +严禁在评论区、资源上传区发布反动、色情、暴力等违法违规内容,一经发现立即删除,情节严重者将上报相关部门。 +用户因违反本声明或相关法律规定导致的任何法律责任,由用户自行承担,网站不承担连带责任。 +#### 七、声明的修改与解释 +本声明内容可根据实际运营情况调整,修改后将在网站公示并即时生效,建议用户定期查阅。网站作者对本声明拥有最终解释权。 +#### 如有疑问,可通过网站联系方式沟通。感谢您的理解与支持。 \ No newline at end of file diff --git a/Page/友情链接.md b/Page/友情链接.md new file mode 100644 index 0000000..2e20a9c --- /dev/null +++ b/Page/友情链接.md @@ -0,0 +1,7 @@ + !!! + [icon]https://mono.imakashi.eu.org/overall/headicon2.webp + [link]https://imakashi.eu.org/blog + [name]明石博客 + [desc]一个互联网海洋中的小岛 + [end] + !!! \ No newline at end of file diff --git a/README(Acer的冲突副本1_2026-01-23 08-56-09).md b/README(Acer的冲突副本1_2026-01-23 08-56-09).md new file mode 100644 index 0000000..fd4bff1 --- /dev/null +++ b/README(Acer的冲突副本1_2026-01-23 08-56-09).md @@ -0,0 +1,5 @@ +## 博客的文章备份 +#### 上一世,由于服务器升级失败导致我的所有文章都没了;这一世我定要记下属于我的一切~ +现在,这个仓库同时作为obsidian的仓库用来作学习笔记以及博客网站的页面和文章管理 + + diff --git a/README.md b/README.md index fd4bff1..2c08b00 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,2 @@ ## 博客的文章备份 -#### 上一世,由于服务器升级失败导致我的所有文章都没了;这一世我定要记下属于我的一切~ -现在,这个仓库同时作为obsidian的仓库用来作学习笔记以及博客网站的页面和文章管理 - - +#### 上一世,由于服务器升级失败导致我的所有文章都没了;这一世我定要记下属于我的一切~ \ No newline at end of file