diff --git a/.gitignore b/mengyanote-frontend/.gitignore similarity index 100% rename from .gitignore rename to mengyanote-frontend/.gitignore diff --git a/build.bat b/mengyanote-frontend/build.bat similarity index 100% rename from build.bat rename to mengyanote-frontend/build.bat diff --git a/eslint.config.js b/mengyanote-frontend/eslint.config.js similarity index 100% rename from eslint.config.js rename to mengyanote-frontend/eslint.config.js diff --git a/index.html b/mengyanote-frontend/index.html similarity index 100% rename from index.html rename to mengyanote-frontend/index.html diff --git a/package-lock.json b/mengyanote-frontend/package-lock.json similarity index 100% rename from package-lock.json rename to mengyanote-frontend/package-lock.json diff --git a/package.json b/mengyanote-frontend/package.json similarity index 100% rename from package.json rename to mengyanote-frontend/package.json diff --git a/public/data/directoryTree.json b/mengyanote-frontend/public/data/directoryTree.json similarity index 69% rename from public/data/directoryTree.json rename to mengyanote-frontend/public/data/directoryTree.json index 026d768..8af8fa7 100644 --- a/public/data/directoryTree.json +++ b/mengyanote-frontend/public/data/directoryTree.json @@ -6,38 +6,30 @@ "path": "编程语言", "children": [ { - "id": "编程语言/前端", - "name": "前端", + "id": "编程语言/前端&HTML&CSS&JS", + "name": "前端&HTML&CSS&JS", "type": "folder", - "path": "编程语言/前端", + "path": "编程语言/前端&HTML&CSS&JS", "children": [ { - "id": "编程语言/前端/JavaScript趣味题", - "name": "JavaScript趣味题", + "id": "编程语言/前端&HTML&CSS&JS/代码片段", + "name": "代码片段", "type": "folder", - "path": "编程语言/前端/JavaScript趣味题", + "path": "编程语言/前端&HTML&CSS&JS/代码片段", "children": [ { - "id": "编程语言/前端/JavaScript趣味题/JavaScript趣味题_128.md", - "name": "JavaScript趣味题_128.md", + "id": "编程语言/前端&HTML&CSS&JS/代码片段/代码片段-标准HelloWorld输出.md", + "name": "代码片段-标准HelloWorld输出.md", "type": "file", - "path": "编程语言/前端/JavaScript趣味题/JavaScript趣味题_128.md", + "path": "编程语言/前端&HTML&CSS&JS/代码片段/代码片段-标准HelloWorld输出.md", "children": [], "isExpanded": false }, { - "id": "编程语言/前端/JavaScript趣味题/JavaScript趣味题_18.md", - "name": "JavaScript趣味题_18.md", + "id": "编程语言/前端&HTML&CSS&JS/代码片段/代码片段-特殊HelloWorld输出.md", + "name": "代码片段-特殊HelloWorld输出.md", "type": "file", - "path": "编程语言/前端/JavaScript趣味题/JavaScript趣味题_18.md", - "children": [], - "isExpanded": false - }, - { - "id": "编程语言/前端/JavaScript趣味题/JavaScript趣味题_28.md", - "name": "JavaScript趣味题_28.md", - "type": "file", - "path": "编程语言/前端/JavaScript趣味题/JavaScript趣味题_28.md", + "path": "编程语言/前端&HTML&CSS&JS/代码片段/代码片段-特殊HelloWorld输出.md", "children": [], "isExpanded": false } @@ -45,18 +37,91 @@ "isExpanded": false }, { - "id": "编程语言/前端/纯静态网页的强大功能与应用.md", - "name": "纯静态网页的强大功能与应用.md", + "id": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题", + "name": "JavaScript趣味题", + "type": "folder", + "path": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题", + "children": [ + { + "id": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题/JavaScript趣味题_128.md", + "name": "JavaScript趣味题_128.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题/JavaScript趣味题_128.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题/JavaScript趣味题_18.md", + "name": "JavaScript趣味题_18.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题/JavaScript趣味题_18.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题/JavaScript趣味题_28.md", + "name": "JavaScript趣味题_28.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/JavaScript趣味题/JavaScript趣味题_28.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/初始化一个React项目教程.md", + "name": "初始化一个React项目教程.md", "type": "file", - "path": "编程语言/前端/纯静态网页的强大功能与应用.md", + "path": "编程语言/前端&HTML&CSS&JS/初始化一个React项目教程.md", "children": [], "isExpanded": false }, { - "id": "编程语言/前端/css注入代码合集.md", + "id": "编程语言/前端&HTML&CSS&JS/纯静态网页的强大功能与应用.md", + "name": "纯静态网页的强大功能与应用.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/纯静态网页的强大功能与应用.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/前端html导入css和js方法.md", + "name": "前端html导入css和js方法.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/前端html导入css和js方法.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/css注入代码合集.md", "name": "css注入代码合集.md", "type": "file", - "path": "编程语言/前端/css注入代码合集.md", + "path": "编程语言/前端&HTML&CSS&JS/css注入代码合集.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/nodejs的markdown库.md", + "name": "nodejs的markdown库.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/nodejs的markdown库.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/OpenList.md", + "name": "OpenList.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/OpenList.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/前端&HTML&CSS&JS/React打包成Windows和Android软件方案.md", + "name": "React打包成Windows和Android软件方案.md", + "type": "file", + "path": "编程语言/前端&HTML&CSS&JS/React打包成Windows和Android软件方案.md", "children": [], "isExpanded": false } @@ -94,6 +159,31 @@ "type": "folder", "path": "编程语言/C", "children": [ + { + "id": "编程语言/C/代码片段", + "name": "代码片段", + "type": "folder", + "path": "编程语言/C/代码片段", + "children": [ + { + "id": "编程语言/C/代码片段/代码片段-标准HelloWorld输出.md", + "name": "代码片段-标准HelloWorld输出.md", + "type": "file", + "path": "编程语言/C/代码片段/代码片段-标准HelloWorld输出.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/C/代码片段/代码片段-特殊HelloWorld输出.md", + "name": "代码片段-特殊HelloWorld输出.md", + "type": "file", + "path": "编程语言/C/代码片段/代码片段-特殊HelloWorld输出.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "编程语言/C/C 代码概述:检查特定条件的素数.md", "name": "C 代码概述:检查特定条件的素数.md", @@ -192,6 +282,31 @@ ], "isExpanded": false }, + { + "id": "编程语言/C++/代码片段", + "name": "代码片段", + "type": "folder", + "path": "编程语言/C++/代码片段", + "children": [ + { + "id": "编程语言/C++/代码片段/代码片段-标准HelloWorld输出.md", + "name": "代码片段-标准HelloWorld输出.md", + "type": "file", + "path": "编程语言/C++/代码片段/代码片段-标准HelloWorld输出.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/C++/代码片段/代码片段-特殊HelloWorld输出.md", + "name": "代码片段-特殊HelloWorld输出.md", + "type": "file", + "path": "编程语言/C++/代码片段/代码片段-特殊HelloWorld输出.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "编程语言/C++/变量使用set,get方法原因.md", "name": "变量使用set,get方法原因.md", @@ -281,6 +396,31 @@ "type": "folder", "path": "编程语言/CSharp", "children": [ + { + "id": "编程语言/CSharp/代码片段", + "name": "代码片段", + "type": "folder", + "path": "编程语言/CSharp/代码片段", + "children": [ + { + "id": "编程语言/CSharp/代码片段/代码片段-标准HelloWorld输出.md", + "name": "代码片段-标准HelloWorld输出.md", + "type": "file", + "path": "编程语言/CSharp/代码片段/代码片段-标准HelloWorld输出.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/CSharp/代码片段/代码片段-特殊HelloWorld输出.md", + "name": "代码片段-特殊HelloWorld输出.md", + "type": "file", + "path": "编程语言/CSharp/代码片段/代码片段-特殊HelloWorld输出.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "编程语言/CSharp/mono和dotnet的区别.md", "name": "mono和dotnet的区别.md", @@ -293,32 +433,74 @@ "isExpanded": false }, { - "id": "编程语言/Flutter", - "name": "Flutter", + "id": "编程语言/Flutter&Dart", + "name": "Flutter&Dart", "type": "folder", - "path": "编程语言/Flutter", + "path": "编程语言/Flutter&Dart", "children": [ { - "id": "编程语言/Flutter/Flutter安卓构建注意事项.md", + "id": "编程语言/Flutter&Dart/Flutter安卓构建注意事项.md", "name": "Flutter安卓构建注意事项.md", "type": "file", - "path": "编程语言/Flutter/Flutter安卓构建注意事项.md", + "path": "编程语言/Flutter&Dart/Flutter安卓构建注意事项.md", "children": [], "isExpanded": false }, { - "id": "编程语言/Flutter/Flutter常用命令.md", + "id": "编程语言/Flutter&Dart/Flutter常用命令.md", "name": "Flutter常用命令.md", "type": "file", - "path": "编程语言/Flutter/Flutter常用命令.md", + "path": "编程语言/Flutter&Dart/Flutter常用命令.md", "children": [], "isExpanded": false }, { - "id": "编程语言/Flutter/Flutter构建平台产物位置.md", + "id": "编程语言/Flutter&Dart/Flutter构建平台产物位置.md", "name": "Flutter构建平台产物位置.md", "type": "file", - "path": "编程语言/Flutter/Flutter构建平台产物位置.md", + "path": "编程语言/Flutter&Dart/Flutter构建平台产物位置.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, + { + "id": "编程语言/Golang", + "name": "Golang", + "type": "folder", + "path": "编程语言/Golang", + "children": [ + { + "id": "编程语言/Golang/代码片段", + "name": "代码片段", + "type": "folder", + "path": "编程语言/Golang/代码片段", + "children": [ + { + "id": "编程语言/Golang/代码片段/代码片段-标准HelloWorld输出.md", + "name": "代码片段-标准HelloWorld输出.md", + "type": "file", + "path": "编程语言/Golang/代码片段/代码片段-标准HelloWorld输出.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/Golang/代码片段/代码片段-特殊HelloWorld输出.md", + "name": "代码片段-特殊HelloWorld输出.md", + "type": "file", + "path": "编程语言/Golang/代码片段/代码片段-特殊HelloWorld输出.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, + { + "id": "编程语言/Golang/Golang标准库热门模块.md", + "name": "Golang标准库热门模块.md", + "type": "file", + "path": "编程语言/Golang/Golang标准库热门模块.md", "children": [], "isExpanded": false } @@ -332,10 +514,67 @@ "path": "编程语言/Java", "children": [ { - "id": "编程语言/Java/Java基础-导入java文件.md", - "name": "Java基础-导入java文件.md", + "id": "编程语言/Java/代码片段", + "name": "代码片段", + "type": "folder", + "path": "编程语言/Java/代码片段", + "children": [ + { + "id": "编程语言/Java/代码片段/代码片段-标准HelloWorld输出.md", + "name": "代码片段-标准HelloWorld输出.md", + "type": "file", + "path": "编程语言/Java/代码片段/代码片段-标准HelloWorld输出.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/Java/代码片段/代码片段-特殊HelloWorld输出.md", + "name": "代码片段-特殊HelloWorld输出.md", + "type": "file", + "path": "编程语言/Java/代码片段/代码片段-特殊HelloWorld输出.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, + { + "id": "编程语言/Java/Java标准库常用异常类.md", + "name": "Java标准库常用异常类.md", "type": "file", - "path": "编程语言/Java/Java基础-导入java文件.md", + "path": "编程语言/Java/Java标准库常用异常类.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/Java/Java基础-处理异常方法.md", + "name": "Java基础-处理异常方法.md", + "type": "file", + "path": "编程语言/Java/Java基础-处理异常方法.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/Java/Java基础-导入java文件方法.md", + "name": "Java基础-导入java文件方法.md", + "type": "file", + "path": "编程语言/Java/Java基础-导入java文件方法.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/Java/Java基础-实现多线程方法.md", + "name": "Java基础-实现多线程方法.md", + "type": "file", + "path": "编程语言/Java/Java基础-实现多线程方法.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/Java/Java中的map,set,list比较.md", + "name": "Java中的map,set,list比较.md", + "type": "file", + "path": "编程语言/Java/Java中的map,set,list比较.md", "children": [], "isExpanded": false } @@ -348,6 +587,31 @@ "type": "folder", "path": "编程语言/Python", "children": [ + { + "id": "编程语言/Python/代码片段", + "name": "代码片段", + "type": "folder", + "path": "编程语言/Python/代码片段", + "children": [ + { + "id": "编程语言/Python/代码片段/代码片段-标准HelloWorld输出.md", + "name": "代码片段-标准HelloWorld输出.md", + "type": "file", + "path": "编程语言/Python/代码片段/代码片段-标准HelloWorld输出.md", + "children": [], + "isExpanded": false + }, + { + "id": "编程语言/Python/代码片段/代码片段-特殊HelloWorld输出.md", + "name": "代码片段-特殊HelloWorld输出.md", + "type": "file", + "path": "编程语言/Python/代码片段/代码片段-特殊HelloWorld输出.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "编程语言/Python/Kivy", "name": "Kivy", @@ -393,6 +657,95 @@ "type": "folder", "path": "计算机科普", "children": [ + { + "id": "计算机科普/术语科普", + "name": "术语科普", + "type": "folder", + "path": "计算机科普/术语科普", + "children": [ + { + "id": "计算机科普/术语科普/术语科普-CVM.md", + "name": "术语科普-CVM.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-CVM.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-DMZ.md", + "name": "术语科普-DMZ.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-DMZ.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-IT行业的A端B端C端.md", + "name": "术语科普-IT行业的A端B端C端.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-IT行业的A端B端C端.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-MCU.md", + "name": "术语科普-MCU.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-MCU.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-MQ.md", + "name": "术语科普-MQ.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-MQ.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-POI.md", + "name": "术语科普-POI.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-POI.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-pwn.md", + "name": "术语科普-pwn.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-pwn.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-QPS.md", + "name": "术语科普-QPS.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-QPS.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-SaaS.md", + "name": "术语科普-SaaS.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-SaaS.md", + "children": [], + "isExpanded": false + }, + { + "id": "计算机科普/术语科普/术语科普-UGC.md", + "name": "术语科普-UGC.md", + "type": "file", + "path": "计算机科普/术语科普/术语科普-UGC.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "计算机科普/编程语言科普.md", "name": "编程语言科普.md", @@ -433,70 +786,6 @@ "children": [], "isExpanded": false }, - { - "id": "计算机科普/术语解释-DMZ.md", - "name": "术语解释-DMZ.md", - "type": "file", - "path": "计算机科普/术语解释-DMZ.md", - "children": [], - "isExpanded": false - }, - { - "id": "计算机科普/术语科普-CVM.md", - "name": "术语科普-CVM.md", - "type": "file", - "path": "计算机科普/术语科普-CVM.md", - "children": [], - "isExpanded": false - }, - { - "id": "计算机科普/术语科普-IT行业的A端B端C端.md", - "name": "术语科普-IT行业的A端B端C端.md", - "type": "file", - "path": "计算机科普/术语科普-IT行业的A端B端C端.md", - "children": [], - "isExpanded": false - }, - { - "id": "计算机科普/术语科普-MCU.md", - "name": "术语科普-MCU.md", - "type": "file", - "path": "计算机科普/术语科普-MCU.md", - "children": [], - "isExpanded": false - }, - { - "id": "计算机科普/术语科普-MQ.md", - "name": "术语科普-MQ.md", - "type": "file", - "path": "计算机科普/术语科普-MQ.md", - "children": [], - "isExpanded": false - }, - { - "id": "计算机科普/术语科普-POI.md", - "name": "术语科普-POI.md", - "type": "file", - "path": "计算机科普/术语科普-POI.md", - "children": [], - "isExpanded": false - }, - { - "id": "计算机科普/术语科普-pwn.md", - "name": "术语科普-pwn.md", - "type": "file", - "path": "计算机科普/术语科普-pwn.md", - "children": [], - "isExpanded": false - }, - { - "id": "计算机科普/术语科普-QPS.md", - "name": "术语科普-QPS.md", - "type": "file", - "path": "计算机科普/术语科普-QPS.md", - "children": [], - "isExpanded": false - }, { "id": "计算机科普/网络协议科普.md", "name": "网络协议科普.md", @@ -602,6 +891,14 @@ "type": "folder", "path": "计算机网络", "children": [ + { + "id": "计算机网络/计算机网络期末考试综合题简单论述.md", + "name": "计算机网络期末考试综合题简单论述.md", + "type": "file", + "path": "计算机网络/计算机网络期末考试综合题简单论述.md", + "children": [], + "isExpanded": false + }, { "id": "计算机网络/网络层次划分.md", "name": "网络层次划分.md", @@ -627,10 +924,10 @@ "isExpanded": false }, { - "id": "计算机网络/TCP的三次握手四次握手总结.md", - "name": "TCP的三次握手四次握手总结.md", + "id": "计算机网络/TCP的三次握手四次挥手总结.md", + "name": "TCP的三次握手四次挥手总结.md", "type": "file", - "path": "计算机网络/TCP的三次握手四次握手总结.md", + "path": "计算机网络/TCP的三次握手四次挥手总结.md", "children": [], "isExpanded": false } @@ -644,11 +941,28 @@ "path": "内网穿透", "children": [ { - "id": "内网穿透/搭建derp和headscale避坑与指南.md", - "name": "搭建derp和headscale避坑与指南.md", - "type": "file", - "path": "内网穿透/搭建derp和headscale避坑与指南.md", - "children": [], + "id": "内网穿透/Tailscale", + "name": "Tailscale", + "type": "folder", + "path": "内网穿透/Tailscale", + "children": [ + { + "id": "内网穿透/Tailscale/搭建derp和headscale避坑与指南.md", + "name": "搭建derp和headscale避坑与指南.md", + "type": "file", + "path": "内网穿透/Tailscale/搭建derp和headscale避坑与指南.md", + "children": [], + "isExpanded": false + }, + { + "id": "内网穿透/Tailscale/Tailscale客户端常用命令.md", + "name": "Tailscale客户端常用命令.md", + "type": "file", + "path": "内网穿透/Tailscale/Tailscale客户端常用命令.md", + "children": [], + "isExpanded": false + } + ], "isExpanded": false }, { @@ -682,6 +996,14 @@ "path": "内网穿透/frp客户端配置.md", "children": [], "isExpanded": false + }, + { + "id": "内网穿透/Frp设置同一端口不同域名访问.md", + "name": "Frp设置同一端口不同域名访问.md", + "type": "file", + "path": "内网穿透/Frp设置同一端口不同域名访问.md", + "children": [], + "isExpanded": false } ], "isExpanded": false @@ -781,6 +1103,23 @@ "type": "folder", "path": "实习求职/面试八股", "children": [ + { + "id": "实习求职/面试八股/网络模型", + "name": "网络模型", + "type": "folder", + "path": "实习求职/面试八股/网络模型", + "children": [ + { + "id": "实习求职/面试八股/网络模型/OSI 七层模型是什么?.md", + "name": "OSI 七层模型是什么?.md", + "type": "file", + "path": "实习求职/面试八股/网络模型/OSI 七层模型是什么?.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "实习求职/面试八股/HTTP 与HTTPS", "name": "HTTP 与HTTPS", @@ -924,10 +1263,26 @@ "path": "数据库", "children": [ { - "id": "数据库/json文件储存和MongoDB储存优缺点.md", - "name": "json文件储存和MongoDB储存优缺点.md", + "id": "数据库/未命名.md", + "name": "未命名.md", "type": "file", - "path": "数据库/json文件储存和MongoDB储存优缺点.md", + "path": "数据库/未命名.md", + "children": [], + "isExpanded": false + }, + { + "id": "数据库/Linux控制台登录Mysql8,MongoDB,PostgresDB教程.md", + "name": "Linux控制台登录Mysql8,MongoDB,PostgresDB教程.md", + "type": "file", + "path": "数据库/Linux控制台登录Mysql8,MongoDB,PostgresDB教程.md", + "children": [], + "isExpanded": false + }, + { + "id": "数据库/Linux控制台登录Redis教程.md", + "name": "Linux控制台登录Redis教程.md", + "type": "file", + "path": "数据库/Linux控制台登录Redis教程.md", "children": [], "isExpanded": false }, @@ -947,6 +1302,14 @@ "children": [], "isExpanded": false }, + { + "id": "数据库/MongoDB添加管理员账号.md", + "name": "MongoDB添加管理员账号.md", + "type": "file", + "path": "数据库/MongoDB添加管理员账号.md", + "children": [], + "isExpanded": false + }, { "id": "数据库/MySQL数据库支持的数据类型.md", "name": "MySQL数据库支持的数据类型.md", @@ -1112,6 +1475,14 @@ "children": [], "isExpanded": false }, + { + "id": "杂项/带图片.md", + "name": "带图片.md", + "type": "file", + "path": "杂项/带图片.md", + "children": [], + "isExpanded": false + }, { "id": "杂项/古诗.md", "name": "古诗.md", @@ -1187,6 +1558,23 @@ ], "isExpanded": false }, + { + "id": "正则表达式", + "name": "正则表达式", + "type": "folder", + "path": "正则表达式", + "children": [ + { + "id": "正则表达式/简单举例.md", + "name": "简单举例.md", + "type": "file", + "path": "正则表达式/简单举例.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "AI", "name": "AI", @@ -1199,6 +1587,14 @@ "type": "folder", "path": "AI/AI提示词工程", "children": [ + { + "id": "AI/AI提示词工程/大模型驱动应用功能的实现.md", + "name": "大模型驱动应用功能的实现.md", + "type": "file", + "path": "AI/AI提示词工程/大模型驱动应用功能的实现.md", + "children": [], + "isExpanded": false + }, { "id": "AI/AI提示词工程/开发前后端分离网站提示词.md", "name": "开发前后端分离网站提示词.md", @@ -1226,6 +1622,14 @@ "children": [], "isExpanded": false }, + { + "id": "AI/大模型上下文记忆功能的实现.md", + "name": "大模型上下文记忆功能的实现.md", + "type": "file", + "path": "AI/大模型上下文记忆功能的实现.md", + "children": [], + "isExpanded": false + }, { "id": "AI/大语言模型的API 调用.md", "name": "大语言模型的API 调用.md", @@ -1281,6 +1685,14 @@ "type": "folder", "path": "Docker/优秀好用的Docker镜像", "children": [ + { + "id": "Docker/优秀好用的Docker镜像/60sAPI-一款多功能丰富的后端接口集合.md", + "name": "60sAPI-一款多功能丰富的后端接口集合.md", + "type": "file", + "path": "Docker/优秀好用的Docker镜像/60sAPI-一款多功能丰富的后端接口集合.md", + "children": [], + "isExpanded": false + }, { "id": "Docker/优秀好用的Docker镜像/模板.md", "name": "模板.md", @@ -1313,6 +1725,14 @@ "children": [], "isExpanded": false }, + { + "id": "Docker/优秀好用的Docker镜像/kkfileview-文件格式预览大全.md", + "name": "kkfileview-文件格式预览大全.md", + "type": "file", + "path": "Docker/优秀好用的Docker镜像/kkfileview-文件格式预览大全.md", + "children": [], + "isExpanded": false + }, { "id": "Docker/优秀好用的Docker镜像/MongoDB-数据库.md", "name": "MongoDB-数据库.md", @@ -1361,6 +1781,14 @@ "children": [], "isExpanded": false }, + { + "id": "Docker/优秀好用的Docker镜像/registry-轻量级自建Docker镜像仓库.md", + "name": "registry-轻量级自建Docker镜像仓库.md", + "type": "file", + "path": "Docker/优秀好用的Docker镜像/registry-轻量级自建Docker镜像仓库.md", + "children": [], + "isExpanded": false + }, { "id": "Docker/优秀好用的Docker镜像/SurveyKing-强大的问卷调查服务.md", "name": "SurveyKing-强大的问卷调查服务.md", @@ -1413,6 +1841,22 @@ "type": "folder", "path": "Github", "children": [ + { + "id": "Github/Git常用命令.md", + "name": "Git常用命令.md", + "type": "file", + "path": "Github/Git常用命令.md", + "children": [], + "isExpanded": false + }, + { + "id": "Github/Git提交临时禁用https.md", + "name": "Git提交临时禁用https.md", + "type": "file", + "path": "Github/Git提交临时禁用https.md", + "children": [], + "isExpanded": false + }, { "id": "Github/Github仓库公共API总结.md", "name": "Github仓库公共API总结.md", @@ -1487,6 +1931,48 @@ "type": "folder", "path": "Linux", "children": [ + { + "id": "Linux/随身WiFi", + "name": "随身WiFi", + "type": "folder", + "path": "Linux/随身WiFi", + "children": [ + { + "id": "Linux/随身WiFi/随身WiFi一些记录.md", + "name": "随身WiFi一些记录.md", + "type": "file", + "path": "Linux/随身WiFi/随身WiFi一些记录.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, + { + "id": "Linux/ADB", + "name": "ADB", + "type": "folder", + "path": "Linux/ADB", + "children": [ + { + "id": "Linux/ADB/某安卓板子不知名初始化脚本.md", + "name": "某安卓板子不知名初始化脚本.md", + "type": "file", + "path": "Linux/ADB/某安卓板子不知名初始化脚本.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/ADB/ADB常用命令.md", + "name": "ADB常用命令.md", + "type": "file", + "path": "Linux/ADB/ADB常用命令.md", + "children": [], + "isExpanded": false + } + ], + "isExpanded": false + }, { "id": "Linux/Termux", "name": "Termux", @@ -1534,6 +2020,22 @@ ], "isExpanded": false }, + { + "id": "Linux/Termux/service-frpc.md", + "name": "service-frpc.md", + "type": "file", + "path": "Linux/Termux/service-frpc.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/Termux/service-openlist.md", + "name": "service-openlist.md", + "type": "file", + "path": "Linux/Termux/service-openlist.md", + "children": [], + "isExpanded": false + }, { "id": "Linux/Termux/shell2http举例.md", "name": "shell2http举例.md", @@ -1550,6 +2052,30 @@ "children": [], "isExpanded": false }, + { + "id": "Linux/Termux/Termux-SSH相关.md", + "name": "Termux-SSH相关.md", + "type": "file", + "path": "Linux/Termux/Termux-SSH相关.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/Termux/Termux常用命令.md", + "name": "Termux常用命令.md", + "type": "file", + "path": "Linux/Termux/Termux常用命令.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/Termux/Termux常用软件包.md", + "name": "Termux常用软件包.md", + "type": "file", + "path": "Linux/Termux/Termux常用软件包.md", + "children": [], + "isExpanded": false + }, { "id": "Linux/Termux/termux的pkg命令总结.md", "name": "termux的pkg命令总结.md", @@ -1557,6 +2083,14 @@ "path": "Linux/Termux/termux的pkg命令总结.md", "children": [], "isExpanded": false + }, + { + "id": "Linux/Termux/Termux问题小总结.md", + "name": "Termux问题小总结.md", + "type": "file", + "path": "Linux/Termux/Termux问题小总结.md", + "children": [], + "isExpanded": false } ], "isExpanded": false @@ -1585,14 +2119,6 @@ "children": [], "isExpanded": false }, - { - "id": "Linux/飞牛os切换root.md", - "name": "飞牛os切换root.md", - "type": "file", - "path": "Linux/飞牛os切换root.md", - "children": [], - "isExpanded": false - }, { "id": "Linux/构建最小Linux系统.md", "name": "构建最小Linux系统.md", @@ -1602,10 +2128,10 @@ "isExpanded": false }, { - "id": "Linux/某安卓板子不知名初始化脚本.md", - "name": "某安卓板子不知名初始化脚本.md", + "id": "Linux/全局执行某个sh脚本,该放在Linux哪个目录.md", + "name": "全局执行某个sh脚本,该放在Linux哪个目录.md", "type": "file", - "path": "Linux/某安卓板子不知名初始化脚本.md", + "path": "Linux/全局执行某个sh脚本,该放在Linux哪个目录.md", "children": [], "isExpanded": false }, @@ -1633,14 +2159,6 @@ "children": [], "isExpanded": false }, - { - "id": "Linux/我想全局执行某个sh脚本,该放在Linux哪个目录.md", - "name": "我想全局执行某个sh脚本,该放在Linux哪个目录.md", - "type": "file", - "path": "Linux/我想全局执行某个sh脚本,该放在Linux哪个目录.md", - "children": [], - "isExpanded": false - }, { "id": "Linux/busybox v1.36命令简介.md", "name": "busybox v1.36命令简介.md", @@ -1665,6 +2183,46 @@ "children": [], "isExpanded": false }, + { + "id": "Linux/Debian 12安装MySQL教程.md", + "name": "Debian 12安装MySQL教程.md", + "type": "file", + "path": "Linux/Debian 12安装MySQL教程.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/Debian 12安装PostgresDB教程.md", + "name": "Debian 12安装PostgresDB教程.md", + "type": "file", + "path": "Linux/Debian 12安装PostgresDB教程.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/Debian12安装MongoDB教程.md", + "name": "Debian12安装MongoDB教程.md", + "type": "file", + "path": "Linux/Debian12安装MongoDB教程.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/Debian12安装Redis教程.md", + "name": "Debian12安装Redis教程.md", + "type": "file", + "path": "Linux/Debian12安装Redis教程.md", + "children": [], + "isExpanded": false + }, + { + "id": "Linux/Debian12卸载宝塔面板命令.md", + "name": "Debian12卸载宝塔面板命令.md", + "type": "file", + "path": "Linux/Debian12卸载宝塔面板命令.md", + "children": [], + "isExpanded": false + }, { "id": "Linux/docker,LXC,qemu,k8s,chroot等的特点.md", "name": "docker,LXC,qemu,k8s,chroot等的特点.md", @@ -1673,30 +2231,6 @@ "children": [], "isExpanded": false }, - { - "id": "Linux/docker配置.md", - "name": "docker配置.md", - "type": "file", - "path": "Linux/docker配置.md", - "children": [], - "isExpanded": false - }, - { - "id": "Linux/frp配置.md", - "name": "frp配置.md", - "type": "file", - "path": "Linux/frp配置.md", - "children": [], - "isExpanded": false - }, - { - "id": "Linux/Git常用命令.md", - "name": "Git常用命令.md", - "type": "file", - "path": "Linux/Git常用命令.md", - "children": [], - "isExpanded": false - }, { "id": "Linux/Linux zip 命令总结.md", "name": "Linux zip 命令总结.md", @@ -1705,14 +2239,6 @@ "children": [], "isExpanded": false }, - { - "id": "Linux/linux安装nodejs22.md", - "name": "linux安装nodejs22.md", - "type": "file", - "path": "Linux/linux安装nodejs22.md", - "children": [], - "isExpanded": false - }, { "id": "Linux/Linux安装ollama.md", "name": "Linux安装ollama.md", @@ -1801,14 +2327,6 @@ "children": [], "isExpanded": false }, - { - "id": "Linux/nodejsmarkdown库.md", - "name": "nodejsmarkdown库.md", - "type": "file", - "path": "Linux/nodejsmarkdown库.md", - "children": [], - "isExpanded": false - }, { "id": "Linux/QQ机器人napcat命令.md", "name": "QQ机器人napcat命令.md", @@ -1834,18 +2352,18 @@ "isExpanded": false }, { - "id": "Linux/systemctl命令详细总结-豆包.md", - "name": "systemctl命令详细总结-豆包.md", + "id": "Linux/ssh切换root登录通用方法.md", + "name": "ssh切换root登录通用方法.md", "type": "file", - "path": "Linux/systemctl命令详细总结-豆包.md", + "path": "Linux/ssh切换root登录通用方法.md", "children": [], "isExpanded": false }, { - "id": "Linux/Termux-SSH相关.md", - "name": "Termux-SSH相关.md", + "id": "Linux/systemctl命令详细总结.md", + "name": "systemctl命令详细总结.md", "type": "file", - "path": "Linux/Termux-SSH相关.md", + "path": "Linux/systemctl命令详细总结.md", "children": [], "isExpanded": false }, @@ -1889,6 +2407,14 @@ "path": "Minecraft/Minecraft常用命令.md", "children": [], "isExpanded": false + }, + { + "id": "Minecraft/Minecraft命名彩蛋.md", + "name": "Minecraft命名彩蛋.md", + "type": "file", + "path": "Minecraft/Minecraft命名彩蛋.md", + "children": [], + "isExpanded": false } ], "isExpanded": false @@ -1911,10 +2437,10 @@ "isExpanded": false }, { - "id": "首页.md", - "name": "首页.md", + "id": "📒萌芽笔记.md", + "name": "📒萌芽笔记.md", "type": "file", - "path": "首页.md", + "path": "📒萌芽笔记.md", "children": [], "isExpanded": false } diff --git a/src/data/fileContents.json b/mengyanote-frontend/public/data/fileContents.json similarity index 71% rename from src/data/fileContents.json rename to mengyanote-frontend/public/data/fileContents.json index 670e471..b263684 100644 --- a/src/data/fileContents.json +++ b/mengyanote-frontend/public/data/fileContents.json @@ -1,41 +1,52 @@ { - "AI/AI大模型应用拆解.md": "> 此笔记记录一些AI工具的应用原理,给自己制作此类工具提供一点思路\n\nAI老师阅卷批改:\nOCR文字识别->大语言模型文本处理\n\nAI视频总结(bilinote):\n下载视频->提取音频->音频转文字->大语言模型文本处理", + "AI/AI大模型应用拆解.md": "> 此笔记记录一些AI工具的应用原理,给自己制作此类工具提供一点思路\n\n**AI老师阅卷批改:**\nOCR文字识别->大语言模型文本处理\n\n**AI视频总结(bilinote):**\n下载视频->提取音频->音频转文字->大语言模型文本处理\n\n**AI一键解读医学报告:**\nOCR文字识别->大语言模型文本处理\n", "AI/AI提示词工程/AI绘画提示词.md": "*by 树萌芽*\n\n**图片风格为2D像素像素化风格,比例 「1:1」 画一个游戏道具,背景是纯黑色,纯黑色** \n**不带任何文字,没有任何文字,现在我要你画 一个闪闪发光的金黄色金币卡**\n\n\n**图片风格为2D像素风格,比例 「1:1」 画一个游戏元素,风格为2.5D 就是上帝视角,就是正交斜视角那种有立体感,背景是纯黑色,纯黑色 不带任何文字,现在我要你画一个** \n**一丛茂密的灌木丛 记住一定要3d立体感 只要 灌木丛 只要 灌木丛!**\n\n\n比例 「1:1」图片风格为2D像素风格, 画一个游戏装饰元素,风格为2.5D 就是上帝视角,就是正交斜视角那种有立体感,背景是纯黑色,纯黑色 不带任何文字,现在我要你画一个 占卜测运算命台 相关的装饰可以多一点 记住一定要3d立体感 ", + "AI/AI提示词工程/大模型驱动应用功能的实现.md": "\n**大模型本身不能直接执行任何任务。它像一个超级大脑,但缺少手和脚。它通过生成“指令”或“代码”,然后由一个“执行环境”来真正驱动任务。**\n\n让我们来分解这个过程:\n\n### 核心原理:工具使用与函数调用\n\n大模型驱动任务的核心能力被称为 **“工具使用”** 或 **“函数调用”** 。你可以把这个过程想象成一个聪明的分析师和一个高效的执行秘书之间的配合:\n\n- **大模型(分析师):** 负责理解你的自然语言指令、分析意图、制定计划,并决定下一步该调用哪个“工具”(函数)。\n- **执行环境/应用程序(秘书):** 它拥有真正的“手和脚”。它准备好了各种工具(API、函数),并严格按照分析师的指令去执行。\n\n### 具体工作流程(以“订机票”为例)\n\n假设你对一个集成了大模型的AI助手说:“帮我订一张明天从北京到上海的最便宜的机票。”\n\n这个过程并不是大模型直接去登录航空公司的系统,而是如下步骤:\n\n1. **意图理解与规划:**\n - 大模型解析你的指令,识别出关键信息:\n - **意图:** 订机票\n - **出发地:** 北京\n - **目的地:** 上海\n - **时间:** 明天\n - **偏好:** 最便宜\n - 它在内部规划出一个步骤序列:`查询航班 -> 比较价格 -> 填写订单 -> 完成支付`。\n\n2. **识别可用工具:**\n - 应用程序(AI助手)已经向大模型“注册”了它可以调用的各种工具函数,比如:\n - `search_flights(departure, destination, date)`\n - `compare_prices(flight_list)`\n - `book_flight(flight_id, passenger_info)`\n - `process_payment(booking_id, payment_details)`\n\n3. **生成函数调用:**\n - 大模型意识到第一步需要查询航班。于是,它不会用自然语言回复你,而是会生成一个**结构化的函数调用请求**,格式通常是JSON:\n ```json\n {\n \"function\": \"search_flights\",\n \"arguments\": {\n \"departure\": \"北京\",\n \"destination\": \"上海\",\n \"date\": \"2024-06-02\"\n }\n }\n ```\n\n4. **执行函数:**\n - 应用程序接收到这个请求后,**在自己的安全环境内**,调用真正的 `search_flights` 函数。这个函数可能连接着航司的API、携程的接口,或者一个内部的航班数据库。\n - **关键点:** 执行代码、访问网络、操作数据库等危险或实际的操作,都是由应用程序完成的,而不是大模型本身。\n\n5. **获取结果并继续:**\n - `search_flights` 函数返回一个结构化的航班列表给应用程序。\n - 应用程序把这个结果(数据)再次作为上下文提供给大模型。\n - 大模型看到查询结果后,进行下一步分析,比如调用 `compare_prices` 来筛选出最便宜的选项。\n - 然后,它可能会生成下一个函数调用,比如 `book_flight`,并提示你提供乘机人信息。\n\n6. **循环直至完成:**\n - 这个“模型分析 -> 生成调用 -> 环境执行 -> 返回结果”的循环会一直持续,直到任务完成(比如订单确认号生成)。\n\n### “打开网页”是如何工作的?\n\n这个例子更直观:\n\n1. 你说:“打开百度首页。”\n2. 大模型识别出你的意图是“打开网页”,并且目标网址是“百度首页”。\n3. 它生成一个函数调用,比如 `open_browser(url=\"https://www.baidu.com\")`。\n4. 应用程序(比如你的操作系统 shell 或一个自动化脚本)执行这个函数,启动你的默认浏览器并导航到该网址。\n5. 大模型回复你:“已为您打开百度首页。”\n\n### 为什么大模型“能够”做这些事?它的能力来源是什么?\n\n1. **代码理解与生成能力:** 大模型在训练时学习了海量的公开代码(如GitHub),因此它非常理解编程逻辑和API的调用方式。它知道 `search_flights` 这个函数需要哪些参数,以及返回的数据大概是什么样子。\n2. **逻辑推理与规划能力:** 它将复杂的用户请求(“订最便宜的机票”)分解成一系列可执行的、有序的步骤。\n3. **自然语言到结构化数据的转换能力:** 这是最关键的一步。它能将你模糊的、非结构化的口语指令(“帮我找个便宜的航班”),精确地转换成计算机可以理解的结构化参数(`{“max_price\": 500, \"sort_by\": \"price\"}`)。\n\n### 总结\n\n- **大模型是“策略大脑”,不是“执行手脚”。** 它通过**工具使用(函数调用)** 来驱动任务。\n- **真正的执行者是外部的应用程序或系统**,它提供了安全的执行环境和真实的工具。\n- 大模型的价值在于充当了一个**极其强大的“自然语言到代码/指令”的翻译器和规划器**,让人类可以用最自然的方式与复杂的计算机系统交互。\n\n所以,当你看到一个大模型能“订机票”或“打开网页”时,背后其实是一个精心设计的系统,在这个系统中,大模型扮演着指挥中心的角色,而具体的脏活累活则由它指挥的其他专业模块来完成。", "AI/AI提示词工程/开发前后端分离网站提示词.md": "1.取消CORS跨域限制,允许任何链接\n2.前端使用React框架,后端使用python的Flask框架\n3.前端修改在frontend文件夹,后端修改在backend文件夹", "AI/Qwen-Code命令行安装使用教程.md": "**Qwen Code** 是一个 CLI 工具,修改自 **Gemini CLI**,针对 Qwen3‑Coder系列的模型增强了解析器和工具支持。\n\n确保已安装 Node.js 20 及以上版本,可以通过以下命令安装:\n\n```bash\ncurl -qL https://www.npmjs.com/install.sh | sh\n```\n\n然后通过 npm 管理器安装 Qwen Code:\n\n```bash\nnpm i -g @qwen-code/qwen-code\n```\n\n> 另一种方式是从源码安装:\n> \n> ```bash\n> git clone https://github.com/QwenLM/qwen-code.git\n> cd qwen-code && npm install && npm install -g\n> ```\n\nQwen Code 支持 OpenAI SDK 调用 LLM,你可以导出以下环境变量,或者简单地将其放在 `.envfile` 中。\n\n```bash\nexport OPENAI_API_KEY=\"your_api_key_here\"\nexport OPENAI_BASE_URL=\"https://dashscope.aliyuncs.com/compatible-mode/v1\"\nexport OPENAI_MODEL=\"qwen3-coder-plus\"\n```\n\n现在,你可以通过简单地输入 **`qwen`** 来享受 Qwen-Code 和 Qwen 带来的编程体验。\n\n### Claude Code\n\n除了 Qwen Code 之外,现在还可以将 Qwen3‑Coder 与 Claude Code 搭配使用。只需在[阿里云百炼](https://bailian.console.aliyun.com/)平台申请 API Key,并安装 Claude Code,即可开始畅享编码体验。\n\n```bash\nnpm install -g @anthropic-ai/claude-code\n```\n\n我们提供了两种接入方式,帮助你无缝地用 Qwen3‑Coder 进行编码。\n\n#### 使用dashscope提供的代理  API\n\n只需要将Anthropic的base url替换成dashscope上提供的endpoint即可。\n\n```bash\nexport ANTHROPIC_BASE_URL=https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy\nexport ANTHROPIC_AUTH_TOKEN=your-dashscope-apikey\n```\n\n可选方案 2:使用 claude-code-config 自定义路由\n\n#### Optional 2: 使用 claude-code-config 自定义路由\n\nclaude-code-router 是一个第三方的路由工具,用于为 Claude Code 灵活地切换不同的后端 API。dashScope平台提供了一个简单的扩展包 claude-code-config,可为 claude-code-router 生成包含 dashScope 支持的默认配置。\n\n```bash\nnpm install -g @musistudio/claude-code-router\nnpm install -g @dashscope-js/claude-code-config\n```\n\n生成配置文件和插件目录:\n\n```bash\nccr-dashscope\n```\n\n该命令会自动生成 ccr 所需的配置文件和插件目录。你也可以手动调整 ~/.claude-code-router/config.json 和 ~/.claude-code-router/plugins/ 中的配置。\n\n最后,通过 ccr 开始使用 Claude Code:\n\n```bash\nccr code\n```\n\n至此,你即可通过 ccr 使用 Claude Code 畅享 Qwen3‑Coder 的强大编码能力。祝开发顺利!\n\n### Cline\n\n配置 Qwen3-Coder-480B-A35B-instruct 以使用 cline ‒ 进入 cline 的配置设置 ‒ 选择“OpenAI Compatible”模式 ‒ 在 OpenAI Compatible API tokens处,输入从 Dashscope 获取的密钥 ‒ 勾选“使用自定义基础 URL”,并输入:`https://dashscope.aliyuncs.com/compatible-mode/v1` ‒ 输入模型名称:`qwen3-coder-plus`", "AI/Qwen-Code官方文档使用教程.md": "\n---\n\nQwen Code 是一款专为 **Qwen3-Coder** 模型优化的命令行 AI 工作流工具,通过先进的代码理解能力、自动化任务和智能辅助功能,显著提升开发效率。\n\n---\n\n## 🛠 操作步骤\n\n### 1️⃣ 获取阿里云百炼 API Key\n\n1. 登录 **阿里云百炼大模型服务平台**。\n \n2. 如果页面顶部显示 **image**,说明需要开通服务。\n \n - 开通后可领取新人免费额度(30~180天)。\n \n - 如果提示 **实名认证**,请先完成认证。\n \n3. 免费额度详情可在 **新人免费额度页面** 查看。\n \n4. 获取 **阿里云百炼 API Key**。\n \n\n---\n\n### 2️⃣ 选择模型\n\nQwen Code 支持 **OpenAI 兼容接口模型**,包括:\n\n- 🌟 **qwen3-coder-plus**(推荐,2025年7月23日起限时优惠)\n \n- qwen3-coder-480b-a35b-instruct\n \n- qwen3-coder-flash\n \n- qwen3-coder-30b-a3b-instruct\n \n\n---\n\n### 3️⃣ 安装与配置 Qwen Code\n\n#### ✅ Node.js 版本检查\n\n```bash\nnode -v\n```\n\n需 **Node.js 20+**,低于则需重新安装。\n\n#### 📦 安装 Qwen Code\n\n```bash\n# 配置镜像源加速\nnpm config set registry https://registry.npmmirror.com\n\n# 安装 Qwen Code\nnpm install -g @qwen-code/qwen-code@latest\n```\n\n---\n\n### 4️⃣ 启动并配置 Qwen Code\n\n1. 在终端中输入:\n \n ```bash\n qwen\n ```\n \n2. 选择认证方式 → **OpenAI**\n \n3. 填写以下信息:\n \n\n|配置项|说明|\n|---|---|\n|🔑 API Key|阿里云百炼 API Key|\n|🌐 Base URL|`https://dashscope.aliyuncs.com/compatible-mode/v1`|\n|🤖 Model|推荐 `qwen3-coder-plus`|\n\n👉 若不想每次都输入,请配置 **环境变量**。\n\n---\n\n### 5️⃣ 配置环境变量\n\n在系统中设置:\n\n```bash\nexport OPENAI_API_KEY=你的APIKey\nexport OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\nexport OPENAI_MODEL=qwen3-coder-plus\n```\n\n---\n\n### 6️⃣ 向 Qwen Code 提问\n\n💡 示例问题:\n\n```\n如何用python实现一个二叉搜索树?\n```\n\nQwen Code 会自动创建文件、写入并执行代码。\n\n---\n\n### 7️⃣ 查看 Token 消耗\n\n输入:\n\n```bash\n/stats model\n```\n\n即可查看本次启动后的 **Token 消耗** 与 **API 调用次数**。\n\n---\n\n## 🎁 免费额度\n\n- 阿里云百炼:**每个模型 100 万免费 Token**\n \n- Qwen Code:**每天 2000 次免费调用**\n \n\n👉 为避免额外消费,可开启 **免费额度用完即停** 按钮。\n\n---\n\n## 🔧 进阶操作\n\n更多功能请参考:\n\n- 📘 [Qwen Code 文档]\n \n- 📘 [阿里云百炼代码能力]\n \n\n---\n\n## ❓ 常见问题 (FAQ)\n\n### ❓ Q:为什么 Token 消耗快?\n\n✅ A:可能多次调用 API。 \n👉 控制方法:\n\n- 精简工作目录(避免在项目根目录运行)。\n \n- 设置 Token 限额:\n \n\n```json\n{\n \"sessionTokenLimit\": 32000\n}\n```\n\n- 使用指令:\n \n - `/compress` → 压缩对话历史\n \n - `/clear` → 清空历史\n \n\n---\n\n### ❓ Q:如何切换模型?\n\n- 未配置环境变量:\n \n 1. `/quit` 退出\n \n 2. `qwen` 重新启动,手动输入 API Key、Base URL、模型名\n \n- 已配置环境变量:\n \n 1. 修改 `OPENAI_MODEL`\n \n 2. `/quit` → `qwen` 重启\n \n\n---\n\n### ❓ Q:如何使用每天 2000 次免费额度?\n\n- 输入 `/auth` → 选择 **Qwen Oauth** → 登录 **Qwen Chat**\n \n- 每天可免费调用 `qwen3-coder-plus` **2000 次**\n \n- 超过 2000 次 → 切换回 **OpenAI 认证方式**\n \n\n---\n\n### ❓ Q:为什么报 `401 Incorrect API key provided` 错误?\n\n✅ 检查以下:\n\n- API Key 是否正确\n \n- 是否有全局环境变量覆盖了配置文件\n \n\n---", + "AI/大模型上下文记忆功能的实现.md": "\n**大模型本身不具备记忆功能,并且是无状态的。我们感受到的“记忆”和“上下文”能力,是由使用大模型的应用程序(或框架)提供的。**\n\n### 1. 大模型本身:一个“无状态”的函数\n\n你可以把一个大模型(比如 GPT-4)想象成一个极其复杂、聪明的**数学函数**。\n\n- **无状态:** 这个函数本身不存储任何关于上一次被调用(即上一次对话)的信息。就像你计算 `f(x) = x + 2` 这个函数,你输入 `3`,它输出 `5`。你再次输入 `3`,它还是会输出 `5`。它不会“记得”你上一次输入了什么。大模型在每次被调用时,都只基于**当前这一次的输入**进行计算,然后产生输出。计算完成后,它内部不保存任何这次对话的“状态”。\n- **核心输入:** 大模型最核心的输入就是一个**文本序列**,也就是一个由词汇(Token)组成的字符串。它在这个序列的范围内进行模式识别和文本生成。\n\n### 2. “记忆”从何而来?—— 上下文窗口\n\n既然模型本身无记忆,我们感受到的连贯对话是怎么来的呢?答案是 **“上下文窗口”**。\n\n- **什么是上下文窗口?** 这是模型**单次处理**所能接受的最大文本长度(例如 128K Tokens)。这个窗口不仅包含你**刚刚提出的新问题**,还包含了应用程序**特意塞进去的、之前所有的对话历史**。\n- **工作流程是这样的:**\n 1. 你第一次说:“你好,我叫小明。”\n 2. 应用程序(比如ChatGPT界面)会收到这条消息。它不会只把“你好,我叫小明。”发给模型,而是会组装一个完整的“提示”。这个提示可能看起来像这样(高度简化):\n `[系统指令:你是一个友好的助手...] 用户:你好,我叫小明。 助手:`\n 3. 模型收到这个提示,生成回答:“你好小明!很高兴认识你。”\n 4. **关键一步:** 当你接着问第二个问题:“你还记得我叫什么吗?”时,应用程序会把**迄今为止所有的对话**都组装成一个新的、更长的提示,发给模型:\n `[系统指令:你是一个友好的助手...] 用户:你好,我叫小明。 助手:你好小明!很高兴认识你。 用户:你还记得我叫什么吗? 助手:`\n 5. 模型看到这个包含了全部历史的提示,它就能“看到”之前你提到了名字叫“小明”,从而生成正确的回答:“当然记得,你叫小明!”\n\n所以,**模型的“记忆”本质上是“回顾”**。它并没有真正记住,而是每次都被给予了一份完整的“剧本”以供参考。这个剧本就是**上下文窗口**。\n\n### 3. 应用程序的角色:有状态的“对话管理者”\n\n真正“有状态”的,是和你交互的**应用程序或服务**。\n\n- **它负责维护对话历史:** 这个应用(比如ChatGPT网页、API后端服务)有一个数据库或缓存,用来存储你整个会话的所有消息。\n- **它负责组装和修剪提示:** 每次你发送新消息,它都会从存储中取出历史记录,拼接到新消息前面,形成一个完整的提示,再发送给无状态的大模型。当对话很长,超过了模型的上下文窗口限制时,它还需要智能地修剪或总结早期的对话内容,以腾出空间。\n- **它可能管理长期记忆:** 一些更高级的应用(如GPTs、某些AI聊天机器人)可能会提供“长期记忆”或“核心记忆”功能。这通常是应用程序将你认为重要的信息提取出来,存储在独立的向量数据库里。在后续对话中,它会动态地从数据库中检索相关的“记忆”,并将其作为上下文的一部分塞给模型。\n\n### 总结与类比\n\n为了让你更好地理解,我们可以做一个类比:\n\n- **大模型本身:** 像一个**世界顶级的、但患有短期失忆症的厨师**。他厨艺精湛,能根据你给他的所有食材(输入提示)做出一道完美的菜(输出回答)。但做完之后,他就把这次烹饪忘得一干二净。\n- **应用程序:** 像这个厨师的**助手和服务员**。他负责记录每一位顾客(用户)点过的所有菜(对话历史)。当顾客要点新菜时,服务员会把顾客过去的点单记录和新的要求一起交给厨师,这样厨师就能做出符合顾客口味和需求的菜。\n\n**所以,回到你的问题:**\n\n1. **你觉得这个记忆的功能是大模型提供的能力吗?**\n - 不完全是。**基础能力**(在给定上下文中理解关联信息)是模型提供的,但**实现记忆的机制**(存储、组装、传递上下文)是由应用程序提供的。两者缺一不可。\n\n2. **大模型是有状态的吗?**\n - **大模型本身是无状态的。** 它是一个纯粹的函数。\n - **但以大模型为核心构建的AI应用或服务是“有状态”的。** 这个状态就是它维护的对话历史、用户偏好等数据。\n\n这种“无状态模型 + 有状态应用”的设计,既保证了模型本身的纯粹和可扩展性(可以同时服务海量用户而状态不冲突),又通过应用程序赋予了它进行连贯、个性化对话的强大能力。", "AI/大语言模型的API key.md": "#### deepseek :\n**调用密钥:**\nsk-832f8e5250464de08a31523c7fd71295\n**调用地址:**\nhttps://api.deepseek.com\n**调用模型:**\ndeepseek-chat \ndeepseek-reasoner\n\n\n\n阿里云百炼大模型平台:\n通用秘钥:sk-3d9e8e02a3704868b1a7159d52f2643d\n\n\n字节火山方舟模型控制台:\n通用秘钥:fc439240-ed3c-4e65-acaf-3541c66c6ebc\n\n\n#### Kimi :\n**调用密钥:**\nsk-zdg9NBpTlhOcDDpoWfaBKu0KNDdGv18SipORnL2utawja0bE\n**调用地址:**\nhttps://api.moonshot.cn\n**调用模型:**\nkimi-k2-0905-preview \nkimi-k2-0711-preview\nkimi-k2-turbo-preview 这个非常贵\nkimi-latest-8k 支持图片理解\nkimi-latest-32k\nkimi-latest-128k 这个非常贵\n", "AI/大语言模型的API 调用.md": "deepseek api秘钥:\n调用密钥:\nsk-16e24c16ff894771849ee6e15d4fb301\n调用地址:\nhttps://api.deepseek.com\n\n阿里云百炼大模型平台:\n通用秘钥:\nsk-3d9e8e02a3704868b1a7159d52f2643d\n调用地址:\nhttps://dashscope.aliyuncs.com/compatible-mode/v1\n\n字节火山方舟模型控制台:\n通用秘钥:\nfc439240-ed3c-4e65-acaf-3541c66c6ebc\n调用地址:\nhttps://ark.cn-beijing.volces.com/api/v3/chat/completions\n\nkimi API调用:\n调用密钥:\nsk-32M3DYWQdPlftpaGOmIuS7OFKzqCiSutktFPxPqTWn3oFadM\n调用地址:\nhttps://api.moonshot.cn", "AI/阿里云百炼平台模型API调用示例.md": "\n### **Python调用示例:**\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(\n api_key=os.getenv(\"DASHSCOPE_API_KEY\"), # 如果您没有配置环境变量,请在此处用您的API Key进行替换\n base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n)\ncompletion = client.chat.completions.create(\n model=\"qwen3-coder-plus\",\n messages=[\n {'role': 'system', 'content': 'You are a helpful assistant.'},\n {'role': 'user', 'content': '请编写一个Python函数 find_prime_numbers,该函数接受一个整数 n 作为参数,并返回一个包含所有小于 n 的质数(素数)的列表。质数是指仅能被1和其自身整除的正整数,如2, 3, 5, 7等。不要输出非代码的内容。'}],\n )\nprint(\"=\"*20+\"回复内容\"+\"=\"*20)\nprint(completion.choices[0].message.content)\nprint(\"=\"*20+\"Token消耗\"+\"=\"*20)\nprint(completion.usage)\n```\n**返回结果示例:**\n````plaintext\n====================回复内容====================\n```python\ndef find_prime_numbers(n):\n if n <= 2:\n return []\n \n primes = []\n \n for num in range(2, n):\n is_prime = True\n for i in range(2, int(num ** 0.5) + 1):\n if num % i == 0:\n is_prime = False\n break\n if is_prime:\n primes.append(num)\n \n return primes\n```\n====================Token消耗====================\nCompletionUsage(completion_tokens=95, prompt_tokens=91, total_tokens=186, completion_tokens_details=None, prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=0))\n````\n\n\n\ncurl调用示例:\n```curl\ncurl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \\\n-H \"Authorization: Bearer $DASHSCOPE_API_KEY\" \\\n-H \"Content-Type: application/json\" \\\n-d '{\n \"model\": \"qwen3-coder-plus\",\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"You are a helpful assistant.\"\n },\n {\n \"role\": \"user\", \n \"content\": \"请编写一个Python函数 find_prime_numbers,该函数接受一个整数 n 作为参数,并返回一个包含所有小于 n 的质数(素数)的列表。质数是指仅能被1和其自身整除的正整数,如2, 3, 5, 7等。不要输出非代码的内容。\"\n }\n ]\n}'\n```\n\n\n返回结果示例:\n```json\n{\n \"choices\": [\n {\n \"message\": {\n \"content\": \"```python\\ndef find_prime_numbers(n):\\n if n <= 2:\\n return []\\n \\n primes = []\\n \\n for num in range(2, n):\\n is_prime = True\\n for i in range(2, int(num ** 0.5) + 1):\\n if num % i == 0:\\n is_prime = False\\n break\\n if is_prime:\\n primes.append(num)\\n \\n return primes\\n```\",\n \"role\": \"assistant\"\n },\n \"finish_reason\": \"stop\",\n \"index\": 0,\n \"logprobs\": null\n }\n ],\n \"object\": \"chat.completion\",\n \"usage\": {\n \"prompt_tokens\": 91,\n \"completion_tokens\": 95,\n \"total_tokens\": 186,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n }\n },\n \"created\": 1753192010,\n \"system_fingerprint\": null,\n \"model\": \"qwen3-coder-plus\",\n \"id\": \"chatcmpl-798c99c2-7410-9cc4-8385-6dfd757757fa\"\n}\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "Docker/Docker 镜像相关.md": "\n**QQ机器人框架NapCat**\n```shell\n#安装\ndocker run -d \\\n-e NAPCAT_GID=$(id -g) \\\n-e NAPCAT_UID=$(id -u) \\\n-p 4080:3000 \\\n-p 4070:3001 \\\n-p 4060:6099 \\\n--name napcat \\\n--restart=always \\\nmlikiowa/napcat-docker:latest\n\n#固化以下路径,方便掉线时快速重新登录\n#QQ 持久化数据路径:/app/.config/QQ\n#NapCat 配置文件路径: /app/napcat/config\n\n#登录 WebUI 后台地址:http://<宿主机ip>:6099/webui\n```\n\n**网页SSH客户端-EasyNode**\n```shell\n#项目地址:https://github.com/chaos-zhu/easynode\n\n# 1. 创建easynode目录\nmkdir -p /root/easynode && cd /root/easynode\n\n# 2. 下载docker-compose.yml文件\nwget https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/docker-compose.yml\n\n# 3. 启动服务\ndocker-compose up -d\n\ndocker run -d -p 8082:8082 --restart=always -v /root/easynode/db:/easynode/app/db chaoszhu/easynode\n\n### 监控服务\n#安装\n# 使用默认端口22022安装\ncurl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n\n# 使用自定义端口安装, 例如54321\ncurl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash -s -- 54321\n\n#卸载\ncurl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-uninstall.sh | bash\n\n#查看监控服务状态:systemctl status easynode-client \n#查看监控服务日志: journalctl --follow -u easynode-client \n#查看详细日志:journalctl -xe\n```\n\n**docker加速地址**\n\n![[Screenshot_20250717_225309.jpg]]\n\n\ndocker.1ms.run/\n\ndocker run -d -p 4050:80 --restart=always -v /shumengya/tu:/var/www/html docker.1ms.run/oaooa/pichome\n\n\n\n\n\n\n\n", - "Docker/Docker命令集合.md": "\ndocker-compose up -d\n\ndocker-compose down\n\ndocker-compose restart\n\ndocker-compose logs -f\n\ndocker-compose ps \n\ndocker-compose build --no-cache\n\n\n**Docker容器一键更新到最新版镜像(以60s API举例)**\n```bash\n#拉取最新镜像\ndocker pull vikiboss/60s:latest \ndocker pull mlikiowa/napcat-docker:latest\ndocker pull couchdb:latest #Obsidian同步的数据库\ndocker pull aceberg/watchyourlan #扫描局域网的工具\n\ndocker pull dpanel/dpanel:latest\n\n\n#停止并删除旧容器\ndocker stop 60s\ndocker rm 60s\ndocker stop napcat\ndocker rm napcat\n\n#兰空图床免费版\ndocker run -d \\\n --name lsky-pro \\\n -p 8089:80 \\\n -v /shumengya/docker/storage/lsky:/var/www/html \\\n --restart=always \\\n halcyonazure/lsky-pro:latest\n\n\n\n\n\n\n\n\n#可视化Docker面板\ndocker run -d \\\n --name dpanel \\\n -p 8800:8080 \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -v /shumengya/docker/storage/dpanel:/dpanel/data \\\n --restart=always \\\n dpanel/dpanel:latest\n\n\n\n#扫描局域网的工具\ndocker run -d \\\n --name watch-your-lan \\\n --restart unless-stopped \\\n --net=host \\\n -e TZ=Asia/Shanghai \\\n -v /shumengya/docker/storage/watchyourlan:/data \\\n aceberg/watchyourlan\n\n#Obsidian 同步数据库\ndocker run -d \\\n --name obsidian-couchdb \\\n -e COUCHDB_USER=shumengya \\\n -e COUCHDB_PASSWORD='tyh@19900420' \\\n -p 5984:5984 \\\n couchdb:latest\n\n#60s api后端\ndocker run -d \\\n --restart always \\\n --name 60s \\\n -p 4399:4399 \\\n vikiboss/60s:latest\n \n#napcat QQ机器人\ndocker run -d \\\n --name napcat \\\n --restart=always \\\n -e NAPCAT_GID=$(id -g) \\\n -e NAPCAT_UID=$(id -u) \\\n -p 4080:3000 \\\n -p 4070:3001 \\\n -p 4060:6099 \\\n -v /shumengya/docker/storage/napcat/qq:/app/.config/QQ \\\n -v /shumengya/docker/storage/napcat/config:/app/napcat/config \\\n mlikiowa/napcat-docker:latest\n\n\n\n\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "Docker/Docker命令集合.md": "\ndocker-compose up -d\n\ndocker-compose down\n\ndocker-compose restart\n\ndocker-compose logs -f\n\ndocker-compose ps \n\ndocker-compose build --no-cache\n\n\n**Docker容器一键更新到最新版镜像(以60s API举例)**\n```bash\n#拉取最新镜像\n\ndocker pull mlikiowa/napcat-docker:latest\ndocker pull couchdb:latest #Obsidian同步的数据库\ndocker pull aceberg/watchyourlan #扫描局域网的工具\n\ndocker pull dpanel/dpanel:latest\n\n\n#停止并删除旧容器\n\ndocker stop napcat\ndocker rm napcat\n\n#兰空图床免费版\ndocker run -d \\\n --name lsky-pro \\\n -p 8089:80 \\\n -v /shumengya/docker/storage/lsky:/var/www/html \\\n --restart=always \\\n halcyonazure/lsky-pro:latest\n\n\n\n\n\n\n\n\n#可视化Docker面板\ndocker run -d \\\n --name dpanel \\\n -p 8800:8080 \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -v /shumengya/docker/storage/dpanel:/dpanel/data \\\n --restart=always \\\n dpanel/dpanel:latest\n\n\n\n#扫描局域网的工具\ndocker run -d \\\n --name watch-your-lan \\\n --restart unless-stopped \\\n --net=host \\\n -e TZ=Asia/Shanghai \\\n -v /shumengya/docker/storage/watchyourlan:/data \\\n aceberg/watchyourlan\n\n#Obsidian 同步数据库\ndocker run -d \\\n --name obsidian-couchdb \\\n -e COUCHDB_USER=shumengya \\\n -e COUCHDB_PASSWORD='tyh@19900420' \\\n -p 5984:5984 \\\n couchdb:latest\n\n\n \n#napcat QQ机器人\ndocker run -d \\\n --name napcat \\\n --restart=always \\\n -e NAPCAT_GID=$(id -g) \\\n -e NAPCAT_UID=$(id -u) \\\n -p 4080:3000 \\\n -p 4070:3001 \\\n -p 4060:6099 \\\n -v /shumengya/docker/storage/napcat/qq:/app/.config/QQ \\\n -v /shumengya/docker/storage/napcat/config:/app/napcat/config \\\n mlikiowa/napcat-docker:latest\n\n\n\n\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "Docker/Docker镜像快速迁移.md": "\n---\n\n## ✅ 方法一:直接导出容器(container → tar)\n\n如果你运行的是一个 **容器**(而不是镜像),可以直接打包它:\n\n```bash\n# 导出容器\ndocker export <容器ID或名字> -o container.tar\n\n# 在另一台Linux机器上导入\ndocker import container.tar new-image:latest\n```\n\n特点:\n\n- 容器的运行时文件系统会被打包(包含你安装的软件和修改),**但不会包含容器的历史层和环境变量**。\n \n- 类似于“快照”迁移。\n \n\n---\n\n## ✅ 方法二:保存镜像(image → tar)\n\n如果你已经把容器做成了一个镜像,建议用 **save/load**:\n\n```bash\n# 在源主机上保存镜像\ndocker save -o myimage.tar myimage:latest\ndocker save -o frpc-1panel.tar snowdreamtech/frpc:0.63.0\n\n# 拷贝到目标主机(比如用 scp)\nscp myimage.tar user@remote:/path/\n\n# 在目标主机导入\ndocker load -i myimage.tar\n```\n\n特点:\n\n- 保留镜像层和构建历史。\n \n- 推荐这种方式。\n \n\n---\n\n", + "Docker/优秀好用的Docker镜像/60sAPI-一款多功能丰富的后端接口集合.md": "\n```bash\n\n#60s api后端\ndocker run -d \\\n --restart always \\\n --name 60s \\\n -p 4399:4399 \\\n vikiboss/60s:latest\n\n```\n\n```bash\ndocker pull vikiboss/60s:latest \n```\n\n```bash\ndocker stop 60s\ndocker rm 60s\n```", "Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md": "\n```bash\ndocker run -d \\\n --name filecodebox \\\n --restart=always \\\n -p 12345:12345 \\\n -v /shumengya/docker/storage/filecodebox:/app/data \\\n lanol/filecodebox:beta\n\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull lanol/filecodebox:beta\n```\n\n```\ndocker stop lanol/filecodebox:beta\ndocker rm lanol/filecodebox:beta\n```", "Docker/优秀好用的Docker镜像/frp-内网穿透神器.md": "\n```bash\n#启动最新版frp客户端\ndocker run -d \\\n --name frpc \\\n --restart=always \\\n --network host \\\n -v /shumengya/docker/storage/frpc:/etc/frp \\\n -e TZ=Asia/Shanghai \\\n natfrp/frpc:latest \\\n -c /etc/frp/frpc.toml\n\n#启动最新版frp服务端\ndocker run -d \\\n --name frps \\\n --restart=always \\\n --network host \\\n -e TZ=Asia/Tokyo \\\n -v /shumengya/docker/storage/frps:/etc/frp \\\n snowdreamtech/frps:latest \\\n -c /etc/frp/frps.toml\n\n\n```\n\n```bash\n\n```\n\n```\n\n```", "Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md": "\n```bash\n#github/gitlab的本地轻量化部署代替-gitea\ndocker run -d \\\n --name gitea \\\n -p 8989:3000 \\\n -p 8022:22 \\\n -e USER_UID=1000 \\\n -e USER_GID=1000 \\\n -v /shumengya/docker/storage/gitea:/data \\\n --restart=always \\\n gitea/gitea:latest\n\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull gitea/gitea:latest\n```\n\n```\ndocker stop gitea/gitea:latest\ndocker rm gitea/gitea:latest\n```", + "Docker/优秀好用的Docker镜像/kkfileview-文件格式预览大全.md": "\n```bash\n\ndocker run -d \\\n --name kkfileview \\\n -p 8289:8012 \\\n -v /shumengya/docker/storage/kkFileView:/data/file \\\n --restart unless-stopped \\\n keking/kkfileview:latest\n\n\n```\n\n```bash\n\n```\n\n```\n\n```", "Docker/优秀好用的Docker镜像/MongoDB-数据库.md": "\n```bash\n#MongoDB数据库\ndocker run -d --name mongodb \\\n -e MONGO_INITDB_ROOT_USERNAME=shumengya \\\n -e MONGO_INITDB_ROOT_PASSWORD=shumengya520 \\\n -v /shumengya/docker/storage/mongodb:/data/db \\\n -p 27017:27017 \\\n mongo\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull mongo \n```", "Docker/优秀好用的Docker镜像/MySQL-数据库.md": "\n```bash\ndocker run -d \\\n--name mysql_latest \\\n-p 3306:3306 \\\n-v /shumengya/docker/storage/mysql:/var/lib/mysql \\\n-e MYSQL_ROOT_PASSWORD=shumengya520 \\\n--memory=4g \\\n--cpus=4 \\\nmysql:latest\n\n\n\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull mysql:latest\n```\n\n```\ndocker stop mysql\ndocker rm mysql\n```", "Docker/优秀好用的Docker镜像/NapCat-QQ机器人框架.md": "\n```bash\ndocker run -d \\\n --name filecodebox \\\n --restart=always \\\n -p 12345:12345 \\\n -v /shumengya/docker/storage/filecodebox:/app/data \\\n lanol/filecodebox:beta\n\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull lanol/filecodebox:beta\n```\n\n```\ndocker stop lanol/filecodebox:beta\ndocker rm lanol/filecodebox:beta\n```", "Docker/优秀好用的Docker镜像/Ntfy-萌芽通知.md": "\n```bash\ndocker run -d \\\n --name ntfy \\\n --restart=always \\\n -e TZ=\"Asia/Shanghai\" \\\n -e NTFY_BASE_URL=\"https://ntfy.shumengya.top\" \\\n -e NTFY_CACHE_FILE=\"/var/cache/ntfy/cache.db\" \\\n -e NTFY_AUTH_FILE=\"/var/lib/ntfy/auth.db\" \\\n -e NTFY_AUTH_DEFAULT_ACCESS=\"deny-all\" \\\n -e NTFY_BEHIND_PROXY=\"true\" \\\n -e NTFY_ATTACHMENT_CACHE_DIR=\"/var/lib/ntfy/attachments\" \\\n -e NTFY_ENABLE_LOGIN=\"true\" \\\n -v /shumengya/docker/storage/ntfy/cache:/var/cache/ntfy \\\n -v /shumengya/docker/storage/ntfy/etc:/etc/ntfy \\\n -v /shumengya/docker/storage/ntfy/lib:/var/lib/ntfy \\\n -p 82:80 \\\n binwiederhier/ntfy:latest \\\n serve\n\n\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull binwiederhier/ntfy:latest\n```\n\n```\ndocker stop binwiederhier/ntfy:latest\ndocker rm binwiederhier/ntfy:latest\n```", "Docker/优秀好用的Docker镜像/Postgres-数据库.md": "\n```bash\n#postgres数据库\ndocker run -d \\\n --name postgres \\\n -e POSTGRES_PASSWORD=shumengya520 \\\n -e POSTGRES_USER=shumengya \\\n -e POSTGRES_DB=shumengyadb \\\n -v /shumengya/docker/storage/postgres:/data \\\n -e PGDATA=/data/pgdata \\\n -p 5432:5432 \\\n --restart=always \\\n postgres:latest\n\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull postgres:latest\n```\n\n```\ndocker stop postgres:latest\ndocker rm postgres:latest\n```", - "Docker/优秀好用的Docker镜像/Redis-内存数据库.md": "\n```bash\n#Redis数据库\ndocker run -d --name redis-server \\\n -p 6379:6379 \\\n redis:latest \\\n redis-server --requirepass \"shumengya520\"\n\n```\n\n```bash\n\ndocker pull redis\n```", + "Docker/优秀好用的Docker镜像/Redis-内存数据库.md": "\n```bash\n#Redis数据库\ndocker run -d --name redis-server \\\n -p 6379:6379 \\\n -v /shumengya/docker/storage/redis:/data \\\n redis:latest \\\n redis-server --requirepass \"shumengya520\" --appendonly yes\n \ndocker run -d --name redis-server \\\n -p 6379:6379 \\\n -v /shumengya/docker/storage/redis:/data \\\n redis:latest \\\n redis-server --requirepass \"shumengya520\" --appendonly yes --save 900 1 --save 300 10 --save 60 10000\n```\n\n```bash\n\ndocker pull redis\n```", + "Docker/优秀好用的Docker镜像/registry-轻量级自建Docker镜像仓库.md": "\n```bash\n\ndocker run -d \\\n --name registry \\\n --restart always \\\n --cpus=\"1\" \\\n --memory=\"512m\" \\\n --log-opt max-size=1m \\\n --log-opt max-file=3 \\\n -p 5000:5000 \\\n -v /shumengya/docker/storage/registry:/var/lib/registry \\\n -e TZ=Asia/Shanghai \\\n -e REGISTRY_STORAGE_DELETE_ENABLED=true \\\n registry:3.0.0\n\n```\n\n```bash\n\n```\n\n```\n\n```", "Docker/优秀好用的Docker镜像/SurveyKing-强大的问卷调查服务.md": "\n```bash\ndocker run -d \\\n -p 1991:1991 \\\n --memory=4g \\\n --cpus=4 \\\n surveyking/surveyking\n\n\n```\n\n```bash\n\n```\n\n```\n\n```", "Docker/优秀好用的Docker镜像/tailscale-ip-derp.md": "\n```bash\ndocker run -d \\\n--name derper \\\n-p 33445:13477/tcp \\\n-p 3478:3478/udp \\\n-v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \\\n-e DERP_ADDR=\":33445\" \\\n-e DERP_VERIFY_CLIENTS=true \\\nghcr.io/yangchuansheng/ip_derper:latest\n\n\n\n```\n\n```bash\n#典型的非关系型数据库(json)\ndocker pull lanol/filecodebox:beta\n```\n\n```\ndocker stop lanol/filecodebox:beta\ndocker rm lanol/filecodebox:beta\n```", "Docker/优秀好用的Docker镜像/模板.md": "\n```bash\n\n\n\n```\n\n```bash\n\n```\n\n```\n\n```", "Github/Github仓库公共API总结.md": "\n---\n\n## Releases(发行版本)相关接口\n\n- **获取最新发布版本(Latest Release)** \n `GET /repos/{owner}/{repo}/releases/latest` \n 返回最新非预发布、非草稿版的发布详情,包括版本号、发布时间、说明等。([GitHub Docs](https://docs.github.com/en/rest/releases?utm_source=chatgpt.com \"REST API endpoints for releases and release assets\"))\n \n- **列出所有发布版本(List Releases)** \n `GET /repos/{owner}/{repo}/releases` \n 返回该仓库所有发布版本的列表,不包含未关联发布的普通 Git 标签。([GitHub Docs](https://docs.github.com/en/rest/releases/releases?utm_source=chatgpt.com \"REST API endpoints for releases\"))\n \n- **通过 Tag 获取指定发布版本(Get a Release by Tag)** \n `GET /repos/{owner}/{repo}/releases/tags/{tag}` \n 根据具体 tag 名称获取对应发布版本的信息。([GitHub Docs](https://docs.github.com/en/rest/releases?utm_source=chatgpt.com \"REST API endpoints for releases and release assets\"))\n \n- **创建、更新、删除发布版本(Create / Update / Delete Release)**\n \n - `POST /repos/{owner}/{repo}/releases` — 创建新的发布版本\n \n - `PATCH /repos/{owner}/{repo}/releases/{release_id}` — 更新发布版本\n \n - `DELETE /repos/{owner}/{repo}/releases/{release_id}` — 删除发布版本 \n (这些操作通常需要认证权限。)([GitHub Docs](https://docs.github.com/en/rest/releases?utm_source=chatgpt.com \"REST API endpoints for releases and release assets\"))\n \n\n---\n\n## Git Tags(标签)相关接口\n\n- **列出仓库的 Git 标签** \n `GET /repos/{owner}/{repo}/tags` \n 返回该仓库所有标签(包括 lightweight 和 annotated)。([Stack Overflow](https://stackoverflow.com/questions/18384873/how-to-list-the-releases-of-a-repository?utm_source=chatgpt.com \"github - How to list the releases of a repository?\"), [GitHub Docs](https://docs.github.com/en/rest/repos/tags?utm_source=chatgpt.com \"REST API endpoints for repository tags\"))\n \n- **获取标签引用(Tag Reference)** \n `GET /repos/{owner}/{repo}/git/refs/tags/{tag_name}` \n 可获取该标签所对应的对象(TAG_SHA),用于进一步查询。([Stack Overflow](https://stackoverflow.com/questions/72429056/how-to-get-single-tag-information-using-github-api?utm_source=chatgpt.com \"How to get Single tag Information using GitHub Api?\"))\n \n- **获取 Annotated Tag 对象详情** \n `GET /repos/{owner}/{repo}/git/tags/{tag_sha}` \n 获取标签对象的完整信息,包括 `object.sha` 即对应的 commit SHA、tagger、message 等。([Stack Overflow](https://stackoverflow.com/questions/72429056/how-to-get-single-tag-information-using-github-api?utm_source=chatgpt.com \"How to get Single tag Information using GitHub Api?\"))\n \n\n---\n\n## Commits(提交)相关接口\n\n- **列出提交记录(List Commits)** \n `GET /repos/{owner}/{repo}/commits` \n 返回最新的提交列表,第一个通常为最新提交。响应中包含 SHA、作者、提交信息、签名验证信息等。([GitHub Docs](https://docs.github.com/en/rest/commits/commits?utm_source=chatgpt.com \"REST API endpoints for commits\"))\n \n- **获取单个提交详情(Get a Commit)** \n `GET /repos/{owner}/{repo}/commits/{commit_sha}` \n 获取指定提交的详细信息。([GitHub Docs](https://docs.github.com/en/rest/commits?utm_source=chatgpt.com \"REST API endpoints for commits\"))\n \n- **比较两个提交(Compare Commits)** \n `GET /repos/{owner}/{repo}/compare/{base}...{head}` \n 用于比较两个 commit 或两个 tag 之间的差异。([Stack Overflow](https://stackoverflow.com/questions/61359461/get-all-commits-in-a-git-tag-through-github-api-return-only-the-first-commit?utm_source=chatgpt.com \"get all commits in a Git tag through GitHub API return only ...\"))\n \n\n---\n\n## 综合流程示例\n\n下面是一个常见逻辑,例如想获取最新发布对应的 commit SHA:\n\n1. 调用 `GET /repos/{owner}/{repo}/releases/latest` 获取最新 release 的 `tag_name`。\n \n2. 调用 `GET /repos/{owner}/{repo}/git/refs/tags/{tag_name}` 获取 TAG_SHA。\n \n3. 调用 `GET /repos/{owner}/{repo}/git/tags/{tag_sha}` 获取该标签对象的 commit SHA(object.sha)。\n \n\n这套流程常用于从发布版本跳转到对应的 Git 提交。([Stack Overflow](https://stackoverflow.com/questions/67040794/how-can-i-get-the-commit-hash-of-the-latest-release-from-github-api?utm_source=chatgpt.com \"How can I get the commit hash of the latest release from ...\"))\n\n---\n\n## 表格总结\n\n|功能需求|接口路径 / 方法|\n|---|---|\n|最新发布版本信息|`GET /repos/{owner}/{repo}/releases/latest`|\n|列出所有发布版本|`GET /repos/{owner}/{repo}/releases`|\n|通过 tag 查询发布|`GET /repos/{owner}/{repo}/releases/tags/{tag}`|\n|获取标签列表|`GET /repos/{owner}/{repo}/tags`|\n|获取标签引用(TAG_SHA)|`GET /repos/{owner}/{repo}/git/refs/tags/{tag_name}`|\n|获取标签对象详情|`GET /repos/{owner}/{repo}/git/tags/{tag_sha}`|\n|列出提交|`GET /repos/{owner}/{repo}/commits`|\n|获取指定 commit 信息|`GET /repos/{owner}/{repo}/commits/{commit_sha}`|\n|比较两个 commit/tag|`GET /repos/{owner}/{repo}/compare/{base}...{head}`|\n\n---\n\n如果你还希望了解更多,如 API 速率限制、认证方式(匿名 vs token)、分页处理(per_page、page 参数)、使用 GraphQL API 实现同类功能,或具体的 JavaScript `fetch` 调用示例,都可以随时继续讨论!", "Github/Github获取仓库密钥.md": "这个地方要注意:\n\n你输入 `git push` 时出现\n\n```\nUsername for 'https://github.com': shumengya\nPassword for 'https://shumengya@github.com':\n```\n\n这里的 **Password** 已经不是 GitHub 登录密码了。\n从 2021 年 8 月开始,GitHub **禁用了账户密码推送**,必须用 **Personal Access Token (PAT)** 或 **SSH Key** 来认证。\n\n---\n\n### ✅ 方案一:生成 Personal Access Token(HTTPS 推荐)\n\n1. 登录 GitHub → 右上角头像 → **Settings**\n2. 左侧栏 → **Developer settings** → **Personal access tokens** → **Tokens (classic)**\n3. 点击 **Generate new token (classic)**\n\n * 勾选 **repo**(访问和推送仓库必须要有)\n * 设置有效期(比如 90 天或无期限)\n * 点击生成\n4. 复制生成的 Token(只会显示一次)\n\n之后推送时:\n\n* **Username**:填 GitHub 用户名(`shumengya`)\n* **Password**:填刚生成的 Token\n\n---\n\n### ✅ 方案二:改用 SSH Key(更方便)\n\n1. 本地生成 SSH Key:\n\n ```bash\n ssh-keygen -t ed25519 -C \"你的邮箱\"\n ```\n\n 按回车保存,默认会在 `~/.ssh/id_ed25519` 和 `~/.ssh/id_ed25519.pub`。\n2. 查看公钥:\n\n ```bash\n cat ~/.ssh/id_ed25519.pub\n ```\n3. 复制内容 → GitHub → **Settings → SSH and GPG keys → New SSH key** → 粘贴保存。\n4. 修改仓库地址为 SSH:\n\n ```bash\n git remote set-url origin git@github.com:shumengya/你的仓库名.git\n ```\n5. 之后直接 `git push` 就不用输密码了。\n\n---\n\n👉 建议你选 **SSH Key**,因为用一次就永久生效,不会过期。\n\n要不要我给你写一份 **完整 SSH Key 配置和测试流程**(从生成到验证)?\n\n", + "Github/Git常用命令.md": "```shell\r\ngit remote add origin \r\ngit remote add origin https://github.com/shumengya6666666/Pixel-plane-wars.git\r\ngit remote add origin git@github.com:shumengya6666666/Pixel-plane-wars.git\r\ngit remote set-url origin git@github.com:shumengya6666666/Pixel-plane-wars.git\r\ngit clone git@github.com:shumengya6666666/Pixel-plane-wars.git\r\ngit remote add origin git@github.com:shumengya6666666/Pixel-Odyssey.git\r\ngit push -u origin main\r\ngit remote add origin git@github.com:shumengya6666666/Sprout-Farm.git\r\ngit remote set-url origin git@github.com:shumengya6666666/Sprout-Farm.git\r\ngit push -u origin master\r\ngit remote add origin git@github.com:shumengya6666666/Pixel-plane-wars.git\r\n```\r\n\r\n", + "Github/Git提交临时禁用https.md": "在 Git 中临时禁用 HTTPS 证书认证(主要用于解决自签名证书、证书过期或不可信证书导致的连接问题),可以通过修改 Git 的 http.sslVerify 配置实现\n\n### **1. 单次命令临时禁用(推荐)**\n在执行具体 Git 命令(如 clone、pull、push 等)时,通过 -c 参数临时指定禁用 SSL 验证,仅对当前命令生效:\n\n```bash\n# 示例1:克隆仓库时临时禁用\ngit clone -c http.sslVerify=false https://远程仓库地址.git\n# 示例2:拉取代码时临时禁用\ngit pull -c http.sslVerify=false origin 分支名\n# 示例3:推送代码时临时禁用\ngit push -c http.sslVerify=false origin 分支名\n```\n\n### **2. 当前仓库临时禁用(有效期至手动恢复)**\n如果需要在当前仓库中临时禁用(多次操作生效),可修改当前仓库的局部配置:\n\n```bash\n# 进入仓库目录后执行,禁用当前仓库的HTTPS证书验证\ngit config http.sslVerify false\n# 此时执行 pull/push 等操作会跳过证书验证\ngit pull origin 分支名\n```\n\n**使用完毕后务必恢复验证**(避免长期暴露风险):\n\n```bash\n# 恢复当前仓库的HTTPS证书验证(默认值)\ngit config http.sslVerify true\n```\n\n### **3. 全局临时禁用(不推荐,影响所有仓库)**\n如果需要对所有仓库临时禁用(不建议,风险较高),可修改全局配置:\n\n```bash\n# 全局禁用(所有仓库生效)\ngit config --global http.sslVerify false\n# 恢复全局默认设置\ngit config --global http.sslVerify true\n```\n\n", "Github/Linux下使用git探索.md": "**修改全局代理为http1**\n```\ngit config --global http.version HTTP/1.1\n```\n\n**相当于 git fetch + git merge,会把远程最新提交合并到你当前分支。**\n```\ngit pull\n```\n\n**这会把你的本地提交临时“挪开”,先更新远程提交,然后再把你的提交放回去,避免多余的合并记录。**\n```\ngit pull --rebase\n```\n\n**如果只想下载最新提交但不合并**\n```\ngit fetch\n```\n\n**树萌芽GitHub仓库提交代码通用密钥:**\n```\n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\n```\n\n### 1. 添加所有改动\n```\ngit add .\n```\n### 2. 提交,写上提交说明\n```\ngit commit -m \"更新说明\"\n```\n### 3. 推送到远程仓库(假设分支是 main)\n```\ngit push origin main\n```\n\n\n**压缩成一条命令实现:**\n```\ngit add . && git commit -m \"update\" && git push origin main\n```\n\n**或者设置命令别名,比如写进 ~/.bashrc 或 ~/.zshrc:**\n```\nalias gopush='git add . && git commit -m \"update\" && git push origin main'\n```\n\n\n注意:校园网可能会屏蔽梯子,必要时开热点提交\n\n", "Github/linux常用git命令.md": "下面给你整理了一份 **Linux 下常用的 Git 命令速查表**,涵盖从初始化到协作的常见操作:\n\n---\n\n## 🔹 基础配置\n\n```bash\ngit config --global user.name \"你的名字\" # 设置用户名\ngit config --global user.email \"你的邮箱\" # 设置邮箱\ngit config --global core.editor \"vim\" # 设置默认编辑器\ngit config --list # 查看当前配置 \n```\n\n---\n\n## 🔹 仓库初始化与克隆\n\n```bash\ngit init # 初始化一个本地仓库\ngit clone # 克隆远程仓库\ngit clone myproj # 克隆并重命名文件夹\n```\n\n---\n\n## 🔹 文件操作\n\n```bash\ngit status # 查看仓库当前状态\ngit add # 添加文件到暂存区\ngit add . # 添加所有修改到暂存区\ngit reset # 从暂存区撤销已添加的文件\ngit rm # 删除文件并记录到暂存区\ngit mv old new # 重命名文件并记录到暂存区\n```\n\n---\n\n## 🔹 提交相关\n\n```bash\ngit commit -m \"说明\" # 提交暂存区到仓库\ngit commit -am \"说明\" # 添加修改并提交(跳过 git add)\ngit log # 查看提交历史\ngit log --oneline --graph # 图形化查看分支提交记录\n```\n\n---\n\n## 🔹 分支操作\n\n```bash\ngit branch # 查看分支\ngit branch # 创建分支\ngit checkout # 切换分支\ngit checkout -b # 新建并切换分支\ngit merge # 合并分支到当前分支\ngit branch -d # 删除分支\n```\n\n---\n\n## 🔹 远程仓库\n\n```bash\ngit remote -v # 查看远程仓库地址\ngit remote add origin # 添加远程仓库\ngit remote remove origin # 删除远程仓库\ngit push origin master # 推送 master 分支到远程\ngit push -u origin # 推送并设置默认分支\ngit pull origin master # 拉取远程更新并合并\ngit fetch origin # 抓取远程分支(不合并)\n```\n\n---\n\n## 🔹 回退与撤销\n\n```bash\ngit checkout -- # 撤销工作区修改\ngit reset HEAD # 取消暂存区文件\ngit reset --hard HEAD~1 # 回退到上一个提交\ngit revert # 撤销指定提交,生成新提交\n```\n\n---\n\n## 🔹 标签管理\n\n```bash\ngit tag # 查看标签\ngit tag v1.0 # 打标签\ngit tag -a v1.0 -m \"说明\" # 创建附注标签\ngit push origin v1.0 # 推送标签到远程\ngit push origin --tags # 推送所有标签\n```\n\n---\n\n## 🔹 常用技巧\n\n```bash\ngit stash # 临时保存修改\ngit stash pop # 恢复最近一次保存\ngit diff # 查看未暂存的修改\ngit diff --cached # 查看已暂存的修改\n```\n\n---\n\n\n", "LeetCode/力扣-两数之和详解.md": "两数之和问题 - 详细运算过程解析\n\n算法思路回顾\n\n使用哈希表(字典)来存储已经遍历过的数字及其索引,对于每个当前数字,计算其与目标值的差值(补数),并检查该补数是否已经在哈希表中存在。\n\n详细运算过程\n\n让我们通过一个具体例子来详细解析算法的执行过程:\n\n示例: nums = [2, 7, 11, 15], target = 9\n\n初始化阶段\n\n```python\nnum_map = {} # 创建一个空字典用于存储数字和索引的映射\n```\n\n第一次迭代 (i=0, num=2)\n\n1. 计算补数:complement = target - num = 9 - 2 = 7\n2. 检查补数7是否在num_map中:7 in num_map → 结果为False(因为字典为空)\n3. 将当前数字和索引存入字典:num_map[2] = 0\n4. 此时字典状态:{2: 0}\n\n第二次迭代 (i=1, num=7)\n\n1. 计算补数:complement = target - num = 9 - 7 = 2\n2. 检查补数2是否在num_map中:2 in num_map → 结果为True(因为字典中有键2)\n3. 找到匹配,返回结果:[num_map[2], 1] → [0, 1]\n4. 算法结束,返回结果[0, 1]\n\n运算过程可视化\n\n迭代次数 当前索引(i) 当前值(num) 补数(complement) 补数是否在num_map中 num_map更新 操作说明\n1 0 2 7 否 {2:0} 将2和索引0存入字典\n2 1 7 2 是 - 找到匹配,返回[0,1]\n\n关键点解析\n\n1. 补数计算:对于每个数字,计算target - num得到补数,这个补数就是我们需要在之前遍历过的数字中寻找的值。\n2. 哈希表的作用:哈希表用于存储已经遍历过的数字及其索引,这样可以在O(1)时间内检查补数是否存在。\n3. 顺序重要性:算法先检查补数是否存在,然后再将当前数字存入字典,这样可以确保不会使用同一个元素两次。\n4. 时间复杂度:每个元素只被访问一次,哈希表的插入和查找操作平均时间复杂度为O(1),因此总时间复杂度为O(n)。\n5. 空间复杂度:最坏情况下需要存储所有n个元素,因此空间复杂度为O(n)。\n\n为什么这种方法有效?\n\n这种方法有效的关键在于利用了数学关系:如果a + b = target,那么target - a = b。通过存储已经遍历过的数字,我们可以快速检查当前数字的补数是否已经出现过。\n\n这种方法比暴力解法(双重循环)高效得多,将时间复杂度从O(n²)降低到O(n),是典型的\"以空间换时间\"策略。\n\n边界情况处理\n\n虽然题目保证有解,但实际应用中可能需要考虑无解的情况。我们的代码在无解时会返回空列表,这是一种合理的处理方式。\n\n这种算法设计简洁高效,是解决两数之和问题的标准方法,被广泛应用于各种编程面试和实际开发中。", "LeetCode/力扣1-两数相加问题.md": "两数相加问题\n\n问题描述\n\n给定两个非空链表,表示两个非负整数。每位数字按照逆序方式存储,每个节点存储一位数字。将两个数相加,并以相同形式返回表示和的链表。\n\n假设除了数字0之外,这两个数都不会以0开头。\n\n示例\n\n示例 1:\n\n```\n输入:l1 = [2,4,3], l2 = [5,6,4]\n输出:[7,0,8]\n解释:342 + 465 = 807\n```\n\n示例 2:\n\n```\n输入:l1 = [0], l2 = [0]\n输出:[0]\n```\n\n示例 3:\n\n```\n输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]\n输出:[8,9,9,9,0,0,0,1]\n```\n\n提示\n\n· 每个链表中的节点数在范围 [1, 100] 内\n· 0 <= Node.val <= 9\n· 题目数据保证列表表示的数字不含前导零\n\n方法思路\n\n问题分析\n\n两个链表表示的数字是逆序存储的,即链表的头节点表示个位数,第二个节点表示十位数,以此类推。我们需要模拟加法运算,从低位到高位逐位相加,并处理进位问题。\n\n算法选择\n\n· 使用一个虚拟头节点(dummy node)简化链表操作\n· 同时遍历两个链表,逐位相加并处理进位\n· 如果链表长度不同,较短链表的缺失位视为0\n· 最后如果还有进位,需要额外创建一个节点\n\n算法步骤\n\n1. 初始化虚拟头节点和当前指针\n2. 初始化进位值为0\n3. 同时遍历两个链表,直到两个链表都遍历完且没有进位\n4. 计算当前位的和:两个链表当前节点的值加上进位\n5. 计算新的进位和当前位的值\n6. 创建新节点并连接到结果链表\n7. 移动所有指针到下一个位置\n8. 返回虚拟头节点的下一个节点\n\n复杂度分析\n\n· 时间复杂度:O(max(m, n)),其中m和n分别是两个链表的长度\n· 空间复杂度:O(max(m, n)),结果链表的长度最多为max(m, n) + 1\n\n解决代码\n\n```python\n# Definition for singly-linked list.\nclass ListNode:\n def __init__(self, val=0, next=None):\n self.val = val\n self.next = next\n\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n \"\"\"\n 将两个逆序存储的数字链表相加,返回结果链表\n \n 参数:\n l1: ListNode - 第一个数字链表\n l2: ListNode - 第二个数字链表\n \n 返回:\n ListNode - 相加结果的链表\n \"\"\"\n dummy = ListNode(0) # 虚拟头节点\n current = dummy # 当前指针\n carry = 0 # 进位值\n \n # 遍历两个链表,直到两个链表都为空且没有进位\n while l1 or l2 or carry:\n # 获取当前节点的值,如果节点为空则为0\n val1 = l1.val if l1 else 0\n val2 = l2.val if l2 else 0\n \n # 计算当前位的和\n total = val1 + val2 + carry\n carry = total // 10 # 计算进位\n digit = total % 10 # 计算当前位的值\n \n # 创建新节点并连接到结果链表\n current.next = ListNode(digit)\n current = current.next\n \n # 移动到下一个节点\n if l1:\n l1 = l1.next\n if l2:\n l2 = l2.next\n \n return dummy.next # 返回结果链表的头节点\n```\n\n代码解释\n\n1. 链表节点定义:ListNode类定义了链表节点的结构,包含值val和指向下一个节点的指针next。\n2. 初始化:\n · 创建虚拟头节点dummy,简化链表操作\n · 设置当前指针current指向虚拟头节点\n · 初始化进位carry为0\n3. 循环处理:\n · 使用while循环遍历两个链表,直到两个链表都遍历完且没有进位\n · 循环条件l1 or l2 or carry确保处理所有情况\n4. 获取当前值:\n · 如果链表节点存在,获取其值;否则视为0\n · 这样可以处理链表长度不同的情况\n5. 计算和与进位:\n · 计算当前位的总和:val1 + val2 + carry\n · 计算新的进位:total // 10\n · 计算当前位的值:total % 10\n6. 创建新节点:\n · 根据当前位的值创建新节点\n · 将新节点连接到结果链表\n · 移动当前指针到新节点\n7. 移动指针:\n · 如果链表还有节点,移动到下一个节点\n · 这样可以继续处理后续位\n8. 返回结果:\n · 返回虚拟头节点的下一个节点,即结果链表的头节点\n · 虚拟头节点简化了链表操作,避免处理空链表的情况\n\n示例验证\n\n以示例1为例:l1 = [2,4,3] (表示342),l2 = [5,6,4] (表示465)\n\n1. 个位:2 + 5 = 7,进位0 → 结果个位7\n2. 十位:4 + 6 = 10,进位1 → 结果十位0\n3. 百位:3 + 4 + 1 = 8,进位0 → 结果百位8\n\n最终结果为[7,0,8] (表示807),符合预期。\n\n这种方法高效地处理了链表相加的问题,考虑了所有边界情况,包括链表长度不同和最后有进位的情况。", - "LeetCode/力扣2-两数之和.md": "两数之和问题\n\n问题描述\n\n给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。\n\n你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。\n\n示例 1:\n\n```\n输入:nums = [2,7,11,15], target = 9\n输出:[0,1]\n解释:因为 nums[0] + nums[1] == 9,返回 [0, 1]。\n```\n\n示例 2:\n\n```\n输入:nums = [3,2,4], target = 6\n输出:[1,2]\n```\n\n示例 3:\n\n```\n输入:nums = [3,3], target = 6\n输出:[0,1]\n```\n\n提示:\n\n· 2 <= nums.length <= 10^4\n· -10^9 <= nums[i] <= 10^9\n· -10^9 <= target <= 10^9\n· 只会存在一个有效答案\n\n方法思路\n\n1. 问题分析\n\n我们需要在数组中找到两个不同的元素,它们的和等于目标值。由于数组可能很大,暴力解法(双重循环)的时间复杂度为O(n²),效率太低。\n\n2. 算法选择\n\n使用哈希表来存储每个元素及其索引,这样可以在O(1)时间内检查目标值与当前元素的差值是否存在于哈希表中。\n\n3. 算法步骤\n\n1. 初始化一个空哈希表(字典)\n2. 遍历数组中的每个元素及其索引\n3. 对于每个元素,计算目标值与当前元素的差值(补数)\n4. 检查该差值是否已存在于哈希表中\n5. 如果存在,返回当前索引和差值的索引\n6. 如果不存在,将当前元素及其索引存入哈希表\n\n4. 复杂度分析\n\n· 时间复杂度:O(n),只需遍历数组一次\n· 空间复杂度:O(n),用于存储哈希表\n\n解决代码\n\n```python\ndef twoSum(nums, target):\n \"\"\"\n 在给定数组中找出和为目标值的两个整数的索引\n \n 参数:\n nums: List[int] - 整数数组\n target: int - 目标值\n \n 返回:\n List[int] - 两个整数的索引列表\n \"\"\"\n num_map = {} # 创建空字典存储数字和索引的映射\n for i, num in enumerate(nums): # 遍历数组,获取索引和数值\n complement = target - num # 计算补数\n if complement in num_map: # 检查补数是否在字典中\n return [num_map[complement], i] # 如果在,返回两个索引\n num_map[num] = i # 如果不在,将当前数字和索引存入字典\n return [] # 如果没有找到,返回空列表(但题目保证有解,所以不会执行到这里)\n```\n\n代码解释\n\n1. 初始化哈希表:num_map 用于存储元素值到索引的映射\n2. 遍历数组:使用 enumerate 函数同时获取元素的索引 i 和数值 num\n3. 计算补数:对于每个 num,计算 complement = target - num\n4. 检查补数是否存在:如果补数存在于哈希表中,说明找到了两个数,返回它们的索引\n5. 存储当前元素:如果补数不存在,将当前元素及其索引存入哈希表,以便后续查找\n6. 返回结果:如果遍历结束仍未找到,返回空列表(但题目保证有解,所以不会执行到此)\n\n这种方法确保了高效查找,适用于大规模数据输入,是解决此类问题的标准方法。", - "Linux/busybox v1.36命令简介.md": "以下是针对 **BusyBox** 中每条命令的简要说明:\r\n\r\n1. **[**:测试表达式的真假。\r\n2. **[[**:增强版的条件测试命令。\r\n3. **acpid**:管理系统的 ACPI 事件。\r\n4. **adjtimex**:调整系统时间。\r\n5. **ar**:创建、修改、提取归档文件。\r\n6. **arch**:显示机器架构类型。\r\n7. **arp**:显示或修改 ARP 缓存。\r\n8. **arping**:向网络发送 ARP 请求。\r\n9. **ascii**:显示 ASCII 表。\r\n10. **ash**:一个轻量级的 shell。\r\n11. **awk**:强大的文本处理工具。\r\n12. **base32**:以 Base32 编码格式进行数据转换。\r\n13. **base64**:以 Base64 编码格式进行数据转换。\r\n14. **basename**:从路径中提取文件名。\r\n15. **bbconfig**:配置 BusyBox。\r\n16. **beep**:产生蜂鸣声。\r\n17. **blkdiscard**:丢弃磁盘块。\r\n18. **blkid**:显示块设备的标识。\r\n19. **blockdev**:对块设备进行操作。\r\n20. **brctl**:管理网桥接口。\r\n21. **bunzip2**:解压 `.bz2` 格式文件。\r\n22. **bzcat**:查看 `.bz2` 格式文件内容。\r\n23. **bzip2**:压缩文件为 `.bz2` 格式。\r\n24. **cal**:显示日历。\r\n25. **cat**:连接文件并显示内容。\r\n26. **chat**:发送控制字符以进行调制解调器通信。\r\n27. **chattr**:改变文件的属性。\r\n28. **chcon**:改变文件的 SELinux 上下文。\r\n29. **chgrp**:改变文件的组。\r\n30. **chmod**:改变文件的权限。\r\n31. **chown**:改变文件的拥有者。\r\n32. **chroot**:改变根目录。\r\n33. **chrt**:操作进程的调度策略。\r\n34. **chvt**:切换虚拟终端。\r\n35. **cksum**:计算文件的校验和。\r\n36. **clear**:清除终端屏幕。\r\n37. **cmp**:比较两个文件。\r\n38. **comm**:比较两个已排序文件的内容。\r\n39. **conspy**:查看控制台的输出。\r\n40. **cp**:复制文件。\r\n41. **cpio**:创建、解压 cpio 格式归档。\r\n42. **crc32**:计算 CRC32 校验和。\r\n43. **crond**:周期性执行任务的守护进程。\r\n44. **crontab**:编辑 cron 表。\r\n45. **cttyhack**:改变控制终端。\r\n46. **cut**:按列剪切文本。\r\n47. **date**:显示或设置系统日期和时间。\r\n48. **dc**:计算器程序。\r\n49. **dd**:转换和复制文件。\r\n50. **deallocvt**:释放虚拟终端。\r\n51. **depmod**:生成内核模块依赖关系。\r\n52. **devmem**:访问物理内存。\r\n53. **df**:显示文件系统的磁盘空间使用情况。\r\n54. **dhcprelay**:转发 DHCP 请求。\r\n55. **diff**:比较文件的不同之处。\r\n56. **dirname**:获取路径的目录部分。\r\n57. **dmesg**:显示内核的消息缓冲区内容。\r\n58. **dnsd**:轻量级 DNS 服务器。\r\n59. **dnsdomainname**:显示域名。\r\n60. **dos2unix**:转换 DOS 格式文本为 Unix 格式。\r\n61. **du**:显示磁盘使用情况。\r\n62. **dumpkmap**:转储键盘映射。\r\n63. **dumpleases**:显示 DHCP 租约。\r\n64. **echo**:显示一行文本。\r\n65. **ed**:文本编辑器。\r\n66. **egrep**:扩展正则表达式的 grep 命令。\r\n67. **eject**:弹出光盘。\r\n68. **env**:显示或设置环境变量。\r\n69. **ether-wake**:发送 Wake-on-LAN 魔术包。\r\n70. **expand**:将制表符转换为空格。\r\n71. **expr**:计算表达式的值。\r\n72. **factor**:因数分解。\r\n73. **fakeidentd**:模拟 identd 服务。\r\n74. **false**:返回失败状态。\r\n75. **fatattr**:显示或修改 FAT 文件系统的属性。\r\n76. **fbset**:设置帧缓冲设备的参数。\r\n77. **fbsplash**:管理帧缓冲启动画面。\r\n78. **fdflush**:刷新文件描述符。\r\n79. **fdformat**:格式化软盘。\r\n80. **fdisk**:管理磁盘分区。 \r\n81. **fgconsole**:切换到指定的虚拟终端。\r\n82. **fgrep**:固定字符串搜索工具。\r\n83. **find**:搜索文件。\r\n84. **findfs**:查找文件系统。\r\n85. **flash_eraseall**:擦除闪存设备。\r\n86. **flash_lock**:锁定闪存设备。\r\n87. **flash_unlock**:解锁闪存设备。\r\n88. **flock**:对文件进行锁定。\r\n89. **fold**:折叠文本行。\r\n90. **free**:显示内存使用情况。\r\n91. **freeramdisk**:释放 RAM 磁盘。\r\n92. **fsck**:检查文件系统的完整性。\r\n93. **fsck.minix**:检查 Minix 文件系统。\r\n94. **fsfreeze**:冻结文件系统以进行备份。\r\n95. **fstrim**:修剪未使用的磁盘空间。\r\n96. **fsync**:强制磁盘同步。\r\n97. **ftpd**:启动 FTP 服务器。\r\n98. **ftpget**:下载文件通过 FTP。\r\n99. **ftpput**:上传文件通过 FTP。\r\n100. **fuser**:显示正在使用某个文件的进程。\r\n101. **getenforce**:显示 SELinux 的状态。\r\n102. **getopt**:解析命令行选项。\r\n103. **grep**:搜索文本中的模式。\r\n104. **groups**:显示用户所属的组。\r\n105. **gunzip**:解压 `.gz` 文件。\r\n106. **gzip**:压缩文件为 `.gz` 格式。\r\n107. **hd**:显示硬盘的分区信息。\r\n108. **hdparm**:设置硬盘参数。\r\n109. **head**:显示文件的开头部分。\r\n110. **hexdump**:以十六进制格式显示文件内容。\r\n111. **hexedit**:编辑十六进制文件。\r\n112. **hostname**:显示或设置主机名。\r\n113. **httpd**:启动 HTTP 服务器。\r\n114. **hush**:一个小型 shell。\r\n115. **hwclock**:访问硬件时钟。\r\n116. **id**:显示用户和组信息。\r\n117. **ifconfig**:配置网络接口。\r\n118. **ifdown**:关闭网络接口。\r\n119. **ifenslave**:配置链路聚合。\r\n120. **ifplugd**:监控网络接口的连接状态。\r\n121. **ifup**:启用网络接口。\r\n122. **inetd**:启动网络服务守护进程。\r\n123. **inotifyd**:启动文件系统事件监控。\r\n124. **insmod**:加载内核模块。\r\n125. **install**:复制文件并设置权限。\r\n126. **ionice**:设置进程的 I/O 优先级。\r\n127. **iostat**:显示 CPU 和 I/O 统计信息。\r\n128. **ip**:配置网络接口和路由。\r\n129. **ipaddr**:显示或设置 IP 地址。\r\n130. **ipcalc**:计算和显示 IP 地址信息。\r\n131. **ipcrm**:删除共享内存、消息队列、信号量。\r\n132. **ipcs**:显示进程间通信的状态。\r\n133. **iplink**:管理网络接口的状态。\r\n134. **ipneigh**:显示邻居表。\r\n135. **iproute**:管理路由表。\r\n136. **iprule**:显示或管理路由规则。\r\n137. **iptunnel**:配置 IP 隧道。\r\n138. **kbd_mode**:设置键盘模式。\r\n139. **kill**:终止进程。\r\n140. **killall**:终止指定名称的所有进程。\r\n141. **killall5**:终止所有进程。\r\n142. **klogd**:内核日志守护进程。\r\n143. **less**:分页显示文件内容。\r\n144. **link**:创建硬链接。\r\n145. **ln**:创建硬链接或符号链接。\r\n146. **loadfont**:加载字体。\r\n147. **loadkmap**:加载键盘映射。\r\n148. **logread**:显示日志文件内容。\r\n149. **losetup**:管理环回设备。\r\n150. **ls**:列出目录内容。\r\n\r\n继续接着之前的命令列表进行总结:\r\n\r\n151. **lsattr**:显示文件的属性。\r\n\r\n152. **lsmod**:显示加载的内核模块。\r\n\r\n153. **lsof**:列出打开的文件。\r\n\r\n154. **lspci**:显示所有 PCI 设备。\r\n\r\n155. **lsscsi**:显示 SCSI 设备信息。\r\n\r\n156. **lsusb**:列出 USB 设备。\r\n\r\n157. **lzcat**:解压 `.lz` 文件并显示内容。\r\n\r\n158. **lzma**:压缩文件为 `.lzma` 格式。\r\n\r\n159. **lzop**:快速的文件压缩工具。\r\n\r\n160. **lzopcat**:查看 `.lzo` 格式文件内容。\r\n\r\n161. **makedevs**:创建设备节点。\r\n\r\n162. **makemime**:生成 MIME 类型文件。\r\n\r\n163. **man**:查看手册页(如果有)。\r\n\r\n164. **md5sum**:计算文件的 MD5 校验和。\r\n\r\n165. **mesg**:控制终端消息的接收。\r\n\r\n166. **microcom**:串行通信工具。\r\n\r\n167. **mim**:提取文件的 MIME 类型。\r\n\r\n168. **mkdir**:创建目录。\r\n\r\n169. **mkdosfs**:创建 FAT 文件系统。\r\n\r\n170. **mke2fs**:创建 ext2 文件系统。\r\n\r\n171. **mkfifo**:创建命名管道。\r\n\r\n172. **mkfs.ext2**:创建 ext2 文件系统。\r\n\r\n173. **mkfs.minix**:创建 Minix 文件系统。\r\n\r\n174. **mkfs.reiser**:创建 Reiser 文件系统。\r\n\r\n175. **mkfs.vfat**:创建 VFAT 文件系统。\r\n\r\n176. **mknod**:创建块设备或字符设备文件。\r\n\r\n177. **mkswap**:创建交换分区。\r\n\r\n178. **mktemp**:创建临时文件。\r\n\r\n179. **modinfo**:显示内核模块的信息。\r\n\r\n180. **modprobe**:加载或卸载内核模块。\r\n\r\n181. **more**:分页显示文件内容。\r\n\r\n182. **mount**:挂载文件系统。\r\n\r\n183. **mountpoint**:检查是否为挂载点。\r\n\r\n184. **mpstat**:显示 CPU 使用统计信息。\r\n\r\n185. **mv**:移动或重命名文件。\r\n\r\n186. **nameif**:根据 MAC 地址设置网络接口名称。\r\n\r\n187. **nanddump**:转储 NAND 闪存的内容。\r\n\r\n188. **nandwrite**:将数据写入 NAND 闪存。\r\n\r\n189. **nbd-client**:连接到网络块设备。\r\n\r\n190. **nc**:Netcat 工具,用于读写网络连接。\r\n\r\n191. **netstat**:显示网络连接状态。\r\n\r\n192. **nice**:调整进程的优先级。\r\n\r\n193. **nl**:显示带有行号的文件内容。\r\n\r\n194. **nmeter**:网络带宽监控工具。\r\n\r\n195. **nohup**:在后台运行命令并忽略挂起信号。\r\n\r\n196. **nologin**:禁止用户登录。\r\n\r\n197. **nsenter**:进入其他命名空间。\r\n\r\n198. **nslookup**:查询 DNS 信息。\r\n\r\n199. **nuke**:终止所有与特定进程相关的网络连接。\r\n\r\n200. **od**:以不同格式显示文件内容(如十六进制)。\r\n\r\n201. **openvt**:在指定的虚拟终端上运行命令。\r\n\r\n202. **partprobe**:通知操作系统重新读取分区表。\r\n\r\n203. **paste**:合并多个文件按列显示。\r\n\r\n204. **patch**:应用补丁文件。\r\n\r\n205. **pgrep**:查找匹配指定模式的进程。\r\n\r\n206. **pidof**:查找指定进程的 PID。\r\n\r\n207. **ping**:向网络主机发送 ICMP 请求。\r\n\r\n208. **ping6**:向网络主机发送 ICMPv6 请求。\r\n\r\n209. **pipe_progress**:显示管道中的数据传输进度。\r\n\r\n210. **pivot_root**:更改文件系统根目录。\r\n\r\n211. **pkill**:根据进程名终止进程。\r\n\r\n212. **pmap**:显示进程的内存映射。\r\n\r\n213. **popmaildir**:从邮件目录中获取邮件。\r\n\r\n214. **poweroff**:关闭计算机。\r\n\r\n215. **powertop**:用于优化电源管理的工具。\r\n\r\n216. **printenv**:显示所有环境变量。\r\n\r\n217. **printf**:格式化并输出文本。\r\n\r\n218. **ps**:显示当前进程信息。\r\n\r\n219. **pscan**:扫描当前进程的状态。\r\n\r\n220. **pstree**:以树形结构显示进程。\r\n\r\n221. **pwd**:显示当前工作目录。\r\n\r\n222. **pwdx**:显示指定进程的工作目录。\r\n\r\n223. **raidautorun**:自动启动 RAID 配置。\r\n\r\n224. **rdate**:同步时间。\r\n\r\n225. **rdev**:显示或设置设备的特殊属性。\r\n\r\n226. **readlink**:显示符号链接的目标。\r\n\r\n227. **readprofile**:读取并显示应用的性能配置。\r\n\r\n228. **realpath**:返回文件的绝对路径。\r\n\r\n229. **reboot**:重启系统。\r\n\r\n230. **reformime**:转换 MIME 格式。\r\n\r\n231. **renice**:改变进程的优先级。\r\n\r\n232. **reset**:重置终端。\r\n\r\n233. **resize**:调整终端大小。\r\n\r\n234. **resume**:恢复挂起的进程。\r\n\r\n235. **rev**:反转每行文本。\r\n\r\n236. **rfkill**:管理无线设备的开关。\r\n\r\n237. **rm**:删除文件。\r\n\r\n238. **rmdir**:删除空目录。\r\n\r\n239. **rmmod**:卸载内核模块。\r\n\r\n240. **route**:显示或修改路由表。\r\n\r\n241. **rtcwake**:设置系统的 RTC 来定时唤醒。\r\n\r\n242. **run-init**:运行初始化程序。\r\n\r\n243. **run-parts**:按顺序运行目录中的脚本。\r\n\r\n244. **runcon**:设置进程的 SELinux 上下文。\r\n\r\n245. **rx**:接收串口数据。\r\n\r\n246. **script**:记录终端会话。\r\n\r\n247. **scriptreplay**:重放记录的终端会话。\r\n\r\n248. **sed**:流编辑器,用于处理文本数据。\r\n\r\n249. **seedrng**:种子随机数生成器。\r\n\r\n250. **selinuxenabled**:检查 SELinux 是否启用。\r\n\r\n251. **sendmail**:发送电子邮件。\r\n\r\n252. **seq**:生成一个数字序列。\r\n\r\n253. **sestatus**:显示 SELinux 状态。\r\n\r\n254. **setconsole**:设置控制台的终端类型。\r\n\r\n255. **setenforce**:启用或禁用 SELinux 强制模式。\r\n\r\n256. **setfattr**:设置文件的扩展属性。\r\n\r\n257. **setfont**:设置终端的字体。\r\n\r\n258. **setkeycodes**:设置键盘扫描码到键值的映射。\r\n\r\n259. **setlogcons**:设置日志控制台。\r\n\r\n260. **setpriv**:设置进程的特权级别。\r\n\r\n261. **setserial**:设置串口设备的参数。\r\n\r\n262. **setsid**:创建新的会话并运行命令。\r\n\r\n263. **setuidgid**:设置进程的用户和组标识。\r\n\r\n264. **sh**:启动一个新的 shell。\r\n\r\n265. **sha1sum**:计算文件的 SHA-1 校验和。\r\n\r\n266. **sha256sum**:计算文件的 SHA-256 校验和。\r\n\r\n267. **sha3sum**:计算文件的 SHA-3 校验和。\r\n\r\n268. **sha512sum**:计算文件的 SHA-512 校验和。\r\n\r\n269. **showkey**:显示键盘输入的键值。\r\n\r\n270. **shred**:擦除文件,防止数据恢复。\r\n\r\n271. **shuf**:随机排列输入行。\r\n\r\n272. **slattach**:设置串行连接。\r\n\r\n273. **sleep**:暂停一段时间。\r\n\r\n274. **smemcap**:设置进程内存使用限制。\r\n\r\n275. **sort**:按行排序文本文件。\r\n\r\n276. **split**:将文件分割成多个小文件。\r\n\r\n277. **ssl_client**:通过 SSL 连接远程主机。\r\n\r\n278. **start-stop-daemon**:启动或停止后台守护进程。\r\n\r\n279. **stat**:显示文件或文件系统的状态。\r\n\r\n280. **strings**:显示文件中的可打印字符串。\r\n\r\n281. **stty**:设置终端行属性。\r\n\r\n282. **sum**:计算文件的校验和。\r\n\r\n283. **svc**:启动、停止或重启服务。\r\n\r\n284. **svok**:检查服务的状态。\r\n\r\n285. **swapoff**:禁用交换空间。\r\n\r\n286. **swapon**:启用交换空间。\r\n\r\n287. **switch_root**:切换到新的根文件系统。\r\n\r\n288. **sync**:同步文件系统。\r\n\r\n289. **sysctl**:显示或设置内核参数。\r\n\r\n290. **syslogd**:启动系统日志守护进程。\r\n\r\n291. **tac**:反向显示文件内容。\r\n\r\n292. **tail**:显示文件的最后部分。\r\n\r\n293. **tar**:创建和解压 tar 归档。\r\n\r\n294. **tc**:配置网络流量控制。\r\n295. **tcpsvd**:TCP 服务守护进程。\r\n296. **tee**:将输入内容输出到多个文件。\r\n297. **telnet**:远程登录到另一个计算机。\r\n298. **telnetd**:启动 Telnet 服务器。\r\n299. **test**:检查条件的真假。\r\n300. **tftp**:简易的文件传输协议客户端。\r\n301. **tftpd**:TFTP 服务器。\r\n302. **time**:测量命令执行时间。\r\n303. **timeout**:设置命令的超时时间。\r\n304. **top**:显示系统进程信息。\r\n305. **touch**:创建空文件或更新文件的时间戳。\r\n306. **tr**:替换或删除字符。\r\n307. **traceroute**:追踪数据包在网络中的路由。\r\n308. **traceroute6**:追踪 IPv6 数据包的路由。\r\n309. **tree**:以树形结构显示目录内容。\r\n310. **true**:始终返回成功状态。\r\n311. **truncate**:截断文件到指定长度。\r\n312. **ts**:为每行添加时间戳。\r\n313. **tsort**:排序文件中的时间戳。\r\n314. **tty**:显示终端设备名称。\r\n315. **ttysize**:显示终端的大小。\r\n316. **tunctl**:管理 TUN/TAP 网络设备。\r\n317. **tune2fs**:调整 ext2/ext3/ext4 文件系统的参数。\r\n318. **ubiattach**:附加 UBI 设备。\r\n319. **ubidetach**:分离 UBI 设备。\r\n320. **ubimkvol**:创建 UBI 卷。\r\n321. **ubirename**:重命名 UBI 卷。\r\n322. **ubirmvol**:删除 UBI 卷。\r\n323. **ubirsvol**:恢复 UBI 卷。\r\n324. **ubiupdatevol**:更新 UBI 卷的数据。\r\n325. **udhcpc**:DHCP 客户端,用于获取网络配置信息。\r\n326. **udhcpc6**:DHCPv6 客户端。\r\n327. **udhcpd**:DHCP 服务器。\r\n328. **udpsvd**:UDP 服务守护进程。\r\n329. **uevent**:显示系统的 udev 事件。\r\n330. **umount**:卸载文件系统。\r\n331. **uname**:显示系统信息。\r\n332. **uncompress**:解压 `.Z` 格式文件。\r\n333. **unexpand**:将空格转换为制表符。\r\n334. **uniq**:删除重复的行。\r\n335. **unix2dos**:转换 Unix 格式文本为 DOS 格式。\r\n336. **unlink**:删除文件。\r\n337. **unlzma**:解压 `.lzma` 格式文件。\r\n338. **unlzop**:解压 `.lzo` 格式文件。\r\n339. **unshare**:在新命名空间中运行命令。\r\n340. **unxz**:解压 `.xz` 格式文件。\r\n341. **unzip**:解压 `.zip` 文件。\r\n342. **uptime**:显示系统的运行时间和负载。\r\n343. **usleep**:暂停指定的微秒数。\r\n344. **uudecode**:解码 `.uu` 格式文件。\r\n345. **uuencode**:编码文件为 `.uu` 格式。\r\n346. **vconfig**:管理 VLAN 网络接口。\r\n347. **vi**:文本编辑器。\r\n348. **volname**:显示文件系统的卷标。\r\n349. **watch**:定期执行并显示命令输出。\r\n350. **watchdog**:监控系统状态并在需要时重启。\r\n351. **wc**:计算文件的行数、字数和字符数。\r\n352. **wget**:下载文件。\r\n353. **which**:显示可执行文件的路径。\r\n354. **whoami**:显示当前用户的用户名。\r\n355. **whois**:查询域名注册信息。\r\n356. **xargs**:将标准输入转换为命令行参数。\r\n357. **xxd**:创建十六进制转储。\r\n358. **xz**:压缩文件为 `.xz` 格式。\r\n359. **xzcat**:查看 `.xz` 格式文件内容。\r\n360. **yes**:输出指定字符串,通常用来测试管道。\r\n361. **zcat**:查看 `.gz` 格式文件内容。\r\n362. **zcip**:配置 ZCIP 地址。\r\n\r\n这些命令覆盖了文件操作、系统管理、网络配置、进程管理等多个方面,是 BusyBox 在资源受限环境中为用户提供常用功能的集合。\r\n", - "Linux/busybox玩法总结.md": "### 一句命令启动busybox的简单http服务器\r\n\r\n```shell\r\nbusybox httpd -f -p 端口 -h 目录\r\n```\r\n\r\n### 使用 `busybox netstat` 查看端口占用情况\r\n\r\n- `-t`:显示 TCP 连接\r\n- `-u`:显示 UDP 连接\r\n- `-l`:只显示正在监听的端口\r\n- `-n`:显示数字形式的地址和端口号,而不进行域名解析\r\n\r\n```shell\r\nbusybox netstat -tuln\r\n```\r\n\r\n### 启动busybox的ftp服务器\r\n\r\n```shell\r\nbusybox ftp -d 目录 -p 端口\r\nbusybox ftp -d 目录 #默认占用21端口\r\n\r\nsudo mkdir -p 目录\r\nsudo chmod 755 目录\r\n\r\n```\r\n\r\n### 启动 `busybox` 的 Telnet 服务器(不安全的ssh)\r\n\r\n```\r\nbusybox telnetd -l /bin/login\r\nbusybox telnetd -p 2323 -l /bin/login\r\n\r\n```\r\n\r\n", - "Linux/crontab的使用.md": "`crontab` 是一个用于在 Unix 和类 Unix 系统(如 Linux)中设置定时任务的工具。它允许用户根据指定的时间间隔安排脚本或命令的执行。以下是关于 `crontab` 使用方法的详细介绍和示例。\r\n\r\n### 基本概念\r\n`crontab` 的配置文件由一系列行组成,每行代表一个定时任务,其基本格式如下:\r\n```plaintext\r\n* * * * * command\r\n```\r\n这五个 `*` 分别代表分钟(0 - 59)、小时(0 - 23)、日期(1 - 31)、月份(1 - 12)和星期(0 - 7,其中 0 和 7 都代表星期日),`command` 是要执行的命令或脚本。\r\n\r\n### 使用步骤\r\n\r\n#### 1. 编辑 `crontab` 文件\r\n可以使用以下命令编辑当前用户的 `crontab` 文件:\r\n```bash\r\ncrontab -e\r\n```\r\n首次使用时,系统会提示选择一个文本编辑器,选择你熟悉的编辑器(如 `nano` 或 `vim`)即可。\r\n\r\n#### 2. 添加定时任务\r\n在打开的 `crontab` 文件中添加定时任务,下面是一些具体的示例:\r\n\r\n##### 示例 1:每分钟执行一次命令\r\n```plaintext\r\n* * * * * /usr/bin/echo \"This is a test\" >> /tmp/test.log\r\n```\r\n这个任务会每分钟执行一次,将 `\"This is a test\"` 追加到 `/tmp/test.log` 文件中。\r\n\r\n##### 示例 2:每小时的第 30 分钟执行一次命令\r\n```plaintext\r\n30 * * * * /usr/bin/backup_script.sh\r\n```\r\n这个任务会在每小时的第 30 分钟执行 `/usr/bin/backup_script.sh` 脚本。\r\n\r\n##### 示例 3:每天凌晨 2 点执行一次命令\r\n```plaintext\r\n0 2 * * * /usr/bin/daily_cleanup.sh\r\n```\r\n这个任务会在每天凌晨 2 点执行 `/usr/bin/daily_cleanup.sh` 脚本。\r\n\r\n##### 示例 4:每月 1 号的 3 点 15 分执行一次命令\r\n```plaintext\r\n15 3 1 * * /usr/bin/monthly_report.sh\r\n```\r\n这个任务会在每月 1 号的 3 点 15 分执行 `/usr/bin/monthly_report.sh` 脚本。\r\n\r\n##### 示例 5:每周日的 18 点执行一次命令\r\n```plaintext\r\n0 18 * * 0 /usr/bin/weekly_backup.sh\r\n```\r\n这个任务会在每周日的 18 点执行 `/usr/bin/weekly_backup.sh` 脚本。\r\n\r\n##### 示例 6:指定时间范围执行命令\r\n```plaintext\r\n0 9-17 * * 1-5 /usr/bin/workday_check.sh\r\n```\r\n这个任务会在周一至周五的 9 点到 17 点之间,每小时的整点执行 `/usr/bin/workday_check.sh` 脚本。\r\n\r\n##### 示例 7:每隔一段时间执行命令\r\n```plaintext\r\n*/15 * * * * /usr/bin/check_status.sh\r\n```\r\n这个任务会每隔 15 分钟执行一次 `/usr/bin/check_status.sh` 脚本。\r\n\r\n#### 3. 保存并退出\r\n编辑完成后,保存并退出文本编辑器。如果使用 `nano` 编辑器,按 `Ctrl + X`,然后按 `Y` 确认保存,最后按 `Enter` 键退出。如果使用 `vim` 编辑器,按 `Esc` 键,输入 `:wq` 并按 `Enter` 键保存并退出。\r\n\r\n#### 4. 查看 `crontab` 文件内容\r\n可以使用以下命令查看当前用户的 `crontab` 文件内容:\r\n```bash\r\ncrontab -l\r\n```\r\n\r\n#### 5. 删除 `crontab` 文件\r\n如果需要删除当前用户的所有定时任务,可以使用以下命令:\r\n```bash\r\ncrontab -r\r\n```\r\n\r\n### 注意事项\r\n- **环境变量**:`crontab` 任务在执行时使用的环境变量可能与用户登录时不同。如果脚本依赖特定的环境变量,需要在脚本中明确设置。\r\n- **日志记录**:建议将定时任务的输出重定向到日志文件,以便后续排查问题。\r\n- **权限问题**:确保执行的命令或脚本具有足够的权限。\r\n", - "Linux/docker,LXC,qemu,k8s,chroot等的特点.md": "\r\n以下从技术定义、核心原理、特点、区别及相互关系等方面,详细解析 **LXC、Docker、chroot、虚拟机、QEMU、K8s** 的概念及关联:\r\n\r\n\r\n### **一、核心技术定义与原理**\r\n#### 1. **chroot**\r\n- **本质**:Linux 系统调用,用于修改进程的“根目录”(`/`),创建一个隔离的文件系统视图。\r\n- **原理**:通过 `chroot` 命令,指定一个新的根目录,进程只能访问该目录下的文件(类似“伪根”),但不隔离 CPU、内存、网络等资源。\r\n- **特点**:\r\n - 最轻量的隔离,仅文件系统隔离,无资源限制。\r\n - 进程仍共享宿主机内核、进程空间、网络栈等。\r\n - 非完整容器,常用于调试、环境隔离(如构建跨平台程序)。\r\n\r\n#### 2. **LXC(Linux Containers)**\r\n- **本质**:基于 Linux 内核特性(`namespace` 命名空间 + `cgroups` 资源控制)的操作系统级容器。\r\n- **原理**:\r\n - `namespace`:隔离进程、网络、文件系统、用户等资源(如 `PID namespace` 使容器内进程号独立)。\r\n - `cgroups`:限制容器的 CPU、内存、磁盘 I/O 资源使用。\r\n- **特点**:\r\n - 共享宿主机内核,启动快(秒级),资源占用低。\r\n - 提供接近虚拟机的隔离性,但轻量高效。\r\n - 需要手动配置,侧重系统级隔离(如运行完整的 Linux 发行版)。\r\n\r\n#### 3. **Docker**\r\n- **本质**:基于容器技术的应用打包与部署平台,核心是容器运行时(`runc`,基于 Open Container Initiative 标准)。\r\n- **原理**:\r\n - 继承 LXC 的 `namespace` 和 `cgroups`,但更上层,封装了镜像(`Image`)、容器(`Container`)、仓库(`Registry`)流程。\r\n - 通过镜像分层技术(UnionFS)实现快速打包,通过 `Docker Engine` 管理容器生命周期。\r\n- **特点**:\r\n - 聚焦“应用容器化”,强调“一次构建,到处运行”。\r\n - 比 LXC 更易用(标准化 API、自动化部署),适合微服务、CI/CD。\r\n - 镜像生态丰富(Docker Hub),但隔离性略弱于 LXC(共享内核,依赖宿主机内核版本)。\r\n\r\n#### 4. **虚拟机(Virtual Machine, VM)**\r\n- **本质**:通过虚拟化技术模拟完整硬件环境,运行独立操作系统。\r\n- **分类与原理**:\r\n - **全虚拟化**(如 VMware Workstation):Hypervisor 完全模拟硬件,Guest OS 无需修改。\r\n - **半虚拟化**(如 Xen):Guest OS 知道自己运行在虚拟机中,通过 Hypercall 与 Hypervisor 交互。\r\n - **硬件辅助虚拟化**(如 Intel VT-x):CPU 直接支持虚拟化,提升性能。\r\n- **特点**:\r\n - 隔离性最强(独立内核、硬件资源),支持不同操作系统(如 Windows 跑在 Linux 宿主机上)。\r\n - 资源开销大(需模拟硬件,启动慢,内存/CPU 占用高)。\r\n - 适合需要完整 OS 环境的场景(如测试不同系统、遗留应用迁移)。\r\n\r\n#### 5. **QEMU**\r\n- **本质**:开源的通用模拟器和虚拟机监视器(Virtual Machine Monitor, VMM)。\r\n- **原理**:\r\n - 单独使用时,通过软件模拟目标硬件(如在 x86 上运行 ARM 程序),性能较低。\r\n - 与 **KVM**(Kernel-based Virtual Machine,Linux 内核模块)结合时,利用硬件虚拟化技术(如 VT-x),成为高效的虚拟机引擎(QEMU-KVM)。\r\n- **特点**:\r\n - 跨平台兼容性强,支持多种架构(x86、ARM、RISC-V 等)。\r\n - 是虚拟机技术的具体实现之一,常作为 KVM 的用户空间工具。\r\n\r\n#### 6. **K8s(Kubernetes)**\r\n- **本质**:容器编排平台,用于自动化部署、扩展和管理容器化应用。\r\n- **核心功能**:\r\n - 调度容器到节点(Node),支持负载均衡、服务发现。\r\n - 处理容器的生命周期(重启、扩缩容、滚动更新)。\r\n - 提供资源配额、健康检查、故障恢复等机制。\r\n- **特点**:\r\n - 不绑定特定容器运行时(支持 Docker、containerd、runc 等)。\r\n - 解决“大规模容器集群管理”问题,适合微服务架构、云原生应用。\r\n\r\n\r\n### **二、核心区别对比**\r\n| **维度** | **chroot** | **LXC/Docker(容器)** | **虚拟机(含 QEMU-KVM)** | **K8s** |\r\n|-------------------|------------------|------------------------|---------------------------|------------------------|\r\n| **隔离级别** | 文件系统隔离 | 操作系统级隔离(内核共享) | 硬件级隔离(独立内核) | 编排管理层(不涉及底层隔离) |\r\n| **资源共享** | 完全共享 | 共享宿主机内核 | 独立内核,硬件资源模拟 | 管理多个容器/节点的资源 |\r\n| **启动时间** | 瞬间 | 秒级 | 分钟级(需启动 Guest OS) | 不涉及启动,管理已有容器 |\r\n| **资源开销** | 极低 | 低(仅用户空间隔离) | 高(硬件模拟 + 完整 OS) | 额外控制平面开销 |\r\n| **支持的 OS** | 同宿主机内核 | 同宿主机内核 | 任意 OS(如 Windows/Linux) | 不限制,管理容器化应用 |\r\n| **核心目标** | 文件系统隔离 | 轻量应用隔离/部署 | 完整 OS 环境模拟 | 容器集群管理 |\r\n| **典型用途** | 环境调试 | 应用打包、轻量部署 | 多系统测试、遗留应用兼容 | 大规模容器调度、微服务 |\r\n\r\n\r\n### **三、相互关系**\r\n#### 1. **技术栈分层**\r\n```\r\n应用层(K8s)\r\n├─ 容器运行时(Docker/LXC/containerd)\r\n│ ├─ 内核特性(namespace/cgroups)\r\n│ └─ chroot(基础文件系统隔离)\r\n└─ 虚拟化层(虚拟机/QEMU-KVM)\r\n └─ 硬件(CPU/内存/存储,支持 VT-x 等虚拟化技术)\r\n```\r\n\r\n#### 2. **具体关联**\r\n- **chroot 与容器**: \r\n chroot 是容器实现文件系统隔离的基础(如 Docker 镜像的根文件系统通过 chroot 挂载),但容器在此之上增加了 `namespace` 和 `cgroups` 实现完整隔离。\r\n\r\n- **LXC 与 Docker**: \r\n Docker 早期基于 LXC 开发,后转向自有运行时(`libcontainer`,现 `runc`),二者同属容器技术,但定位不同: \r\n - LXC 偏向“系统级容器”(运行完整 Linux 发行版,如 Ubuntu 容器); \r\n - Docker 偏向“应用级容器”(打包单个应用及其依赖,如 Node.js 服务)。\r\n\r\n- **虚拟机与 QEMU**: \r\n QEMU 是虚拟机的一种实现方式,单独使用时模拟硬件(慢),与 KVM 结合时利用硬件虚拟化(高效),属于虚拟机技术的底层引擎之一(类似 VirtualBox、VMware 的技术定位)。\r\n\r\n- **K8s 与容器/虚拟机**: \r\n - K8s 主要管理容器(如 Docker 容器),但也可通过虚拟机节点(Node)部署(每个 Node 可以是物理机或虚拟机)。 \r\n - 容器运行在宿主机(物理机或虚拟机)上,K8s 不关心底层是物理机还是虚拟机,只调度容器到节点。\r\n\r\n\r\n### **四、应用场景总结**\r\n- **chroot**:简单文件系统隔离(如构建跨版本软件、修复系统)。 \r\n- **Docker/LXC**:轻量应用部署(微服务、Web 服务),追求资源效率和快速启动。 \r\n- **虚拟机/QEMU-KVM**:需要完整 OS 隔离(如运行 Windows 应用、多租户隔离、硬件兼容性测试)。 \r\n- **K8s**:大规模容器集群管理(微服务架构、弹性扩缩容、高可用部署)。\r\n\r\n\r\n### **五、核心总结**\r\n- **隔离性**:虚拟机(强隔离,独立内核)> 容器(共享内核,OS 级隔离)> chroot(仅文件系统)。 \r\n- **效率**:chroot/容器(高效)> 虚拟机(低效,因硬件模拟)。 \r\n- **关系**: \r\n - 容器技术(LXC/Docker)基于内核特性(namespace/cgroups),chroot 是其文件系统隔离的基础。 \r\n - 虚拟机(如 QEMU-KVM)通过硬件虚拟化实现强隔离,与容器形成互补(容器适合同一 OS 下的应用隔离,虚拟机适合跨 OS 隔离)。 \r\n - K8s 是容器的“上层管理工具”,不依赖特定容器运行时,聚焦集群调度与自动化。\r\n\r\n理解这些技术的核心是明确其“隔离目标”和“资源模型”:容器追求轻量高效,虚拟机追求强隔离,K8s 解决规模化管理问题,而 chroot 是最基础的工具。根据需求选择合适的技术(如部署单个应用用 Docker,多 OS 环境用虚拟机,大规模集群用 K8s 编排容器)。", - "Linux/docker配置.md": "QQ机器人(napcat)\r\ndocker run -d \\\r\n-e NAPCAT_GID=$(id -g) \\\r\n-e NAPCAT_UID=$(id -u) \\\r\n-p 3000:3000 \\\r\n-p 3001:3001 \\\r\n-p 3002:6099 \\\r\n--name napcat \\\r\n--restart=always \\\r\nmlikiowa/napcat-docker:latest\r\n\r\n微信机器人(gewe)\r\ndocker run -itd -v /shumengya/bin/wechatbot:/root/temp -p 2531:2531 -p 2532:2532 --privileged=true --name=gewe gewe /usr/sbin/init\r\n\r\n\r\n\r\n", - "Linux/frp配置.md": "### 使用 yum 安装 systemd(CentOS/RHEL)\r\n```\r\nyum install systemd\r\n```\r\n\r\n\r\n\r\n### 使用 apt 安装 systemd(Debian/Ubuntu)\r\n```\r\napt install systemd\r\nsudo vim /etc/systemd/system/frps.service\r\n```\r\n\r\n\r\n\r\n### 服务名称,可自定义\r\n```\r\nDescription = frp server\r\nAfter = network.target syslog.target\r\nWants = network.target\r\n\r\n[Service]\r\nType = simple\r\n```\r\n\r\n\r\n### 启动frps的命令,需修改为您的frps的安装路径\r\n```\r\nExecStart = /path/to/frps -c /path/to/frps.toml\r\n\r\n[Install]\r\nWantedBy = multi-user.target\r\n```\r\n\r\n\r\n\r\n### 启动frp\r\n```\r\nsudo systemctl start frps\r\n```\r\n\r\n\r\n### 停止frp\r\n```\r\nsudo systemctl stop frps\r\n```\r\n\r\n\r\n### 重启frp\r\n```\r\nsudo systemctl restart frps\r\n```\r\n\r\n\r\n### 查看frp状态\r\n```\r\nsudo systemctl status frps\r\nsudo systemctl enable frps\r\n```\r\n\r\n", - "Linux/Git常用命令.md": "```shell\r\ngit remote add origin \r\ngit remote add origin https://github.com/shumengya6666666/Pixel-plane-wars.git\r\ngit remote add origin git@github.com:shumengya6666666/Pixel-plane-wars.git\r\ngit remote set-url origin git@github.com:shumengya6666666/Pixel-plane-wars.git\r\ngit clone git@github.com:shumengya6666666/Pixel-plane-wars.git\r\ngit remote add origin git@github.com:shumengya6666666/Pixel-Odyssey.git\r\ngit push -u origin main\r\ngit remote add origin git@github.com:shumengya6666666/Sprout-Farm.git\r\ngit remote set-url origin git@github.com:shumengya6666666/Sprout-Farm.git\r\ngit push -u origin master\r\ngit remote add origin git@github.com:shumengya6666666/Pixel-plane-wars.git\r\n```\r\n\r\n", + "LeetCode/力扣2-两数之和.md": "两数之和问题\n\n问题描述\n\n给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。\n\n你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。\n\n示例 1:\n\n```\n输入:nums = [2,7,11,15], target = 9\n输出:[0,1]\n解释:因为 nums[0] + nums[1] == 9,返回 [0, 1]。\n```\n\n示例 2:\n\n```\n输入:nums = [3,2,4], target = 6\n输出:[1,2]\n```\n\n示例 3:\n\n```\n输入:nums = [3,3], target = 6\n输出:[0,1]\n```\n\n提示:\n\n· 2 <= nums.length <= 10^4\n· -10^9 <= nums[i] <= 10^9\n· -10^9 <= target <= 10^9\n· 只会存在一个有效答案\n\n方法思路\n\n1. 问题分析\n\n我们需要在数组中找到两个不同的元素,它们的和等于目标值。由于数组可能很大,暴力解法(双重循环)的时间复杂度为O(n²),效率太低。\n\n2. 算法选择\n\n使用哈希表来存储每个元素及其索引,这样可以在O(1)时间内检查目标值与当前元素的差值是否存在于哈希表中。\n\n3. 算法步骤\n\n1. 初始化一个空哈希表(字典)\n2. 遍历数组中的每个元素及其索引\n3. 对于每个元素,计算目标值与当前元素的差值(补数)\n4. 检查该差值是否已存在于哈希表中\n5. 如果存在,返回当前索引和差值的索引\n6. 如果不存在,将当前元素及其索引存入哈希表\n\n4. 复杂度分析\n\n· 时间复杂度:O(n),只需遍历数组一次\n· 空间复杂度:O(n),用于存储哈希表\n\n解决代码\n\n```python\ndef twoSum(nums, target):\n \"\"\"\n 在给定数组中找出和为目标值的两个整数的索引\n \n 参数:\n nums: List[int] - 整数数组\n target: int - 目标值\n \n 返回:\n List[int] - 两个整数的索引列表\n \"\"\"\n num_map = {} # 创建空字典存储数字和索引的映射\n for i, num in enumerate(nums): # 遍历数组,获取索引和数值\n complement = target - num # 计算补数\n if complement in num_map: # 检查补数是否在字典中\n return [num_map[complement], i] # 如果在,返回两个索引\n num_map[num] = i # 如果不在,将当前数字和索引存入字典\n return [] # 如果没有找到,返回空列表(但题目保证有解,所以不会执行到这里)\n \n#最简单方法\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n n=len(nums)\n for i in range(n):\n for j in range(i+1,n):\n if nums[i]+nums[j]==target:\n return[i,j]\n return[]\n \n```\n\n代码解释\n\n1. 初始化哈希表:num_map 用于存储元素值到索引的映射\n2. 遍历数组:使用 enumerate 函数同时获取元素的索引 i 和数值 num\n3. 计算补数:对于每个 num,计算 complement = target - num\n4. 检查补数是否存在:如果补数存在于哈希表中,说明找到了两个数,返回它们的索引\n5. 存储当前元素:如果补数不存在,将当前元素及其索引存入哈希表,以便后续查找\n6. 返回结果:如果遍历结束仍未找到,返回空列表(但题目保证有解,所以不会执行到此)\n\n", + "Linux/ADB/ADB常用命令.md": "\n\n### 1. **基本命令**\n\n- **连接设备**\n ```bash\n adb devices\n ```\n \n 列出连接的设备,显示设备ID和状态。\n \n- **启动ADB服务器**\n ```bash\n adb start-server\n ```\n \n 启动ADB服务。\n \n- **停止ADB服务器**\n ```bash\n adb kill-server\n ```\n \n 停止ADB服务。\n \n\n### 2. **设备管理**\n\n- **查看设备信息**\n ```bash\n adb shell getprop\n ```\n \n 获取设备的各种信息(如型号、Android版本等)。\n \n- **重启设备**\n ```bash\n adb reboot\n ```\n \n 重新启动设备。\n \n- **重启到bootloader**\n ```bash\n adb reboot bootloader\n ```\n \n 将设备重启到bootloader模式(用于解锁、刷机等)。\n \n- **进入恢复模式**\n ```bash\n adb reboot recovery\n ```\n \n 重新启动设备并进入恢复模式。\n \n\n### 3. **文件传输**\n\n- **从设备拷贝文件到电脑**\n ```bash\n adb pull <设备路径> <本地路径>\n ```\n \n 例如:\n \n ```bash\n adb pull /sdcard/test.txt ./test.txt\n ```\n \n- **从电脑拷贝文件到设备**\n ```bash\n adb push <本地路径> <设备路径>\n ```\n \n 例如:\n \n ```bash\n adb push test.txt /sdcard/\n ```\n \n\n### 4. **执行命令**\n\n- **进入设备的Shell**\n ```bash\n adb shell\n ```\n \n 进入设备的命令行界面,可以执行Linux命令。\n \n- **执行单个命令**\n ```bash\n adb shell <命令>\n ```\n \n 例如,查看设备的文件系统:\n \n ```bash\n adb shell ls /sdcard/\n ```\n \n\n### 5. **应用管理**\n\n- **安装应用**\n ```bash\n adb install \n ```\n \n 例如:\n \n ```bash\n adb install app.apk\n ```\n \n- **卸载应用**\n ```bash\n adb uninstall <包名>\n ```\n \n 例如:\n \n ```bash\n adb uninstall com.example.app\n ```\n \n- **列出所有已安装的应用**\n ```bash\n adb shell pm list packages\n ```\n \n- **清除应用数据**\n ```bash\n adb shell pm clear <包名>\n ```\n \n 例如:\n \n ```bash\n adb shell pm clear com.example.app\n ```\n \n\n### 6. **日志与调试**\n\n- **查看日志输出**\n ```bash\n adb logcat\n ```\n \n 实时显示设备的日志输出,常用于调试。\n \n- **过滤日志**\n ```bash\n adb logcat <标签>:<等级>\n ```\n \n 例如:\n \n ```bash\n adb logcat *:E\n ```\n \n 显示所有错误级别(Error)及以上的日志。\n \n- **查看设备的进程**\n ```bash\n adb shell ps\n ```\n \n\n### 7. **屏幕截图与录屏**\n\n- **截取屏幕截图**\n \n ```bash\n adb shell screencap /sdcard/screenshot.png\n ```\n \n 将截图保存到设备存储中。\n \n- **录制屏幕视频**\n ```bash\n adb shell screenrecord /sdcard/demo.mp4\n ```\n \n\n### 8. **开发与调试**\n\n- **开启开发者选项与USB调试** \n 需要在设备的设置里开启开发者选项,并启用USB调试。\n \n- **远程调试**\n ```bash\n adb tcpip 5555\n ```\n \n 让设备进入无线调试模式(通过IP连接设备)。\n \n- **连接到指定IP设备**\n ```bash\n adb connect <设备IP>:5555\n ```\n \n\n### 9. **设备状态与操作**\n\n- **查看设备状态**\n ```bash\n adb devices -l\n ```\n \n- **查看设备的存储**\n ```bash\n adb shell df\n ```\n \n- **获取设备电池状态**\n ```bash\n adb shell dumpsys battery\n ```\n \n\n### 10. **其他常用命令**\n\n- **获取设备信息(硬件、系统信息)**\n ```bash\n adb shell dumpsys\n ```\n \n- **查看设备的CPU使用情况**\n ```bash\n adb shell top\n ```\n \n", + "Linux/ADB/某安卓板子不知名初始化脚本.md": "adb push busybox /tmp\nadb shell\ncd /tmp\nchmod 777 *\n./busybox ifconfig wlan0 up\n\n人总是孤独的,不要去搞过于偏门的东西,大学时间很有限,不要花太多时间在一些虚无缥缈的东西上\n", + "Linux/busybox v1.36命令简介.md": "以下是针对 **BusyBox** 中每条命令的简要说明:\n\n1. **[**:测试表达式的真假。\n2. **[[**:增强版的条件测试命令。\n3. **acpid**:管理系统的 ACPI 事件。\n4. **adjtimex**:调整系统时间。\n5. **ar**:创建、修改、提取归档文件。\n6. **arch**:显示机器架构类型。\n7. **arp**:显示或修改 ARP 缓存。\n8. **arping**:向网络发送 ARP 请求。\n9. **ascii**:显示 ASCII 表。\n10. **ash**:一个轻量级的 shell。\n11. **awk**:强大的文本处理工具。\n12. **base32**:以 Base32 编码格式进行数据转换。\n13. **base64**:以 Base64 编码格式进行数据转换。\n14. **basename**:从路径中提取文件名。\n15. **bbconfig**:配置 BusyBox。\n16. **beep**:产生蜂鸣声。\n17. **blkdiscard**:丢弃磁盘块。\n18. **blkid**:显示块设备的标识。\n19. **blockdev**:对块设备进行操作。\n20. **brctl**:管理网桥接口。\n21. **bunzip2**:解压 `.bz2` 格式文件。\n22. **bzcat**:查看 `.bz2` 格式文件内容。\n23. **bzip2**:压缩文件为 `.bz2` 格式。\n24. **cal**:显示日历。\n25. **cat**:连接文件并显示内容。\n26. **chat**:发送控制字符以进行调制解调器通信。\n27. **chattr**:改变文件的属性。\n28. **chcon**:改变文件的 SELinux 上下文。\n29. **chgrp**:改变文件的组。\n30. **chmod**:改变文件的权限。\n31. **chown**:改变文件的拥有者。\n32. **chroot**:改变根目录。\n33. **chrt**:操作进程的调度策略。\n34. **chvt**:切换虚拟终端。\n35. **cksum**:计算文件的校验和。\n36. **clear**:清除终端屏幕。\n37. **cmp**:比较两个文件。\n38. **comm**:比较两个已排序文件的内容。\n39. **conspy**:查看控制台的输出。\n40. **cp**:复制文件。\n41. **cpio**:创建、解压 cpio 格式归档。\n42. **crc32**:计算 CRC32 校验和。\n43. **crond**:周期性执行任务的守护进程。\n44. **crontab**:编辑 cron 表。\n45. **cttyhack**:改变控制终端。\n46. **cut**:按列剪切文本。\n47. **date**:显示或设置系统日期和时间。\n48. **dc**:计算器程序。\n49. **dd**:转换和复制文件。\n50. **deallocvt**:释放虚拟终端。\n51. **depmod**:生成内核模块依赖关系。\n52. **devmem**:访问物理内存。\n53. **df**:显示文件系统的磁盘空间使用情况。\n54. **dhcprelay**:转发 DHCP 请求。\n55. **diff**:比较文件的不同之处。\n56. **dirname**:获取路径的目录部分。\n57. **dmesg**:显示内核的消息缓冲区内容。\n58. **dnsd**:轻量级 DNS 服务器。\n59. **dnsdomainname**:显示域名。\n60. **dos2unix**:转换 DOS 格式文本为 Unix 格式。\n61. **du**:显示磁盘使用情况。\n62. **dumpkmap**:转储键盘映射。\n63. **dumpleases**:显示 DHCP 租约。\n64. **echo**:显示一行文本。\n65. **ed**:文本编辑器。\n66. **egrep**:扩展正则表达式的 grep 命令。\n67. **eject**:弹出光盘。\n68. **env**:显示或设置环境变量。\n69. **ether-wake**:发送 Wake-on-LAN 魔术包。\n70. **expand**:将制表符转换为空格。\n71. **expr**:计算表达式的值。\n72. **factor**:因数分解。\n73. **fakeidentd**:模拟 identd 服务。\n74. **false**:返回失败状态。\n75. **fatattr**:显示或修改 FAT 文件系统的属性。\n76. **fbset**:设置帧缓冲设备的参数。\n77. **fbsplash**:管理帧缓冲启动画面。\n78. **fdflush**:刷新文件描述符。\n79. **fdformat**:格式化软盘。\n80. **fdisk**:管理磁盘分区。 \n81. **fgconsole**:切换到指定的虚拟终端。\n82. **fgrep**:固定字符串搜索工具。\n83. **find**:搜索文件。\n84. **findfs**:查找文件系统。\n85. **flash_eraseall**:擦除闪存设备。\n86. **flash_lock**:锁定闪存设备。\n87. **flash_unlock**:解锁闪存设备。\n88. **flock**:对文件进行锁定。\n89. **fold**:折叠文本行。\n90. **free**:显示内存使用情况。\n91. **freeramdisk**:释放 RAM 磁盘。\n92. **fsck**:检查文件系统的完整性。\n93. **fsck.minix**:检查 Minix 文件系统。\n94. **fsfreeze**:冻结文件系统以进行备份。\n95. **fstrim**:修剪未使用的磁盘空间。\n96. **fsync**:强制磁盘同步。\n97. **ftpd**:启动 FTP 服务器。\n98. **ftpget**:下载文件通过 FTP。\n99. **ftpput**:上传文件通过 FTP。\n100. **fuser**:显示正在使用某个文件的进程。\n101. **getenforce**:显示 SELinux 的状态。\n102. **getopt**:解析命令行选项。\n103. **grep**:搜索文本中的模式。\n104. **groups**:显示用户所属的组。\n105. **gunzip**:解压 `.gz` 文件。\n106. **gzip**:压缩文件为 `.gz` 格式。\n107. **hd**:显示硬盘的分区信息。\n108. **hdparm**:设置硬盘参数。\n109. **head**:显示文件的开头部分。\n110. **hexdump**:以十六进制格式显示文件内容。\n111. **hexedit**:编辑十六进制文件。\n112. **hostname**:显示或设置主机名。\n113. **httpd**:启动 HTTP 服务器。\n114. **hush**:一个小型 shell。\n115. **hwclock**:访问硬件时钟。\n116. **id**:显示用户和组信息。\n117. **ifconfig**:配置网络接口。\n118. **ifdown**:关闭网络接口。\n119. **ifenslave**:配置链路聚合。\n120. **ifplugd**:监控网络接口的连接状态。\n121. **ifup**:启用网络接口。\n122. **inetd**:启动网络服务守护进程。\n123. **inotifyd**:启动文件系统事件监控。\n124. **insmod**:加载内核模块。\n125. **install**:复制文件并设置权限。\n126. **ionice**:设置进程的 I/O 优先级。\n127. **iostat**:显示 CPU 和 I/O 统计信息。\n128. **ip**:配置网络接口和路由。\n129. **ipaddr**:显示或设置 IP 地址。\n130. **ipcalc**:计算和显示 IP 地址信息。\n131. **ipcrm**:删除共享内存、消息队列、信号量。\n132. **ipcs**:显示进程间通信的状态。\n133. **iplink**:管理网络接口的状态。\n134. **ipneigh**:显示邻居表。\n135. **iproute**:管理路由表。\n136. **iprule**:显示或管理路由规则。\n137. **iptunnel**:配置 IP 隧道。\n138. **kbd_mode**:设置键盘模式。\n139. **kill**:终止进程。\n140. **killall**:终止指定名称的所有进程。\n141. **killall5**:终止所有进程。\n142. **klogd**:内核日志守护进程。\n143. **less**:分页显示文件内容。\n144. **link**:创建硬链接。\n145. **ln**:创建硬链接或符号链接。\n146. **loadfont**:加载字体。\n147. **loadkmap**:加载键盘映射。\n148. **logread**:显示日志文件内容。\n149. **losetup**:管理环回设备。\n150. **ls**:列出目录内容。\n\n\n151. **lsattr**:显示文件的属性。\n152. **lsmod**:显示加载的内核模块。\n153. **lsof**:列出打开的文件。\n154. **lspci**:显示所有 PCI 设备。\n155. **lsscsi**:显示 SCSI 设备信息。\n156. **lsusb**:列出 USB 设备。\n157. **lzcat**:解压 `.lz` 文件并显示内容。\n158. **lzma**:压缩文件为 `.lzma` 格式。\n159. **lzop**:快速的文件压缩工具。\n160. **lzopcat**:查看 `.lzo` 格式文件内容。\n161. **makedevs**:创建设备节点。\n162. **makemime**:生成 MIME 类型文件。\n163. **man**:查看手册页(如果有)。\n164. **md5sum**:计算文件的 MD5 校验和。\n165. **mesg**:控制终端消息的接收。\n166. **microcom**:串行通信工具。\n167. **mim**:提取文件的 MIME 类型。\n168. **mkdir**:创建目录。\n169. **mkdosfs**:创建 FAT 文件系统。\n170. **mke2fs**:创建 ext2 文件系统。\n171. **mkfifo**:创建命名管道。\n172. **mkfs.ext2**:创建 ext2 文件系统。\n173. **mkfs.minix**:创建 Minix 文件系统。\n174. **mkfs.reiser**:创建 Reiser 文件系统。\n175. **mkfs.vfat**:创建 VFAT 文件系统。\n176. **mknod**:创建块设备或字符设备文件。\n177. **mkswap**:创建交换分区。\n178. **mktemp**:创建临时文件。\n179. **modinfo**:显示内核模块的信息。\n180. **modprobe**:加载或卸载内核模块。\n181. **more**:分页显示文件内容。\n182. **mount**:挂载文件系统。\n183. **mountpoint**:检查是否为挂载点。\n184. **mpstat**:显示 CPU 使用统计信息。\n185. **mv**:移动或重命名文件。\n186. **nameif**:根据 MAC 地址设置网络接口名称。\n187. **nanddump**:转储 NAND 闪存的内容。\n188. **nandwrite**:将数据写入 NAND 闪存。\n189. **nbd-client**:连接到网络块设备。\n190. **nc**:Netcat 工具,用于读写网络连接。\n191. **netstat**:显示网络连接状态。\n192. **nice**:调整进程的优先级。\n193. **nl**:显示带有行号的文件内容。\n194. **nmeter**:网络带宽监控工具。\n195. **nohup**:在后台运行命令并忽略挂起信号。\n196. **nologin**:禁止用户登录。\n197. **nsenter**:进入其他命名空间。\n198. **nslookup**:查询 DNS 信息。\n199. **nuke**:终止所有与特定进程相关的网络连接。\n200. **od**:以不同格式显示文件内容(如十六进制)。\n201. **openvt**:在指定的虚拟终端上运行命令。\n202. **partprobe**:通知操作系统重新读取分区表。\n203. **paste**:合并多个文件按列显示。\n204. **patch**:应用补丁文件。\n205. **pgrep**:查找匹配指定模式的进程。\n206. **pidof**:查找指定进程的 PID。\n207. **ping**:向网络主机发送 ICMP 请求。\n208. **ping6**:向网络主机发送 ICMPv6 请求。\n209. **pipe_progress**:显示管道中的数据传输进度。\n210. **pivot_root**:更改文件系统根目录。\n211. **pkill**:根据进程名终止进程。\n212. **pmap**:显示进程的内存映射。\n213. **popmaildir**:从邮件目录中获取邮件。\n214. **poweroff**:关闭计算机。\n215. **powertop**:用于优化电源管理的工具。\n216. **printenv**:显示所有环境变量。\n217. **printf**:格式化并输出文本。\n218. **ps**:显示当前进程信息。\n219. **pscan**:扫描当前进程的状态。\n220. **pstree**:以树形结构显示进程。\n221. **pwd**:显示当前工作目录。\n222. **pwdx**:显示指定进程的工作目录。\n223. **raidautorun**:自动启动 RAID 配置。\n224. **rdate**:同步时间。\n225. **rdev**:显示或设置设备的特殊属性。\n226. **readlink**:显示符号链接的目标。\n227. **readprofile**:读取并显示应用的性能配置。\n228. **realpath**:返回文件的绝对路径。\n229. **reboot**:重启系统。\n230. **reformime**:转换 MIME 格式。\n231. **renice**:改变进程的优先级。\n232. **reset**:重置终端。\n233. **resize**:调整终端大小。\n234. **resume**:恢复挂起的进程。\n235. **rev**:反转每行文本。\n236. **rfkill**:管理无线设备的开关。\n237. **rm**:删除文件。\n238. **rmdir**:删除空目录。\n239. **rmmod**:卸载内核模块。\n240. **route**:显示或修改路由表。\n241. **rtcwake**:设置系统的 RTC 来定时唤醒。\n242. **run-init**:运行初始化程序。\n243. **run-parts**:按顺序运行目录中的脚本。\n244. **runcon**:设置进程的 SELinux 上下文。\n245. **rx**:接收串口数据。\n246. **script**:记录终端会话。\n247. **scriptreplay**:重放记录的终端会话。\n248. **sed**:流编辑器,用于处理文本数据。\n249. **seedrng**:种子随机数生成器。\n250. **selinuxenabled**:检查 SELinux 是否启用。\n251. **sendmail**:发送电子邮件。\n252. **seq**:生成一个数字序列。\n253. **sestatus**:显示 SELinux 状态。\n254. **setconsole**:设置控制台的终端类型。\n255. **setenforce**:启用或禁用 SELinux 强制模式。\n256. **setfattr**:设置文件的扩展属性。\n257. **setfont**:设置终端的字体。\n258. **setkeycodes**:设置键盘扫描码到键值的映射。\n259. **setlogcons**:设置日志控制台。\n260. **setpriv**:设置进程的特权级别。\n261. **setserial**:设置串口设备的参数。\n262. **setsid**:创建新的会话并运行命令。\n263. **setuidgid**:设置进程的用户和组标识。\n264. **sh**:启动一个新的 shell。\n265. **sha1sum**:计算文件的 SHA-1 校验和。\n266. **sha256sum**:计算文件的 SHA-256 校验和。\n267. **sha3sum**:计算文件的 SHA-3 校验和。\n268. **sha512sum**:计算文件的 SHA-512 校验和。\n269. **showkey**:显示键盘输入的键值。\n270. **shred**:擦除文件,防止数据恢复。\n271. **shuf**:随机排列输入行。\n272. **slattach**:设置串行连接。\n273. **sleep**:暂停一段时间。\n274. **smemcap**:设置进程内存使用限制。\n275. **sort**:按行排序文本文件。\n276. **split**:将文件分割成多个小文件。\n277. **ssl_client**:通过 SSL 连接远程主机。\n278. **start-stop-daemon**:启动或停止后台守护进程。\n279. **stat**:显示文件或文件系统的状态。\n280. **strings**:显示文件中的可打印字符串。\n281. **stty**:设置终端行属性。\n282. **sum**:计算文件的校验和。\n283. **svc**:启动、停止或重启服务。\n284. **svok**:检查服务的状态。\n285. **swapoff**:禁用交换空间。\n286. **swapon**:启用交换空间。\n287. **switch_root**:切换到新的根文件系统。\n288. **sync**:同步文件系统。\n289. **sysctl**:显示或设置内核参数。\n290. **syslogd**:启动系统日志守护进程。\n291. **tac**:反向显示文件内容。\n292. **tail**:显示文件的最后部分。\n293. **tar**:创建和解压 tar 归档。\n\n294. **tc**:配置网络流量控制。\n295. **tcpsvd**:TCP 服务守护进程。\n296. **tee**:将输入内容输出到多个文件。\n297. **telnet**:远程登录到另一个计算机。\n298. **telnetd**:启动 Telnet 服务器。\n299. **test**:检查条件的真假。\n300. **tftp**:简易的文件传输协议客户端。\n301. **tftpd**:TFTP 服务器。\n302. **time**:测量命令执行时间。\n303. **timeout**:设置命令的超时时间。\n304. **top**:显示系统进程信息。\n305. **touch**:创建空文件或更新文件的时间戳。\n306. **tr**:替换或删除字符。\n307. **traceroute**:追踪数据包在网络中的路由。\n308. **traceroute6**:追踪 IPv6 数据包的路由。\n309. **tree**:以树形结构显示目录内容。\n310. **true**:始终返回成功状态。\n311. **truncate**:截断文件到指定长度。\n312. **ts**:为每行添加时间戳。\n313. **tsort**:排序文件中的时间戳。\n314. **tty**:显示终端设备名称。\n315. **ttysize**:显示终端的大小。\n316. **tunctl**:管理 TUN/TAP 网络设备。\n317. **tune2fs**:调整 ext2/ext3/ext4 文件系统的参数。\n318. **ubiattach**:附加 UBI 设备。\n319. **ubidetach**:分离 UBI 设备。\n320. **ubimkvol**:创建 UBI 卷。\n321. **ubirename**:重命名 UBI 卷。\n322. **ubirmvol**:删除 UBI 卷。\n323. **ubirsvol**:恢复 UBI 卷。\n324. **ubiupdatevol**:更新 UBI 卷的数据。\n325. **udhcpc**:DHCP 客户端,用于获取网络配置信息。\n326. **udhcpc6**:DHCPv6 客户端。\n327. **udhcpd**:DHCP 服务器。\n328. **udpsvd**:UDP 服务守护进程。\n329. **uevent**:显示系统的 udev 事件。\n330. **umount**:卸载文件系统。\n331. **uname**:显示系统信息。\n332. **uncompress**:解压 `.Z` 格式文件。\n333. **unexpand**:将空格转换为制表符。\n334. **uniq**:删除重复的行。\n335. **unix2dos**:转换 Unix 格式文本为 DOS 格式。\n336. **unlink**:删除文件。\n337. **unlzma**:解压 `.lzma` 格式文件。\n338. **unlzop**:解压 `.lzo` 格式文件。\n339. **unshare**:在新命名空间中运行命令。\n340. **unxz**:解压 `.xz` 格式文件。\n341. **unzip**:解压 `.zip` 文件。\n342. **uptime**:显示系统的运行时间和负载。\n343. **usleep**:暂停指定的微秒数。\n344. **uudecode**:解码 `.uu` 格式文件。\n345. **uuencode**:编码文件为 `.uu` 格式。\n346. **vconfig**:管理 VLAN 网络接口。\n347. **vi**:文本编辑器。\n348. **volname**:显示文件系统的卷标。\n349. **watch**:定期执行并显示命令输出。\n350. **watchdog**:监控系统状态并在需要时重启。\n351. **wc**:计算文件的行数、字数和字符数。\n352. **wget**:下载文件。\n353. **which**:显示可执行文件的路径。\n354. **whoami**:显示当前用户的用户名。\n355. **whois**:查询域名注册信息。\n356. **xargs**:将标准输入转换为命令行参数。\n357. **xxd**:创建十六进制转储。\n358. **xz**:压缩文件为 `.xz` 格式。\n359. **xzcat**:查看 `.xz` 格式文件内容。\n360. **yes**:输出指定字符串,通常用来测试管道。\n361. **zcat**:查看 `.gz` 格式文件内容。\n362. **zcip**:配置 ZCIP 地址。\n\n这些命令覆盖了文件操作、系统管理、网络配置、进程管理等多个方面,是 BusyBox 在资源受限环境中为用户提供常用功能的集合。\n", + "Linux/busybox玩法总结.md": "### 一句命令启动busybox的简单http服务器\n\n```shell\nbusybox httpd -f -p 端口 -h 目录\n```\n\n### 查看端口占用情况\n\n- `-t`:显示 TCP 连接\n- `-u`:显示 UDP 连接\n- `-l`:只显示正在监听的端口\n- `-n`:显示数字形式的地址和端口号,而不进行域名解析\n\n```shell\nbusybox netstat -tuln\n```\n\n### 启动busybox的ftp服务器\n\n```shell\nbusybox ftp -d 目录 -p 端口\nbusybox ftp -d 目录 #默认占用21端口\n\nsudo mkdir -p 目录\nsudo chmod 755 目录\n\n```\n\n### 启动 `busybox` 的 Telnet 服务器\n\n```\nbusybox telnetd -l /bin/login\nbusybox telnetd -p 2323 -l /bin/login\n\n```\n\n", + "Linux/crontab的使用.md": "`crontab` 是一个用于在 Unix 和类 Unix 系统(如 Linux)中设置定时任务的工具。它允许用户根据指定的时间间隔安排脚本或命令的执行。\n> 目前我用来代替 systemctl的服务\n\n### 基本概念\n`crontab` 的配置文件由一系列行组成,每行代表一个定时任务,其基本格式如下:\n```plaintext\n* * * * * command\n```\n这五个 `*` 分别代表分钟(0 - 59)、小时(0 - 23)、日期(1 - 31)、月份(1 - 12)和星期(0 - 7,其中 0 和 7 都代表星期日),`command` 是要执行的命令或脚本。\n\n### 使用步骤\n\n#### 1. 编辑 `crontab` 文件\n可以使用以下命令编辑当前用户的 `crontab` 文件:\n```bash\ncrontab -e\n```\n首次使用时,系统会提示选择一个文本编辑器,选择你熟悉的编辑器(如 `nano` 或 `vim`)即可。\n\n#### 2. 添加定时任务\n在打开的 `crontab` 文件中添加定时任务,下面是一些具体的示例:\n\n##### 示例 1:每分钟执行一次命令\n```plaintext\n* * * * * /usr/bin/echo \"This is a test\" >> /tmp/test.log\n```\n这个任务会每分钟执行一次,将 `\"This is a test\"` 追加到 `/tmp/test.log` 文件中。\n\n##### 示例 2:每小时的第 30 分钟执行一次命令\n```plaintext\n30 * * * * /usr/bin/backup_script.sh\n```\n这个任务会在每小时的第 30 分钟执行 `/usr/bin/backup_script.sh` 脚本。\n\n##### 示例 3:每天凌晨 2 点执行一次命令\n```plaintext\n0 2 * * * /usr/bin/daily_cleanup.sh\n```\n这个任务会在每天凌晨 2 点执行 `/usr/bin/daily_cleanup.sh` 脚本。\n\n##### 示例 4:每月 1 号的 3 点 15 分执行一次命令\n```plaintext\n15 3 1 * * /usr/bin/monthly_report.sh\n```\n这个任务会在每月 1 号的 3 点 15 分执行 `/usr/bin/monthly_report.sh` 脚本。\n\n##### 示例 5:每周日的 18 点执行一次命令\n```plaintext\n0 18 * * 0 /usr/bin/weekly_backup.sh\n```\n这个任务会在每周日的 18 点执行 `/usr/bin/weekly_backup.sh` 脚本。\n\n##### 示例 6:指定时间范围执行命令\n```plaintext\n0 9-17 * * 1-5 /usr/bin/workday_check.sh\n```\n这个任务会在周一至周五的 9 点到 17 点之间,每小时的整点执行 `/usr/bin/workday_check.sh` 脚本。\n\n##### 示例 7:每隔一段时间执行命令\n```plaintext\n*/15 * * * * /usr/bin/check_status.sh\n```\n这个任务会每隔 15 分钟执行一次 `/usr/bin/check_status.sh` 脚本。\n\n#### 3. 保存并退出\n编辑完成后,保存并退出文本编辑器。如果使用 `nano` 编辑器,按 `Ctrl + X`,然后按 `Y` 确认保存,最后按 `Enter` 键退出。如果使用 `vim` 编辑器,按 `Esc` 键,输入 `:wq` 并按 `Enter` 键保存并退出。\n\n#### 4. 查看 `crontab` 文件内容\n可以使用以下命令查看当前用户的 `crontab` 文件内容:\n```bash\ncrontab -l\n```\n\n#### 5. 删除 `crontab` 文件\n如果需要删除当前用户的所有定时任务,可以使用以下命令:\n```bash\ncrontab -r\n```\n\n### 注意事项\n- **环境变量**:`crontab` 任务在执行时使用的环境变量可能与用户登录时不同。如果脚本依赖特定的环境变量,需要在脚本中明确设置。\n- **日志记录**:建议将定时任务的输出重定向到日志文件,以便后续排查问题。\n- **权限问题**:确保执行的命令或脚本具有足够的权限。\n", + "Linux/Debian 12安装MySQL教程.md": "\n---\n\n## 🧩 一、卸载旧版本(如果你之前装过 5.7 或 MariaDB)\n\n为了避免冲突,建议先清理旧包:\n\n```bash\nsudo systemctl stop mysql || true\nsudo apt remove --purge -y mysql-server mysql-client mysql-common mariadb-server mariadb-client mariadb-common\nsudo apt autoremove --purge -y\nsudo rm -rf /var/lib/mysql /etc/mysql\n```\n\n---\n\n## ⚙️ 二、添加官方 MySQL APT 仓库\n\n### 1️⃣ 下载并安装配置包\n\n```bash\nwget https://dev.mysql.com/get/mysql-apt-config_0.8.36-1_all.deb\nsudo dpkg -i mysql-apt-config_0.8.36-1_all.deb\n```\n\n安装时会弹出交互菜单,请仔细选择:\n\n- **MySQL Server & Cluster → mysql-8.4-lts**\n \n- 其他(如 Tools、Connector 等)可保持默认。\n \n\n然后退出(选择 “OK” 保存配置)。\n\n---\n\n## ⚙️ 三、更新并安装 MySQL 8.4 LTS\n\n```bash\nsudo apt update\nsudo apt install -y mysql-server\n```\n\n这个命令会自动安装最新的 MySQL 8.4(LTS 版),包含 `mysql-community-server` 和相关依赖。\n\n---\n\n## 🔍 四、验证安装\n\n```bash\nmysql --version\n```\n\n你应看到类似输出:\n\n```\nmysql Ver 8.4.2 for Linux on x86_64 (MySQL Community Server - GPL)\n```\n\n---\n\n## 🧠 五、启动与开机自启\n\n```bash\nsudo systemctl enable mysql\nsudo systemctl start mysql\nsudo systemctl status mysql\n```\n\n如果输出里状态是 `active (running)` ✅,说明服务正常运行。\n\n---\n\n## 🔐 六、安全配置\n\n执行官方安全脚本:\n\n```bash\nsudo mysql_secure_installation\n```\n\n它会引导你:\n\n- 设置 root 密码\n \n- 移除匿名用户\n \n- 禁止 root 远程登录(可选)\n \n- 删除 test 数据库\n \n- 重载权限表\n \n\n建议全部选择“是(Y)”。\n\n---\n\n## 🧭 七、登录测试\n\n```bash\nmysql -u root -p\n```\n\n输入刚刚设置的密码,进入后执行:\n\n```sql\nSELECT VERSION();\n```\n\n输出应为:\n\n```\n+-----------+\n| VERSION() |\n+-----------+\n| 8.4.x |\n+-----------+\n```\n\n---\n\n## 🧰 八、(可选)修改 MySQL 配置文件\n\n主配置路径:\n\n```\n/etc/mysql/mysql.conf.d/mysqld.cnf\n```\n\n如果你想修改端口、字符集等:\n\n```bash\nsudo nano /etc/mysql/mysql.conf.d/mysqld.cnf\n```\n\n推荐添加以下配置以支持中文与 emoji:\n\n```ini\n[mysqld]\ncharacter-set-server = utf8mb4\ncollation-server = utf8mb4_unicode_ci\n\n[client]\ndefault-character-set = utf8mb4\n```\n\n然后重启服务:\n\n```bash\nsudo systemctl restart mysql\n```\n\n---\n\n## 🧱 九、测试端口与启动情况\n\n```bash\nss -tunlp | grep mysql\n```\n\n输出类似:\n\n```\ntcp LISTEN 0 80 127.0.0.1:3306 *:* users:((\"mysqld\",pid=xxxx,fd=xxx))\n```\n\n说明 MySQL 已在 3306 端口监听。\n\n---\n\n## 🚀 十、总结\n\n|项目|状态|\n|---|---|\n|系统|Debian 12 (Bookworm) ✅|\n|MySQL 版本|8.4 LTS ✅|\n|官方支持|完全兼容|\n|安装难度|简单(无依赖冲突)|\n|推荐用途|长期开发 / 生产环境|\n\n---\n", + "Linux/Debian 12安装PostgresDB教程.md": "下面给出在 PostgreSQL (PostgreSQL)在 Debian 12 (Bookworm) 上安装及基本配置的**一步步教程**\n\n---\n\n## 前置条件\n\n1. 已有一台 Debian 12 系统(可以是物理机、VM、或者云上实例)。\n \n2. 使用拥有 `sudo` 权限的用户登录。\n \n3. 网络可访问外部软件源。\n \n\n---\n\n## 安装过程\n\n### 1. 更新系统软件包\n\n```bash\nsudo apt update\nsudo apt upgrade -y\n```\n\n这是一个好习惯,确保系统软件包为最新。\n\n### 2. 安装 PostgreSQL\n\n有两种方式:使用 Debian 默认仓库或使用官方 PostgreSQL 仓库。\n\n#### 方法 A:使用 Debian 默认仓库\n\n```bash\nsudo apt install -y postgresql postgresql-contrib\n```\n\n这会安装 PostgreSQL 及一些附加工具。\n安装后,服务一般会自动启动。可用 `sudo systemctl status postgresql` 查看。\n\n#### 方法 B:使用 PostgreSQL 官方 PGDG 仓库(推荐如果你想安装特定版本)\n\n1. 安装 `postgresql-common`(生成脚本等):\n \n ```bash\n sudo apt install -y postgresql-common\n ```\n \n\n \n2. 运行脚本将 PGDG 仓库添加到系统:\n \n ```bash\n sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh\n ```\n \n 或者手动:导入签名密钥、创建 `/etc/apt/sources.list.d/pgdg.list`。\n \n3. 更新软件包列表:\n \n ```bash\n sudo apt update\n ```\n \n4. 安装你想的版本,比如:\n \n ```bash\n sudo apt install -y postgresql-18\n ```\n \n (版本号根据仓库显示为止)\n \n\n---\n\n### 3. 检查服务状态 & 设置开机启动\n\n```bash\nsudo systemctl status postgresql\nsudo systemctl enable postgresql\n```\n\n确认服务已运行并且开机启动。\n\n---\n\n### 4. 切换用户、设置 postgres 用户密码\n\n安装完成后,系统默认创建一个系统用户 `postgres`,以及 PostgreSQL 内部用户 `postgres`。你可以切换并为它设密码:\n\n```bash\nsudo -i -u postgres\npsql\n\\password postgres\n\\q\nexit\n```\n\n这样为超级用户设置了密码。\n\n---\n\n### 5. 创建数据库和用户(基本操作)\n\n切换为 `postgres` 用户后,在 psql 中执行:\n\n```sql\nCREATE DATABASE mydb;\nCREATE USER myuser WITH PASSWORD 'strongpassword';\nGRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;\n```\n\n然后退出 `\\q`。\n你可以用以下方式连接:\n\n```bash\npsql -d mydb -U myuser -h localhost\n```\n\n---\n\n### 6. 配置远程访问(如果你希望其他机器也能访问数据库)\n\n默认 PostgreSQL 只监听本地 localhost。若要允许远程连接,需要两步:\n\n1. 编辑 `postgresql.conf`,修改 listen_addresses :\n \n ```bash\n sudo nano /etc/postgresql/12/main/postgresql.conf\n # 找到\n listen_addresses = 'localhost'\n # 改为\n listen_addresses = '*'\n ```\n \n 然后保存。\n \n2. 编辑 `pg_hba.conf`,允许特定 IP 或网段连接:\n \n ```bash\n sudo nano /etc/postgresql/12/main/pg_hba.conf\n # 添加一行,例如:\n host all all 192.168.100.0/24 md5\n ```\n \n 然后重启服务:\n \n ```bash\n sudo systemctl restart postgresql\n ```\n \n\n> **警告**:允许远程访问时要注意安全(防火墙、强密码、只限可信IP)。\n\n---\n\n### 7. (可选)安装 pgAdmin4 图形管理工具\n\n如果你更倾向图形界面管理数据库,可以考虑安装 pgAdmin 4。 ([HowtoForge](https://www.howtoforge.com/how-to-install-postgresql-and-pgadmin-tool-on-debian-12/?utm_source=chatgpt.com \"How to Install PostgreSQL and pgAdmin Tool on Debian 12\")) \n大致步骤:添加 pgAdmin 仓库、安装 `pgadmin4-web`、运行配置脚本、然后通过浏览器访问管理界面。\n\n---\n\n### 8. 卸载或清理(如果需要)\n\n如果你想移除 PostgreSQL,建议使用 `purge` 而不仅仅 `remove`,以清理配置文件。有人经验如下:\n\n> “使用 apt purge —purge … 然后 rm -rf 残余目录” ([Reddit](https://www.reddit.com/r/debian/comments/16cn3zx/how_to_properly_install_postgresql_remove_it_and/?utm_source=chatgpt.com \"how to properly install postgresql, remove it, and install it again?\")) \n> 但在你的场景里(你打算长期使用 PostgreSQL),通常不需要卸载。\n\n\n---\n", + "Linux/Debian12卸载宝塔面板命令.md": "在 **Debian 12** 上彻底卸载 **宝塔面板(BT Panel)**,包括其服务、目录和残留配置文件,可以按以下步骤执行。\n\n---\n\n### 🧹 一键卸载命令(官方脚本)\n\n宝塔官方提供了卸载脚本,最安全的做法是:\n\n```bash\nbt uninstall\n```\n\n如果命令不存在,可用下面的方式:\n\n```bash\nbash /www/server/panel/install/uninstall.sh\n```\n\n---\n\n### 🧨 手动彻底清理残留(推荐完整执行以下步骤)\n\n如果你想**完全删除所有宝塔相关文件与服务**,执行以下命令(逐条复制):\n\n```bash\n# 1. 停止宝塔服务\n/etc/init.d/bt stop || systemctl stop bt\n\n# 2. 删除宝塔主目录\nrm -rf /www\n\n# 3. 删除宝塔执行脚本及命令链接\nrm -f /usr/bin/bt\nrm -f /etc/init.d/bt\n\n# 4. 删除启动服务项\nsystemctl disable bt --now 2>/dev/null\n\n# 5. 删除宝塔日志和缓存\nrm -rf /tmp/*bt*\nrm -rf /var/log/bt*\nrm -rf /var/lib/btpanel\n\n# 6. 删除宝塔安装脚本可能残留的位置\nrm -rf /root/.bt_backup\nrm -rf /root/bt.*\nrm -rf /root/panel\nrm -rf /root/.ssh_bt\n\n# 7. 删除 Nginx、MySQL、PHP 等由宝塔安装的服务(如需要)\n# ⚠️ 若系统中其它服务依赖这些组件,请谨慎执行!\napt purge -y nginx* mysql* mariadb* php* pure-ftpd* redis* memcached* mongod* vsftpd*\napt autoremove -y\napt clean\n```\n\n---\n\n### 🧾 可选清理(防止端口和用户残留)\n\n```bash\n# 删除宝塔可能创建的用户\nuserdel -r www 2>/dev/null\n\n# 清理面板端口防火墙规则(默认为 8888)\nufw delete allow 8888 2>/dev/null || iptables -D INPUT -p tcp --dport 8888 -j ACCEPT 2>/dev/null\n```\n\n---\n\n### ✅ 验证是否卸载干净\n\n执行以下命令检查:\n\n```bash\nps aux | grep bt\nls /www\nls /usr/bin/bt\n```\n\n若无输出或显示“无此文件或目录”,说明已彻底卸载。\n\n---\n", + "Linux/Debian12安装MongoDB教程.md": "在 **Debian 12 (Bookworm)** 上安装 MongoDB 的正确方式是使用 **MongoDB 官方仓库**(推荐)或 **APT 默认仓库**(版本较旧)。下面给出详细步骤(推荐安装 **MongoDB 7.0** 最新稳定版)。\n\n---\n\n## 🧩 一、使用 MongoDB 官方仓库安装(推荐)\n\n### 1️⃣ 导入 MongoDB 公钥\n\n```bash\nsudo apt-get install -y curl gnupg\ncurl -fsSL https://pgp.mongodb.com/server-7.0.asc | \\\n sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor\n```\n\n---\n\n### 2️⃣ 添加 MongoDB 官方 APT 源\n\n```bash\necho \"deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] \\\nhttps://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main\" | \\\nsudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list\n```\n\n---\n\n### 3️⃣ 更新软件源并安装 MongoDB\n\n```bash\nsudo apt-get update\nsudo apt-get install -y mongodb-org\n```\n\n---\n\n### 4️⃣ 启动并设置开机自启\n\n```bash\nsudo systemctl start mongod\nsudo systemctl enable mongod\n```\n\n---\n\n### 5️⃣ 查看运行状态\n\n```bash\nsudo systemctl status mongod\n```\n\n如果显示 `active (running)`,说明安装成功。\n\n---\n\n### 6️⃣ 进入 Mongo Shell(测试)\n\n```bash\nmongosh\n```\n\n退出:\n\n```bash\nexit\n```\n\n---\n\n## 🧩 二、(可选)如果想卸载 MongoDB\n\n```bash\n# 1️⃣ 停止服务\nsudo systemctl stop mongod 2>/dev/null || true\nsudo systemctl disable mongod 2>/dev/null || true\n\n# 2️⃣ 卸载所有相关包\nsudo apt-get purge -y mongodb-org* mongodb* mongosh*\n\n# 3️⃣ 删除残留的数据和日志目录\nsudo rm -rf /var/lib/mongo\nsudo rm -rf /var/lib/mongodb\nsudo rm -rf /var/log/mongodb\nsudo rm -rf /tmp/mongodb-*\n\n# 4️⃣ 删除配置文件和 systemd 服务文件\nsudo rm -f /etc/mongod.conf\nsudo rm -rf /etc/mongodb.conf\nsudo rm -f /lib/systemd/system/mongod.service\nsudo rm -f /etc/systemd/system/mongod.service\n\n# 5️⃣ 删除 apt 源文件\nsudo rm -f /etc/apt/sources.list.d/mongodb-org-*.list\n\n# 6️⃣ 清理包缓存\nsudo apt-get autoremove -y\nsudo apt-get autoclean -y\n\n\n# 1️⃣ 导入官方 GPG 密钥\ncurl -fsSL https://pgp.mongodb.com/server-7.0.asc | \\\n sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor\n\n# 2️⃣ 添加官方源\necho \"deb [signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] \\\nhttps://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main\" | \\\n sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list\n\n# 3️⃣ 更新包并安装\nsudo apt-get update\nsudo apt-get install -y mongodb-org\n\n# 4️⃣ 启动并设置开机自启\nsudo systemctl enable mongod\nsudo systemctl start mongod\nsudo systemctl status mongod\n\n```\n\n---\n\n## ✅ 验证版本\n\n```bash\nmongod --version\n```\n\n---\n", + "Linux/Debian12安装Redis教程.md": "\n---\n\n## ① 卸载当前 Debian 仓库版本\n\n执行以下命令以删除 Redis 及其依赖,并清理旧配置/服务残留:\n\n```bash\nsudo systemctl stop redis-server.service\nsudo systemctl disable redis-server.service\n\nsudo apt remove --purge -y redis-server redis-tools\n# 可选清理相关包\nsudo apt autoremove -y\n\n# 删除可能的配置和数据目录(如果你数据可以丢弃或已备份):\nsudo rm -rf /etc/redis\nsudo rm -rf /var/lib/redis\nsudo rm -rf /var/log/redis\n```\n\n这样可以确保旧版本几乎完全被移除。\n\n---\n\n## ② 添加官方 Redis 仓库 & 安装最新版\n\n从官方文档添加仓库并安装最新版。根据官方说明: ([Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/archive/install-redis/install-redis-on-linux/?utm_source=chatgpt.com \"Install Redis on Linux | Docs\"))\n\n```bash\nsudo apt update\n\n# 安装必要工具\nsudo apt install -y lsb-release curl gpg\n\n# 添加官方 GPG key\ncurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg\nsudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg\n\n# 添加 Redis 官方仓库\necho \"deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main\" | sudo tee /etc/apt/sources.list.d/redis.list\n\n# 更新仓库索引\nsudo apt update\n\n# 安装 Redis 最新版本(官方名称可能是 “redis” 或 “redis-server”,看包名)\nsudo apt install -y redis\n```\n\n安装完成后,启动服务并设为开机启动:\n\n```bash\nsudo systemctl enable redis-server\nsudo systemctl start redis-server\n```\n\n验证安装:\n\n```bash\nredis-server --version\nredis-cli ping # 应返回 PONG\n```\n\n---\n\n## ③ 注意事项 &提示\n\n- 由于你之前遇到过 “`/usr/bin/redis-server -> redis-check-rdb`” 的链接问题,这次用官方仓库安装后,务必检查 `which redis-server`、`ls -l /usr/bin/redis-server`,确认 `redis-server` 是正确的守护进程可执行体。\n \n- 配置文件可能变化,最好检查 `/etc/redis/redis.conf` 中 `supervised systemd` 或 `daemonize no`、`bind` 等项是否与你的环境相符。\n \n- 若你的服务端(你开发的游戏服务端)使用 Redis 作为缓存或消息队列,建议备份关键配置或数据,以避免在卸载过程中丢失。\n \n- 安装后再次测试服务状态:\n \n ```bash\n sudo systemctl status redis-server\n ```\n \n 确认 “Active: active (running)”。\n \n- 安全建议:设置强密码、开启绑定本地(或限制访问)、配置持久化策略等。\n \n\n---\n", + "Linux/docker,LXC,qemu,k8s,chroot等的特点.md": "\n以下从技术定义、核心原理、特点、区别及相互关系等方面,详细解析 **LXC、Docker、chroot、虚拟机、QEMU、K8s** 的概念及关联:\n\n\n### **一、核心技术定义与原理**\n#### 1. **chroot**\n- **本质**:Linux 系统调用,用于修改进程的“根目录”(`/`),创建一个隔离的文件系统视图。\n- **原理**:通过 `chroot` 命令,指定一个新的根目录,进程只能访问该目录下的文件(类似“伪根”),但不隔离 CPU、内存、网络等资源。\n- **特点**:\n - 最轻量的隔离,仅文件系统隔离,无资源限制。\n - 进程仍共享宿主机内核、进程空间、网络栈等。\n - 非完整容器,常用于调试、环境隔离(如构建跨平台程序)。\n\n#### 2. **LXC(Linux Containers)**\n- **本质**:基于 Linux 内核特性(`namespace` 命名空间 + `cgroups` 资源控制)的操作系统级容器。\n- **原理**:\n - `namespace`:隔离进程、网络、文件系统、用户等资源(如 `PID namespace` 使容器内进程号独立)。\n - `cgroups`:限制容器的 CPU、内存、磁盘 I/O 资源使用。\n- **特点**:\n - 共享宿主机内核,启动快(秒级),资源占用低。\n - 提供接近虚拟机的隔离性,但轻量高效。\n - 需要手动配置,侧重系统级隔离(如运行完整的 Linux 发行版)。\n\n#### 3. **Docker**\n- **本质**:基于容器技术的应用打包与部署平台,核心是容器运行时(`runc`,基于 Open Container Initiative 标准)。\n- **原理**:\n - 继承 LXC 的 `namespace` 和 `cgroups`,但更上层,封装了镜像(`Image`)、容器(`Container`)、仓库(`Registry`)流程。\n - 通过镜像分层技术(UnionFS)实现快速打包,通过 `Docker Engine` 管理容器生命周期。\n- **特点**:\n - 聚焦“应用容器化”,强调“一次构建,到处运行”。\n - 比 LXC 更易用(标准化 API、自动化部署),适合微服务、CI/CD。\n - 镜像生态丰富(Docker Hub),但隔离性略弱于 LXC(共享内核,依赖宿主机内核版本)。\n\n#### 4. **虚拟机(Virtual Machine, VM)**\n- **本质**:通过虚拟化技术模拟完整硬件环境,运行独立操作系统。\n- **分类与原理**:\n - **全虚拟化**(如 VMware Workstation):Hypervisor 完全模拟硬件,Guest OS 无需修改。\n - **半虚拟化**(如 Xen):Guest OS 知道自己运行在虚拟机中,通过 Hypercall 与 Hypervisor 交互。\n - **硬件辅助虚拟化**(如 Intel VT-x):CPU 直接支持虚拟化,提升性能。\n- **特点**:\n - 隔离性最强(独立内核、硬件资源),支持不同操作系统(如 Windows 跑在 Linux 宿主机上)。\n - 资源开销大(需模拟硬件,启动慢,内存/CPU 占用高)。\n - 适合需要完整 OS 环境的场景(如测试不同系统、遗留应用迁移)。\n\n#### 5. **QEMU**\n- **本质**:开源的通用模拟器和虚拟机监视器(Virtual Machine Monitor, VMM)。\n- **原理**:\n - 单独使用时,通过软件模拟目标硬件(如在 x86 上运行 ARM 程序),性能较低。\n - 与 **KVM**(Kernel-based Virtual Machine,Linux 内核模块)结合时,利用硬件虚拟化技术(如 VT-x),成为高效的虚拟机引擎(QEMU-KVM)。\n- **特点**:\n - 跨平台兼容性强,支持多种架构(x86、ARM、RISC-V 等)。\n - 是虚拟机技术的具体实现之一,常作为 KVM 的用户空间工具。\n\n#### 6. **K8s(Kubernetes)**\n- **本质**:容器编排平台,用于自动化部署、扩展和管理容器化应用。\n- **核心功能**:\n - 调度容器到节点(Node),支持负载均衡、服务发现。\n - 处理容器的生命周期(重启、扩缩容、滚动更新)。\n - 提供资源配额、健康检查、故障恢复等机制。\n- **特点**:\n - 不绑定特定容器运行时(支持 Docker、containerd、runc 等)。\n - 解决“大规模容器集群管理”问题,适合微服务架构、云原生应用。\n\n\n### **二、核心区别对比**\n| **维度** | **chroot** | **LXC/Docker(容器)** | **虚拟机(含 QEMU-KVM)** | **K8s** |\n|-------------------|------------------|------------------------|---------------------------|------------------------|\n| **隔离级别** | 文件系统隔离 | 操作系统级隔离(内核共享) | 硬件级隔离(独立内核) | 编排管理层(不涉及底层隔离) |\n| **资源共享** | 完全共享 | 共享宿主机内核 | 独立内核,硬件资源模拟 | 管理多个容器/节点的资源 |\n| **启动时间** | 瞬间 | 秒级 | 分钟级(需启动 Guest OS) | 不涉及启动,管理已有容器 |\n| **资源开销** | 极低 | 低(仅用户空间隔离) | 高(硬件模拟 + 完整 OS) | 额外控制平面开销 |\n| **支持的 OS** | 同宿主机内核 | 同宿主机内核 | 任意 OS(如 Windows/Linux) | 不限制,管理容器化应用 |\n| **核心目标** | 文件系统隔离 | 轻量应用隔离/部署 | 完整 OS 环境模拟 | 容器集群管理 |\n| **典型用途** | 环境调试 | 应用打包、轻量部署 | 多系统测试、遗留应用兼容 | 大规模容器调度、微服务 |\n\n\n### **三、相互关系**\n#### 1. **技术栈分层**\n```\n应用层(K8s)\n├─ 容器运行时(Docker/LXC/containerd)\n│ ├─ 内核特性(namespace/cgroups)\n│ └─ chroot(基础文件系统隔离)\n└─ 虚拟化层(虚拟机/QEMU-KVM)\n └─ 硬件(CPU/内存/存储,支持 VT-x 等虚拟化技术)\n```\n\n#### 2. **具体关联**\n- **chroot 与容器**: \n chroot 是容器实现文件系统隔离的基础(如 Docker 镜像的根文件系统通过 chroot 挂载),但容器在此之上增加了 `namespace` 和 `cgroups` 实现完整隔离。\n\n- **LXC 与 Docker**: \n Docker 早期基于 LXC 开发,后转向自有运行时(`libcontainer`,现 `runc`),二者同属容器技术,但定位不同: \n - LXC 偏向“系统级容器”(运行完整 Linux 发行版,如 Ubuntu 容器); \n - Docker 偏向“应用级容器”(打包单个应用及其依赖,如 Node.js 服务)。\n\n- **虚拟机与 QEMU**: \n QEMU 是虚拟机的一种实现方式,单独使用时模拟硬件(慢),与 KVM 结合时利用硬件虚拟化(高效),属于虚拟机技术的底层引擎之一(类似 VirtualBox、VMware 的技术定位)。\n\n- **K8s 与容器/虚拟机**: \n - K8s 主要管理容器(如 Docker 容器),但也可通过虚拟机节点(Node)部署(每个 Node 可以是物理机或虚拟机)。 \n - 容器运行在宿主机(物理机或虚拟机)上,K8s 不关心底层是物理机还是虚拟机,只调度容器到节点。\n\n\n### **四、应用场景总结**\n- **chroot**:简单文件系统隔离(如构建跨版本软件、修复系统)。 \n- **Docker/LXC**:轻量应用部署(微服务、Web 服务),追求资源效率和快速启动。 \n- **虚拟机/QEMU-KVM**:需要完整 OS 隔离(如运行 Windows 应用、多租户隔离、硬件兼容性测试)。 \n- **K8s**:大规模容器集群管理(微服务架构、弹性扩缩容、高可用部署)。\n\n\n### **五、核心总结**\n- **隔离性**:虚拟机(强隔离,独立内核)> 容器(共享内核,OS 级隔离)> chroot(仅文件系统)。 \n- **效率**:chroot/容器(高效)> 虚拟机(低效,因硬件模拟)。 \n- **关系**: \n - 容器技术(LXC/Docker)基于内核特性(namespace/cgroups),chroot 是其文件系统隔离的基础。 \n - 虚拟机(如 QEMU-KVM)通过硬件虚拟化实现强隔离,与容器形成互补(容器适合同一 OS 下的应用隔离,虚拟机适合跨 OS 隔离)。 \n - K8s 是容器的“上层管理工具”,不依赖特定容器运行时,聚焦集群调度与自动化。\n\n理解这些技术的核心是明确其“隔离目标”和“资源模型”:容器追求轻量高效,虚拟机追求强隔离,K8s 解决规模化管理问题,而 chroot 是最基础的工具。根据需求选择合适的技术(如部署单个应用用 Docker,多 OS 环境用虚拟机,大规模集群用 K8s 编排容器)。", "Linux/Linux zip 命令总结.md": "\n1. 打包单个文件:\n\n```\nzip 压缩包名称.zip 要打包的文件\n```\n\n2. 打包多个文件:\n\n```\nzip 压缩包名称.zip 文件1 文件2 文件3\n```\n\n3. 打包整个目录(包括子目录):\n\n```\nzip -r 压缩包名称.zip 要打包的目录\n```\n\n4. 打包目录并排除某些文件:\n\n```\nzip -r 压缩包名称.zip 要打包的目录 -x 要排除的文件或目录\n```\n\n5. 带密码打包:\n\n```\nzip -r -e 压缩包名称.zip 要打包的目录\n```\n\n执行后会提示你输入密码\n\n例如,要打包当前目录下的documents文件夹为backup.zip,可以使用:\n\n```\nzip -r backup.zip documents\n```\n\n如果系统中没有zip命令,可以先安装:\n\n- Debian/Ubuntu: sudo apt install zip\n", "Linux/Linux一些奇奇怪怪的命令.md": "打开终端tmoe面板:\ncurl -LO https://gitee.com/mo2/linux/raw/2/2.awk\nawk -f 2.awk\n\nubuntu和deepin系统安装宝塔面板:\nwget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash install.sh ed8484bec\n\n重启宝塔面板:\nbt restart\n\n开启宝塔面板:\nbt default\n\n安装和运行casaos轻量nas系统:\ncurl -fsSL https://get.casaos.io | sudo bash\n\n安装和运行1panel面板:\ncurl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh\n\n连接ssh示例\n\nssh root@192.168.25.151 -p 6003", "Linux/Linux下的scp命令总结.md": "Linux scp 命令总结\n用途:安全复制文件/目录到本地或远程主机(基于 SSH 协议)。\n \n基本语法\n \nscp [选项] 源文件 目标路径\n \n \n常用选项\n \n选项 说明 \n -r  递归复制目录及子目录 \n -P   指定 SSH 端口(注意大写 P) \n -i   使用指定的私钥文件认证 \n -C  压缩传输数据 \n -p  保留文件属性(时间戳、权限等) \n -v  显示详细传输过程 \n \n典型示例\n \n1. 本地文件 → 远程主机\n \nscp local_file.txt user@remote_host:/path/to/remote_dir/\n \n2. 远程文件 → 本地\n \nscp user@remote_host:/path/to/remote_file.txt ~/local_dir/\n \n3. 复制目录(需加  -r )\n \nscp -r local_dir/ user@remote_host:/path/to/remote_dir/\n \n4. 远程主机间复制(通过本地中转)\n \nscp user1@host1:/file.txt user2@host2:/path/\n \n5. 指定端口(如非默认 22 端口)\n \nscp -P 2222 local_file.txt user@remote_host:/remote_path/\n \n6. 使用私钥认证\n \nscp -i ~/.ssh/id_rsa local_file.txt user@remote_host:/remote_path/\n \n \n注意事项\n \n- 远程路径需以  user@host:  开头。\n- 目标路径不存在时会自动创建(目录需  -r )。\n- 若提示权限问题,检查私钥文件权限(需  chmod 600 )。", @@ -43,57 +54,67 @@ "Linux/Linux后台运行程序.md": "在 Linux 系统中,让服务一直保持在后台运行有多种方法,下面为你详细介绍:\r\n\r\n### 1. 使用 `&` 符号\r\n在命令后面加上 `&` 符号可以让命令在后台运行。\r\n\r\n#### 示例\r\n```bash\r\npython my_script.py &\r\n```\r\n上述命令会让 `my_script.py` 脚本在后台运行。\r\n\r\n#### 注意事项\r\n- 这种方式虽然简单,但当你关闭当前终端会话时,该进程可能会收到 `SIGHUP` 信号而终止。\r\n- 你可以使用 `jobs` 命令查看当前终端中后台运行的作业,使用 `fg` 命令将后台作业调回到前台。\r\n\r\n### 2. 使用 `nohup` 命令\r\n`nohup` 命令可以让程序忽略 `SIGHUP` 信号,从而在你关闭终端后继续运行。\r\n\r\n#### 示例\r\n```bash\r\nnohup python my_script.py > output.log 2>&1 &\r\n```\r\n- `nohup`:用于忽略 `SIGHUP` 信号。\r\n- `> output.log`:将标准输出重定向到 `output.log` 文件。\r\n- `2>&1`:将标准错误输出也重定向到标准输出,即同样写入 `output.log` 文件。\r\n- `&`:让命令在后台运行。\r\n\r\n#### 查看运行状态\r\n使用 `ps` 命令可以查看进程是否还在运行:\r\n```bash\r\nps -ef | grep my_script.py\r\n```\r\n\r\n### 3. 使用 `screen` 工具\r\n`screen` 是一个全屏窗口管理器,它可以创建多个虚拟终端会话,即使你断开连接,会话中的进程仍然会继续运行。\r\n\r\n#### 安装 `screen`\r\n在 Debian 或 Ubuntu 系统上:\r\n```bash\r\nsudo apt-get install screen\r\n```\r\n在 CentOS 或 RHEL 系统上:\r\n```bash\r\nsudo yum install screen\r\n```\r\n\r\n#### 使用步骤\r\n1. 启动一个新的 `screen` 会话:\r\n```bash\r\nscreen\r\n```\r\n2. 在 `screen` 会话中运行你的命令,例如:\r\n```bash\r\npython my_script.py\r\n```\r\n3. 按下 `Ctrl + A` 然后再按下 `D` 组合键,将当前 `screen` 会话分离,此时会话会在后台继续运行。\r\n4. 如果你想重新连接到该会话,可以使用以下命令:\r\n```bash\r\nscreen -r\r\n```\r\n\r\n### 4. 使用 `tmux` 工具\r\n`tmux` 也是一个类似 `screen` 的终端复用工具,功能更强大。\r\n\r\n#### 安装 `tmux`\r\n在 Debian 或 Ubuntu 系统上:\r\n```bash\r\nsudo apt-get install tmux\r\n```\r\n在 CentOS 或 RHEL 系统上:\r\n```bash\r\nsudo yum install tmux\r\n```\r\n\r\n#### 使用步骤\r\n1. 启动一个新的 `tmux` 会话:\r\n```bash\r\ntmux new -s mysession\r\n```\r\n这里的 `mysession` 是会话的名称,你可以自定义。\r\n2. 在 `tmux` 会话中运行你的命令,例如:\r\n```bash\r\npython my_script.py\r\n```\r\n3. 按下 `Ctrl + B` 然后再按下 `D` 组合键,将当前 `tmux` 会话分离。\r\n4. 如果你想重新连接到该会话,可以使用以下命令:\r\n```bash\r\ntmux attach -t mysession\r\n```\r\n\r\n### 5. 使用系统服务管理工具(如 `systemd`)\r\n对于需要长期稳定运行的服务,推荐使用系统服务管理工具,如 `systemd`(大多数现代 Linux 发行版都使用 `systemd`)。\r\n\r\n#### 创建服务文件\r\n创建一个新的服务文件,例如 `/etc/systemd/system/my_script.service`:\r\n```ini\r\n[Unit]\r\nDescription=My Python Script Service\r\nAfter=network.target\r\n\r\n[Service]\r\nExecStart=/usr/bin/python /path/to/my_script.py\r\nWorkingDirectory=/path/to/working/directory\r\nRestart=always\r\nUser=your_username\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\n```\r\n- `Description`:服务的描述信息。\r\n- `After`:指定服务在网络服务启动后再启动。\r\n- `ExecStart`:指定要执行的命令。\r\n- `WorkingDirectory`:指定工作目录。\r\n- `Restart`:设置为 `always` 表示服务崩溃或停止后会自动重启。\r\n- `User`:指定运行服务的用户。\r\n\r\n#### 启动和管理服务\r\n```bash\r\n# 重新加载 systemd 管理器配置\r\nsudo systemctl daemon-reload\r\n# 启动服务\r\nsudo systemctl start my_script.service\r\n# 设置服务开机自启\r\nsudo systemctl enable my_script.service\r\n# 查看服务状态\r\nsudo systemctl status my_script.service\r\n```", "Linux/Linux命令风格解析.md": "在Linux命令行中,选项的不同书写形式反映了三种主流风格的设计逻辑,以下是结合历史背景与实际应用场景的深度解析:\n\n### 一、Unix/Posix风格:简洁至上的单字符范式\n这是最古老的选项体系,诞生于Unix电传打字机时代。其核心特征是:\n- **符号标识**:必须以单个短横线`-`开头,如`ls -a`\n- **组合规则**:无参数的选项可自由拼接,如`ls -alh`等价于`ls -a -l -h`\n- **参数绑定**:带参数的选项需紧跟值,如`-w50`或`-w 50`均可\n- **历史局限**:受限于26个字母的容量,复杂工具需依赖组合(如`find -type f -exec`)\n\n典型场景:文件操作(`ls`、`cp`)、权限管理(`chmod`)等基础命令。这种风格的高效性在处理批量文件时尤为突出,例如`rm -rf`的组合操作。\n\n### 二、BSD风格:去符号化的实用主义\nBSD操作系统对Unix传统的突破体现在:\n- **无符号标识**:直接使用字母组合,如`ps aux`\n- **灵活组合**:多个选项可连写且无需分隔符,如`tar zxf archive.tar.gz`\n- **参数兼容**:带参数的选项可空格分隔或直接拼接,如`ps Uroot`与`ps U root`等效\n\n这种设计源于BSD对用户体验的优化,例如`ps aux`的组合能直观展示进程全貌。但需注意,并非所有BSD风格选项都能随意组合,如`ps fx`中的`f`和`x`分别控制显示格式和非终端进程,顺序调换可能影响输出。\n\n### 三、GNU风格:可读性优先的长选项\nGNU项目为解决单字符选项的语义模糊问题,引入了:\n- **双横线标识**:以`--`开头的完整单词,如`gzip --help`\n- **参数传递**:支持`--sort=time`或`--sort time`两种格式\n- **缩写机制**:唯一前缀即可生效,如`--cre`可替代`--create`\n- **功能扩展**:突破字母限制,如`wget --user-agent`可自定义请求头\n\n这种风格在复杂工具(如`git`、`docker`)中广泛应用,例如`git commit --amend`比`-a`更清晰。GNU工具通常同时支持长/短选项,如`ls --all`与`-a`等效。\n\n### 四、混合使用的注意事项\n1. **解析优先级**:旧风格选项需置于最前,如`tar cvf --exclude=*.tmp`中`cvf`为传统选项,`--exclude`为GNU选项\n2. **命令特异性**:并非所有命令都支持混合风格,例如`ps`可接受`ps -ef`(Unix风格)和`ps aux`(BSD风格),但`ps -aux`会被解析为混合模式\n3. **参数歧义**:当选项与文件名冲突时,可用`--`终止选项解析,如`rm -- -file`可强制删除名为`-file`的文件\n\n### 五、典型命令的风格对比\n| 命令 | Unix风格 | BSD风格 | GNU风格 |\n|------------|-------------------|-----------------|------------------|\n| 解压缩 | `tar -zxf file` | `tar zxf file` | `tar --gzip --extract --file=file` |\n| 进程查看 | `ps -ef` | `ps aux` | `ps --forest` |\n| 显示帮助 | `ls -h` | `ls h`(无效) | `ls --help` |\n\n### 六、历史演变与实践建议\n- **工具适配**:GNU工具普遍兼容多种风格,而BSD衍生工具(如`freebsd`的`ps`)可能仅支持特定格式\n- **学习路径**:新手建议从GNU长选项入手(如`--help`),逐步掌握短选项组合\n- **文档依赖**:使用`man`或`--help`查看具体命令的选项说明,例如`tar --help`会列出所有支持的风格\n\n理解这些风格差异,不仅能更高效地使用命令行,还能深入体会不同开发社区的设计哲学。例如,GNU的长选项体现了自由软件运动对可读性的追求,而BSD的简洁风格则延续了Unix“做一件事并做好”的理念。在实际应用中,可根据场景灵活选择:快速操作时用短选项,复杂配置时用长选项,疑难问题则结合`--help`与`man`手册。\n", "Linux/Linux复制文件命令.md": "在 Linux 中,可以使用 `cp` 命令将某个路径的文件复制到另一个位置。命令格式如下:\r\n\r\n```bash\r\ncp 源文件路径 目标路径\r\n```\r\n\r\n### 示例\r\n假设要将 `/home/user/file.txt` 复制到 `/home/user/documents/`,命令如下:\r\n\r\n```bash\r\ncp /home/user/file.txt /home/user/documents/\r\n```\r\n\r\n### 选项\r\n- **`-r`**:复制目录及其内容。\r\n- **`-i`**:覆盖前提示确认。\r\n- **`-v`**:显示复制进度。\r\n\r\n### 示例\r\n1. **复制目录**:\r\n ```bash\r\n cp -r /home/user/folder /home/user/documents/\r\n ```\r\n\r\n2. **覆盖前提示**:\r\n ```bash\r\n cp -i /home/user/file.txt /home/user/documents/\r\n ```\r\n\r\n3. **显示进度**:\r\n ```bash\r\n cp -v /home/user/file.txt /home/user/documents/\r\n ```\r\n\r\n### 总结\r\n`cp` 命令用于复制文件或目录,常用选项包括 `-r`、`-i` 和 `-v`。", - "Linux/linux安装nodejs22.md": "apt install curl\n\n# Download and install nvm:\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash\n\n# in lieu of restarting the shell\n\\. \"$HOME/.nvm/nvm.sh\"\n\n# Download and install Node.js:\nnvm install 22\n\n# Verify the Node.js version:\nnode -v # Should print \"v22.19.0\".\n\n# Verify npm version:\nnpm -v # Should print \"10.9.3\".\n\n", "Linux/Linux安装ollama.md": "apt install tur-repo\napt install ollama\nollama serve\n重新开启个会话\n安装各种开源模型\n", "Linux/Linux常用软件包安装.md": "```bash\nsudo apt install docker-compose -y\n```", "Linux/Linux查看无线网口.md": "在Debian系统中,可以通过以下几种方法查看使用的无线网卡的名称:\r\n\r\n### 使用命令行工具`ifconfig`\r\n1. 打开终端,输入命令`ifconfig -a`。\r\n2. 该命令会列出系统中所有的网络接口,包括有线网卡、无线网卡等。通常无线网卡的名称会以`wlan`开头,如`wlan0`、`wlan1`等。你可以根据网卡的相关信息(如MAC地址、IP地址等)来确定具体使用的无线网卡。\r\n\r\n### 使用`iwconfig`命令\r\n1. 在终端中输入`iwconfig`。\r\n2. 此命令主要用于配置无线网卡,它会显示出系统中的无线接口信息,包括无线网卡的名称、频率、信号强度等。通过识别无线网卡的相关参数,能找到正在使用的无线网卡名称。\r\n\r\n### 查看`/sys/class/net/`目录\r\n1. 打开终端,输入命令`ls /sys/class/net/`。\r\n2. 该目录下列出了系统中所有的网络设备接口文件,无线网卡的名称通常也以`wlan`开头,通过查看该目录可以找到无线网卡的名称。\r\n\r\n### 使用`nmcli`命令\r\n1. 确保`NetworkManager`服务已安装并运行,然后在终端中输入`nmcli device status`。\r\n2. 该命令会显示系统中网络设备的状态信息,包括设备名称、设备类型、状态等。在设备类型为`wifi`的行中,可以找到无线网卡的名称。", "Linux/Linux的Proc目录解析.md": " `/proc` 在 Linux 中是一个 **伪文件系统 (procfs)**,它不是存储在磁盘上的真实文件,而是内核在内存中动态生成的接口,主要用于提供 **内核、进程和系统状态** 的信息。几乎所有的监控工具(如 `top`、`htop`、`ps`、`free`、`uptime`、`vmstat`、`iostat`)都是通过读取 `/proc` 下的文件获取数据的。\n \n---\n\n# 🗂 **/proc 能查看的信息汇总**\n\n## 1. **进程相关信息**\n\n每个正在运行的进程在 `/proc` 下都会有一个以 **PID** 命名的目录,例如 `/proc/1234/`。里面的内容主要是该进程的状态:\n\n- `/proc/[pid]/cmdline` → 启动命令行参数\n \n- `/proc/[pid]/cwd` → 当前工作目录 (符号链接)\n \n- `/proc/[pid]/exe` → 可执行文件路径 (符号链接)\n \n- `/proc/[pid]/environ` → 环境变量\n \n- `/proc/[pid]/fd/` → 打开的文件描述符\n \n- `/proc/[pid]/maps` → 内存映射情况\n \n- `/proc/[pid]/stat` → 进程状态、运行时间、优先级等\n \n- `/proc/[pid]/status` → 可读性较好的进程状态信息\n \n- `/proc/[pid]/task/` → 线程信息(子目录为线程 ID)\n \n\n---\n\n## 2. **CPU 相关信息**\n\n- `/proc/cpuinfo` → CPU 型号、核心数、主频、缓存大小、虚拟化支持等\n \n- `/proc/stat` → CPU 使用率、上下文切换、中断次数等\n \n- `/proc/interrupts` → 中断统计\n \n- `/proc/softirqs` → 软中断统计\n \n\n---\n\n## 3. **内存信息**\n\n- `/proc/meminfo` → 总内存、可用内存、缓存、swap 等\n \n- `/proc/kcore` → 内核内存映射(类似物理内存的转储)\n \n- `/proc/vmallocinfo` → 内核虚拟内存使用情况\n \n- `/proc/slabinfo` → 内核对象缓存(slab 分配器)\n \n\n---\n\n## 4. **系统信息**\n\n- `/proc/version` → 内核版本信息\n \n- `/proc/uptime` → 系统运行时间和空闲时间\n \n- `/proc/loadavg` → 系统平均负载\n \n- `/proc/cmdline` → 内核启动参数\n \n- `/proc/modules` → 已加载的内核模块\n \n- `/proc/filesystems` → 支持的文件系统类型\n \n- `/proc/mounts` → 当前挂载的文件系统(和 `mount` 命令一致)\n \n- `/proc/partitions` → 磁盘分区信息\n \n- `/proc/devices` → 已注册的设备\n \n- `/proc/ioports` → I/O 端口使用情况\n \n- `/proc/iomem` → 内存映射的 I/O 信息\n \n- `/proc/diskstats` → 磁盘 I/O 统计\n \n- `/proc/locks` → 当前内核中的文件锁\n \n\n---\n\n## 5. **网络信息**\n\n在 `/proc/net/` 目录下:\n\n- `/proc/net/dev` → 网络接口的流量统计(类似 `ifconfig`、`ip -s link`)\n \n- `/proc/net/tcp`、`/proc/net/udp` → TCP/UDP 连接信息(类似 `ss`、`netstat`)\n \n- `/proc/net/unix` → UNIX 套接字信息\n \n- `/proc/net/route` → 路由表\n \n- `/proc/net/arp` → ARP 缓存表\n \n- `/proc/net/snmp` → 网络协议统计信息(ICMP、TCP、UDP)\n \n\n---\n\n## 6. **内核配置与参数**\n\n- `/proc/sys/` → 内核参数(可读可写,可通过 `sysctl` 修改),例如:\n \n - `/proc/sys/net/ipv4/ip_forward` → 是否启用 IPv4 转发\n \n - `/proc/sys/kernel/hostname` → 主机名\n \n - `/proc/sys/kernel/pid_max` → 最大进程号\n \n - `/proc/sys/vm/swappiness` → 内存换出策略\n \n\n---\n\n## 7. **其他有用的文件**\n\n- `/proc/self/` → 当前进程(即访问 `/proc` 的进程本身)的信息\n \n- `/proc/kmsg` → 内核日志(类似 `dmesg`)\n \n- `/proc/sched_debug` → 调度器的调试信息\n \n- `/proc/zoneinfo` → 内存区域信息\n \n- `/proc/swap` → swap 使用情况\n \n\n---\n\n# 📊 **总结**\n\n通过 `/proc`,你可以获取:\n\n1. **进程级别** → PID、内存、CPU、线程、文件描述符\n \n2. **系统级别** → CPU、内存、负载、启动参数、模块、文件系统\n \n3. **硬件级别** → 设备、中断、I/O 端口、内存映射\n \n4. **网络级别** → 接口流量、TCP/UDP 连接、路由、ARP\n \n5. **内核级别** → 内核参数、调度、日志、虚拟内存\n \n\n---\n", "Linux/Linux软件包存放地址.md": "在 Linux 系统中,安装的软件包通常会放置在以下几个目录中,具体路径取决于软件包的类型和安装方式。\r\n\r\n### 1. **二进制文件(可执行文件)**\r\n - **`/usr/bin/`**:大多数用户安装的软件的二进制文件都会安装在此目录下。这些是常见的应用程序和命令(例如 `ls`, `cp`, `git` 等)。\r\n - **`/bin/`**:存放一些最基本的系统命令,这些命令在系统的任何时候都需要可用,通常在恢复模式下也能使用。\r\n - **`/usr/local/bin/`**:用户自己安装的软件(通常是通过源代码编译安装的软件)会放在这个目录下。它优先级高于 `/usr/bin/`,因此用户安装的命令会覆盖系统自带的软件。\r\n - **`/sbin/` 和 `/usr/sbin/`**:这些目录通常存放的是系统管理工具,需要管理员权限来使用。比如 `ifconfig`, `mount` 等。\r\n\r\n### 2. **库文件**\r\n - **`/lib/`**:包含了系统启动和运行时所必需的共享库(例如 C 库)。\r\n - **`/usr/lib/`**:用于存放大多数安装的软件包的共享库,支持应用程序的运行。\r\n - **`/usr/local/lib/`**:与 `/usr/local/bin/` 类似,这是存放用户手动安装的程序和库的地方。\r\n\r\n### 3. **配置文件**\r\n - **`/etc/`**:这是系统和应用程序的全局配置文件所在的目录。几乎所有的配置文件都可以在这里找到。例如 `/etc/passwd` 存放用户信息,`/etc/ssh/sshd_config` 存放 SSH 配置等。\r\n - **`/usr/local/etc/`**:对于用户自己安装的软件包,它的配置文件一般会放在此目录下。\r\n\r\n### 4. **文档和帮助文件**\r\n - **`/usr/share/`**:存放共享的数据文件,包括应用程序的文档、帮助文件、图标等。例如 `/usr/share/doc/` 目录存放着已安装软件包的文档和许可证。\r\n - **`/usr/local/share/`**:用户自己安装的软件的共享数据文件通常存放在此目录。\r\n\r\n### 5. **临时文件**\r\n - **`/tmp/`**:这个目录用于存放临时文件,系统或应用程序运行时会使用这个目录来存放临时数据。通常,`/tmp/` 目录中的文件会在系统重启后被删除。\r\n - **`/var/tmp/`**:类似于 `/tmp/`,但 `/var/tmp/` 中的文件不会在系统重启时被清除,适用于需要较长时间存储的临时文件。\r\n\r\n### 6. **日志文件**\r\n - **`/var/log/`**:存放系统和应用程序的日志文件。比如 `/var/log/syslog` 记录了系统日志,`/var/log/auth.log` 记录了认证相关的日志等。\r\n\r\n### 7. **其他相关目录**\r\n - **`/opt/`**:这个目录通常用于存放大型的第三方软件包,特别是那些由供应商提供的独立应用程序(例如 Google Chrome 或 Oracle Java)通常会安装在这个目录。\r\n - **`/home/`**:每个用户的个人目录会在 `/home/` 目录下(例如 `/home/user/`),其中可能包含用户安装的软件或自定义的程序。\r\n\r\n### 总结\r\n- **二进制文件**:`/bin/`、`/usr/bin/`、`/usr/local/bin/`\r\n- **库文件**:`/lib/`、`/usr/lib/`、`/usr/local/lib/`\r\n- **配置文件**:`/etc/`、`/usr/local/etc/`\r\n- **共享数据文件**:`/usr/share/`、`/usr/local/share/`\r\n- **日志文件**:`/var/log/`\r\n- **临时文件**:`/tmp/`、`/var/tmp/`\r\n- **软件包**:`/opt/`(大型第三方应用)\r\n", - "Linux/nodejsmarkdown库.md": "1. **markdown-it**:\r\n \r\n - **简介**: 一个功能强大且可扩展的 Markdown 解析器,支持插件和自定义规则。\r\n - **安装**: 可以通过 npm 安装:`npm install markdown-it`\r\n - **使用示例**:\r\n ```javascript\r\n const MarkdownIt = require('markdown-it');\r\n const md = new MarkdownIt();\r\n const result = md.render('# 你好,Markdown!');\r\n console.log(result);\r\n ```\r\n \r\n2. **marked**:\r\n - **简介**: 一个快速、轻量级的 Markdown 解析器,支持自定义渲染器。\r\n - **安装**: 使用 npm 安装:`npm install marked`\r\n - **使用示例**:\r\n ```javascript\r\n const marked = require('marked');\r\n const result = marked('# 你好,Markdown!');\r\n console.log(result);\r\n ```\r\n\r\n3. **remark**:\r\n - **简介**: 一个强大的 Markdown 处理库,支持解析、检查和转换 Markdown 文档。\r\n - **安装**: 通过 npm 安装:`npm install remark remark-html`\r\n - **使用示例**:\r\n ```javascript\r\n const remark = require('remark');\r\n const html = require('remark-html');\r\n \r\n remark()\r\n .use(html)\r\n .process('# 你好,Markdown!', function (err, file) {\r\n if (err) throw err;\r\n console.log(String(file));\r\n });\r\n ```\r\n\r\n这些库各有优点,选择哪个库取决于您的具体需求,比如性能、可扩展性、支持的特性等。如果你需要简单的解析和渲染,`marked` 和 `markdown-it` 都是不错的选择;如果需要更多的可扩展性和插件支持,`remark` 可能更适合。", - "Linux/QQ机器人napcat命令.md": "输入 xvfb-run -a qq --no-sandbox 命令启动。 \r\n保持后台运行 请输入 screen -dmS napcat bash -c \"xvfb-run -a qq --no-sandbox\" \r\n后台快速登录 请输入 screen -dmS napcat bash -c \"xvfb-run -a qq --no-sandbox -q QQ号码\" \r\nNapcat安装位置 /opt/QQ/resources/app/app_launcher/napcat \r\nWEBUI_TOKEN 请自行查看/opt/QQ/resources/app/app_launcher/napcat/config/webui.json文件获取 \r\n注意, 您可以随时使用 screen -r napcat 来进入后台进程并使用 ctrl + a + d 离开(离开不会关闭后台进程)。 \r\n停止后台运行 \r\n\r\n screen -S napcat -X quit ", - "Linux/screen常用指令.md": "## `screen`命令简介\r\n\r\n`screen` 是一个窗口管理器,允许用户在一个单一的终端窗口中运行多个会话。它特别适用于需要长时间运行的进程,因为即使网络连接断开,进程也会继续运行。\r\n\r\n## 常用命令\r\n\r\n### 启动和使用\r\n\r\n- **启动一个新的screen会话**\r\n ```bash\r\n screen\r\n ```\r\n 或者为会话命名:\r\n ```bash\r\n screen -S session_name\r\n ```\r\n\r\n- **列出所有screen会话**\r\n ```bash\r\n screen -ls\r\n ```\r\n\r\n- **重新连接到一个已存在的screen会话**\r\n ```bash\r\n screen -r session_name\r\n ```\r\n\r\n- **分离当前会话(让会话在后台继续运行)**\r\n 按下 `Ctrl + A` 然后按 `D`。\r\n\r\n- **终止一个screen会话**\r\n 在会话中按下 `Ctrl + D` 或者输入 `exit`。\r\n\r\n### 会话管理\r\n\r\n- **强制连接到一个会话**\r\n 如果有多个会话在运行,使用:\r\n ```bash\r\n screen -r -d session_name\r\n ```\r\n 这将断开该会话的其他连接并连接到它。\r\n\r\n- **多窗口管理**\r\n - 创建新窗口:`Ctrl + A` 然后 `C`\r\n - 切换窗口:`Ctrl + A` 然后 `N`(下一个),`Ctrl + A` 然后 `P`(上一个)\r\n - 列出所有窗口:`Ctrl + A` 然后 `\"`(双引号)\r\n\r\n### 会话命名\r\n\r\n- **重命名当前窗口**\r\n 按下 `Ctrl + A` 然后 `A`,输入新的名称。\r\n\r\n## 配置文件\r\n\r\n- **自定义screen**\r\n 可以通过编辑 `~/.screenrc` 文件进行配置。例如:\r\n ```bash\r\n # 开启多窗口状态栏\r\n hardstatus on\r\n hardstatus alwayslastline\r\n hardstatus string \"%{= kG}%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<\"\r\n ```\r\n\r\n## 提示\r\n\r\n- 使用 `screen` 可以有效防止因网络不稳定导致的会话中断。\r\n- 熟练掌握快捷键可以大大提高效率。\r\n- 对于需要长期运行的任务,如编译或数据处理,`screen` 是一个非常有用的工具。\r\n\r\n", - "Linux/SSH服务端配置.md": "配置 SSH 服务端(`sshd_config`)是确保服务器安全性和功能性的关键步骤。以下是基于您提供的默认配置文件的详细配置指南,包括关键选项的解释和安全建议。\n\n### 1. 基本配置\n\n#### 端口设置\n默认情况下,SSH 使用端口 22。为了提高安全性,您可以更改为其他端口。\n\n```bash\nPort 22\n```\n\n**建议**:修改为非标准端口(如 `Port 2222`)可以减少被自动扫描攻击的风险。\n\n```bash\nPort 2222\n```\n\n#### 监听地址\n默认配置监听所有 IPv4 地址。\n\n```bash\nListenAddress 0.0.0.0\n#ListenAddress ::\n```\n\n**建议**:如果服务器有多个网络接口,您可以指定特定的 IP 地址来监听。例如,仅监听内部网络:\n\n```bash\nListenAddress 192.168.1.100\n```\n\n### 2. 主机密钥\n\n主机密钥用于验证服务器的身份。确保这些密钥存在并且安全。\n\n```bash\n#HostKey /etc/ssh/ssh_host_rsa_key\n#HostKey /etc/ssh/ssh_host_ecdsa_key\n#HostKey /etc/ssh/ssh_host_ed25519_key\n```\n\n**建议**:取消注释需要的密钥类型,确保至少启用一种强加密算法(如 Ed25519)。\n\n```bash\nHostKey /etc/ssh/ssh_host_ed25519_key\n```\n\n### 3. 身份验证\n\n#### 禁止 root 登录\n出于安全考虑,建议禁止 root 用户通过 SSH 登录。\n\n```bash\n#PermitRootLogin prohibit-password\n```\n\n**建议**:将其设置为 `no` 或 `prohibit-password`,推荐使用密钥认证。\n\n```bash\nPermitRootLogin no\n```\n\n#### 密码认证\n启用或禁用密码认证。为了更高的安全性,建议使用密钥认证并禁用密码认证。\n\n```bash\n#PasswordAuthentication yes\nPasswordAuthentication no\n```\n\n#### 公钥认证\n确保启用公钥认证,并配置 `AuthorizedKeysFile`。\n\n```bash\nPubkeyAuthentication yes\nAuthorizedKeysFile .ssh/authorized_keys\n```\n\n**建议**:保持默认配置,确保每个用户的 `~/.ssh/authorized_keys` 文件中包含正确的公钥。\n\n#### 键盘交互认证\n如果只使用密钥认证,禁用键盘交互认证。\n\n```bash\nKbdInteractiveAuthentication no\n```\n\n### 4. 使用 PAM\n\nPAM(可插拔认证模块)用于增强认证机制。\n\n```bash\nUsePAM yes\n```\n\n**建议**:保持启用,但确保其他认证方法(如密码认证)根据需要进行配置。\n\n### 5. 限制用户和组\n\n通过 `AllowUsers` 或 `AllowGroups` 限制可以通过 SSH 登录的用户或组。\n\n```bash\n# Allow only specific users\n#AllowUsers user1 user2\n\n# Allow only specific groups\n#AllowGroups sshusers\n```\n\n**建议**:根据需要取消注释并配置,限制访问范围。\n\n```bash\nAllowUsers alice bob\n```\n\n### 6. 其他安全设置\n\n#### 禁用空密码登录\n\n```bash\n#PermitEmptyPasswords no\nPermitEmptyPasswords no\n```\n\n**确保**:禁止使用空密码登录。\n\n#### 启用防火墙和限制连接数\n\n配置防火墙(如 `ufw` 或 `iptables`)仅允许必要的端口和 IP 地址访问。同时,可以设置 `MaxAuthTries` 和 `MaxSessions` 来限制尝试次数和并发会话数。\n\n```bash\nMaxAuthTries 3\nMaxSessions 2\n```\n\n### 7. 日志和监控\n\n设置合适的日志级别以监控 SSH 活动。\n\n```bash\nLogLevel VERBOSE\n```\n\n**建议**:根据需要设置日志级别,如 `INFO` 或 `VERBOSE`,并定期检查日志文件(通常位于 `/var/log/auth.log` 或 `/var/log/secure`)。\n\n### 8. 重启 SSH 服务\n\n在完成配置后,重新启动 SSH 服务以应用更改。\n\n```bash\nsudo systemctl restart sshd\n```\n\n**检查配置是否正确**:\n\n在重新启动之前,最好检查配置文件是否有语法错误:\n\n```bash\nsudo sshd -t\n```\n\n如果没有输出,说明配置语法正确。否则,按照错误提示进行修正。\n\n### 9. 其他推荐配置\n\n- **启用双因素认证(2FA)**:增加登录的安全性。\n- **限制 SSH 登录时间**:通过 `sshd_config` 或使用其他工具限制用户的登录时间。\n- **使用 Fail2Ban**:防止暴力破解攻击,通过监控日志文件并动态更新防火墙规则。\n\n### 示例优化后的 `sshd_config`\n\n以下是根据上述建议优化后的配置示例:\n\n```bash\nPort 2222\nListenAddress 0.0.0.0\nHostKey /etc/ssh/ssh_host_ed25519_key\n\nPubkeyAuthentication yes\nAuthorizedKeysFile .ssh/authorized_keys\n\nPermitRootLogin no\nPasswordAuthentication no\nKbdInteractiveAuthentication no\n\nUsePAM yes\n\nAllowUsers alice bob\n\nLogLevel VERBOSE\n\nMaxAuthTries 3\nMaxSessions 2\n\nAcceptEnv LANG LC_*\n\nSubsystem\tsftp\t/usr/lib/openssh/sftp-server\n```\n\n### 总结\n\n正确配置 SSH 服务端对于保障服务器的安全至关重要。请根据您的具体需求和环境,结合上述指南进行配置。同时,定期审查和更新配置,以应对潜在的安全威胁。", - "Linux/systemctl命令详细总结-豆包.md": "\r\n### Linux `systemctl` 命令常用用法总结\r\n\r\n\r\n#### **一、服务管理(核心功能)**\r\n`systemctl` 主要用于管理系统服务(`.service` 文件),支持启动、停止、重启、查看状态、设置开机启动等操作。\r\n\r\n##### 1. 服务状态操作\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 启动服务 | `systemctl start <服务名>` | 启动指定服务(仅临时生效,重启后不保留) |\r\n| 停止服务 | `systemctl stop <服务名>` | 停止指定服务 |\r\n| 重启服务 | `systemctl restart <服务名>` | 重启服务(若服务未运行则启动) |\r\n| 重新加载配置 | `systemctl reload <服务名>` | 重新加载服务配置文件(不重启服务,适用于支持此功能的服务,如 Nginx) |\r\n| 平滑重启(优雅重启)| `systemctl try-restart <服务名>` | 仅在服务运行时重启,避免报错 |\r\n\r\n##### 2. 服务状态查询\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 查看状态 | `systemctl status <服务名>` | 显示服务运行状态、日志及依赖关系(按 `Q` 退出) |\r\n| 简洁状态 | `systemctl is-active <服务名>` | 仅显示服务是否激活(active/running) |\r\n| 查看是否启用开机启动| `systemctl is-enabled <服务名>` | 显示服务是否设置为开机启动(enabled/disabled) |\r\n| 列出所有服务 | `systemctl list-units --type=service` | 列出所有运行中的服务 |\r\n| 列出所有服务(含未激活)| `systemctl list-units --type=service --all` | 显示所有服务,包括未激活的(状态为 inactive/failed 等) |\r\n| 列出失败的服务 | `systemctl --failed --type=service` | 查看启动失败的服务 |\r\n\r\n##### 3. 开机启动管理\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 启用开机启动 | `systemctl enable <服务名>` | 设置服务开机自动启动(永久生效,关联到默认运行目标) |\r\n| 禁用开机启动 | `systemctl disable <服务名>` | 取消服务开机启动 |\r\n| 临时启用(仅本次启动)| `systemctl enable --now <服务名>` | 立即启动服务并设置开机启动 |\r\n| 临时禁用(停止并取消启动)| `systemctl disable --now <服务名>` | 立即停止服务并取消开机启动 |\r\n\r\n##### 4. 服务依赖与依赖关系\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 查看依赖关系 | `systemctl list-dependencies <服务名>` | 显示服务的依赖项(依赖它的服务 + 它依赖的服务) |\r\n| 查看直接依赖 | `systemctl list-dependencies --reverse <服务名>` | 仅显示依赖该服务的其他服务 |\r\n\r\n\r\n#### **二、系统状态与控制**\r\n##### 1. 系统基本状态\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 查看系统运行时间 | `systemctl uptime` | 显示系统已运行时间(类似 `uptime` 命令) |\r\n| 查看启动耗时 | `systemctl time` | 显示系统启动总耗时及各阶段(内核、用户空间、服务)耗时 |\r\n| 查看登录会话 | `systemctl list-sessions` | 列出当前登录的用户会话 |\r\n\r\n##### 2. 电源管理(需管理员权限)\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 关机 | `systemctl poweroff` | 立即关机 |\r\n| 重启 | `systemctl reboot` | 立即重启 |\r\n| 休眠(挂起到硬盘) | `systemctl hibernate` | 系统进入休眠状态 |\r\n| 睡眠(挂起到内存) | `systemctl suspend` | 系统进入睡眠状态(低功耗,断电数据丢失) |\r\n| 混合休眠 | `systemctl hybrid-sleep` | 同时休眠到内存和硬盘,结合两者优势 |\r\n| 取消挂起/休眠 | `systemctl wakeup` | 唤醒系统(需配合定时器使用) |\r\n\r\n##### 3. 运行目标(替代传统运行级别)\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 查看当前目标 | `systemctl get-default` | 显示默认运行目标(如 `graphical.target` 对应图形界面) |\r\n| 切换目标 | `systemctl isolate <目标名>` | 切换到指定目标(如 `multi-user.target` 为无图形多用户模式) |\r\n| 设置默认目标 | `systemctl set-default <目标名>` | 设置开机默认目标(需管理员权限) |\r\n\r\n**常用目标对应关系**: \r\n- `graphical.target`:图形界面(对应传统运行级别 5) \r\n- `multi-user.target`:无图形多用户模式(对应级别 3) \r\n- `rescue.target`:单用户救援模式(对应级别 1) \r\n- `emergency.target`:紧急模式(无文件系统挂载,仅基本命令) \r\n\r\n\r\n#### **三、定时器管理(systemd.timer)**\r\n`systemctl` 可管理定时任务(替代传统 `cron`),需配合 `.timer` 文件使用。\r\n\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 列出所有定时器 | `systemctl list-timers` | 显示激活的定时器及其下一次触发时间 |\r\n| 查看定时器状态 | `systemctl status <定时器名>` | 显示定时器详细状态及日志 |\r\n| 启用/禁用定时器 | `systemctl enable/disable <定时器名>` | 控制定时器是否开机启动 |\r\n| 立即触发定时器任务 | `systemctl start <定时器名>` | 强制立即执行定时器关联的服务 |\r\n\r\n\r\n#### **四、资源控制与限制(高级功能)**\r\n可对服务设置 CPU、内存、IO 等资源限制(需在服务文件中配置,或临时生效)。\r\n\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 设置 CPU 核心限制 | `systemctl set-property <服务名> CPUAffinity=0,1` | 限制服务仅运行在 CPU 0 和 1 核心 |\r\n| 设置内存上限 | `systemctl set-property <服务名> MemoryMax=1G` | 限制服务最大内存使用量为 1GB |\r\n| 恢复默认资源配置 | `systemctl unset-property <服务名> CPUAffinity MemoryMax` | 清除已设置的资源限制 |\r\n\r\n\r\n#### **五、日志相关(结合 journalctl)**\r\n| 操作 | 命令 | 说明 |\r\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\r\n| 查看服务日志 | `systemctl status <服务名> -l` | 显示服务状态并附带日志(`-l` 展开完整日志) |\r\n| 实时监控日志 | `journalctl -u <服务名> -f` | 实时追踪服务日志(需结合 `journalctl` 命令) |\r\n| 查看历史日志 | `journalctl -u <服务名> --since \"2025-05-01\"` | 查看指定时间后的服务日志 |\r\n\r\n\r\n#### **六、常用选项与技巧**\r\n- **通配符匹配**: \r\n 可使用通配符管理同类服务,例如: \r\n ```bash\r\n systemctl start nginx*.service # 启动所有以 nginx 开头的服务\r\n systemctl stop *.timer # 停止所有定时器服务\r\n ```\r\n\r\n- **强制操作**: \r\n `--force` 用于强制停止/重启服务(可能终止进程): \r\n ```bash\r\n systemctl --force stop <服务名>\r\n ```\r\n\r\n- **临时生效(不修改配置)**: \r\n 使用 `--now` 可立即执行操作并关联开机启动(或取消): \r\n ```bash\r\n systemctl enable --now <服务名> # 启动并启用开机启动\r\n systemctl disable --now <服务名> # 停止并禁用开机启动\r\n ```\r\n\r\n- **查看帮助**: \r\n ```bash\r\n systemctl --help # 查看全局帮助\r\n systemctl help <子命令> # 查看子命令详细用法(如 systemctl help start)\r\n ```\r\n\r\n\r\n#### **七、示例场景**\r\n1. **管理 Nginx 服务**: \r\n ```bash\r\n systemctl start nginx # 启动 Nginx\r\n systemctl enable nginx # 设置开机启动\r\n systemctl status nginx # 查看运行状态\r\n systemctl reload nginx # 重新加载配置\r\n ```\r\n\r\n2. **系统关机与重启**: \r\n ```bash\r\n systemctl reboot # 立即重启\r\n systemctl poweroff # 立即关机\r\n systemctl suspend # 进入睡眠\r\n ```\r\n\r\n3. **设置默认运行目标**: \r\n ```bash\r\n systemctl set-default multi-user.target # 设为无图形多用户模式\r\n systemctl isolate rescue.target # 进入单用户救援模式\r\n ```\r\n\r\n\r\n### 总结\r\n`systemctl` 是 systemd 生态的核心工具,覆盖服务管理、系统控制、定时任务、资源限制等功能。熟练掌握其常用命令可高效管理 Linux 系统服务与状态,替代传统 SysVinit 的 `service`、`chkconfig` 等工具。建议结合 `journalctl` 分析服务日志,通过服务文件(`/etc/systemd/system/`)自定义复杂配置。`systemctl` 是 Linux 系统中用于控制 `systemd` 系统和服务管理器的命令。以下是 `systemctl` 命令的一些常用用法总结:\r\n\r\n### 1. 服务管理\r\n#### 启动服务\r\n```bash\r\nsystemctl start <服务名>\r\n```\r\n例如,启动 `httpd` 服务:\r\n```bash\r\nsystemctl start httpd\r\n```\r\n\r\n#### 停止服务\r\n```bash\r\nsystemctl stop <服务名>\r\n```\r\n例如,停止 `httpd` 服务:\r\n```bash\r\nsystemctl stop httpd\r\n```\r\n\r\n#### 重启服务\r\n```bash\r\nsystemctl restart <服务名>\r\n```\r\n例如,重启 `httpd` 服务:\r\n```bash\r\nsystemctl restart httpd\r\n```\r\n\r\n#### 重新加载服务配置\r\n```bash\r\nsystemctl reload <服务名>\r\n```\r\n例如,重新加载 `nginx` 服务配置:\r\n```bash\r\nsystemctl reload nginx\r\n```\r\n\r\n#### 查看服务状态\r\n```bash\r\nsystemctl status <服务名>\r\n```\r\n例如,查看 `httpd` 服务状态:\r\n```bash\r\nsystemctl status httpd\r\n```\r\n\r\n### 2. 服务的开机自启管理\r\n#### 设置服务开机自启\r\n```bash\r\nsystemctl enable <服务名>\r\n```\r\n例如,设置 `httpd` 服务开机自启:\r\n```bash\r\nsystemctl enable httpd\r\n```\r\n\r\n#### 禁止服务开机自启\r\n```bash\r\nsystemctl disable <服务名>\r\n```\r\n例如,禁止 `httpd` 服务开机自启:\r\n```bash\r\nsystemctl disable httpd\r\n```\r\n\r\n#### 查看服务是否开机自启\r\n```bash\r\nsystemctl is-enabled <服务名>\r\n```\r\n例如,查看 `httpd` 服务是否开机自启:\r\n```bash\r\nsystemctl is-enabled httpd\r\n```\r\n\r\n### 3. 系统管理\r\n#### 重启系统\r\n```bash\r\nsystemctl reboot\r\n```\r\n\r\n#### 关机\r\n```bash\r\nsystemctl poweroff\r\n```\r\n\r\n#### 挂起系统\r\n```bash\r\nsystemctl suspend\r\n```\r\n\r\n#### 休眠系统\r\n```bash\r\nsystemctl hibernate\r\n```\r\n\r\n#### 混合休眠(挂起并休眠)\r\n```bash\r\nsystemctl hybrid-sleep\r\n```\r\n\r\n### 4. 查看系统状态\r\n#### 查看系统当前运行级别\r\n```bash\r\nsystemctl get-default\r\n```\r\n\r\n#### 设置系统默认运行级别\r\n```bash\r\nsystemctl set-default <目标运行级别>\r\n```\r\n例如,设置系统默认运行级别为多用户模式:\r\n```bash\r\nsystemctl set-default multi-user.target\r\n```\r\n\r\n### 5. 查看服务列表\r\n#### 查看所有已激活的服务\r\n```bash\r\nsystemctl list-units --type=service --state=active\r\n```\r\n\r\n#### 查看所有服务(包括未激活的)\r\n```bash\r\nsystemctl list-units --type=service --all\r\n```\r\n\r\n这些是 `systemctl` 命令的一些常用用法,掌握这些用法可以帮助你有效地管理 Linux 系统中的服务和系统状态。 ", + "Linux/QQ机器人napcat命令.md": "输入 xvfb-run -a qq --no-sandbox 命令启动。 \n保持后台运行 请输入 screen -dmS napcat bash -c \"xvfb-run -a qq --no-sandbox\" \n后台快速登录 请输入 screen -dmS napcat bash -c \"xvfb-run -a qq --no-sandbox -q QQ号码\" \nNapcat安装位置 /opt/QQ/resources/app/app_launcher/napcat \nWEBUI_TOKEN 请自行查看/opt/QQ/resources/app/app_launcher/napcat/config/webui.json文件获取 \n注意, 您可以随时使用 screen -r napcat 来进入后台进程并使用 ctrl + a + d 离开(离开不会关闭后台进程)。 \n停止后台运行 \n\n screen -S napcat -X quit ", + "Linux/screen常用指令.md": "## `screen`命令简介\n\n`screen` 是一个窗口管理器,允许用户在一个单一的终端窗口中运行多个会话。它特别适用于需要长时间运行的进程,因为即使网络连接断开,进程也会继续运行。\n\n## 常用命令\n\n### 启动和使用\n\n- **启动一个新的screen会话**\n ```bash\n screen\n ```\n 或者为会话命名:\n ```bash\n screen -S session_name\n ```\n\n- **列出所有screen会话**\n ```bash\n screen -ls\n ```\n\n- **重新连接到一个已存在的screen会话**\n ```bash\n screen -r session_name\n ```\n\n- **分离当前会话(让会话在后台继续运行)**\n 按下 `Ctrl + A` 然后按 `D`。\n\n- **终止一个screen会话**\n 在会话中按下 `Ctrl + D` 或者输入 `exit`。\n\n### 会话管理\n\n- **强制连接到一个会话**\n 如果有多个会话在运行,使用:\n ```bash\n screen -r -d session_name\n ```\n 这将断开该会话的其他连接并连接到它。\n\n- **多窗口管理**\n - 创建新窗口:`Ctrl + A` 然后 `C`\n - 切换窗口:`Ctrl + A` 然后 `N`(下一个),`Ctrl + A` 然后 `P`(上一个)\n - 列出所有窗口:`Ctrl + A` 然后 `\"`(双引号)\n\n### 会话命名\n\n- **重命名当前窗口**\n 按下 `Ctrl + A` 然后 `A`,输入新的名称。\n\n## 配置文件\n\n- **自定义screen**\n 可以通过编辑 `~/.screenrc` 文件进行配置。例如:\n ```bash\n # 开启多窗口状态栏\n hardstatus on\n hardstatus alwayslastline\n hardstatus string \"%{= kG}%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<\"\n ```\n\n## 提示\n\n- 使用 `screen` 可以有效防止因网络不稳定导致的会话中断。\n- 熟练掌握快捷键可以大大提高效率。\n- 对于需要长期运行的任务,如编译或数据处理,`screen` 是一个非常有用的工具。\n\n", + "Linux/ssh切换root登录通用方法.md": "1. 给root新建密码:sudo passwd root\n2. 配置权限文件:sudo nano /etc/ssh/sshd_config \n3. 光标移动到:permitrootlogin no 把no 改为yes ctrl+o(写入文本)回车 ctrl+x(退出) \n4. 重启服务器:sudo reboot\n5. 重启ssh服务:sudo service sshd restart\n6. 用命令切换root账号:su -(或者sudo su -)", + "Linux/SSH服务端配置.md": "配置 SSH 服务端(`sshd_config`)是确保服务器安全性和功能性的关键步骤。以下是基于您提供的默认配置文件的详细配置指南,包括关键选项的解释和安全建议。\n\n### 1. 基本配置\n\n#### 端口设置\n默认情况下,SSH 使用端口 22。为了提高安全性,您可以更改为其他端口。\n\n```bash\nPort 22\n```\n\n**建议**:修改为非标准端口(如 `Port 2222`)可以减少被自动扫描攻击的风险。\n\n```bash\nPort 2222\n```\n\n#### 监听地址\n默认配置监听所有 IPv4 地址。\n\n```bash\nListenAddress 0.0.0.0\n#ListenAddress ::\n```\n\n**建议**:如果服务器有多个网络接口,您可以指定特定的 IP 地址来监听。例如,仅监听内部网络:\n\n```bash\nListenAddress 192.168.1.100\n```\n\n### 2. 主机密钥\n\n主机密钥用于验证服务器的身份。确保这些密钥存在并且安全。\n\n```bash\n#HostKey /etc/ssh/ssh_host_rsa_key\n#HostKey /etc/ssh/ssh_host_ecdsa_key\n#HostKey /etc/ssh/ssh_host_ed25519_key\n```\n\n**建议**:取消注释需要的密钥类型,确保至少启用一种强加密算法(如 Ed25519)。\n\n```bash\nHostKey /etc/ssh/ssh_host_ed25519_key\n```\n\n### 3. 身份验证\n\n#### 禁止 root 登录\n出于安全考虑,建议禁止 root 用户通过 SSH 登录。\n\n```bash\n#PermitRootLogin prohibit-password\n```\n\n**建议**:将其设置为 `no` 或 `prohibit-password`,推荐使用密钥认证。\n\n```bash\nPermitRootLogin no\n```\n\n#### 密码认证\n启用或禁用密码认证。为了更高的安全性,建议使用密钥认证并禁用密码认证。\n\n```bash\n#PasswordAuthentication yes\nPasswordAuthentication no\n```\n\n#### 公钥认证\n确保启用公钥认证,并配置 `AuthorizedKeysFile`。\n\n```bash\nPubkeyAuthentication yes\nAuthorizedKeysFile .ssh/authorized_keys\n```\n\n**建议**:保持默认配置,确保每个用户的 `~/.ssh/authorized_keys` 文件中包含正确的公钥。\n\n#### 键盘交互认证\n如果只使用密钥认证,禁用键盘交互认证。\n\n```bash\nKbdInteractiveAuthentication no\n```\n\n### 4. 使用 PAM\n\nPAM(可插拔认证模块)用于增强认证机制。\n\n```bash\nUsePAM yes\n```\n\n**建议**:保持启用,但确保其他认证方法(如密码认证)根据需要进行配置。\n\n### 5. 限制用户和组\n\n通过 `AllowUsers` 或 `AllowGroups` 限制可以通过 SSH 登录的用户或组。\n\n```bash\n# Allow only specific users\n#AllowUsers user1 user2\n\n# Allow only specific groups\n#AllowGroups sshusers\n```\n\n**建议**:根据需要取消注释并配置,限制访问范围。\n\n```bash\nAllowUsers alice bob\n```\n\n### 6. 其他安全设置\n\n#### 禁用空密码登录\n\n```bash\n#PermitEmptyPasswords no\nPermitEmptyPasswords no\n```\n\n**确保**:禁止使用空密码登录。\n\n#### 启用防火墙和限制连接数\n\n配置防火墙(如 `ufw` 或 `iptables`)仅允许必要的端口和 IP 地址访问。同时,可以设置 `MaxAuthTries` 和 `MaxSessions` 来限制尝试次数和并发会话数。\n\n```bash\nMaxAuthTries 3\nMaxSessions 2\n```\n\n### 7. 日志和监控\n\n设置合适的日志级别以监控 SSH 活动。\n\n```bash\nLogLevel VERBOSE\n```\n\n**建议**:根据需要设置日志级别,如 `INFO` 或 `VERBOSE`,并定期检查日志文件(通常位于 `/var/log/auth.log` 或 `/var/log/secure`)。\n\n### 8. 重启 SSH 服务\n\n在完成配置后,重新启动 SSH 服务以应用更改。\n\n```bash\nsudo systemctl restart sshd\n```\n\n**检查配置是否正确**:\n\n在重新启动之前,最好检查配置文件是否有语法错误:\n\n```bash\nsudo sshd -t\n```\n\n如果没有输出,说明配置语法正确。否则,按照错误提示进行修正。\n\n### 9. 其他推荐配置\n\n- **启用双因素认证(2FA)**:增加登录的安全性。\n- **限制 SSH 登录时间**:通过 `sshd_config` 或使用其他工具限制用户的登录时间。\n- **使用 Fail2Ban**:防止暴力破解攻击,通过监控日志文件并动态更新防火墙规则。\n\n### 示例优化后的 `sshd_config`\n\n以下是根据上述建议优化后的配置示例:\n\n```bash\nPort 2222\nListenAddress 0.0.0.0\nHostKey /etc/ssh/ssh_host_ed25519_key\n\nPubkeyAuthentication yes\nAuthorizedKeysFile .ssh/authorized_keys\n\nPermitRootLogin no\nPasswordAuthentication no\nKbdInteractiveAuthentication no\n\nUsePAM yes\n\nAllowUsers alice bob\n\nLogLevel VERBOSE\n\nMaxAuthTries 3\nMaxSessions 2\n\nAcceptEnv LANG LC_*\n\nSubsystem\tsftp\t/usr/lib/openssh/sftp-server\n```\n\n", + "Linux/systemctl命令详细总结.md": "\n### Linux `systemctl` 命令常用用法总结\n\n\n#### **一、服务管理(核心功能)**\n`systemctl` 主要用于管理系统服务(`.service` 文件),支持启动、停止、重启、查看状态、设置开机启动等操作。\n\n##### 1. 服务状态操作\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 启动服务 | `systemctl start <服务名>` | 启动指定服务(仅临时生效,重启后不保留) |\n| 停止服务 | `systemctl stop <服务名>` | 停止指定服务 |\n| 重启服务 | `systemctl restart <服务名>` | 重启服务(若服务未运行则启动) |\n| 重新加载配置 | `systemctl reload <服务名>` | 重新加载服务配置文件(不重启服务,适用于支持此功能的服务,如 Nginx) |\n| 平滑重启(优雅重启)| `systemctl try-restart <服务名>` | 仅在服务运行时重启,避免报错 |\n\n##### 2. 服务状态查询\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 查看状态 | `systemctl status <服务名>` | 显示服务运行状态、日志及依赖关系(按 `Q` 退出) |\n| 简洁状态 | `systemctl is-active <服务名>` | 仅显示服务是否激活(active/running) |\n| 查看是否启用开机启动| `systemctl is-enabled <服务名>` | 显示服务是否设置为开机启动(enabled/disabled) |\n| 列出所有服务 | `systemctl list-units --type=service` | 列出所有运行中的服务 |\n| 列出所有服务(含未激活)| `systemctl list-units --type=service --all` | 显示所有服务,包括未激活的(状态为 inactive/failed 等) |\n| 列出失败的服务 | `systemctl --failed --type=service` | 查看启动失败的服务 |\n\n##### 3. 开机启动管理\n| 操作 | 命令 | 说明 |\n| ------------- | ------------------------------- | -------------------------- |\n| 启用开机启动 | `systemctl enable <服务名>` | 设置服务开机自动启动(永久生效,关联到默认运行目标) |\n| 禁用开机启动 | `systemctl disable <服务名>` | 取消服务开机启动 |\n| 临时启用(仅本次启动) | `systemctl enable --now <服务名>` | 立即启动服务并设置开机启动 |\n| 临时禁用(停止并取消启动) | `systemctl disable --now <服务名>` | 立即停止服务并取消开机启动 |\n\n##### 4. 服务依赖与依赖关系\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 查看依赖关系 | `systemctl list-dependencies <服务名>` | 显示服务的依赖项(依赖它的服务 + 它依赖的服务) |\n| 查看直接依赖 | `systemctl list-dependencies --reverse <服务名>` | 仅显示依赖该服务的其他服务 |\n\n\n#### **二、系统状态与控制**\n##### 1. 系统基本状态\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 查看系统运行时间 | `systemctl uptime` | 显示系统已运行时间(类似 `uptime` 命令) |\n| 查看启动耗时 | `systemctl time` | 显示系统启动总耗时及各阶段(内核、用户空间、服务)耗时 |\n| 查看登录会话 | `systemctl list-sessions` | 列出当前登录的用户会话 |\n\n##### 2. 电源管理(需管理员权限)\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 关机 | `systemctl poweroff` | 立即关机 |\n| 重启 | `systemctl reboot` | 立即重启 |\n| 休眠(挂起到硬盘) | `systemctl hibernate` | 系统进入休眠状态 |\n| 睡眠(挂起到内存) | `systemctl suspend` | 系统进入睡眠状态(低功耗,断电数据丢失) |\n| 混合休眠 | `systemctl hybrid-sleep` | 同时休眠到内存和硬盘,结合两者优势 |\n| 取消挂起/休眠 | `systemctl wakeup` | 唤醒系统(需配合定时器使用) |\n\n##### 3. 运行目标(替代传统运行级别)\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 查看当前目标 | `systemctl get-default` | 显示默认运行目标(如 `graphical.target` 对应图形界面) |\n| 切换目标 | `systemctl isolate <目标名>` | 切换到指定目标(如 `multi-user.target` 为无图形多用户模式) |\n| 设置默认目标 | `systemctl set-default <目标名>` | 设置开机默认目标(需管理员权限) |\n\n**常用目标对应关系**: \n- `graphical.target`:图形界面(对应传统运行级别 5) \n- `multi-user.target`:无图形多用户模式(对应级别 3) \n- `rescue.target`:单用户救援模式(对应级别 1) \n- `emergency.target`:紧急模式(无文件系统挂载,仅基本命令) \n\n\n#### **三、定时器管理(systemd.timer)**\n`systemctl` 可管理定时任务(替代传统 `cron`),需配合 `.timer` 文件使用。\n\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 列出所有定时器 | `systemctl list-timers` | 显示激活的定时器及其下一次触发时间 |\n| 查看定时器状态 | `systemctl status <定时器名>` | 显示定时器详细状态及日志 |\n| 启用/禁用定时器 | `systemctl enable/disable <定时器名>` | 控制定时器是否开机启动 |\n| 立即触发定时器任务 | `systemctl start <定时器名>` | 强制立即执行定时器关联的服务 |\n\n\n#### **四、资源控制与限制(高级功能)**\n可对服务设置 CPU、内存、IO 等资源限制(需在服务文件中配置,或临时生效)。\n\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 设置 CPU 核心限制 | `systemctl set-property <服务名> CPUAffinity=0,1` | 限制服务仅运行在 CPU 0 和 1 核心 |\n| 设置内存上限 | `systemctl set-property <服务名> MemoryMax=1G` | 限制服务最大内存使用量为 1GB |\n| 恢复默认资源配置 | `systemctl unset-property <服务名> CPUAffinity MemoryMax` | 清除已设置的资源限制 |\n\n\n#### **五、日志相关(结合 journalctl)**\n| 操作 | 命令 | 说明 |\n|---------------------|---------------------------------------|----------------------------------------------------------------------|\n| 查看服务日志 | `systemctl status <服务名> -l` | 显示服务状态并附带日志(`-l` 展开完整日志) |\n| 实时监控日志 | `journalctl -u <服务名> -f` | 实时追踪服务日志(需结合 `journalctl` 命令) |\n| 查看历史日志 | `journalctl -u <服务名> --since \"2025-05-01\"` | 查看指定时间后的服务日志 |\n\n\n#### **六、常用选项与技巧**\n- **通配符匹配**: \n 可使用通配符管理同类服务,例如: \n ```bash\n systemctl start nginx*.service # 启动所有以 nginx 开头的服务\n systemctl stop *.timer # 停止所有定时器服务\n ```\n\n- **强制操作**: \n `--force` 用于强制停止/重启服务(可能终止进程): \n ```bash\n systemctl --force stop <服务名>\n ```\n\n- **临时生效(不修改配置)**: \n 使用 `--now` 可立即执行操作并关联开机启动(或取消): \n ```bash\n systemctl enable --now <服务名> # 启动并启用开机启动\n systemctl disable --now <服务名> # 停止并禁用开机启动\n ```\n\n- **查看帮助**: \n ```bash\n systemctl --help # 查看全局帮助\n systemctl help <子命令> # 查看子命令详细用法(如 systemctl help start)\n ```\n\n\n#### **七、示例场景**\n1. **管理 Nginx 服务**: \n ```bash\n systemctl start nginx # 启动 Nginx\n systemctl enable nginx # 设置开机启动\n systemctl status nginx # 查看运行状态\n systemctl reload nginx # 重新加载配置\n ```\n\n2. **系统关机与重启**: \n ```bash\n systemctl reboot # 立即重启\n systemctl poweroff # 立即关机\n systemctl suspend # 进入睡眠\n ```\n\n3. **设置默认运行目标**: \n ```bash\n systemctl set-default multi-user.target # 设为无图形多用户模式\n systemctl isolate rescue.target # 进入单用户救援模式\n ```\n\n\n### 总结\n`systemctl` 是 systemd 生态的核心工具,覆盖服务管理、系统控制、定时任务、资源限制等功能。熟练掌握其常用命令可高效管理 Linux 系统服务与状态,替代传统 SysVinit 的 `service`、`chkconfig` 等工具。建议结合 `journalctl` 分析服务日志,通过服务文件(`/etc/systemd/system/`)自定义复杂配置。`systemctl` 是 Linux 系统中用于控制 `systemd` 系统和服务管理器的命令。以下是 `systemctl` 命令的一些常用用法总结:\n\n### 1. 服务管理\n#### 启动服务\n```bash\nsystemctl start <服务名>\n```\n例如,启动 `httpd` 服务:\n```bash\nsystemctl start httpd\n```\n\n#### 停止服务\n```bash\nsystemctl stop <服务名>\n```\n例如,停止 `httpd` 服务:\n```bash\nsystemctl stop httpd\n```\n\n#### 重启服务\n```bash\nsystemctl restart <服务名>\n```\n例如,重启 `httpd` 服务:\n```bash\nsystemctl restart httpd\n```\n\n#### 重新加载服务配置\n```bash\nsystemctl reload <服务名>\n```\n例如,重新加载 `nginx` 服务配置:\n```bash\nsystemctl reload nginx\n```\n\n#### 查看服务状态\n```bash\nsystemctl status <服务名>\n```\n例如,查看 `httpd` 服务状态:\n```bash\nsystemctl status httpd\n```\n\n### 2. 服务的开机自启管理\n#### 设置服务开机自启\n```bash\nsystemctl enable <服务名>\n```\n例如,设置 `httpd` 服务开机自启:\n```bash\nsystemctl enable httpd\n```\n\n#### 禁止服务开机自启\n```bash\nsystemctl disable <服务名>\n```\n例如,禁止 `httpd` 服务开机自启:\n```bash\nsystemctl disable httpd\n```\n\n#### 查看服务是否开机自启\n```bash\nsystemctl is-enabled <服务名>\n```\n例如,查看 `httpd` 服务是否开机自启:\n```bash\nsystemctl is-enabled httpd\n```\n\n### 3. 系统管理\n#### 重启系统\n```bash\nsystemctl reboot\n```\n\n#### 关机\n```bash\nsystemctl poweroff\n```\n\n#### 挂起系统\n```bash\nsystemctl suspend\n```\n\n#### 休眠系统\n```bash\nsystemctl hibernate\n```\n\n#### 混合休眠(挂起并休眠)\n```bash\nsystemctl hybrid-sleep\n```\n\n### 4. 查看系统状态\n#### 查看系统当前运行级别\n```bash\nsystemctl get-default\n```\n\n#### 设置系统默认运行级别\n```bash\nsystemctl set-default <目标运行级别>\n```\n例如,设置系统默认运行级别为多用户模式:\n```bash\nsystemctl set-default multi-user.target\n```\n\n### 5. 查看服务列表\n#### 查看所有已激活的服务\n```bash\nsystemctl list-units --type=service --state=active\n```\n\n#### 查看所有服务(包括未激活的)\n```bash\nsystemctl list-units --type=service --all\n```\n\n", + "Linux/Termux/service-frpc.md": "```bash\nbash -lc '\nset -e\nmkdir -p \"$PREFIX/var/service/frpc/log\"\nln -sf \"$PREFIX/share/termux-services/svlogger\" \\\n \"$PREFIX/var/service/frpc/log/run\"\n\ncat > \"$PREFIX/var/service/frpc/run\" <<'\"'\"'EOF'\"'\"'\n#!/data/data/com.termux/files/usr/bin/sh\nexec 2>&1\ncd \"$HOME/frpc\"\nexec frpc -c \"$HOME/frpc/frpc.toml\"\nEOF\n\nchmod +x \"$PREFIX/var/service/frpc/run\" \\\n \"$PREFIX/var/service/frpc/log/run\"\n\necho \"✅ frpc service 已创建\"\necho \"👉 启动:sv up frpc\"\necho \"👉 状态:sv status frpc\"\necho \"👉 日志:tail -n 200 $PREFIX/var/log/sv/frpc/current\"\n'\n```", + "Linux/Termux/service-openlist.md": "```shell\nbash -lc '\nset -e\n\n# 1) 准备 service 目录 + log 目录\nmkdir -p \"$PREFIX/var/service/openlist/log\"\n\n# 2) 绑定官方 logger\nln -sf \"$PREFIX/share/termux-services/svlogger\" \\\n \"$PREFIX/var/service/openlist/log/run\"\n\n# 3) 写 run 脚本(沿用你现有的 ~/data 数据目录)\ncat > \"$PREFIX/var/service/openlist/run\" <<'\"'\"'EOF'\"'\"'\n#!/data/data/com.termux/files/usr/bin/sh\nexec 2>&1\ncd \"$HOME\"\nexec openlist server --data \"$HOME/data\"\nEOF\n\nchmod +x \"$PREFIX/var/service/openlist/run\" \\\n \"$PREFIX/var/service/openlist/log/run\"\n\necho \"✅ openlist service 已创建\"\necho \"👉 现在可用:sv up openlist\"\necho \"👉 查看状态:sv status openlist\"\necho \"👉 查看日志:tail -n 200 $PREFIX/var/log/sv/openlist/current\"\n'\n```\n\n```bash\nsv up openlist\nsv status openlist\n# 想让 Termux 每次打开就自动拉起:\nsv-enable openlist\n```", "Linux/Termux/shell2http举例.md": "`shell2http` 的灵活性和轻量级特性让它能玩出许多有趣的花样!以下是一些创意使用案例,涵盖实用场景和趣味玩法:\n\n---\n\n### **一、智能家居 & 自动化**\n1. **远程控制智能插座** \n ```bash\n shell2http -basic-auth=\"admin:密码\" POST:/灯控 'curl -X POST http://智能插座IP/开关 -d \"state=on\"'\n ```\n - 用途:用手机浏览器一键开关灯,配合 Siri 快捷指令还能语音控制。\n\n2. **树莓派摄像头拍照** \n ```bash\n shell2http /拍照 'raspistill -o /tmp/snapshot.jpg && base64 /tmp/snapshot.jpg'\n ```\n - 用途:远程拍照并返回 Base64 图片,可嵌入网页实时查看。\n\n3. **温湿度监控** \n ```bash\n shell2http /温湿度 'python3 读取传感器脚本.py'\n ```\n - 用途:连接 DHT11/DHT22 传感器,通过 HTTP 返回 JSON 格式温湿度数据。\n\n---\n\n### **二、实用工具**\n4. **临时文件共享** \n ```bash\n shell2http -form /upload 'mv $filepath_file1 ./共享文件夹/$filename_file1 && echo 上传成功'\n ```\n - 用途:在局域网内快速共享文件,上传后生成直链供他人下载。\n\n5. **二维码生成器** \n ```bash\n shell2http /qrcode \"qrencode -t ANSIUTF8 '$v_text'\"\n ```\n - 用法:访问 `http://IP:8080/qrcode?text=HelloWorld`,终端直接显示二维码。\n\n6. **DDNS 动态域名更新** \n ```bash\n shell2http /update_ddns 'curl \"https://ddns服务商API?ip=$(curl ifconfig.me)\"'\n ```\n - 用途:外网触发更新 DDNS 记录,解决家庭宽带 IP 变化问题。\n\n---\n\n### **三、趣味玩法**\n7. **语音播报远程控制** \n ```bash\n shell2http POST:/说话 'echo \"$v_text\" | espeak -v zh' # Linux 文本转语音\n ```\n - 用途:用手机输入文字,让电脑念出来(比如捉弄同事)。\n\n8. **在线抽奖/随机选择** \n ```bash\n shell2http /抽奖 'shuf -n1 名单.txt'\n ```\n - 用途:年会时打开网页点击按钮,大屏幕显示中奖者。\n\n9. **生成梗图** \n ```bash\n shell2http -form /生成表情包 'convert 模板.jpg -pointsize 30 -fill white -annotate +100+200 \"$v_text\" -' \n ```\n - 用途:上传文字生成表情包,可集成到微信群机器人。\n\n---\n\n### **四、开发调试**\n10. **模拟慢速 API** \n ```bash\n shell2http /slow 'sleep ${v_time:-5} && echo 响应完成'\n ```\n - 用途:测试前端 Loading 效果,访问 `/slow?time=10` 模拟 10 秒延迟。\n\n11. **Mock 测试接口** \n ```bash\n shell2http /api/user 'echo \"{\\\"name\\\":\\\"张三\\\",\\\"age\\\":$(shuf -i 20-60 -n1)}\"'\n ```\n - 用途:快速生成随机 JSON 数据,替代未完成的真实接口。\n\n12. **代理请求记录器** \n ```bash\n shell2http -cgi /proxy 'echo \"URL: $REQUEST_URI\" >> log.txt; curl -s \"$v_url\"'\n ```\n - 用途:记录所有经过的请求参数,调试第三方回调。\n\n---\n\n### **五、系统管理**\n13. **服务器监控面板** \n ```bash\n shell2http /cpu \"top -bn1 | grep 'Cpu(s)'\" /内存 \"free -h\" /磁盘 \"df -h\"\n ```\n - 用途:手机浏览器快速查看服务器状态。\n\n14. **远程重启服务** \n ```bash\n shell2http -500 POST:/reboot_nginx 'systemctl restart nginx && echo 成功'\n ```\n - 用途:内网安全重启服务(务必设置 Basic 认证!)。\n\n15. **日志实时查看** \n ```bash\n shell2http /tail_log 'tail -n20 /var/log/syslog'\n ```\n - 用途:快速检查日志,无需 SSH 登录。\n\n---\n\n### **注意事项**\n- **安全第一**:暴露在公网时务必启用 `-basic-auth` 和 HTTPS。\n- **权限控制**:敏感操作(如重启服务)建议结合 IP 白名单。\n- **临时用途**:适合原型设计或内部工具,不建议替代专业 API 网关。\n\n这些案例只需简单修改即可运行,试试用 `shell2http` 把你身边的硬件和脚本变成「物联网设备」吧!", "Linux/Termux/shell2HTTP软件简单总结.md": "以下是 `shell2http` 项目的详细中文总结:\n\n---\n\n### **项目概述**\n`shell2http` 是一个用 Go 编写的轻量级 HTTP 服务器,核心功能是通过 HTTP 请求触发执行预定义的 Shell 命令,并将结果返回给客户端。它适用于开发调试、原型设计、远程控制等场景,支持快速将 Shell 脚本暴露为 HTTP 接口。\n\n---\n\n### **核心功能**\n1. **简单易用** \n - 通过命令行参数直接绑定 URL 路径与 Shell 命令,例如: \n ```shell\n shell2http /date \"date\" /ps \"ps aux\"\n ```\n - 支持 GET、POST 等多种 HTTP 方法(通过 `METHOD:/path` 语法指定)。\n\n2. **请求处理模式** \n - **普通模式**:直接执行命令,返回标准输出(stdout)。\n - **表单模式(`-form`)**:解析查询参数和上传文件,生成环境变量供脚本使用:\n - `$v_参数名`:来自 URL 查询参数的值(如 `?id=123` → `$v_id`)。\n - `$filepath_字段名`:上传文件的临时路径。\n - `$filename_字段名`:上传文件的原始文件名。\n - **CGI 模式(`-cgi`)**:模拟 CGI 环境,设置 HTTP 请求相关环境变量,处理请求体数据。\n\n3. **安全与认证** \n - **Basic 认证**:通过 `-basic-auth` 设置用户名密码,支持多用户。\n - **SSL/TLS**:使用 `-cert` 和 `-key` 选项启动 HTTPS 服务器。\n - **表单字段过滤**:通过 `-form-check` 限制参数名格式(如仅允许数字)。\n\n4. **高级特性** \n - **缓存**:`-cache=N` 缓存命令输出 N 秒。\n - **超时控制**:`-timeout` 设置命令执行超时时间。\n - **错误处理**:`-500` 在命令非零退出时返回 500 错误;`-show-errors` 显示错误输出。\n - **环境变量**:支持导出特定或全部环境变量(`-export-vars`/`-export-all-vars`)。\n\n5. **日志与调试** \n - 自定义日志文件(`-log`)、禁用时间戳(`-no-log-timestamp`)。\n\n---\n\n### **安装方式**\n1. **MacOS** \n ```shell\n brew install msoap/tools/shell2http\n ```\n2. **Docker** \n ```shell\n docker pull msoap/shell2http\n docker run -p 8080:8080 msoap/shell2http /date \"date\"\n ```\n - 使用 `--init` 防止僵尸进程。\n\n3. **Snap(Linux)** \n ```shell\n sudo snap install shell2http\n ```\n - 注意沙箱环境可能导致路径问题。\n\n4. **源码编译** \n ```shell\n go install github.com/msoap/shell2http@latest\n ```\n\n5. **预编译二进制** \n 从 [GitHub Releases](https://github.com/msoap/shell2http/releases) 下载(支持 Windows、Linux、MacOS、树莓派)。\n\n---\n\n### **使用示例**\n1. **基础命令** \n ```shell\n shell2http /top \"top -l 1 | head -10\" /date \"date\"\n ```\n - 访问 `http://localhost:8080/date` 返回当前时间。\n\n2. **环境变量** \n ```shell\n shell2http -export-vars=GOPATH /gopath 'echo $GOPATH'\n ```\n\n3. **表单处理** \n ```shell\n shell2http -form /upload 'cp $filepath_file1 ./uploads/$filename_file1'\n ```\n - 上传文件并保存到 `uploads` 目录。\n\n4. **CGI 模式** \n ```shell\n shell2http -cgi /cgi-script './script.sh'\n ```\n - 脚本可读取请求头、请求体,设置响应头。\n\n5. **HTTPS 服务器** \n ```shell\n shell2http -cert=cert.pem -key=key.pem /date \"date\"\n ```\n - 生成自签名证书: \n ```shell\n go run $(go env GOROOT)/src/crypto/tls/generate_cert.go -host localhost\n ```\n\n---\n\n### **应用场景**\n- **系统监控**:暴露 `top`、`ps`、`df` 等命令的 HTTP 接口。\n- **文件操作**:上传/下载文件、目录列表。\n- **远程控制**:调节音量、控制媒体播放器(如 MacOS 的 Vox.app)。\n- **API 模拟**:返回静态 JSON 或动态生成数据。\n- **调试工具**:模拟慢速响应、记录请求日志。\n\n---\n\n### **相关工具**\n- **shell2telegram**:将 Shell 命令绑定到 Telegram 机器人。\n- **websocketd**:将 STDIN/STDOUT 程序转换为 WebSocket 服务。\n- **devd**:本地开发的轻量级 HTTP 守护进程。\n\n---\n\n### **注意事项**\n- **安全性**:避免在生产环境暴露敏感命令,使用防火墙和认证机制。\n- **性能**:默认多线程处理请求,可通过 `-one-thread` 限制为单线程。\n- **路径问题**:Docker 或 Snap 环境需注意命令的可访问性。\n\n通过灵活配置,`shell2http` 可快速搭建功能丰富的 HTTP 服务,适合开发者和运维人员简化工作流程。", "Linux/Termux/Termux-api用法总结/弹窗.md": "`termux-toast` 命令用于在 Android 设备上显示一个短暂的消息(Toast)。这个消息会在屏幕上弹出,并在几秒钟后自动消失。它的基本用法如下:\n\n### 基本用法\n\n```bash\ntermux-toast [选项] <消息文本>\n```\n\n### 常用选项\n\n- `-s` 或 `--short`:使用短时间显示消息(默认选项)。\n- `-l` 或 `--long`:使用较长时间显示消息。\n- `-g` 或 `--gravity`:设置消息显示的位置。可选值为 `top`、`middle` 和 `bottom`(默认是 `bottom`)。\n- `-b` 或 `--background`:设置背景颜色,使用十六进制颜色代码。\n- `-c` 或 `--color`:设置文本颜色,使用十六进制颜色代码.\n\n### 示例\n\n1. **显示一个默认的短消息**:\n\n ```bash\n termux-toast \"Hello, World!\"\n ```\n\n3. **在屏幕顶部显示消息**:\n\n ```bash\n termux-toast -g top \"This message is at the top.\"\n ```\n\n4. **设置背景和文本颜色**:\n\n ```bash\n termux-toast -b \"#FF0000\" -c \"#FFFFFF\" \"Red background with white text.\"\n ```\n\n这些命令可以在脚本中使用,以便在某些事件发生时通知用户。请注意,由于 Toast 本质上是短暂的通知类型,它们不适合显示需要用户交互或长时间关注的重要信息。", "Linux/Termux/Termux-api用法总结/录音.md": "当然!以下是一些使用 `termux-microphone-record` 命令的示例,展示了如何利用不同的参数来满足不同的录音需求:\n\n1. **使用默认设置开始录音**:\n ```bash\n termux-microphone-record -d\n ```\n 这将使用默认设置开始录音,并保存到默认文件。\n\n2. **录制到指定文件**:\n ```bash\n termux-microphone-record -f /sdcard/my_recording.wav\n ```\n 这会将录音保存到 `/sdcard/my_recording.wav` 文件中。\n\n3. **限制录音时间为 30 秒**:\n ```bash\n termux-microphone-record -f /sdcard/my_recording.wav -l 30\n ```\n 这将录制 30 秒的音频,并保存到指定文件。\n\n4. **使用特定编码器(例如 AAC)录音**:\n ```bash\n termux-microphone-record -f /sdcard/my_recording.aac -e aac\n ```\n 这会使用 AAC 编码器进行录音。\n\n5. **指定比特率为 128 kbps**:\n ```bash\n termux-microphone-record -f /sdcard/my_recording.wav -b 128\n ```\n 这将以 128 kbps 的比特率进行录音。\n\n6. **使用特定采样率(例如 44100 Hz)录音**:\n ```bash\n termux-microphone-record -f /sdcard/my_recording.wav -r 44100\n ```\n 这会以 44100 Hz 的采样率录音。\n\n7. **使用双声道录音**:\n ```bash\n termux-microphone-record -f /sdcard/my_recording.wav -c 2\n ```\n 这会以双声道(立体声)进行录音。\n\n8. **获取当前录音的信息**:\n ```bash\n termux-microphone-record -i\n ```\n 这将显示有关当前录音的详细信息。\n\n9. **停止当前录音**:\n ```bash\n termux-microphone-record -q\n ```\n 这会停止当前正在进行的录音。\n\n这些示例展示了如何使用 `termux-microphone-record` 的不同参数来调整录音的输出。你可以根据需要组合这些参数来实现更复杂的录音配置。", "Linux/Termux/Termux-api用法总结/所有支持的api.md": "Termux API 是一个提供设备功能访问的工具,允许在 Termux 环境中通过命令行接口访问 Android 设备的各种硬件和系统功能。以下是这些 Termux API 的简单介绍:\n\n1. **termux-api-start/stop**:启动或停止 Termux API 服务。\n2. **termux-audio-info**:获取设备的音频信息。\n3. **termux-battery-status**:获取设备的电池状态信息。\n4. **termux-brightness**:设置或获取屏幕亮度。\n5. **termux-call-log**:访问设备的通话记录。\n6. **termux-camera-info**:获取设备相机信息。\n7. **termux-camera-photo**:使用设备相机拍照。\n8. **termux-clipboard-get/set**:获取或设置设备的剪贴板内容。\n9. **termux-contact-list**:获取设备的联系人列表。\n10. **termux-dialog**:显示对话框。\n11. **termux-download**:下载文件。\n12. **termux-fingerprint**:使用指纹传感器进行身份验证。\n13. **termux-infrared-frequencies/transmit**:获取红外频率信息或发送红外信号。\n14. **termux-job-scheduler**:安排一个任务在特定时间运行。\n15. **termux-keystore**:访问或管理密钥存储。\n16. **termux-location**:获取设备的地理位置信息。\n17. **termux-media-player**:播放媒体文件。\n18. **termux-media-scan**:扫描媒体文件。\n19. **termux-microphone-record**:录制音频。\n20. **termux-nfc**:访问 NFC 功能。\n21. **termux-notification/channel/list/remove**:管理通知,包括创建、列出和移除通知。\n22. **termux-saf-create/dirs/ls/managedir/mkdir/read/rm/stat/write**:通过 Storage Access Framework (SAF) 访问和管理文件系统。\n23. **termux-sensor**:访问设备的传感器数据。\n24. **termux-share**:共享文件或文本。\n25. **termux-sms-inbox/list/send**:访问和管理短信,包括查看收件箱和发送短信。\n26. **termux-speech-to-text**:将语音转换为文本。\n27. **termux-storage-get**:从设备存储中获取文件。\n28. **termux-telephony-call/cellinfo/deviceinfo**:拨打电话或获取设备的电话信息。\n29. **termux-toast**:显示一个短暂的消息。\n30. **termux-torch**:控制设备的手电筒。\n31. **termux-tts-engines/speak**:获取 TTS 引擎信息或合成语音。\n32. **termux-usb**:访问 USB 设备。\n33. **termux-vibrate**:控制设备的振动。\n34. **termux-volume**:获取或设置音量。\n35. **termux-wallpaper**:设置设备的壁纸。\n36. **termux-wifi-connectioninfo/enable/scaninfo**:管理 Wi-Fi 连接,获取连接信息或扫描 Wi-Fi 网络。\n\n这些 API 提供了丰富的功能,可以让用户通过脚本自动化许多任务或访问设备的硬件功能。", "Linux/Termux/Termux-api用法总结/闪光灯.md": "`termux-torch` 命令用于控制 Android 设备的手电筒(通常是相机闪光灯)。可以通过此命令打开或关闭手电筒。它的基本用法如下:\n\n### 基本用法\n\n```bash\ntermux-torch <状态>\n```\n\n### 参数\n\n- `<状态>`:指定手电筒的状态,可以是 `on` 或 `off`。\n - `on`:打开手电筒。\n - `off`:关闭手电筒。\n\n### 示例\n\n1. **打开手电筒**:\n\n ```bash\n termux-torch on\n ```\n\n2. **关闭手电筒**:\n\n ```bash\n termux-torch off\n ```\n\n这些命令可以在脚本中使用,以便在特定情况下自动打开或关闭手电筒,比如在黑暗环境中需要光源时。使用这些命令时,请确保授予 Termux 应用程序相应的权限,以便访问设备的相机闪光灯功能。", + "Linux/Termux/Termux-SSH相关.md": "Termux更改终端密码:\n```\npasswd\n```\n重启SSH服务\n```\npkill sshd \nsshd\n```\n查看本机IP\n```\nifconfig\n```\n生成SSH主机密钥\n```\nssh-keygen -A\n```\n更新Termux包\n```\npkg update && pkg upgrade\n```\nTermux退出chroot容器\n```\nexit\n```\nTermux安装软件\n```\npkg install \n```\n查看终端用户名\n```\nwhoami\n```\n\n\n\n", + "Linux/Termux/Termux常用命令.md": "\n**termux-setup-storage** \n挂载外部储存目录\n\n**termux-wake-lock**\n获取唤醒锁(免杀后台)\n\n**termux-battery-status**\n查看设备电池状态", + "Linux/Termux/Termux常用软件包.md": "**termux-services** \n持久化后台服务,类似于systemctl\n\n**openlist**\n网页云盘\n\n**frp**\n内网穿透工具", "Linux/Termux/termux的pkg命令总结.md": "pkg  是用于管理 apt 软件包的工具,用法为  pkg [--check-mirror] command [arguments] , --check-mirror  强制重新检查镜像可用性。其命令包括:\n \n autoclean :从 apt 缓存中删除所有过时软件包。\n \n clean :从 apt 缓存中删除所有软件包。\n \n files  :显示指定软件包安装的所有文件。\n \n install  :安装指定软件包。\n \n list-all :列出仓库中所有可用软件包。\n \n list-installed :列出已安装的软件包。\n \n reinstall  :以最新版本重新安装指定已安装软件包。\n \n search  :按名称或描述等查询搜索软件包。\n \n show  :显示软件包基本元数据,如依赖项。\n \n uninstall  :卸载指定软件包,保留配置文件。\n \n upgrade :将所有已安装软件包升级到最新版本。\n \n update :从配置的仓库更新 apt 数据库。", - "Linux/Termux-SSH相关.md": "Termux更改终端密码:\r\n\r\n```\r\npasswd\r\n```\r\n\r\n重启SSH服务\r\n\r\n```\r\npkill sshd \r\nsshd\r\n```\r\n\r\n查看本机IP\r\n\r\n```\r\nifconfig\r\n```\r\n\r\n生成SSH主机密钥\r\n\r\n```\r\nssh-keygen -A\r\n```\r\n\r\n更新Termux包\r\n\r\n```\r\npkg update && pkg upgrade\r\n```\r\n\r\nTermux退出chroot容器\r\n\r\n```\r\nexit\r\n```\r\n\r\nTermux安装软件\r\n\r\n```\r\npkg install \r\n```\r\n\r\n查看终端用户名\r\n\r\n```\r\nwhoami\r\n```\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n妈的旧手机termux终端用户名\r\n\r\nu0_a143\r\n\r\n爸的旧手机termux终端用户名\r\n\r\nu0_a135\r\n\r\nTermux执行sh脚本\r\n\r\n```\r\nbash 脚本名.sh\r\n```\r\n\r\n\r\n\r\n", + "Linux/Termux/Termux问题小总结.md": "\n#### 使用termux-setup-storage无法访问外部储存\n>在报告问题前,请务必在 Android `14` 上运行 `pkg install termux-am`。\n>\n>存储权限的授予方式如下。\n>\n>- Android `< 11`: `Android Settings` -> `Apps` -> `Termux` -> `Permissions` -> `Storage`\n>- Android `>= 11`: `Android 设置`  ->  `应用`  -> `Termux` ->  `权限`  ->  `文件和媒体`  ->  `允许管理所有文件`\n>- Android `>= 13`: `Android Settings` -> `Apps` -> (`Advanced` ->)  `特殊应用访问`  ->  `所有文件访问`  -> `Termux`\n>\n>如果使用 GitHub 动作构建,运行 `test -d \"$HOME/storage\" || termux-am broadcast --user 0 --es com.termux.app.reload_style storage -a com.termux.app.reload_style com.termux > /dev/null` 应该可以。\n>\n>至于 `termux-setup-storage` 不工作,运行命令后,请发送或发送邮件给我 `adb logcat -d > logcat.txt` 输出。\n\n\n", "Linux/ubuntu设置root登陆.md": "在 Ubuntu GNOME 22.04 中,默认情况下是禁用 root 用户的登录,以提高系统安全性。如果你需要启用 root 用户并允许其通过图形界面登录,可以按照以下步骤操作:\n\n### 1. 启用 Root 用户\n\nUbuntu 默认情况下禁用了 root 用户账户,因此我们需要为 root 设置密码才能启用它。\n\n1. 打开终端,使用以下命令设置 root 用户密码:\n\n ```bash\n sudo passwd root\n ```\n\n 然后根据提示输入并确认 root 用户密码。\n\n### 2. 允许 Root 用户登录图形界面\n\nUbuntu 默认不允许 root 用户直接登录 GNOME 图形界面。如果你希望启用 root 登录图形界面,需要修改 GDM(GNOME Display Manager)的配置文件。\n\n1. 编辑 GDM 配置文件:\n\n ```bash\n sudo nano /etc/gdm3/custom.conf\n ```\n\n2. 找到 `[security]` 部分,并确保以下行没有被注释掉(没有 `#`):\n\n ```plaintext\n AllowRoot=true\n ```\n\n3. 保存并退出(按 `Ctrl + O` 保存,`Ctrl + X` 退出)。\n\n### 3. 重启 GDM\n\n配置更改后,重启 GDM 或重新启动计算机以使更改生效。你可以使用以下命令重启 GDM:\n\n```bash\nsudo systemctl restart gdm3\n```\n\n### 4. 使用 root 登录\n\n现在,你应该能够在登录屏幕选择 root 用户进行登录了。只需要输入你为 root 设置的密码即可。\n\n### 5. 注意安全\n\n启用 root 用户图形界面登录可能会增加系统的安全风险,因为 root 用户具有系统的完全控制权限。为了保护系统的安全性,建议仅在必要时启用 root 登录,并使用强密码以及定期检查系统的安全性。\n\n如果你不需要 root 图形界面登录,建议使用 `sudo` 命令来执行管理员操作,这样可以减少潜在的安全风险。\n\n", "Linux/Windows文件一键上传到Linux.md": "\n**萌芽农场**\n```powershell\nscp -r D:\\Godot\\Godot项目\\比较完成的作品\\萌芽农场\\Server\\* root@192.168.31.233:/shumengya/docker/mengyafarmserver/\n\nscp -r D:\\Godot\\Godot项目\\比较完成的作品\\萌芽农场\\Server\\* root@192.168.1.233:/shumengya/docker/mengyafarmserver/\n```\n\n一个人的服务器(我的世界基岩版1.1.xPocketMine服务器)\n```powershell\nscp -r C:\\Users\\BigTang\\Desktop\\一个人的服务器\\* root@192.168.31.233:/shumengya/docker/OnePersonServer/\n```", "Linux/wlan0简单介绍.md": "### 1. 网络接口类型及其作用\n- **lo(回环接口)**:\n - 用于系统内部通信,IP地址通常为 `127.0.0.1`,子网掩码为 `255.0.0.0`。\n - 主要用于本地测试,如运行本地服务器(如HTTPD)时,只能在本机访问。\n\n- **eth0(以太网接口)**:\n - 代表第一块物理网卡,`HWaddr` 表示网卡的MAC地址,`inet addr` 表示IP地址。\n - 支持IPv4和IPv6,通常用于有线网络连接。\n - 可以通过 `ifconfig` 查看网卡的接收和发送数据包的情况。\n\n- **br0(网桥接口)**:\n - 用于在链路层连接多个网络接口(如eth0),实现帧的转发。\n - 常用于虚拟化环境中,连接多个虚拟网络接口。\n\n- **wlan0(无线接口)**:\n - 代表无线网卡,类似于eth0,但用于无线网络连接。\n - 需要驱动程序支持,配置方式与以太网接口类似。\n\n### 2. `ifconfig` 命令的常见操作\nWindows命令为:ipconfig\n\n- **启动/关闭网卡**:\n - `ifconfig eth0 up`:启动网卡。\n - `ifconfig eth0 down`:关闭网卡。\n\n- **配置/删除IPv6地址**:\n - `ifconfig eth0 add `:为网卡添加IPv6地址。\n - `ifconfig eth0 del `:删除网卡的IPv6地址。\n\n- **修改MAC地址**:\n - `ifconfig eth0 hw ether `:修改网卡的MAC地址。\n\n- **修改IP地址**:\n - `ifconfig eth0 `:修改网卡的IP地址。\n - `ifconfig eth0 netmask <子网掩码>`:修改IP地址并设置子网掩码。\n - `ifconfig eth0 netmask <子网掩码> broadcast <广播地址>`:同时设置IP地址、子网掩码和广播地址。\n\n- **设置最大传输单元(MTU)**:\n - `ifconfig eth0 mtu <字节数>`:设置网卡的最大传输单元大小。\n\n### 3. 注意事项\n- 使用 `ifconfig` 命令时,尤其是在远程服务器上操作时,需谨慎关闭网卡,否则可能导致无法远程连接。\n- 虚拟网卡和物理网卡的区别在于虚拟网卡由系统或应用程序创建,不依赖于物理硬件。\n\n这篇文章详细介绍了 `ifconfig` 命令的使用方法以及常见网络接口的配置和功能,适合需要管理和调试网络接口的用户参考。", - "Linux/我想全局执行某个sh脚本,该放在Linux哪个目录.md": "要使得某个 `.sh` 脚本能够在系统中全局执行,你可以将该脚本放在 **系统的 `PATH` 路径中**,使其在任何地方都能被执行。常见的目录有:\r\n\r\n### 1. **`/usr/local/bin/`**\r\n这是推荐的目录,因为它是用来放置系统管理员手动安装或编译的软件及脚本的。脚本放在这个目录中,可以确保它对所有用户可用,并且不会与系统自带的命令冲突。\r\n\r\n步骤:\r\n1. 将你的 `.sh` 脚本复制到 `/usr/local/bin/` 目录下。\r\n \r\n ```bash\r\n sudo cp your_script.sh /usr/local/bin/\r\n ```\r\n\r\n2. 赋予脚本执行权限:\r\n\r\n ```bash\r\n sudo chmod +x /usr/local/bin/your_script.sh\r\n ```\r\n\r\n3. 确保脚本能被执行,可以通过命令行直接调用(例如 `your_script.sh`),无需指定路径。\r\n\r\n### 2. **`/usr/bin/`**\r\n这个目录通常用于系统范围内的二进制文件,和 `/usr/local/bin/` 类似。但是,建议将自定义脚本放在 `/usr/local/bin/` 目录下,因为 `/usr/bin/` 通常用于通过包管理器安装的系统级命令。\r\n\r\n步骤:\r\n1. 将脚本复制到 `/usr/bin/` 目录:\r\n\r\n ```bash\r\n sudo cp your_script.sh /usr/bin/\r\n ```\r\n\r\n2. 赋予执行权限:\r\n\r\n ```bash\r\n sudo chmod +x /usr/bin/your_script.sh\r\n ```\r\n\r\n### 3. **`/bin/`**(不推荐)\r\n`/bin/` 目录通常用于存放系统核心命令和工具,普通用户通常不建议将自定义脚本放在这个目录中,除非它们确实是系统必需的命令。通常会将脚本放置在 `/usr/local/bin/` 或 `/usr/bin/` 中。\r\n\r\n### 4. **用户特定的目录(例如 `/home/username/bin/`)**\r\n如果你只想为某个特定用户设置全局脚本,而不是所有用户可以访问的脚本,你可以将脚本放在该用户的 `~/bin/` 目录下(如果该目录不存在,可以自己创建)。确保将 `~/bin/` 添加到用户的 `PATH` 环境变量中。\r\n\r\n步骤:\r\n1. 创建 `~/bin/` 目录(如果没有的话):\r\n\r\n ```bash\r\n mkdir -p ~/bin\r\n ```\r\n\r\n2. 将脚本复制到 `~/bin/` 目录:\r\n\r\n ```bash\r\n cp your_script.sh ~/bin/\r\n ```\r\n\r\n3. 赋予执行权限:\r\n\r\n ```bash\r\n chmod +x ~/bin/your_script.sh\r\n ```\r\n\r\n4. 编辑 `~/.bashrc` 或 `~/.profile`,将 `~/bin/` 添加到 `PATH`:\r\n\r\n ```bash\r\n export PATH=$PATH:~/bin\r\n ```\r\n\r\n5. 使 `~/.bashrc` 变更生效:\r\n\r\n ```bash\r\n source ~/.bashrc\r\n ```\r\n\r\n### 总结\r\n- **最推荐的目录:** `/usr/local/bin/`,适用于系统范围内的自定义脚本。\r\n- **其他可选目录:** `/usr/bin/`(不推荐),如果需要放系统级命令可以选择该目录。\r\n- **特定用户的脚本:** 用户自己的 `~/bin/` 目录。\r\n\r\n将脚本放入上述目录,并设置执行权限后,你就可以在系统中的任何地方执行该脚本了。如果有任何问题,请随时告知!", - "Linux/手动配置alist.md": "```shell\r\n# 解压下载的文件,得到可执行文件:\r\ntar -zxvf alist-xxxx.tar.gz\r\n# 授予程序执行权限:\r\nchmod +x alist\r\n# 运行程序\r\n./alist server\r\n\r\n# 获得管理员信息 以下两个不同版本,新版本也有随机生成和手动设置\r\n# 低于v3.25.0版本\r\n./alist admin\r\n\r\n# 高于v3.25.0版本\r\n# 随机生成一个密码\r\n./alist admin random\r\n# 手动设置一个密码 `NEW_PASSWORD`是指你需要设置的密码\r\n./alist admin set NEW_PASSWORD\r\n\r\n```\r\n\r\n\r\n\r\n使用任意方式编辑 `/usr/lib/systemd/system/alist.service` 并添加如下内容,其中 path_alist 为 AList 所在的路径\r\n\r\n```shell\r\n[Unit]\r\nDescription=alist\r\nAfter=network.target\r\n \r\n[Service]\r\nType=simple\r\nWorkingDirectory=path_alist\r\nExecStart=path_alist/alist server\r\nRestart=on-failure\r\n \r\n[Install]\r\nWantedBy=multi-user.target\r\n\r\n```\r\n\r\n然后,执行 systemctl daemon-reload 重载配置,现在你可以使用这些命令来管理程序:\r\n**• 启动: systemctl start alist**\r\n**• 关闭: systemctl stop alist**\r\n**• 配置开机自启: systemctl enable alist**\r\n**• 取消开机自启: systemctl disable alist**\r\n**• 状态: systemctl status alist**\r\n**• 重启: systemctl restart alist**", - "Linux/把Ubuntu镜像源切换到阿里云.md": "要将 Ubuntu 22.04 (AMD64) 的软件源更换为阿里云的镜像源,可以按照以下步骤操作:\n\n### 1. 备份当前的源列表\n\n在更改源之前,先备份原有的 `sources.list` 文件:\n\n```bash\nsudo cp /etc/apt/sources.list /etc/apt/sources.list.bak\n```\n\n### 2. 修改 `sources.list` 文件\n\n打开 `/etc/apt/sources.list` 文件,编辑并替换为阿里云的源地址:\n\n```bash\nsudo nano /etc/apt/sources.list\n```\n\n将文件内容替换为以下内容(适用于 Ubuntu 22.04):\n\n```plaintext\n# 阿里云 Ubuntu 22.04 镜像源\ndeb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse\n\ndeb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse\n\ndeb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse\n\ndeb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse\n```\n\n### 3. 更新软件包列表\n\n替换源后,更新 apt 包索引:\n\n```bash\nsudo apt update\n```\n\n### 4. 升级已安装的软件包\n\n为了确保一切顺利运行,你可以运行以下命令来升级现有的软件包:\n\n```bash\nsudo apt upgrade\n```\n\n完成这些步骤后,你的 Ubuntu 系统应该就会使用阿里云的镜像源了,下载速度会更加快速稳定。\n\n", + "Linux/全局执行某个sh脚本,该放在Linux哪个目录.md": "要使得某个 `.sh` 脚本能够在系统中全局执行,你可以将该脚本放在 **系统的 `PATH` 路径中**,使其在任何地方都能被执行。常见的目录有:\n\n### 1. **`/usr/local/bin/`**\n这是推荐的目录,因为它是用来放置系统管理员手动安装或编译的软件及脚本的。脚本放在这个目录中,可以确保它对所有用户可用,并且不会与系统自带的命令冲突。\n\n步骤:\n1. 将你的 `.sh` 脚本复制到 `/usr/local/bin/` 目录下。\n \n ```bash\n sudo cp your_script.sh /usr/local/bin/\n ```\n\n2. 赋予脚本执行权限:\n\n ```bash\n sudo chmod +x /usr/local/bin/your_script.sh\n ```\n\n3. 确保脚本能被执行,可以通过命令行直接调用(例如 `your_script.sh`),无需指定路径。\n\n### 2. **`/usr/bin/`**\n这个目录通常用于系统范围内的二进制文件,和 `/usr/local/bin/` 类似。但是,建议将自定义脚本放在 `/usr/local/bin/` 目录下,因为 `/usr/bin/` 通常用于通过包管理器安装的系统级命令。\n\n步骤:\n1. 将脚本复制到 `/usr/bin/` 目录:\n\n ```bash\n sudo cp your_script.sh /usr/bin/\n ```\n\n2. 赋予执行权限:\n\n ```bash\n sudo chmod +x /usr/bin/your_script.sh\n ```\n\n### 3. **`/bin/`**(不推荐)\n`/bin/` 目录通常用于存放系统核心命令和工具,普通用户通常不建议将自定义脚本放在这个目录中,除非它们确实是系统必需的命令。通常会将脚本放置在 `/usr/local/bin/` 或 `/usr/bin/` 中。\n\n### 4. **用户特定的目录(例如 `/home/username/bin/`)**\n如果你只想为某个特定用户设置全局脚本,而不是所有用户可以访问的脚本,你可以将脚本放在该用户的 `~/bin/` 目录下(如果该目录不存在,可以自己创建)。确保将 `~/bin/` 添加到用户的 `PATH` 环境变量中。\n\n步骤:\n1. 创建 `~/bin/` 目录(如果没有的话):\n\n ```bash\n mkdir -p ~/bin\n ```\n\n2. 将脚本复制到 `~/bin/` 目录:\n\n ```bash\n cp your_script.sh ~/bin/\n ```\n\n3. 赋予执行权限:\n\n ```bash\n chmod +x ~/bin/your_script.sh\n ```\n\n4. 编辑 `~/.bashrc` 或 `~/.profile`,将 `~/bin/` 添加到 `PATH`:\n\n ```bash\n export PATH=$PATH:~/bin\n ```\n\n5. 使 `~/.bashrc` 变更生效:\n\n ```bash\n source ~/.bashrc\n ```\n\n### 总结\n- **最推荐的目录:** `/usr/local/bin/`,适用于系统范围内的自定义脚本。\n- **其他可选目录:** `/usr/bin/`(不推荐),如果需要放系统级命令可以选择该目录。\n- **特定用户的脚本:** 用户自己的 `~/bin/` 目录。\n", + "Linux/手动配置alist.md": "```shell\n# 解压下载的文件,得到可执行文件:\ntar -zxvf alist-xxxx.tar.gz\n# 授予程序执行权限:\nchmod +x alist\n# 运行程序\n./alist server\n\n# 获得管理员信息 以下两个不同版本,新版本也有随机生成和手动设置\n# 低于v3.25.0版本\n./alist admin\n\n# 高于v3.25.0版本\n# 随机生成一个密码\n./alist admin random\n# 手动设置一个密码 `NEW_PASSWORD`是指你需要设置的密码\n./alist admin set NEW_PASSWORD\n\n```\n\n\n\n使用任意方式编辑 `/usr/lib/systemd/system/alist.service` 并添加如下内容,其中 path_alist 为 AList 所在的路径\n\n```shell\n[Unit]\nDescription=alist\nAfter=network.target\n \n[Service]\nType=simple\nWorkingDirectory=path_alist\nExecStart=path_alist/alist server\nRestart=on-failure\n \n[Install]\nWantedBy=multi-user.target\n\n```\n\n然后,执行 systemctl daemon-reload 重载配置,现在你可以使用这些命令来管理程序:\n**• 启动: systemctl start alist**\n**• 关闭: systemctl stop alist**\n**• 配置开机自启: systemctl enable alist**\n**• 取消开机自启: systemctl disable alist**\n**• 状态: systemctl status alist**\n**• 重启: systemctl restart alist**", + "Linux/把Ubuntu镜像源切换到阿里云.md": "要将 Ubuntu 22.04 (AMD64) 的软件源更换为阿里云的镜像源,可以按照以下步骤操作:\n\n### 1. 备份当前的源列表\n\n在更改源之前,先备份原有的 `sources.list` 文件:\n\n```bash\nsudo cp /etc/apt/sources.list /etc/apt/sources.list.bak\n```\n\n### 2. 修改 `sources.list` 文件\n\n打开 `/etc/apt/sources.list` 文件,编辑并替换为阿里云的源地址:\n\n```bash\nsudo nano /etc/apt/sources.list\n```\n\n将文件内容替换为以下内容(适用于 Ubuntu 22.04):\n\n```plaintext\n# 阿里云 Ubuntu 22.04 镜像源\ndeb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse\n\ndeb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse\n\ndeb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse\n\ndeb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse\ndeb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse\n```\n\n### 3. 更新软件包列表\n\n替换源后,更新 apt 包索引:\n\n```bash\nsudo apt update\n```\n\n### 4. 升级已安装的软件包\n\n为了确保一切顺利运行,你可以运行以下命令来升级现有的软件包:\n\n```bash\nsudo apt upgrade\n```\n\n\n", "Linux/构建最小Linux系统.md": "以下是手动构建一个极简Linux系统(约10MB)的完整步骤,包含内核和基础用户空间:\r\n\r\n### 1. 准备环境(Ubuntu/Debian示例)\r\n```bash\r\nsudo apt install -y build-essential libncurses-dev bison flex qemu-system-x86\r\nmkdir tiny_linux && cd tiny_linux\r\n```\r\n\r\n### 2. 编译定制化内核(5MB)\r\n```bash\r\n# 下载最新稳定版内核\r\nwget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.8.tar.xz\r\ntar xf linux-6.9.8.tar.xz && cd linux-6.9.8\r\n\r\n# 最小化配置\r\nmake defconfig\r\nmake menuconfig # 手动调整以下选项:\r\n# General setup\r\n# [ ] Configure standard kernel features (expert users)\r\n# Device Drivers\r\n# [*] Block devices > RAM block device support (16MB)\r\n# [*] Network device support > Ethernet driver support > Intel(R) PRO/1000\r\n# File systems\r\n# [*] Ext2\r\n# [ ] Btrfs\r\n# [ ] XFS\r\n# [*] Enable loadable module support # 禁用\r\n\r\n# 编译内核\r\nmake -j$(nproc) bzImage\r\n```\r\n\r\n### 3. 创建最小根文件系统(5MB)\r\n```bash\r\ncd ..\r\nmkdir rootfs && cd rootfs\r\n\r\n# 使用BusyBox构建基础工具\r\nwget https://busybox.net/downloads/busybox-1.36.1.tar.bz2\r\ntar xf busybox-1.36.1.tar.bz2 && cd busybox-1.36.1\r\nmake defconfig\r\nmake menuconfig # 选择静态编译:\r\n# Settings -> Build Options -> [*] Build static binary\r\n\r\nmake -j$(nproc) && make install\r\ncd _install\r\n\r\n# 创建必要目录\r\nmkdir -p proc sys dev etc/init.d\r\n\r\n# 创建启动脚本\r\ncat > etc/init.d/rcS <<EOF\r\n#!/bin/sh\r\nmount -t proc none /proc\r\nmount -t sysfs none /sys\r\n/sbin/mdev -s\r\nEOF\r\nchmod +x etc/init.d/rcS\r\n\r\n# 创建文件系统镜像\r\ndd if=/dev/zero of=rootfs.img bs=1M count=16\r\nmkfs.ext2 -F rootfs.img\r\nsudo mount -o loop rootfs.img /mnt\r\nsudo cp -r ./* /mnt\r\nsudo umount /mnt\r\n```\r\n\r\n### 4. 使用QEMU启动测试\r\n```bash\r\nqemu-system-x86_64 \\\r\n -kernel ../linux-6.9.8/arch/x86/boot/bzImage \\\r\n -hda rootfs.img \\\r\n -append "root=/dev/ram0 console=ttyS0" \\\r\n -nographic\r\n```\r\n\r\n### 5. 可选优化(缩减体积)\r\n```bash\r\n# 使用UPX压缩可执行文件\r\nsudo apt install upx\r\nfind . -type f -executable | xargs upx --best\r\n\r\n# 移除调试符号\r\nstrip --strip-all busybox\r\n\r\n# 使用musl libc替代glibc\r\nwget https://musl.libc.org/releases/musl-1.2.4.tar.gz\r\ntar xzf musl-1.2.4.tar.gz && cd musl-1.2.4\r\n./configure --prefix=/usr/local/musl && make && sudo make install\r\n```\r\n\r\n### 6. 构建结果\r\n```\r\n├── linux-6.9.8\r\n│ └── arch/x86/boot/bzImage # 内核文件\r\n├── rootfs\r\n│ ├── bin # 基础命令\r\n│ ├── rootfs.img # 根文件系统镜像\r\n│ └── etc # 配置文件\r\n```\r\n\r\n### 替代方案:使用Buildroot快速构建\r\n```bash\r\ngit clone https://github.com/buildroot/buildroot\r\ncd buildroot\r\nmake menuconfig # 选择:\r\n# Target options -> Target Architecture = x86_64\r\n# System configuration -> Root filesystem overlay = ../rootfs\r\n# Kernel -> Linux Kernel = 6.9.8\r\nmake -j$(nrep)\r\n```\r\n\r\n### 系统特性对比\r\n\r\n| 组件 | 手动构建 | Buildroot构建 |\r\n| ------------ | -------- | ------------- |\r\n| 启动时间 | <1s | <1.5s |\r\n| 内存占用 | 8MB | 12MB |\r\n| 可执行文件数 | 12个 | 25个 |\r\n| 支持网络 | 否 | 是 |\r\n| 支持动态库 | 否 | 可选 |\r\n\r\n建议从手动构建开始学习原理,实际项目使用Buildroot可节省90%时间。后续可添加OpenSSH(+1.2MB)或Web服务器(+0.8MB)等组件扩展功能。", - "Linux/某安卓板子不知名初始化脚本.md": "adb push busybox /tmp\r\nadb shell\r\ncd /tmp\r\nchmod 777 *\r\n./busybox ifconfig wlan0 up", "Linux/树萌芽常用Linux命令集合.md": "tar.gz文件解压:\ntar -zxvf 文件名\n\nlinux 重命名文件/文件夹:\nmv 原文件名 新文件名\n\n注意:/etc/systemd/system/ 这里放置systemctl服务\n\n重新加载systemctl服务:\nsystemctl daemon-reload\n\nsystemctl start 服务名\nsystemctl stop 服务名\nsystemctl enable 服务名\nsystemctl status 服务名\n", - "Linux/树萌芽的局域网中网IP分配.md": "# IP分段:192.168.31.1-192.168.31.255\r\n\r\n## ------------------------------------------------------------\r\n\r\n## 10 20 30 40 50 60 70\r\n\r\n## 66 99 88 11 22 33 44 55\r\n\r\n## 110 120 119 \r\n\r\n## 111 222\r\n\r\n## 233\r\n\r\n## ------------------------------------------------------------\r\n\r\n## x86电脑系列\r\n\r\n#### Windows11\r\n\r\n#### Linux Mint\r\n\r\n#### 树萌芽NAS(大萌芽):233\r\n\r\n\r\n\r\n## 安卓手机系列\r\n\r\n#### 红萌芽盘 :222\r\n\r\n#### 黑萌芽盘 :111\r\n\r\n#### 小萌芽盘: \r\n\r\n\r\n\r\n#### vivo平板\r\n\r\n#### OPPO手机\r\n\r\n\r\n\r\n## 随身WiFi系列\r\n\r\n#### UFI1003 \r\n\r\n#### UZ801\r\n\r\n#### UZ901\r\n\r\n#### UFI100C 目前有9个\r\n\r\n### IP:11 - 99\r\n\r\n\r\n\r\n#### \r\n\r\n#### \r\n\r\n#### \r\n\r\n#### \r\n\r\n\r\n\r\n", + "Linux/树萌芽的局域网中网IP分配.md": "# IP分段:192.168.31.1-192.168.31.255\n\n## -------------------------------\n\n## 10 20 30 40 50 60 70\n\n## 66 99 88 11 22 33 44 55\n\n## 110 120 119 \n\n## 111 222\n\n## 233\n\n## -------------------------------\n\n## x86电脑系列\n\n#### Windows11\n\n#### Linux Mint\n\n#### 树萌芽NAS(大萌芽):233\n\n\n\n## 安卓手机系列\n\n#### 红萌芽盘 :222\n\n#### 黑萌芽盘 :111\n\n#### 小萌芽盘: \n\n\n\n#### vivo平板\n\n#### OPPO手机\n\n\n\n## 随身WiFi系列\n\n#### UFI1003 \n\n#### UZ801\n\n#### UZ901\n\n#### UFI100C 目前有9个\n\n### IP:11 - 99\n\n\n\n#### \n\n#### \n\n#### \n\n#### \n\n\n\n", "Linux/编译alist.md": "以下是编译 Alist 前后端的详细步骤:\r\n\r\n---\r\n\r\n### **1. 准备工作**\r\n#### 环境要求:\r\n- **Go 1.16+** (后端依赖)\r\n- **Node.js 14+** (前端依赖)\r\n- **Git** (代码管理)\r\n- **Yarn** 或 **npm** (前端包管理)\r\n\r\n#### 安装依赖:\r\n```bash\r\n# 安装 Go (以 Linux 为例)\r\nwget https://golang.org/dl/go1.20.linux-amd64.tar.gz\r\nsudo tar -C /usr/local -xzf go1.20.linux-amd64.tar.gz\r\nexport PATH=$PATH:/usr/local/go/bin\r\n\r\n# 安装 Node.js (推荐使用 nvm)\r\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash\r\nnvm install 16\r\nnvm use 16\r\n\r\n# 安装 Yarn\r\nnpm install -g yarn\r\n```\r\n\r\n---\r\n\r\n### **2. 后端编译**\r\n#### 获取源码:\r\n```bash\r\ngit clone https://github.com/alist-org/alist.git\r\ncd alist\r\n```\r\n\r\n#### 安装依赖并编译:\r\n```bash\r\n# 进入后端目录\r\ncd alist\r\n\r\n# 下载 Go 依赖\r\ngo mod download\r\n\r\n# 编译(默认生成当前系统的可执行文件)\r\ngo build -o alist main.go\r\n\r\n# 交叉编译(示例:编译 Linux AMD64)\r\nCGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o alist-linux-amd64 main.go\r\n```\r\n\r\n编译完成后,会在当前目录生成可执行文件 `alist`(或指定名称)。\r\n\r\n---\r\n\r\n### **3. 前端编译**\r\n#### 进入前端目录:\r\n```bash\r\ncd ../web # 假设源码根目录为 alist/\r\n```\r\n\r\n#### 安装依赖并构建:\r\n```bash\r\nyarn install # 或使用 npm install\r\nyarn build # 或使用 npm run build\r\n```\r\n\r\n构建完成后,静态文件会生成在 `dist` 目录中。\r\n\r\n---\r\n\r\n### **4. 整合前后端**\r\n将前端构建的静态文件复制到后端目录的 `public` 文件夹中:\r\n```bash\r\n# 创建 public 目录(如果不存在)\r\nmkdir -p ../alist/public\r\n\r\n# 复制前端文件\r\ncp -r dist/* ../alist/public/\r\n```\r\n\r\n---\r\n\r\n### **5. 运行 Alist**\r\n```bash\r\n# 进入后端目录\r\ncd ../alist\r\n\r\n# 赋予执行权限(Linux/macOS)\r\nchmod +x alist\r\n\r\n# 启动服务\r\n./alist server\r\n```\r\n\r\n默认访问地址:`http://localhost:5244`\r\n\r\n---\r\n\r\n### **6. 高级配置**\r\n1. **修改配置文件** \r\n 首次运行后会在程序目录生成 `data/config.json`,可按需修改端口、存储驱动等。\r\n\r\n2. **自定义前端变量** \r\n 在 `web/.env` 文件中修改环境变量(如 API 地址):\r\n ```env\r\n VITE_API_URL=http://your-domain.com:5244\r\n ```\r\n\r\n3. **Docker 编译(可选)** \r\n Alist 官方提供 Docker 镜像,也可自行构建:\r\n ```bash\r\n docker build -t alist .\r\n ```\r\n\r\n---\r\n\r\n### **常见问题**\r\n1. **依赖安装失败** \r\n - 检查网络是否通畅(尤其是 Go 依赖可能需要代理)。\r\n - 确保 Node.js 和 Go 版本符合要求。\r\n\r\n2. **前端构建报错** \r\n - 清理缓存:`yarn cache clean` 或 `rm -rf node_modules`。\r\n - 检查 `web/package.json` 中的依赖版本是否冲突。\r\n\r\n3. **启动后无法访问** \r\n - 检查防火墙是否开放端口(默认 `5244`)。\r\n - 确认 `config.json` 中 `address` 设置为 `0.0.0.0`(允许外部访问)。\r\n\r\n---\r\n\r\n通过以上步骤,你可以成功编译并运行 Alist 的完整服务。如需更多定制化配置,建议参考 [Alist 官方文档](https://alist.nn.ci/)。", "Linux/编译busybox步骤.md": "```shell\r\npkg update && pkg upgrade\r\npkg install git make clang\r\napt install gcc\r\nexport CC=clang\r\napt install build-essential\r\npkg install ncurses-dev\r\ngit clone https://git.busybox.net/busybox\r\ncd busybox\r\nmake menuconfig\r\n#make -j$(nproc) \r\nmake -j4\r\nmake install\r\n\r\n\r\n```\r\n\r\n```shell\r\n#可选创建符号链接\r\nPREFIX=$HOME/.local\r\nmkdir -p $PREFIX/bin\r\nfor applet in $(./busybox --list); do\r\n ln -s $PREFIX/bin/busybox $PREFIX/bin/$applet\r\ndone\r\n\r\n```\r\n\r\n", - "Linux/飞牛os切换root.md": "1.打开飞牛ssh\r\n2.ssh软件连接上飞牛(飞牛账号)\r\n3.给root新建密码:sudo passwd root 回车\r\n再次输入飞牛密码\r\n再输入密码(root密码)两次(不回显,每次输完回车)\r\n4.配置权限文件:sudo nano /etc/ssh/sshd_config 回车\r\n5.光标移动到:permitrootlogin no 把no 改为yes \r\n6.ctrl+o(写入文本)回车 ctrl+x(退出) 重启服务器:sudo reboot\r\n7.重启ssh服务:sudo service sshd restart\r\n8.用命令切换root账号:su -(或者sudo su -)还要输入一次目前飞牛密码回车就切换root了。", - "Minecraft/Minecraft常用命令.md": "***/kill @e[type=mutant:mskeleton_bones]*** \n清除掉突变骷髅模组的骷髅骨头实体\n\n***/kill @e[type=item]*** \n清除所有掉落物\n\n***/gamerule mobGriefing true*** \n设置生物破坏开启或者禁用 (禁用后村民不会繁殖,雪傀儡不会产雪)", + "Linux/随身WiFi/随身WiFi一些记录.md": "export TERM=linux\n", + "Minecraft/Minecraft命名彩蛋.md": "在 Minecraft Java 版(以及很多情况下 Bedrock 版也适用)里,给生物使用命名牌(Name Tag)命名时,有几种**彩蛋效果**(Easter Eggs)可以触发。以下是主要已知的几种:\n\n| 名称 | 生物 | 效果 | 备注 |\n| -------------------------- | ---------------------------- | -------------------------------------------- | ---------------------------------------------- |\n| **“Dinnerbone” 或 “Grumm”** | 任何可命名的生物(除某些Boss如末影龙) | 生物会“倒立”——模型翻转,看起来在头朝下走路 | 这是对开发者 Nathan Adams(昵称 Dinnerbone)和 Grumm 的致敬。 |\n| **“jeb_”**(注意结尾的下划线) | 羊(Sheep) | 羊的羊毛会不断在所有颜色之间切换,形成“彩虹羊”效果 | 虽然羊毛颜色看上去在变,但剪下或杀掉后掉落的仍然是原始颜色的羊毛 |\n| **“Toast”** | 兔子(Rabbit) | 命名为 “Toast” 的兔子会变成黑白皮肤(纪念性皮肤) | 背后故事是某玩家丢失了一只叫 Toast 的兔子,开发者为其添加了这一皮肤。 |\n| **“Johnny”** | 复仇者(Vindicator)或在某版本中 Zoglin | 命名为 “Johnny” 的复仇者会变得对几乎所有生物(包括动物/敌对/中立)都敌对攻击 | 这是对电影 The Shining 中 “Here’s Johnny” 场景的致敬。 |\n| | | | |\n", + "Minecraft/Minecraft常用命令.md": "***/kill @e[type=mutant:mskeleton_bones]*** \n清除掉突变骷髅模组的骷髅骨头实体\n\n***/kill @e[type=item]*** \n清除所有掉落物\n\n***/gamerule mobGriefing true*** \n设置生物破坏开启或者禁用 (禁用后村民不会繁殖,雪傀儡不会产雪)\n\n***/gamerule keepInventory true***\n设置玩家死亡不掉落", "Obsidion/Obsidion美化.md": "```json\n{\n \"Appearance-light@@theme-light-style-select\": \"theme-light-background-adapt\",\n \"Appearance-light@@mod-left-split-background-select-light\": \"mod-left-split-background-CSS-light\",\n \"Appearance-light@@background-mod-left-CSS-light\": \"radial-gradient(100% 50% at 100% 50%, rgba(90, 109, 237, 0.1) 0%, rgba(255, 255, 255, 0) 100%)\",\n \"Appearance-light@@background-mod-left-CSS-backdrop-filter-light\": \"blur(0px)\",\n \"Appearance-light@@mod-right-split-background-select-light\": \"mod-right-split-background-CSS-light\",\n \"Appearance-light@@background-mod-right-CSS-light\": \"radial-gradient(100% 50% at 0% 50%, rgba(90, 109, 237, 0.1) 0%, rgba(255, 255, 255, 0) 100%)\",\n \"Appearance-light@@background-mod-right-CSS-backdrop-filter-light\": \"blur(0px)\",\n \"Appearance-light@@mod-root-split-background-select-light\": \"mod-root-split-background-CSS-light\",\n \"Appearance-light@@background-mod-root-CSS-light\": \"transparent\",\n \"Appearance-light@@background-mod-root-CSS-backdrop-filter-light\": \"blur(0px)\",\n \"Appearance-light@@background-underlying-select-light\": \"background-underlying-CSS-light\",\n \"Appearance-light@@background-underlying-CSS-light\": \"linear-gradient(168.44deg, #D7DAEA 1.62%, #F2F2F8 95.72%)\",\n \"Appearance-light@@background-underlying-CSS-blend-mode-light\": \"normal\",\n \"Appearance-light@@card-border-radius-light\": \"0px\",\n \"Appearance-light@@card-shadow-light\": \"none\",\n \"Appearance-light@@background-activated-tab-header-light\": \"radial-gradient(50% 150% at 50% 150%, #F8F9FF 0%, rgba(97, 54, 144, 0) 100%)\",\n \"Appearance-light@@shadow-activated-tab-header-light\": \"none\",\n \"Appearance-light@@indicator-remove-light\": true,\n \"Appearance-light@@Active-states-file-explorer-select-light\": \"activated-file-tab-style-light\",\n \"Appearance-light@@workspace-divider-transparent-light\": true,\n \"Components@@CTA-BTN-enable\": true,\n \"Components@@file-names-untrim\": true,\n \"Components@@folder-font-bold\": true,\n \"Components@@colorful-folder\": true,\n \"Components@@file-icon-remove\": false,\n \"Components@@outline-enhanced\": true,\n \"Components@@new-tab-btn-select\": \"new-tab-btn-default\",\n \"Components@@immersive-canvas\": true,\n \"Components@@scrollbar-hide\": true,\n \"Appearance-light@@card-layout-open-light\": true,\n \"Appearance-light@@accent-color-override-light\": false,\n \"Appearance-light@@card-highlight-light\": true,\n \"Editor@@line-hover-indicator\": true,\n \"Editor@@focus-indicator-codeblock-line-number\": true,\n \"Editor@@focus-indicator-list-level\": true,\n \"Editor@@editor-grid-background-pattren\": true,\n \"Editor@@inline-title-divider-remove\": true,\n \"Editor@@h1-divider-on\": true,\n \"Editor@@h2-divider-on\": true,\n \"Editor@@h3-divider-on\": true,\n \"Editor@@h4-divider-on\": true,\n \"Editor@@h5-divider-on\": true,\n \"Editor@@h6-divider-on\": true,\n \"Editor@@text-align-justify\": true,\n \"Editor@@bold-color@@light\": \"#4781EC\",\n \"Editor@@italic-color@@light\": \"#FF4BFE\",\n \"Editor@@img-center-align\": true,\n \"Mobile@@drawer-phone-full-width\": true,\n \"Mobile@@card-layout-pad-open\": true,\n \"Plugin@@colorful-checkbox\": true\n}\n```", "内网穿透/frp客户端配置.md": "\n```toml\n#=============================================================================\n#===================================基础设置===================================\n#=============================================================================\n\nserverAddr = \"47.108.90.0\"\nserverPort = 7000\n\nauth.method = \"token\"\nauth.token = \"smy\"\n\nwebServer.addr = \"0.0.0.0\"\nwebServer.port = 7400\nwebServer.user = \"shumengya\"\nwebServer.password = \"tyh@19900420\"\nwebServer.pprofEnable = false\n\n#下面两个二选一\ntransport.protocol = \"kcp\"\n#transport.protocol = \"quic\"\n\n# 日志配置\nlog.to = \"console\"\nlog.level = \"info\"\n\n\n#=============================================================================\n#===================================Http服务===================================\n#=============================================================================\n\n# 萌芽盘-openlist\n[[proxies]]\nname = \"openlist\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 5244\ncustomDomains = [\"openlist.shumengya.top\",\"pan.shumengya.top\"] \n\n\n#大萌芽1panel面板-1panel\n[[proxies]]\nname = \"1panel\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 19132\ncustomDomains = [\"1panel.shumengya.top\"] \n\n\n#Obsidian笔记同步-couchdb\n[[proxies]]\nname = \"couchdb\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 5984\ncustomDomains = [\"note.shumengya.top\"] \n\n#大萌芽frp客户端-frpc\n[[proxies]]\nname = \"frpc\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 7400\ncustomDomains = [\"frpc.shumengya.top\"] \n\n#萌芽文件快传-filecodebox\n[[proxies]]\nname = \"filecodebox\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 12345\ncustomDomains = [\"file.shumengya.top\",\"send.shumengya.top\"] \n\n#萌芽图床-lsky-pro\n[[proxies]]\nname = \"lsky-pro\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 8089\ncustomDomains = [\"image.shumengya.top\",\"img.shumengya.top\"] \n\n#在线代码编辑器-codeserver\n[[proxies]]\nname = \"codeserver\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 8888\ncustomDomains = [\"code.shumengya.top\"] \n\n#60sAPI接口集合-60sapi\n[[proxies]]\nname = \"60s-API\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 4399\ncustomDomains = [\"60s.api.shumengya.top\"] \n\n#社交媒体视频ai总结-bilinote\n[[proxies]]\nname = \"bilinote\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 3015\ncustomDomains = [\"bilinote.shumengya.top\"] \n\n#萌芽git仓库-gitea\n[[proxies]]\nname = \"gitea\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 8989\ncustomDomains = [\"repo.shumengya.top\"] \n\n#Docker可视化面板-DPanel\n[[proxies]]\nname = \"dpanel\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 8800\ncustomDomains = [\"dpanel.shumengya.top\"] \n\n#萌芽通知-ntfy\n[[proxies]]\nname = \"ntfy\"\ntype = \"http\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 82\ncustomDomains = [\"ntfy.shumengya.top\"] \n\n#萌芽大内网管理后台-openwrt\n[[proxies]]\nname = \"openwrt\"\ntype = \"http\"\nlocalIP = \"192.168.1.1\"\nlocalPort = 80\ncustomDomains = [\"openwrt.shumengya.top\"] \n\n#=========================================================================\n#===================================TCP服务=================================\n#=========================================================================\n\n#萌芽农场远程控制台\n[[proxies]]\nname = \"mengyafarm-config\"\ntype = \"tcp\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 7071\nremotePort = 6060\n\n#mysql数据库\n[[proxies]]\nname = \"mysql\"\ntype = \"tcp\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 3306\nremotePort = 3307 # frps 上的映射端口\n\n#MongoDB数据库\n[[proxies]]\nname = \"mongodb\"\ntype = \"tcp\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 27017\nremotePort = 27018\n\n#Postgres数据库\n[[proxies]]\nname = \"postgres\"\ntype = \"tcp\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 5432\nremotePort = 5433\n\n#大萌芽-Debian11 SSH连接\n[[proxies]]\nname = \"bigmengya-ssh\"\ntype = \"tcp\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 22\nremotePort = 9022\n\n#Redis数据库\n[[proxies]]\nname = \"redis\"\ntype = \"tcp\"\nlocalIP = \"127.0.0.1\"\nlocalPort = 6379\nremotePort = 6380\n\n\n#=========================================================================\n#===================================UDP服务=================================\n#=========================================================================\n\n```\n", "内网穿透/frp服务端配置.md": "\n```toml\n# frp服务端配置 - 作为nginx后端服务\n# 与nginx配合使用,提供HTTPS支持\n\nbindAddr = \"0.0.0.0\"\nbindPort = 7000\n\n#下面两个二选一\nkcpBindPort = 7000 # KCP 监听的 UDP 端口(可与 bindPort 相同)\n#quicBindPort = 7000 # QUIC 使用的 UDP 端口(与 bindPort 可相同)\n\n[auth]\nauth.method = \"token\" \nauth.token = \"smy\" \n\n# HTTP配置 - 作为后端服务(nginx代理)\nvhostHTTPPort = 8080 # nginx代理到此端口\n\n# 日志配置\nlog.to = \"console\"\nlog.level = \"info\"\n\n# 管理界面\n[webServer]\nwebServer.addr = \"0.0.0.0\"\nwebServer.port = 7500\nwebServer.user = \"shumengya\"\nwebServer.password = \"tyh@19900420\" \n\n[transport]\ntcpMux = true # 如要关闭 tcp 多路复用(默认启用)\nmaxPoolCount = 10 # 服务端允许的最大连接池数量\ntls.force = false # 不强制客户端必须 TLS(除非你要强制安全)\n```\n\n", "内网穿透/Frp的kcp和quic的区别和特点.md": "\n---\n\n## 基础:QUIC 与 KCP 本身的区别(协议层面)\n\n要理解 FRP 下这两种模式的差别,首先必须认识 QUIC 与 KCP 两种协议在 UDP 之上的设计差异。下面从几个维度来对比。\n\n|维度|KCP|QUIC|\n|---|---|---|\n|协议定位 / 设计目标|一个可靠的 UDP 层协议(“可靠 UDP + ARQ + 拥塞控制 + 重传策略”),强调低延迟、对弱网络适应性较好。 ([腾讯云](https://cloud.tencent.com/developer/article/1964393?utm_source=chatgpt.com \"KCP协议:从TCP到UDP家族QUIC/KCP/ENET-腾讯云开发 ...\"))|更现代的传输层协议,最初由 Google 设计,后来演化成为 HTTP/3 的底层传输(即:QUIC + TLS + 多路复用)的一部分。它在 UDP 之上集成了连接管理、多路复用、拥塞控制、0-RTT、TLS 加密等机制。 ([CSDN博客](https://blog.csdn.net/qq_36541069/article/details/132143729?utm_source=chatgpt.com \"所得杂记:KCP,QUIC,MQTT - CSDN博客\"))|\n|连接建立 / 握手延迟|KCP 在使用上一般是比较“轻”的握手(因为只是建立会话 ID 等),延迟比较低|QUIC 支持 0-RTT、较快握手(因为集成 TLS)等机制,从连接建立角度更有优势|\n|多路复用 / 多流支持|传统 KCP 是面向“单流”(一个会话对应一个流式数据)。要实现真正的多路复用,需要在上层自己设计;否则每条独立连接就是一个 KCP 实例|QUIC 原生支持多流(multiple streams)和流内优先级,能在一个连接上同时承载多个逻辑数据流,减少队头阻塞(Head-of-line blocking)的问题|\n|拥塞控制 / 拥塞算法|KCP 自己有拥塞控制与窗口机制,也可以调节参数去“弱化”拥塞控制以换取低延迟。 ([腾讯云](https://cloud.tencent.com/developer/article/1964393?utm_source=chatgpt.com \"KCP协议:从TCP到UDP家族QUIC/KCP/ENET-腾讯云开发 ...\"))|QUIC 的拥塞控制受到现代研究和 TCP 的启发,有较为成熟的拥塞控制与流量控制算法;它也能动态适应网络变化|\n|丢包 / 重传机制|KCP 使用选择性重传 (Selective Retransmission)、快速重传、延迟 ACK 调节等策略来减少重传滞后和延迟惩罚。 ([腾讯云](https://cloud.tencent.com/developer/article/1964393?utm_source=chatgpt.com \"KCP协议:从TCP到UDP家族QUIC/KCP/ENET-腾讯云开发 ...\"))|QUIC 也具备细粒度的 ACK / 重传机制,有更复杂的 ACK / 确认策略,集成了更现代的重传算法|\n|加密 / 安全|KCP 本身通常是“裸协议”或可选加密(上层或 FRP 在其上做加密)|QUIC 本身设计是**加密为默认**(TLS 集成在协议里),所有控制面与数据面都加密,更能防止中间人干扰、流量识别等问题|\n|开销 / 资源占用|相对轻量;因为协议栈简单,控制开销、头部开销较低|更复杂,协议处理开销更大(比如加密、握手、流管理、ACK 处理等)|\n|在极端场景 / 性能瓶颈下表现|在高延迟 + 大包 / 大数据量 + 丢包环境下,KCP 性能可能下降。比如有测试指出在**高延迟 + 发送超过 MTU 的数据**时,KCP 的延迟会显著恶化。 ([GitHub](https://github.com/xtaci/kcp-go/issues/204?utm_source=chatgpt.com \"对比TCP/QUIC/KCP的测试结果 · Issue #204 · xtaci/kcp-go - GitHub\"))|在这些情况下,QUIC 的设计通常更稳健一些,更能处理大流量、多个流、多并发场景|\n\n从这些对比来看,QUIC 在协议设计上更“现代”、更全面、更关注安全性与多路复用,而 KCP 更加轻量、灵活,适合对实时性、低延迟要求比较高的场景。\n\n不过,协议设计优劣并不是绝对的,具体在 FRP 的应用场景下,还要考虑实现、参数调优、网络环境等因素。\n\n---\n\n## 在 FRP 中:QUIC 模式 vs KCP 模式的区别与表现\n\nFRP 支持将底层通信协议从默认的 TCP / HTTPTransport 切换成 KCP 或 QUIC(即 `transport.protocol = \"kcp\"` 或 `\"quic\"`)模式。官方文档里对此有说明。 ([gofrp.org](https://gofrp.org/en/docs/features/common/network/network/?utm_source=chatgpt.com \"Communication Security and Optimization | frp\"))\n\n下面是两种模式在 FRP 中常见的差别、优缺点、使用注意。\n\n### 优点 / 劣势对比\n\n|特性 / 维度|FRP + KCP 模式|FRP + QUIC 模式|\n|---|---|---|\n|延迟表现 / 实时响应|通常优于 TCP,尤其在丢包 / 抖动较大、网络不稳定的环境下。很多用户用 KCP 模式来加速远程桌面、SSH 等。 ([CSDN博客](https://blog.csdn.net/MENGHUANBEIKE/article/details/100793876?utm_source=chatgpt.com \"利用frp内网穿透kcp模式做跳板,加速流畅访问远程桌面3389\"))|在连接建立、短连接场景以及多流场景中,QUIC 有优势;也能在某些网络被封、被干扰的情况下更抗阻断性(因为包头更难识别)|\n|抗网络干扰 / 被封锁风险|KCP 尽管在 UDP 上传输,但协议本身特征可能比较容易被识别;在被运营商主动干扰 UDP 流量的环境中可能被限速或封锁|QUIC 本身带加密和混淆特性,更难被中间设备识别,某些用户用 QUIC 模式来规避“被运营商阻断 FRP TCP 连接”的情况。比如有一篇博客指出,TCP 模式在某些校园网或被 ISP 限制时连接失败,而改用 QUIC 协议就能恢复连接。 ([ZRHan's Blog](https://blog.zrhan.top/2024/07/14/%E7%94%A8quic%E5%8D%8F%E8%AE%AE%E8%A7%A3%E5%86%B3frp%E8%A2%AB%E8%BF%90%E8%90%A5%E5%95%86%E9%98%BB%E6%96%AD%E7%9A%84%E9%97%AE%E9%A2%98/?utm_source=chatgpt.com \"用quic协议解决frp被运营商阻断的问题 - ZRHan's Blog\"))|\n|带宽开销 / 效率|KCP 为了追求低延迟,会在一定程度上牺牲一些带宽效率(可能会有额外重传、冗余、控制包开销等) ([gofrp.org](https://gofrp.org/en/docs/features/common/network/network/?utm_source=chatgpt.com \"Communication Security and Optimization \\| frp\"))|QUIC 在设计上对带宽利用率考虑较多,控制与重传机制更复杂,会在多流、大连接场景下更高效|\n|多代理 / 多连接 / 并发|KCP 模式下,如果你在一个 FRP 实例下跑很多代理 / 多条连接,每条连接都是一条 KCP,会有一定管理开销|QUIC 的多流 / 多路复用设计可以在一个连接上承载多个代理或多个数据流,更理想地减少连接数和开销|\n|实现稳定性 / Bug 风险|KCP 在 FRP 中被使用较久、成熟度较高,用户社区案例较多,参数调优经验丰富|QUIC 是相对较新、更复杂的模式,在 FRP 中可能还存在一些 bug 或限制;例如,有 issue 提到 “无法单独运行在 QUIC 模式” 的问题——无论是否配置 bind_port 字段,frps 总会监听 TCP 端口(这个 issue 在 FRP 的 issue 列表里被关闭为“不计划修复”)([GitHub](https://github.com/fatedier/frp/issues/3225?utm_source=chatgpt.com \"无法单独运行在quic模式 · Issue #3225 · fatedier/frp · GitHub\"))|\n|参数调优空间 / 灵活性|KCP 的很多参数(MTU、窗口、nodelay、重传策略等)都可以调,灵活性高;但需要手动调优以适应网络环境|QUIC 的很多机制是在协议内部做的(如流控、拥塞控制、加密层),对用户的参数调控空间可能较少(或复杂)|\n|适用场景|需要低延迟或在弱网络环境里工作的服务(如 SSH、RDP、交互式服务)|多流服务、HTTP(s) 代理、长连接传输、多代理复用、抗干扰场合等可能更适合|\n\n综合来看:如果你现在主要是用 FRP 来做一些 SSH、远程桌面、交互性强的服务,或者网络环境不稳定/丢包率高,KCP 模式可能是更稳定、可控的选择。而如果你需要让 FRP 在更复杂的网络环境下更具抗封锁性、更现代化、更高效,QUIC 模式是一个很有吸引力的选项。\n\n### 在 FRP 上使用时的注意与限制\n\n- 要让 QUIC / KCP 模式生效,你需要在 frps 和 frpc 两边都正确配置对应的端口(`quicBindPort` / `kcpBindPort` 等)与 `transport.protocol = \"quic\"` 或 `\"kcp\"`。否则默认仍用 TCP。 ([格态随记](https://blog.gotab.cn/archives/RvdYvu2g?utm_source=chatgpt.com \"Frp:服务端 frps.toml 和 frpc.toml 客户端配置文件详解\"))\n \n- 防火墙 / UDP 端口必须开放 — 因为 KCP / QUIC 都是在 UDP 上运行的,无法简单依赖 TCP。\n \n- 参数调优很关键:KCP 有很多参数(如 `nodelay`、`interval`、窗口大小、重传策略等)需要根据网络环境调整,否则可能效果不好或发生延迟爆炸。\n \n- QUIC 模式在 FRP 中可能还不够成熟 / 存在一些边界 bug。例如前面提到的 “无法单独运行在 QUIC 模式” 问题就是一个。 ([GitHub](https://github.com/fatedier/frp/issues/3225?utm_source=chatgpt.com \"无法单独运行在quic模式 · Issue #3225 · fatedier/frp · GitHub\"))\n \n- 在高带宽 / 长距离 /大流量场景下,KCP 模式可能表现不如预期,因为协议本身在大包 / 高延迟 + 数据量大时延迟会膨胀。实测中有用户发现,在延迟较高 + 发送大于 MTU 的数据场景下,QUIC 表现优于 KCP。 ([GitHub](https://github.com/xtaci/kcp-go/issues/204?utm_source=chatgpt.com \"对比TCP/QUIC/KCP的测试结果 · Issue #204 · xtaci/kcp-go - GitHub\"))\n \n- 加密开销:如果你还在 FRP 上启用 TLS / 加密,QUIC 本身就有加密,叠加可能有额外开销;KCP 则通常是裸或可选加密,开销可能较低。\n \n\n---\n\n## 总结 & 建议\n\n- **优势倾向** \n  - 若你更注重“稳定 + 可控 + 低延迟 + 在弱网环境下表现好”,KCP 是一个比较稳妥的选择(尤其已有成熟经验) \n  - 若你更希望未来扩展性强、支持多流、抗干扰 / 抗封锁能力更好、连接更现代化,QUIC 是更有前景的选择\n \n- **实用建议** \n  1. 在你的网络环境下做对比测试:部署一个用 KCP,一个用 QUIC,测一下延迟、丢包率、吞吐量、稳定性,哪一个更符合你的场景就用哪个。 \n  2. 若你目前已有稳定的 KCP 环境且能满足需求,不必急于切换;只有在遇到 TCP 被封锁 / 性能瓶颈 / 抗干扰需求时,再考虑 QUIC。 \n  3. 在启用 QUIC(或 KCP)模式时,务必留一个“回退”方案(例如保留 TCP 模式),以防 QUIC 模式在某些网络环境下连接失败 / 不稳定。 \n  4. 多关注 FRP 的版本更新、issue 列表,特别是关于 QUIC 模式的 bug 或兼容性问题。\n \n", + "内网穿透/Frp设置同一端口不同域名访问.md": "\n---\n\n## 1) frps(公网服务器)配置\n\n编辑 `frps.toml`,让 frps 监听一个 HTTP CONNECT 复用端口(你希望是 8022 就设 8022):\n\n```toml\nbindPort = 7000\n\n# 关键:tcpmux 复用入口端口\ntcpmuxHTTPConnectPort = 8022\n```\n\n重启 frps\n这个 8022 **不是直接 SSH 端口**,而是“HTTP CONNECT 复用入口”\n\n---\n\n## 2) 两台内网主机的 frpc 配置\n\n### 主机 A(big.smy.top)\n\n`frpc.toml`:\n\n```toml\nserverAddr = \"你的公网IP\"\nserverPort = 7000\n\n[[proxies]]\nname = \"ssh_big\"\ntype = \"tcpmux\"\nmultiplexer = \"httpconnect\"\ncustomDomains = [\"big.smy.top\"]\nlocalIP = \"127.0.0.1\"\nlocalPort = 22\n```\n\n### 主机 B(small.smy.top)\n\n`frpc.toml`:\n\n```toml\nserverAddr = \"你的公网IP\"\nserverPort = 7000\n\n[[proxies]]\nname = \"ssh_small\"\ntype = \"tcpmux\"\nmultiplexer = \"httpconnect\"\ncustomDomains = [\"small.smy.top\"]\nlocalIP = \"127.0.0.1\"\nlocalPort = 22\n```\n\n`customDomains` 就是用来区分路由的域名键\n\n---\n\n## 3) DNS 解析\n\n把\n\n- `big.smy.top`\n- `small.smy.top`\n \n\n都 **A 记录解析到同一台公网 frps 的 IP**。\n\n---\n\n## 4) 连接方式\n\n因为 tcpmux 依赖 **HTTP CONNECT** 来告诉 frps 目标域名,所以你不能这样直连:\n\n```bash\nssh big.smy.top -p 8022 # ❌ 这样 frps 不知道该转给谁\n```\n\n要用 ProxyCommand(官方示例用 socat):\n\n```bash\nssh -o 'ProxyCommand=socat - PROXY:公网IP:%h:%p,proxyport=8022' test@big.smy.top\nssh -o 'ProxyCommand=socat - PROXY:公网IP:%h:%p,proxyport=8022' test@small.smy.top\n```\n\nfrps 会根据 `%h`(也就是 big / small 域名)分流到对应主机\n\n---\n\n## 5) 更舒服的用法:写到你的 `~/.ssh/config`\n\n```sshconfig\nHost big\n HostName big.smy.top\n User test\n ProxyCommand socat - PROXY:公网IP:%h:%p,proxyport=8022\n\nHost small\n HostName small.smy.top\n User test\n ProxyCommand socat - PROXY:公网IP:%h:%p,proxyport=8022\n```\n\n以后直接:\n\n```bash\nssh big\nssh small\n```\n\n---\n\n因为 SSH 本身无法携带“我要去哪个域名后端”的信息给 frps\ntcpmux 是目前 frp 官方唯一的“同端口分流 SSH”方案\n\n---\n", + "内网穿透/Tailscale/Tailscale客户端常用命令.md": "### tailscale 命令\n\n- **up** \n 连接到 Tailscale,如有需要会进行登录\n- **down** \n 从 Tailscale 断开连接\n- **set** \n 修改指定的偏好设置\n- **login** \n 登录到 Tailscale 账号\n- **logout** \n 从 Tailscale 断开并使当前节点密钥失效\n- **switch** \n 切换到另一个 Tailscale 账号\n- **configure** \n 配置主机以启用更多 Tailscale 功能\n- **syspolicy** \n 诊断 MDM(移动设备管理)与系统策略配置\n- **netcheck** \n 显示本地网络状况的分析\n- **ip** \n 显示 Tailscale 的 IP 地址\n- **dns** \n 诊断内部 DNS 转发器\n- **status** \n 显示 tailscaled 及其连接的状态\n- **metrics** \n 显示 Tailscale 的指标数据\n- **ping** \n 在 Tailscale 层对主机执行 Ping,并显示路由情况\n- **nc** \n 连接到主机的某个端口,并连接到标准输入/输出(类似 netcat)\n- **ssh** \n 通过 Tailscale SSH 到一台 Tailscale 机器\n- **funnel** \n 将内容或本地服务器公开到互联网\n- **serve** \n 在你的 tailnet( Tailscale 网络)中提供内容或本地服务\n- **version** \n 显示 Tailscale 版本\n- **web** \n 运行一个用于控制 Tailscale 的 Web 服务器\n- **file** \n 发送或接收文件\n- **bugreport** \n 输出用于诊断问题的可分享标识符\n- **cert** \n 获取 TLS 证书\n- **lock** \n 管理 tailnet lock(网络锁)\n- **licenses** \n 获取开源许可证信息\n- **exit-node** \n 显示你的 tailnet 中配置为出口节点的机器\n- **update** \n 将 Tailscale 更新到最新或其他版本\n- **whois** \n 显示与某个 Tailscale IP(v4 或 v6)对应的机器和用户\n- **drive** \n 与你的 tailnet 共享目录\n- **completion** \n 生成 shell 自动补全脚本\n \n", + "内网穿透/Tailscale/搭建derp和headscale避坑与指南.md": "derp(Docker安装):\n\n```bash\n#Docker容器一键化启动\n#默认开启tcp端口33445 udp端口3478\ndocker run --restart always \\\n --name derper1 \\\n -p 33445:33445 \\\n -p 3478:3478/udp \\\n -v /shumengya/ssl/derp1/:/app/certs \\\n -e DERP_CERT_MODE=manual \\\n -e DERP_ADDR=:33445 \\\n -e DERP_DOMAIN=derp1.shumengya.top \\\n -e DERP_CERT_FILE=/app/certs/derp1.shumengya.top.crt \\\n -e DERP_KEY_FILE=/app/certs/derp1.shumengya.top.key \\\n -d ghcr.io/yangchuansheng/derper:latest\n \n docker run --restart always \\\n --name derper2 \\\n -p 33445:33445 \\\n -p 3478:3478/udp \\\n -v /shumengya/ssl/derp2/:/app/certs \\\n -e DERP_CERT_MODE=manual \\\n -e DERP_ADDR=:33445 \\\n -e DERP_DOMAIN=derp2.shumengya.top \\\n -e DERP_CERT_FILE=/app/certs/derp2.shumengya.top.crt \\\n -e DERP_KEY_FILE=/app/certs/derp2.shumengya.top.key \\\n -d ghcr.io/yangchuansheng/derper:latest\n \ndocker run --restart always \\\n --name derper3 \\\n -p 33445:33445 \\\n -p 3478:3478/udp \\\n -v /shumengya/ssl/derp3/:/app/certs \\\n -e DERP_CERT_MODE=manual \\\n -e DERP_ADDR=:33445 \\\n -e DERP_DOMAIN=derp3.shumengya.top \\\n -e DERP_CERT_FILE=/app/certs/derp3.shumengya.top.crt \\\n -e DERP_KEY_FILE=/app/certs/derp3.shumengya.top.key \\\n -d ghcr.io/yangchuansheng/derper:latest\n\n```\n\n```bash\n#默认使用Let's Encrypt签发ssl证书\n#默认需要关闭nginx占用80端口来签发证书\ncurl -s https://get.acme.sh | sh\n\nsource ~/.bashrc\n\nacme.sh --issue --standalone -d 你的域名\n#安装依赖\napt update && apt install -y socat\nyum install -y socat\ndnf install -y socat\n\nacme.sh --register-account -m 你的邮箱地址\n```\n\n\nheadscale(直接部署systemctl运行):\n\nheadscale默认放行:9090~9092 和50443\n\n配置一个域名:\nheadscale.shumengya.top\n下载headscale:[https://github.com/juanfont/headscale](headscale)\n下载headscale-ui:[https://github.com/juanfont/headscale](headscale-ui)\n\n新建文件夹(用来放相关文件):\nmkdir -p shumengya/headscale\n\n安装headscale:\ndpkg -i headscale_0.26.1_linux_amd64.deb\n\n修改headscale配置\n```yaml\n---\n# headscale 会按照以下顺序查找名为 `config.yaml` (或 `config.json`) 的配置文件:\n#\n# - `/etc/headscale`\n# - `~/.headscale`\n# - 当前工作目录\n\n# 客户端将要连接的 URL。\n# 通常应为一个域名,例如:\n#\n# https://myheadscale.example.com:443\n#\nserver_url: http://127.0.0.1:9091\n\n# 服务器监听/绑定的地址\n#\n# 生产环境建议:\nlisten_addr: 0.0.0.0:9092\n#listen_addr: 127.0.0.1:8080\n\n# /metrics 和 /debug 的监听地址,你可能希望\n# 将此端点限制在内网\nmetrics_listen_addr: 127.0.0.1:9090\n\n# gRPC 的监听地址。\n# gRPC 用于通过 CLI 远程控制 headscale 服务器\n# 注意:只有在使用有效证书时,远程访问才可用。\n#\n# 生产环境建议:\ngrpc_listen_addr: 0.0.0.0:50443\n#grpc_listen_addr: 127.0.0.1:50443\n\n# 是否允许 gRPC 管理接口以 **不安全** 模式运行。\n# 不推荐启用,因为流量将不加密。只有在你完全理解风险时才启用。\ngrpc_allow_insecure: false\n\n# Noise 部分包含 TS2021 Noise 协议的特定配置\nnoise:\n # Noise 私钥用于在 headscale 和 Tailscale 客户端之间\n # 使用新的基于 Noise 的协议加密流量。缺少的密钥将会自动生成。\n private_key_path: /var/lib/headscale/noise_private.key\n\n# 为 tailnet 分配地址的 IP 前缀列表。\n# 每个前缀由 IPv4 或 IPv6 地址 + 前缀长度组成,以斜杠分隔。\n# 必须在 Tailscale 客户端支持的范围内\n# 即 100.64.0.0/10 和 fd7a:115c:a1e0::/48 的子网。\n# 否则会导致异常问题。\nprefixes:\n v4: 100.64.0.0/10\n #v6: fd7a:115c:a1e0::/48\n\n # 节点 IP 分配策略,可选:\n # - sequential(默认):按顺序分配下一个可用 IP\n # - random:使用伪随机生成器分配可用 IP\n allocation: sequential\n\n# DERP 是 Tailscale 在无法建立直连时使用的中继系统。\n# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp\n#\n# headscale 需要一个 DERP 服务器列表供客户端使用。\nderp:\n server:\n # 启用后,将运行内置 DERP 服务器并合并到 DERP 配置中\n # 上面的 server_url 必须使用 https,DERP 需要 TLS\n enabled: false\n\n # 内置 DERP 服务器的区域 ID。\n # 如果与外部配置的区域 ID 冲突,则本地 DERP 优先。\n region_id: 999\n\n # 区域代码和名称会在 Tailscale UI 中显示\n region_code: \"headscale\"\n region_name: \"Headscale Embedded DERP\"\n\n # 在指定地址上监听 UDP 端口以支持 STUN 连接(帮助 NAT 穿透)。\n # 如果启用内置 DERP,必须定义 stun_listen_addr。\n #\n # 更多详情可参考:https://tailscale.com/blog/how-tailscale-works/\n stun_listen_addr: \"0.0.0.0:3478\"\n\n # 用于加密 headscale DERP 与 Tailscale 客户端之间流量的私钥。\n # 缺少时会自动生成。\n private_key_path: /var/lib/headscale/derp_server_private.key\n\n # 此标志用于控制是否自动将内置 DERP 写入 DERP map。\n # 若设为 false,则需通过 DERP.paths 手动配置。\n automatically_add_embedded_derp_region: true\n\n # 为了更稳定的连接(特别是 Exit-Node + DNS 不可用时),\n # 可以选择性地将公网 IPv4/IPv6 地址写入 Derp-Map:\n ipv4: 1.2.3.4\n ipv6: 2001:db8::1\n\n # 外部可用的 DERP map 列表(JSON 格式)\n urls:\n # - https://controlplane.tailscale.com/derpmap/default\n #- https://你的域名/web/derp.json\n\n # 本地可用的 DERP map 文件(YAML 格式)\n #\n # 对于自建 DERP 服务器很有用:\n # https://tailscale.com/kb/1118/custom-derp-servers/\n #\n # paths:\n # - /etc/headscale/derp-example.yaml\n paths: []\n\n # 若启用,将定期刷新上述 DERP 源并更新 derpmap\n auto_update_enabled: true\n\n # 检查 DERP 更新的间隔\n update_frequency: 24h\n\n# 禁用启动时自动检查 headscale 更新\ndisable_check_updates: false\n\n# 非活跃临时节点在多久后被删除?\nephemeral_node_inactivity_timeout: 30m\n\ndatabase:\n # 数据库类型,可选:sqlite, postgres\n # 注意:强烈不推荐使用 Postgres,仅为遗留原因保留。\n # 所有新开发和优化都基于 SQLite。\n type: sqlite\n\n # 启用调试模式。需要 log.level 设置为 \"debug\" 或 \"trace\"。\n debug: false\n\n # GORM 配置\n gorm:\n # 启用预编译语句。\n prepare_stmt: true\n\n # 启用参数化查询。\n parameterized_queries: true\n\n # 跳过 “record not found” 错误日志。\n skip_err_record_not_found: true\n\n # 慢查询阈值(毫秒)\n slow_threshold: 1000\n\n # SQLite 配置\n sqlite:\n path: /var/lib/headscale/db.sqlite\n\n # 启用 WAL 模式。推荐生产环境启用。\n # https://www.sqlite.org/wal.html\n write_ahead_log: true\n\n # WAL 文件在达到多少帧时自动 checkpoint。\n # 设为 0 可禁用自动 checkpoint。\n wal_autocheckpoint: 1000\n\n # # Postgres 配置(不推荐,仅遗留支持)\n # postgres:\n # # 使用 Unix socket 时,设置 host 为 socket 路径,port 留空。\n # host: localhost\n # port: 5432\n # name: headscale\n # user: foo\n # pass: bar\n # max_open_conns: 10\n # max_idle_conns: 10\n # conn_max_idle_time_secs: 3600\n #\n # # SSL 配置,参考官方文档\n # ssl: false\n\n### TLS 配置\n#\n## Let's Encrypt / ACME\n#\n# headscale 支持使用 Let's Encrypt 自动申请 TLS 证书\n#\n# ACME 目录 URL\nacme_url: https://acme-v02.api.letsencrypt.org/directory\n\n# ACME 注册邮箱\nacme_email: \"\"\n\n# 要申请 TLS 证书的域名\ntls_letsencrypt_hostname: \"\"\n\n# 存储证书和元数据的路径\n# 生产环境建议:\ntls_letsencrypt_cache_dir: /var/lib/headscale/cache\n\n# ACME 挑战类型,目前支持:\n# HTTP-01 或 TLS-ALPN-01\n# 详见 docs/ref/tls.md\ntls_letsencrypt_challenge_type: HTTP-01\n# 使用 HTTP-01 时,letsencrypt 必须监听:\n# :http = 80 端口\ntls_letsencrypt_listen: \":http\"\n\n## 使用已有证书\ntls_cert_path: \"\"\ntls_key_path: \"\"\n\nlog:\n # 日志输出格式:text 或 json\n format: text\n # 日志级别:info, debug, trace\n level: info\n\n## 策略\n# headscale 支持 Tailscale 的 ACL 策略\n# 文档:https://tailscale.com/kb/1018/acls/\npolicy:\n # 模式:file 或 database\n mode: file\n # 若为 file 模式,指定 HuJSON 文件路径\n path: \"\"\n\n## DNS\n#\n# headscale 支持 Tailscale 的 DNS 配置和 MagicDNS。\n# 文档:\n# https://tailscale.com/kb/1054/dns/\n# https://tailscale.com/kb/1081/magicdns/\n# https://tailscale.com/blog/2021-09-private-dns-with-magicdns/\n#\n# 注意:要使 DNS 配置生效,客户端必须启用 `--accept-dns=true`。\n# 否则将不生效。\ndns:\n # 是否启用 MagicDNS\n magic_dns: true\n\n # MagicDNS 的基础域名,必须与 server_url 域名不同。\n base_domain: example.com\n\n # 是否覆盖本地 DNS 设置\n override_local_dns: false\n\n # 全局 DNS 服务器列表\n nameservers:\n global:\n - 1.1.1.1\n - 1.0.0.1\n - 2606:4700:4700::1111\n - 2606:4700:4700::1001\n # NextDNS 示例\n # - https://dns.nextdns.io/abc123\n\n # Split DNS 示例(为特定域使用不同 DNS)\n split: {}\n\n # 自定义搜索域\n search_domains: []\n\n # 额外 DNS 记录(支持 A/AAAA)\n extra_records: []\n # - name: \"grafana.myvpn.example.com\"\n # type: \"A\"\n # value: \"100.64.0.3\"\n\n# CLI 使用的 Unix socket(无认证)\n# 生产环境建议自定义\nunix_socket: /var/run/headscale/headscale.sock\nunix_socket_permission: \"0770\"\n\n# OpenID Connect 配置(实验功能)\n# oidc:\n# only_start_if_oidc_is_available: true\n# issuer: \"https://your-oidc.issuer.com/path\"\n# client_id: \"your-oidc-client-id\"\n# client_secret: \"your-oidc-client-secret\"\n# client_secret_path: \"${CREDENTIALS_DIRECTORY}/oidc_client_secret\"\n# expiry: 180d\n# use_expiry_from_token: false\n# scope: [\"openid\", \"profile\", \"email\", \"custom\"]\n# extra_params:\n# domain_hint: example.com\n# allowed_domains:\n# - example.com\n# allowed_groups:\n# - /headscale\n# allowed_users:\n# - alice@example.com\n# pkce:\n# enabled: false\n# method: S256\n\n# Logtail 配置\n# Logtail 是 Tailscale 的日志与审计系统\nlogtail:\n # 启用后,客户端将日志发送到 Tailscale 服务器\n enabled: false\n\n# 启用后,设备将优先使用随机端口进行 WireGuard 流量\n# 以避免某些防火墙兼容性问题。\n# 详见:https://tailscale.com/kb/1181/firewalls/\nrandomize_client_port: false\n\n\n```\n\n设置反向代理:\n公网域名->127.0.0.1:9092\n```txt\nlocation /web {\n index index.html;\n alias /shumengya/headscale/web;\n}\n```\n\n\n\n\n\n", "内网穿透/内网穿透方案.md": "\n---\n\n## 一、开源替代方案 /工具清单\n\n下面是目前社区里比较流行 /有实用性的开源方案:\n\n|名称|语言 / 技术栈|支持协议 /功能|特点 /亮点|可能缺点 /注意|\n|---|---|---|---|---|\n|**rathole**|Rust|TCP / HTTP /TLS|轻量、高性能,内存占用低,支持热重载、服务令牌认证等。被设计为 FRP / ngrok 的替代品。 ([GitHub](https://github.com/rathole-org/rathole?utm_source=chatgpt.com \"GitHub - rathole-org/rathole: A lightweight and high-performance ...\"))|文档 /社区可能不如 FRP 那么成熟;一些边缘功能可能欠缺|\n|**NSmartProxy**|.NET Core / C#|TCP / HTTP 反向代理 /穿透|跨平台支持好,用异步 I/O 架构驱动穿透代理。 ([GitHub](https://github.com/tmoonlight/NSmartProxy?utm_source=chatgpt.com \"GitHub - tmoonlight/NSmartProxy: NSmartProxy是一款开源的内网穿透工具。采用.NET CORE ...\"))|在 Linux /非 .NET 平台上的稳定性 /优化要测试;社区规模可能偏小|\n|**Tunnelmole**|Node.js / TypeScript|HTTP / HTTPS 隧道|100% 开源、可自托管、方便给本地 Web 服务生成公开 URL。 ([tunnelmole.com](https://tunnelmole.com/?utm_source=chatgpt.com \"Tunnelmole - A free and open source tunneling tool\"))|主要面向 HTTP/HTTPS,游戏 /通用 TCP 服务可能支持不够好;对于高并发 /大流量性能需要评估|\n|**Reverse Proxy Tool(基于 Netty 的)**|Java / Netty|支持任意 TCP 上层协议和 HTTP|支持 HTTP 升级、SSL 验证、协议透传等功能。 ([Gitee](https://gitee.com/codebanks/reverse-proxy-tool?utm_source=chatgpt.com \"Reverse Proxy Tool: Reverse Proxy Tool : 基于Netty实现的 ...\"))|Java 程序可能资源占用较高;配置可能稍复杂;性能需要根据 JVM 优化|\n|**nps / NPS** / **lanproxy** / **holer**|Go /其他|TCP / HTTP /UDP 穿透、反向代理|在「开源内网穿透工具」合集 /对比文章里经常被提及。 ([laoliang.net](https://www.laoliang.net/jsjh/technology/14975.html?utm_source=chatgpt.com \"归纳几种免费开源的内网穿透工具(frp、holer、nps、lanproxy)\"))|各工具在稳定性、协议支持深度、社区维护度上有差别;需要逐个评估|\n|**reverse-tunnel(snsi nfu 的项目)**|(未知 /社区项目)|公网 → 私网 隧道 /映射|提供反向隧道映射能力,据社区介绍可以做安全隧道。 ([CSDN.blog](https://blog.csdn.net/gitblog_01080/article/details/141481391?utm_source=chatgpt.com \"反向隧道工具 reverse-tunnel 使用指南-CSDN博客\"))|项目可能成熟度不高,文档 /示例可能不足;功能边界需自己测试|\n|**tiny-frpc**|Go / 精简 FRP 客户端|frp 协议子集|体积小、适合资源紧张的嵌入式 /小设备使用。 ([博客园](https://www.cnblogs.com/tang863/p/18274521?utm_source=chatgpt.com \"tiny-frpc: frp 反向代理精简版客户端 - AmbiaCode - 博客园\"))|只是 frpc 的子集,用于客户端,不是完整替代;功能限制较多|\n\n---\n\n", - "内网穿透/搭建derp和headscale避坑与指南.md": "derp(Docker安装):\n\n```bash\n#Docker容器一键化启动\n#默认开启tcp端口33445 udp端口3478\ndocker run --restart always \\\n --name derper1 \\\n -p 33445:33445 \\\n -p 3478:3478/udp \\\n -v /shumengya/ssl/derp1/:/app/certs \\\n -e DERP_CERT_MODE=manual \\\n -e DERP_ADDR=:33445 \\\n -e DERP_DOMAIN=derp1.shumengya.top \\\n -e DERP_CERT_FILE=/app/certs/derp1.shumengya.top.crt \\\n -e DERP_KEY_FILE=/app/certs/derp1.shumengya.top.key \\\n -d ghcr.io/yangchuansheng/derper:latest\n \n docker run --restart always \\\n --name derper2 \\\n -p 33445:33445 \\\n -p 3478:3478/udp \\\n -v /shumengya/ssl/derp2/:/app/certs \\\n -e DERP_CERT_MODE=manual \\\n -e DERP_ADDR=:33445 \\\n -e DERP_DOMAIN=derp2.shumengya.top \\\n -e DERP_CERT_FILE=/app/certs/derp2.shumengya.top.crt \\\n -e DERP_KEY_FILE=/app/certs/derp2.shumengya.top.key \\\n -d ghcr.io/yangchuansheng/derper:latest\n \ndocker run --restart always \\\n --name derper3 \\\n -p 33445:33445 \\\n -p 3478:3478/udp \\\n -v /shumengya/ssl/derp3/:/app/certs \\\n -e DERP_CERT_MODE=manual \\\n -e DERP_ADDR=:33445 \\\n -e DERP_DOMAIN=derp3.shumengya.top \\\n -e DERP_CERT_FILE=/app/certs/derp3.shumengya.top.crt \\\n -e DERP_KEY_FILE=/app/certs/derp3.shumengya.top.key \\\n -d ghcr.io/yangchuansheng/derper:latest\n\n```\n\n```bash\n#默认使用Let's Encrypt签发ssl证书\n#默认需要关闭nginx占用80端口来签发证书\ncurl -s https://get.acme.sh | sh\n\nsource ~/.bashrc\n\nacme.sh --issue --standalone -d 你的域名\n#安装依赖\napt update && apt install -y socat\nyum install -y socat\ndnf install -y socat\n\nacme.sh --register-account -m 你的邮箱地址\n```\n\n\nheadscale(直接部署systemctl运行):\n\nheadscale默认放行:9090~9092 和50443\n\n配置一个域名:\nheadscale.shumengya.top\n下载headscale:[https://github.com/juanfont/headscale](headscale)\n下载headscale-ui:[https://github.com/juanfont/headscale](headscale-ui)\n\n新建文件夹(用来放相关文件):\nmkdir -p shumengya/headscale\n\n安装headscale:\ndpkg -i headscale_0.26.1_linux_amd64.deb\n\n修改headscale配置\n```yaml\n---\n# headscale 会按照以下顺序查找名为 `config.yaml` (或 `config.json`) 的配置文件:\n#\n# - `/etc/headscale`\n# - `~/.headscale`\n# - 当前工作目录\n\n# 客户端将要连接的 URL。\n# 通常应为一个域名,例如:\n#\n# https://myheadscale.example.com:443\n#\nserver_url: http://127.0.0.1:9091\n\n# 服务器监听/绑定的地址\n#\n# 生产环境建议:\nlisten_addr: 0.0.0.0:9092\n#listen_addr: 127.0.0.1:8080\n\n# /metrics 和 /debug 的监听地址,你可能希望\n# 将此端点限制在内网\nmetrics_listen_addr: 127.0.0.1:9090\n\n# gRPC 的监听地址。\n# gRPC 用于通过 CLI 远程控制 headscale 服务器\n# 注意:只有在使用有效证书时,远程访问才可用。\n#\n# 生产环境建议:\ngrpc_listen_addr: 0.0.0.0:50443\n#grpc_listen_addr: 127.0.0.1:50443\n\n# 是否允许 gRPC 管理接口以 **不安全** 模式运行。\n# 不推荐启用,因为流量将不加密。只有在你完全理解风险时才启用。\ngrpc_allow_insecure: false\n\n# Noise 部分包含 TS2021 Noise 协议的特定配置\nnoise:\n # Noise 私钥用于在 headscale 和 Tailscale 客户端之间\n # 使用新的基于 Noise 的协议加密流量。缺少的密钥将会自动生成。\n private_key_path: /var/lib/headscale/noise_private.key\n\n# 为 tailnet 分配地址的 IP 前缀列表。\n# 每个前缀由 IPv4 或 IPv6 地址 + 前缀长度组成,以斜杠分隔。\n# 必须在 Tailscale 客户端支持的范围内\n# 即 100.64.0.0/10 和 fd7a:115c:a1e0::/48 的子网。\n# 否则会导致异常问题。\nprefixes:\n v4: 100.64.0.0/10\n #v6: fd7a:115c:a1e0::/48\n\n # 节点 IP 分配策略,可选:\n # - sequential(默认):按顺序分配下一个可用 IP\n # - random:使用伪随机生成器分配可用 IP\n allocation: sequential\n\n# DERP 是 Tailscale 在无法建立直连时使用的中继系统。\n# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp\n#\n# headscale 需要一个 DERP 服务器列表供客户端使用。\nderp:\n server:\n # 启用后,将运行内置 DERP 服务器并合并到 DERP 配置中\n # 上面的 server_url 必须使用 https,DERP 需要 TLS\n enabled: false\n\n # 内置 DERP 服务器的区域 ID。\n # 如果与外部配置的区域 ID 冲突,则本地 DERP 优先。\n region_id: 999\n\n # 区域代码和名称会在 Tailscale UI 中显示\n region_code: \"headscale\"\n region_name: \"Headscale Embedded DERP\"\n\n # 在指定地址上监听 UDP 端口以支持 STUN 连接(帮助 NAT 穿透)。\n # 如果启用内置 DERP,必须定义 stun_listen_addr。\n #\n # 更多详情可参考:https://tailscale.com/blog/how-tailscale-works/\n stun_listen_addr: \"0.0.0.0:3478\"\n\n # 用于加密 headscale DERP 与 Tailscale 客户端之间流量的私钥。\n # 缺少时会自动生成。\n private_key_path: /var/lib/headscale/derp_server_private.key\n\n # 此标志用于控制是否自动将内置 DERP 写入 DERP map。\n # 若设为 false,则需通过 DERP.paths 手动配置。\n automatically_add_embedded_derp_region: true\n\n # 为了更稳定的连接(特别是 Exit-Node + DNS 不可用时),\n # 可以选择性地将公网 IPv4/IPv6 地址写入 Derp-Map:\n ipv4: 1.2.3.4\n ipv6: 2001:db8::1\n\n # 外部可用的 DERP map 列表(JSON 格式)\n urls:\n # - https://controlplane.tailscale.com/derpmap/default\n #- https://你的域名/web/derp.json\n\n # 本地可用的 DERP map 文件(YAML 格式)\n #\n # 对于自建 DERP 服务器很有用:\n # https://tailscale.com/kb/1118/custom-derp-servers/\n #\n # paths:\n # - /etc/headscale/derp-example.yaml\n paths: []\n\n # 若启用,将定期刷新上述 DERP 源并更新 derpmap\n auto_update_enabled: true\n\n # 检查 DERP 更新的间隔\n update_frequency: 24h\n\n# 禁用启动时自动检查 headscale 更新\ndisable_check_updates: false\n\n# 非活跃临时节点在多久后被删除?\nephemeral_node_inactivity_timeout: 30m\n\ndatabase:\n # 数据库类型,可选:sqlite, postgres\n # 注意:强烈不推荐使用 Postgres,仅为遗留原因保留。\n # 所有新开发和优化都基于 SQLite。\n type: sqlite\n\n # 启用调试模式。需要 log.level 设置为 \"debug\" 或 \"trace\"。\n debug: false\n\n # GORM 配置\n gorm:\n # 启用预编译语句。\n prepare_stmt: true\n\n # 启用参数化查询。\n parameterized_queries: true\n\n # 跳过 “record not found” 错误日志。\n skip_err_record_not_found: true\n\n # 慢查询阈值(毫秒)\n slow_threshold: 1000\n\n # SQLite 配置\n sqlite:\n path: /var/lib/headscale/db.sqlite\n\n # 启用 WAL 模式。推荐生产环境启用。\n # https://www.sqlite.org/wal.html\n write_ahead_log: true\n\n # WAL 文件在达到多少帧时自动 checkpoint。\n # 设为 0 可禁用自动 checkpoint。\n wal_autocheckpoint: 1000\n\n # # Postgres 配置(不推荐,仅遗留支持)\n # postgres:\n # # 使用 Unix socket 时,设置 host 为 socket 路径,port 留空。\n # host: localhost\n # port: 5432\n # name: headscale\n # user: foo\n # pass: bar\n # max_open_conns: 10\n # max_idle_conns: 10\n # conn_max_idle_time_secs: 3600\n #\n # # SSL 配置,参考官方文档\n # ssl: false\n\n### TLS 配置\n#\n## Let's Encrypt / ACME\n#\n# headscale 支持使用 Let's Encrypt 自动申请 TLS 证书\n#\n# ACME 目录 URL\nacme_url: https://acme-v02.api.letsencrypt.org/directory\n\n# ACME 注册邮箱\nacme_email: \"\"\n\n# 要申请 TLS 证书的域名\ntls_letsencrypt_hostname: \"\"\n\n# 存储证书和元数据的路径\n# 生产环境建议:\ntls_letsencrypt_cache_dir: /var/lib/headscale/cache\n\n# ACME 挑战类型,目前支持:\n# HTTP-01 或 TLS-ALPN-01\n# 详见 docs/ref/tls.md\ntls_letsencrypt_challenge_type: HTTP-01\n# 使用 HTTP-01 时,letsencrypt 必须监听:\n# :http = 80 端口\ntls_letsencrypt_listen: \":http\"\n\n## 使用已有证书\ntls_cert_path: \"\"\ntls_key_path: \"\"\n\nlog:\n # 日志输出格式:text 或 json\n format: text\n # 日志级别:info, debug, trace\n level: info\n\n## 策略\n# headscale 支持 Tailscale 的 ACL 策略\n# 文档:https://tailscale.com/kb/1018/acls/\npolicy:\n # 模式:file 或 database\n mode: file\n # 若为 file 模式,指定 HuJSON 文件路径\n path: \"\"\n\n## DNS\n#\n# headscale 支持 Tailscale 的 DNS 配置和 MagicDNS。\n# 文档:\n# https://tailscale.com/kb/1054/dns/\n# https://tailscale.com/kb/1081/magicdns/\n# https://tailscale.com/blog/2021-09-private-dns-with-magicdns/\n#\n# 注意:要使 DNS 配置生效,客户端必须启用 `--accept-dns=true`。\n# 否则将不生效。\ndns:\n # 是否启用 MagicDNS\n magic_dns: true\n\n # MagicDNS 的基础域名,必须与 server_url 域名不同。\n base_domain: example.com\n\n # 是否覆盖本地 DNS 设置\n override_local_dns: false\n\n # 全局 DNS 服务器列表\n nameservers:\n global:\n - 1.1.1.1\n - 1.0.0.1\n - 2606:4700:4700::1111\n - 2606:4700:4700::1001\n # NextDNS 示例\n # - https://dns.nextdns.io/abc123\n\n # Split DNS 示例(为特定域使用不同 DNS)\n split: {}\n\n # 自定义搜索域\n search_domains: []\n\n # 额外 DNS 记录(支持 A/AAAA)\n extra_records: []\n # - name: \"grafana.myvpn.example.com\"\n # type: \"A\"\n # value: \"100.64.0.3\"\n\n# CLI 使用的 Unix socket(无认证)\n# 生产环境建议自定义\nunix_socket: /var/run/headscale/headscale.sock\nunix_socket_permission: \"0770\"\n\n# OpenID Connect 配置(实验功能)\n# oidc:\n# only_start_if_oidc_is_available: true\n# issuer: \"https://your-oidc.issuer.com/path\"\n# client_id: \"your-oidc-client-id\"\n# client_secret: \"your-oidc-client-secret\"\n# client_secret_path: \"${CREDENTIALS_DIRECTORY}/oidc_client_secret\"\n# expiry: 180d\n# use_expiry_from_token: false\n# scope: [\"openid\", \"profile\", \"email\", \"custom\"]\n# extra_params:\n# domain_hint: example.com\n# allowed_domains:\n# - example.com\n# allowed_groups:\n# - /headscale\n# allowed_users:\n# - alice@example.com\n# pkce:\n# enabled: false\n# method: S256\n\n# Logtail 配置\n# Logtail 是 Tailscale 的日志与审计系统\nlogtail:\n # 启用后,客户端将日志发送到 Tailscale 服务器\n enabled: false\n\n# 启用后,设备将优先使用随机端口进行 WireGuard 流量\n# 以避免某些防火墙兼容性问题。\n# 详见:https://tailscale.com/kb/1181/firewalls/\nrandomize_client_port: false\n\n\n```\n\n设置反向代理:\n公网域名->127.0.0.1:9092\n```txt\nlocation /web {\n index index.html;\n alias /shumengya/headscale/web;\n}\n```\n\n\n\n\n\n", "实习求职/27双非本一腾讯IEG游戏安全后台实习面经.md": "timeline:\n9.16 一面\n9.18 二面\n9.22 三面\n9.23 HR面\n9.24 录用评估\n9.26 Offer\n\n腾讯一面(1h)\n\n1. 介绍实习需求(K8S 和 Casbin RBAC 相关)\n2. 为啥初创实习两个月离职\n3. Go 为什么支持高并发\n4. GMP模型原理\n5. Goroutine Work-Stealing 的目的\n6. P的角色的作用,如果在M上维护Goroutine队列有什么不好\n7. GMP对CPU密集型任务能提高并发么\n8. IO操作需要CPU么,什么时候需要,磁盘IO和网络IO的区别\n9. Channel的作用和底层实现\n10. Channel的缓冲区在用户态还是内核态\n11. Goroutine阻塞等待的时候由谁来唤醒,需要额外的goroutine来遍历所有的channel么\n12. M上的G0是干嘛的\n13. 介绍select/poll/epoll\n14. 网络IO的流程\n15. 了解过Go Runtime么\n\n算法:求两个数的最大公约数\n\n腾讯二面(1h)\n\n1. 介绍实习需求,最有挑战的部分\n2. RocksDB了解么,说一下LsmTree\n3. 详细介绍一下Raft协议\n4. Raft协议和Paxos协议的区别,有哪些优化\n5. 介绍一下React Agent\n6. LangChain 和 LangGraph 的区别\n7. Agent 和 LLM 的区别\n8. Function Call 和 MCP 的区别\n9. RPC的全流程\n10. 负载均衡算法有哪些\n11. 介绍一致性Hash算法,服务扩缩容之后有什么影响\n12. 网络编程\n13. 介绍一下TCP和UDP\n14. 介绍一下HTTP各个版本及实现\n\n算法:\n\n1. 编辑距离\n2. 两两交换链表中的节点\n\n腾讯三面(30min)\n\n1. 介绍实习,你做了什么\n2. 介绍项目\n3. 实习时长,到岗时间,推HR面\n\n腾讯HR面(15min)\n\n1. 离职原因\n2. 实习时长,到岗时间\n3. 聊聊天", "实习求职/术语科普-HC.md": "“hc” 是英文 “Head Count” 的缩写,核心含义是“人员编制”,指企业或团队中计划招聘、核定的岗位人数,并非已入职的实际人数。\n \n在不同场景下还有其他常见含义,具体需结合语境判断:\n \n- 职场/招聘场景:最常用含义为“人员编制”,例如“这个部门今年还有2个hc”,即该部门今年仍有2个招聘名额。\n- 医学场景:可指“血红蛋白浓度(Hemoglobin Concentration)”,是血常规检查中评估是否贫血的重要指标。\n- 网络用语:偶尔作为“喝彩(hè cǎi)”的拼音首字母缩写,用于表达支持、夸赞,常见于社交平台评论区。", "实习求职/术语科普-PM.md": "“pm” 是多义词缩写,核心含义需结合具体场景判断,最常见的有以下三类:\n \n- 时间场景:全称为 “Post Meridiem”,指一天中的“下午”,与表示“上午”的“am”(Ante Meridiem)对应,例如“3 pm”即“下午3点”。\n- 职场/业务场景:最常用含义为 “Product Manager”,即“产品经理”,负责产品的规划、设计、迭代及市场推广等全流程工作;也可指 “Project Manager”,即“项目经理”,主要负责项目的计划、执行与交付,确保项目按时按质完成。\n- 其他场景:在通信或社交语境中,还可表示 “Private Message”,即“私信”,例如“有问题可以pm我”,意为“有问题可以给我发私信”。", "实习求职/面试八股/HTTP 与HTTPS/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md": "", "实习求职/面试八股/Nacos功能与应用场景详解.md": "Nacos 是阿里巴巴开源的 **动态服务发现、配置管理与服务治理平台**,旨在简化微服务架构的构建、交付和管理。\n\n---\n\n## 🚀 核心功能\n\n| 功能 | 主要作用 |\n|------|----------|\n| 🎯 **服务注册与发现** | 服务提供者注册自身信息,服务消费者动态发现和调用其他服务。 |\n| ⚙️ **动态配置管理** | 集中管理所有环境的配置,支持实时推送变更,无需重启应用。 |\n| 🔍 **服务健康监测** | 定期检查服务实例健康状况,自动隔离不健康实例,保障系统稳定性。 |\n| 🚦 **动态DNS与流量管理** | 支持权重路由,助力灰度发布、蓝绿部署等高级流量管理策略。 |\n\n---\n\n## 🎯 服务发现与健康检查\n\n- **服务注册**:实例启动时向 Nacos 注册自身元数据(服务名、IP、端口等)。 \n- **服务发现**:消费者通过服务名查询健康实例,实现通信而无需关心具体地址。 \n- **健康检查**:支持客户端上报与服务端主动探测,自动剔除不健康实例,保障可靠性。 \n\n---\n\n## ⚙️ 动态配置管理\n\n- **集中化管理**:统一存储数据库连接、开关、限流阈值等配置。 \n- **动态刷新**:配置变更实时推送,应用可在运行中直接生效(热更新)。 \n- **版本控制与回滚**:支持历史版本,一键回滚,降低变更风险。 \n\n---\n\n## 🚦 动态DNS与服务治理\n\n- **动态DNS服务**:支持权重路由、流量控制和简易内网 DNS 解析。 \n- **服务与元数据管理**:统一管理服务描述、依赖关系、健康状态、流量及安全策略。 \n\n---\n\n## 💡 主要应用场景\n\n- **数据库配置集中化管理**:提升安全性与合规性。 \n- **限流与降级开关**:结合 Sentinel 等组件实现运行时动态调整。 \n- **多环境与多数据中心**:基于 Namespace 与 Group 实现隔离与灵活部署。 \n\n---\n\n## 📊 与其他组件对比\n\n- ✅ **功能更全面**:Nacos = 服务发现 + 配置管理;Eureka 仅支持服务发现。 \n- ✅ **健康检查机制更强**:优于 Eureka 心跳检测。 \n- ✅ **社区与生态活跃**:Eureka 已停止维护,而 Nacos 持续迭代。 \n- ✅ **多数据中心支持优越**:原生支持多数据中心部署。 \n\n---\n\n## 📚 总结\n\nNacos 集 **服务发现、配置管理、服务治理** 于一体, \n极大简化了微服务架构复杂性,提升了 **开发效率**、**可维护性** 和 **系统弹性**。\n\n---", + "实习求职/面试八股/网络模型/OSI 七层模型是什么?.md": "\n---\n\n# 🧩 OSI 七层模型详解(国际快递类比版)\n\n## 📌 一句话总结\n\n**OSI 七层模型**将网络通信拆分为: \n**物理 → 数据链路 → 网络 → 传输 → 会话 → 表示 → 应用** \n七个层次,各司其职,模块化设计。 \n可类比为“国际快递”的打包、贴标签、路由、中转、翻译、下单等流程,使网络协议结构更清晰、互不干扰。\n\n---\n\n# 🚚 类比:寄送国际包裹与 OSI 七层对应关系\n\n```\n┌──────────────────────────────────────────────┐\n│ 应用层 Application │ ← 用户下单、填写寄件信息\n├──────────────────────────────────────────────┤\n│ 表示层 Presentation │ ← 翻译成国际通用语言、加密/压缩\n├──────────────────────────────────────────────┤\n│ 会话层 Session │ ← 握手——确认对方愿不愿意收包裹\n├──────────────────────────────────────────────┤\n│ 传输层 Transport │ ← 分段——拆包裹、编号、可靠送达/重传\n├──────────────────────────────────────────────┤\n│ 网络层 Network │ ← 路由——规划路线与中转站\n├──────────────────────────────────────────────┤\n│ 数据链路层 Data Link │ ← 帧封装——贴“省市/楼号/房间号”标签\n├──────────────────────────────────────────────┤\n│ 物理层 Physical │ ← 传输媒介——卡车、飞机、邮差\n└──────────────────────────────────────────────┘\n```\n\n---\n\n# 🔍 各层详解\n\n## 1️⃣ 物理层(Physical Layer)\n\n**功能:**\n- 负责比特流的物理传输(电压、光信号、无线电波)\n\n**设备:**\n- 网线、光纤、Hub、网卡物理接口\n\n**类比:** \n📦 **卡车、飞机等实际运输工具**——负责把集装箱从 A 运到 B。\n\n---\n\n## 2️⃣ 数据链路层(Data Link Layer)\n\n**功能:**\n- 帧的封装/拆解\n- 差错检测(CRC)\n- 流量控制\n- MAC 地址寻址\n \n\n**子层:**\n- LLC\n- MAC\n \n\n**设备:**\n- 交换机、网卡驱动\n \n\n**类比:** \n🏷️ **包裹地址标签(省/市/街道/楼号/房间号)** \n🖊️ 快递员核对签名,保证局域网内无误送达。\n\n---\n\n## 3️⃣ 网络层(Network Layer)\n\n**功能:**\n- 跨网段通信\n- 路由选择\n- 逻辑地址(IP)转发\n \n\n**协议:**\n- IP、ICMP、OSPF、BGP\n\n**设备:**\n- 路由器\n \n\n**类比:** \n🛫 **国际快递分拨中心**——做路径规划、选择中转站。\n\n---\n\n## 4️⃣ 传输层(Transport Layer)\n\n**功能:**\n- 端到端可靠/不可靠传输\n- 数据分段与重组\n- 重传、确认机制\n- 流量控制、拥塞控制\n \n\n**协议:**\n- TCP(可靠、有序、面向连接)\n- UDP(无连接、不保证可靠)\n \n\n**类比:** \n📦 **拆箱分批编号、确认回执,不签收就重发**。\n\n---\n\n## 5️⃣ 会话层(Session Layer)\n\n**功能:**\n- 建立/维护/终止会话\n- 会话恢复\n- 身份验证\n\n**类比:** \n📞 **客服系统:输入验证码→验证→建立会话→挂断结束**\n\n---\n\n## 6️⃣ 表示层(Presentation Layer)\n\n**功能:**\n- 数据格式转换\n- 加密与解密\n- 压缩与解压\n \n\n**协议/格式:**\n- SSL/TLS、MIME、JPEG、ASCII、EBCDIC\n\n**类比:** \n🌐 **中文信件翻译成英文,再压缩体积以便运输**。\n\n---\n\n## 7️⃣ 应用层(Application Layer)\n\n**功能:**\n- 面向用户,提供网络服务接口\n\n**常见协议:**\n- HTTP、FTP、SMTP、DNS、Telnet、SSH\n\n**类比:** \n📝 **用户填写快递单、选择寄件方式、输入寄件内容**\n\n---\n\n# 🧾 小结(速记版)\n\n|层级|名称|核心作用|类比|\n|---|---|---|---|\n|7|应用层|用户接口|填写快递单|\n|6|表示层|编码/加密/压缩|翻译与压缩|\n|5|会话层|建立/管理/断开连接|客服通话|\n|4|传输层|端到端传输、分段、重传|拆包编号、签收回执|\n|3|网络层|路由/跨网段|分拨中心规划路线|\n|2|数据链路层|帧封装与差错校验|地址标签|\n|1|物理层|比特流传输|卡车、飞机|\n\n---\n", "实习求职/面试八股/计算机面试经典八股.md": "+好的!计算机面试中最经典、最高频的“八股文”主要围绕以下几个核心领域展开。掌握这些基础知识和原理是通关技术面试的关键:\n\n## 🧠 一、 数据结构与算法\n\n1. **基础数据结构:**\n * **数组 vs 链表:** 内存结构、访问/插入/删除时间复杂度、适用场景。\n * **栈(Stack) & 队列(Queue):** LIFO/FIFO 原理、实现方式(数组/链表)、应用场景(函数调用栈、BFS/DFS)。\n * **哈希表(Hash Table):** 原理(哈希函数、冲突解决-开放寻址/链地址法)、时间复杂度分析、负载因子、扩容机制。\n * **堆(Heap) / 优先队列(Priority Queue):** 结构(通常是二叉堆)、操作(插入、删除堆顶、堆化)、应用(Top K、中位数、Dijkstra)。\n * **树(Tree):**\n * 二叉树(Binary Tree):遍历(前序、中序、后序、层序)- 递归与非递归实现。\n * 二叉搜索树(BST):定义、查找、插入、删除、中序遍历有序性。\n * 平衡二叉搜索树(AVL / 红黑树):平衡因子/红黑规则、旋转操作、为什么需要(避免BST退化成链表)、应用(Java HashMap的TreeBin/TreeMap)。\n * **图(Graph):** 表示方法(邻接矩阵、邻接表)、遍历算法(BFS、DFS)、常见算法(拓扑排序、最短路径-Dijkstra/Bellman-Ford/Floyd、最小生成树-Prim/Kruskal)。\n\n2. **基础算法思想:**\n * **排序算法:**\n * 比较排序:**快速排序**(分治、选基准、partition过程、时间复杂度-最好O(nlogn)/最坏O(n²)/平均、空间复杂度、稳定性❌)、**归并排序**(分治、稳定✅、时间复杂度O(nlogn)、空间复杂度O(n))、**堆排序**(建堆O(n)、排序O(nlogn)、不稳定❌)、插入排序、冒泡排序、选择排序(原理、时间复杂度)。\n * 非比较排序:计数排序、桶排序、基数排序(思想、适用场景)。\n * **搜索算法:** **二分查找**(前提有序、循环/递归实现、变种问题-找第一个/最后一个/旋转数组)。\n * **递归 & 分治:** 思想、经典问题(斐波那契、汉诺塔、归并/快排)。\n * **贪心算法(Greedy):** 思想(局部最优->全局最优?)、适用场景(活动选择、霍夫曼编码、最小生成树-Prim/Kruskal)、与动态规划区别。\n * **动态规划(DP):** **核心思想**(最优子结构、重叠子问题、状态转移方程)、**解题步骤**(定义状态、状态转移、初始化、边界、输出)、**经典问题**(斐波那契、爬楼梯、背包问题01/完全、最长公共子序列LCS、最长递增子序列LIS、编辑距离、股票买卖系列)。\n * **回溯(Backtracking):** 思想(试错、DFS+剪枝)、经典问题(N皇后、全排列、组合、子集、数独)。\n * **双指针(Two Pointers):** 应用(有序数组两数之和、滑动窗口-最小覆盖子串/最长无重复子串、快慢指针-链表判环/找中点)。\n * **位运算(Bit Manipulation):** 常用操作(与、或、异或、非、移位)、常见技巧(判断奇偶、交换两数、找出只出现一次的数字、位1的个数)。\n\n## 🖥 二、 操作系统\n\n1. **进程与线程:**\n * 进程 vs 线程(定义、资源分配、切换开销、通信方式)。\n * **进程间通信(IPC):** 管道、命名管道、信号、消息队列、共享内存、信号量、套接字。\n * **线程同步机制:** **互斥锁(Mutex)**、**信号量(Semaphore)**、**条件变量(Condition Variable)**、读写锁(Read-Write Lock)、自旋锁(Spin Lock)(原理、适用场景、死锁避免)。\n * **死锁(Deadlock):** 必要条件(互斥、请求与保持、不可剥夺、环路等待)、预防策略、避免策略(银行家算法)、检测与恢复。\n2. **内存管理:**\n * **虚拟内存(Virtual Memory):** 为什么需要?分页(Paging)机制(页表、TLB快表)、分段(Segmentation)机制。\n * **页面置换算法:** **最佳置换(OPT)**、**先进先出(FIFO)**、**最近最久未使用(LRU)**、时钟算法(Clock) 的原理和优缺点。\n * **内存分配:** 伙伴系统(Buddy System)、Slab分配器。\n3. **文件系统:** 文件描述符(File Descriptor)、inode结构、文件存储方式(连续、链式、索引)、目录结构。\n4. **CPU调度:** 调度算法(FCFS、SJF、优先级、RR轮转、多级反馈队列)的目标和特点。\n5. **I/O模型:** 阻塞I/O、非阻塞I/O、I/O多路复用(select/poll/epoll)、信号驱动I/O、异步I/O(AIO) 的区别和比较(特别是epoll的优势)。\n\n## 🌐 三、 计算机网络\n\n1. **网络模型:** **OSI七层模型** 和 **TCP/IP四层模型** 各层功能、对应协议。\n2. **核心协议:**\n * **TCP vs UDP:** 根本区别(连接、可靠性、有序性、流量控制、拥塞控制)、头部结构、应用场景。\n * **TCP可靠传输:** 序号/确认号、超时重传、滑动窗口机制。\n * **TCP连接管理:** **三次握手**(详细过程、为什么是三次?)、**四次挥手**(详细过程、为什么是四次?TIME_WAIT状态的作用?)。\n * **TCP流量控制:** 滑动窗口机制。\n * **TCP拥塞控制:** 慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快速重传(Fast Retransmit)、快速恢复(Fast Recovery) 算法原理。\n * **HTTP:**\n * 请求方法(GET/POST/PUT/DELETE等区别)、状态码(1xx/2xx/3xx/4xx/5xx常见状态码含义)。\n * **HTTP/1.0 vs HTTP/1.1 vs HTTP/2 vs HTTP/3:** 主要改进(连接复用、头部压缩、服务器推送、QUIC协议)。\n * **HTTPS:** SSL/TLS协议作用、加密过程(非对称加密交换对称密钥、对称加密通信)、数字证书作用。\n * **DNS:** 作用、查询过程(递归、迭代)、记录类型(A、AAAA、CNAME、MX、NS)。\n3. **网络安全基础:**\n * **对称加密 vs 非对称加密:** 原理、优缺点、代表算法(AES、RSA)。\n * **数字签名 & 数字证书:** 作用、原理(私钥签名,公钥验签;CA中心颁发证书)。\n * 常见攻击:XSS、CSRF、SQL注入、DDoS、中间人攻击的原理和基本防御措施。\n4. **网络层:** IP协议、IP地址分类/子网划分/CIDR、ARP协议、路由协议(RIP、OSPF、BGP基本思想)。\n5. **传输层与应用层:** 端口号作用、Socket编程基础。\n\n## 🗃 四、 数据库(以关系型数据库 MySQL 为主)\n\n1. **SQL基础:** 常用语句(SELECT, INSERT, UPDATE, DELETE, JOIN, GROUP BY, HAVING, ORDER BY, LIMIT)、多表连接(INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN)。\n2. **索引(Index):**\n * **为什么需要索引?** 加速查询。\n * **数据结构:** **B+树**(为什么比B树更适合数据库?)、哈希索引(适用场景)。\n * **聚簇索引(Clustered Index) vs 非聚簇索引(Non-Clustered Index / Secondary Index):** 根本区别(叶子节点是否存储完整行数据)、InnoDB实现。\n * **索引优化:** 覆盖索引、最左前缀原则、索引下推(ICP)。\n * **索引失效场景:** 函数操作、类型转换、`LIKE '%xx'`、OR条件(部分情况)、不等于(!=, <>)、索引列计算。\n3. **事务(Transaction):**\n * **ACID特性:** 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability) 的含义。\n * **隔离级别(Isolation Level):** **读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read - MySQL默认)、串行化(Serializable)**。每个级别能解决哪些并发问题(脏读、不可重复读、幻读)?\n * **并发问题:** 脏读、不可重复读、幻读的定义。\n * **MVCC(多版本并发控制):** 原理(Undo Log、Read View)、如何实现RC和RR级别(特别是RR如何解决幻读?)。\n4. **锁(Locking):** 共享锁(S锁/读锁)、排他锁(X锁/写锁)、意向锁、行锁、表锁、间隙锁(Gap Lock)、临键锁(Next-Key Lock)的作用和应用场景(特别是InnoDB如何解决幻读)。\n5. **日志(Logging):**\n * **Redo Log(重做日志):** 作用(保证持久性、Crash-Safe)、Write-Ahead Logging(WAL)机制。\n * **Undo Log(回滚日志):** 作用(保证原子性、实现MVCC)。\n * **Binlog(归档日志):** 作用(主从复制、数据恢复)、格式(Statement/Row/Mixed)。\n6. **数据库设计:** 三大范式(1NF, 2NF, 3NF)基本概念、反范式化设计场景。\n7. **性能优化:** Explain分析SQL执行计划、慢查询优化思路。\n\n## 📐 五、 系统设计(面向中高级岗位)\n\n1. **设计原则:** KISS, YAGNI, DRY, SOLID (尤其是单一职责、开闭原则)。\n2. **方法论:**\n * 需求澄清(功能需求、非功能需求-性能/可用性/扩展性/一致性/容错性/安全性)。\n * 估算(QPS、TPS、存储量、带宽)。\n * 抽象与模块化。\n * 核心组件设计(API、数据模型、存储方案、算法)。\n * 深入细节(扩展性、可靠性、性能优化)。\n3. **常见组件与模式:**\n * 负载均衡(LB: Nginx, HAProxy, LVS)。\n * 缓存(Cache: Redis, Memcached)- 缓存策略(Cache Aside, Read/Write Through, Write Behind)、缓存穿透/击穿/雪崩及解决方案。\n * 消息队列(MQ: Kafka, RabbitMQ, RocketMQ)- 解耦、异步、削峰填谷、保证最终一致性。\n * 数据库扩展:读写分离、分库分表(水平/垂直拆分)、分区。\n * 分布式ID生成(Snowflake算法)。\n * 分布式一致性协议:**CAP理论**、**BASE理论**、**Raft/Paxos**(选主、日志复制)基本原理(理解核心思想即可,不要求推导)。\n * 微服务架构:服务注册与发现(Eureka, Nacos, Consul)、API网关(Gateway)、配置中心、服务调用(RPC/REST)、熔断限流(Hystrix, Sentinel)。\n4. **经典系统设计题:** 设计Twitter/微博、设计短链系统、设计秒杀系统、设计分布式缓存、设计搜索引擎、设计聊天系统等。\n\n## 🐍 六、 编程语言特性(根据应聘语言选择)\n\n1. **面向对象(OOP):** 封装、继承、多态、抽象类 vs 接口、重载 vs 重写。\n2. **内存管理:** 垃圾回收(GC)原理(标记清除、复制、标记整理、分代收集-G1/ZGC)、引用类型(强引用、软引用、弱引用、虚引用)。\n3. **并发编程:** 线程生命周期、创建方式、线程池(核心参数、工作流程、拒绝策略)、锁(Synchronized底层原理、Lock/Condition)、并发容器(ConcurrentHashMap原理-CAS+synchronized+分段锁思想)、原子类(CAS操作、ABA问题)、线程间通信。\n4. **语言特性:** 如Java的JVM内存区域、类加载机制、反射、异常体系、集合框架(HashMap源码:put/get流程、扩容、JDK1.7 vs 1.8+);Python的GIL、装饰器、生成器、鸭子类型;Go的Goroutine、Channel、defer等。\n\n## 📌 关键点提醒\n\n1. **理解原理,而非死记硬背:** 面试官更关注你是否真正理解了背后的思想(为什么用这个?解决了什么问题?优缺点是什么?)。\n2. **联系实际:** 思考这些知识在实际系统/项目中是如何应用的。\n3. **清晰表达:** 能条理清晰、简洁准确地阐述概念和过程。\n4. **动手实践:** 算法题要动手写,数据库要会写SQL,系统设计要多思考多画图。\n5. **关注细节:** 很多问题会深入到具体实现细节(如HashMap冲突解决、ConcurrentHashMap分段锁演变、MySQL RR级别如何避免幻读、TCP TIME_WAIT)。\n6. **追踪发展:** 了解一些新技术趋势(如HTTP/3, QUIC, eBPF, 云原生, Serverless)的基本概念。\n\n这份清单涵盖了计算机面试中最核心、最高频的基础知识点。针对具体岗位(前端、后端、算法、运维、测试等)", "嵌入式/USB拓展坞接口数量决定因素.md": "一个USB拓展坞(或集线器)能拓展多少个USB接口,主要由以下几个因素决定:\n \n1. USB协议规范与层级限制\n \n- USB主机控制器的能力:电脑本身的USB主机控制器(如主板上的控制器)决定了初始可连接的设备数量。根据USB规范,一个主机控制器理论上最多可连接 127个设备,但这是通过多级集线器级联实现的(例如主机→一级集线器→二级集线器→……)。\n- 单级集线器的端口数:单个集线器(如拓展坞)的直接端口数通常为 4、7、10个 等,这是由集线器芯片的设计决定的。例如,常见的4口集线器是单芯片直接支持的标准配置。\n \n2. 集线器芯片的硬件设计\n \n- 主控芯片的能力:不同型号的集线器芯片(如瑞萨、德州仪器等品牌)支持的端口数量不同。芯片内部集成的物理接口数量和信号处理能力直接限制了拓展坞的端口数。\n- 信号分配与带宽共享:USB接口共享总线带宽(如USB 3.0的5Gbps),过多端口可能导致带宽不足。因此,芯片设计时会平衡端口数与性能,避免过多端口导致速度下降。\n \n3. 电源供应能力\n \n- 主机供电 vs 外接电源:\n- 无外接电源(总线供电):依赖电脑USB端口的功率(USB 2.0约500mA,USB 3.0约900mA)。若拓展坞无外接电源,总功率需低于主机端口上限,否则可能因供电不足导致设备无法工作(例如连接多个移动硬盘时易出现问题)。\n- 有外接电源(自供电):通过适配器供电,可支持更多高功耗设备,端口数主要受芯片和设计限制。\n- 单端口功率限制:每个USB端口需符合规范(如USB 2.0单端口最大500mA,USB 3.0最大900mA),总功率需在集线器设计的安全范围内。\n \n4. 信号传输与物理限制\n \n- 信号衰减与稳定性:USB信号在长距离或多端口分支中会衰减,尤其是高速率信号(如USB 3.0以上)。拓展坞的电路设计需保证信号完整性,过多端口可能增加干扰风险,因此实际端口数会受限于硬件可靠性。\n- 物理空间与布局:拓展坞的体积和接口排列也会影响端口数量,例如小型便携拓展坞通常设计为4口,而桌面级集线器可能有7-10个端口。\n \n5. 厂商设计与市场需求\n \n- 用户场景导向:厂商会根据目标用户(如普通办公、专业外设连接)设计端口数。例如,针对轻薄本的拓展坞可能集成4-6个端口(兼顾便携性和实用性),而工业级集线器可能支持更多端口。\n- 成本与性价比:更多端口意味着更高的芯片和制造成本,厂商需在功能与价格间平衡。\n \n总结\n \n核心决定因素:\n \n- USB协议的层级与单集线器端口限制\n- 集线器芯片的硬件设计(端口数、带宽分配)\n- 电源供应能力(是否外接电源及总功率)\n- 信号传输的稳定性与物理空间限制\n \n实际中,常见的USB拓展坞多为 4-7个端口,高端或专用集线器可能支持更多(如10口以上),但需结合外接电源和高效的芯片方案来保证性能。", "嵌入式/光纤和网线的特点和区别.md": "\n## 一、 核心区别:传输原理\n\n1. **光纤 (Fiber Optic Cable):**\n * **原理:** 利用光脉冲在极细的玻璃或塑料纤维中进行传输。\n * **信号:** 光信号(激光或LED)。\n * **介质:** 玻璃纤维芯(核心)和包层(折射率不同,实现全反射)。\n\n2. **网线 (双绞线 - Twisted Pair Cable):**\n * **原理:** 利用电信号在相互缠绕的铜线中进行传输。\n * **信号:** 电信号。\n * **介质:** 铜导体(通常为4对双绞线)。\n\n## 二、 关键特点对比\n\n| 特性 | 光纤 (Fiber Optic) | 网线/双绞线 (Twisted Pair) |\n| :--------------- | :----------------------------------------------------- | :----------------------------------------------------- |\n| **传输原理** | **光信号** | **电信号** |\n| **传输介质** | 玻璃纤维芯 + 包层 | 铜线 |\n| **带宽/速度** | **极高**。理论上可达Tbps级别,远超双绞线。常用10Gbps, 40Gbps, 100Gbps甚至更高。 | **相对较低**。受限于铜线物理特性(趋肤效应、串扰)。常用1Gbps, 10Gbps(短距离)。 |\n| **传输距离** | **非常远**。单模光纤可达几十甚至上百公里(无需中继)。多模光纤可达几百米到几公里。 | **较短**。Cat5e/Cat6:100米(千兆)。Cat6a/Cat7:100米(万兆)。距离越长,信号衰减和失真越严重。 |\n| **抗干扰能力** | **极强**。光信号不受电磁干扰、无线电频率干扰影响。可在强电磁环境(如工厂、医院)或雷暴天气下稳定工作。 | **较弱**。铜线是导体,易受电磁干扰、串扰影响。需要屏蔽层(STP/FTP)在干扰环境下改善性能,但成本增加。 |\n| **安全性** | **高**。光信号不易被窃听(需要物理接入并截断光纤,且操作易被发现)。不辐射电磁信号。 | **较低**。电信号可能被电磁感应方式窃听(有一定难度)。铜线会辐射微弱电磁信号。 |\n| **尺寸与重量** | **更细、更轻**。相同容量下,光纤比铜缆细得多、轻得多。 | **较粗、较重**。尤其是高类别带屏蔽的线缆。 |\n| **成本** | **设备成本高**。光模块、光纤收发器、光纤交换机端口价格远高于铜口设备。
**线缆成本中等**。 | **设备成本低**。网卡、交换机端口非常普及且便宜。
**线缆成本中等偏低**(低类别线)。但高类别屏蔽线成本也较高。 |\n| **安装与维护** | **技术要求高**。光纤端接(熔接、研磨)需要专业工具和技能。弯曲半径要求严格,过度弯折易断芯。 | **相对简单**。RJ45水晶头压接容易学习,工具普及。允许更大的弯曲半径,更耐弯折。 |\n| **连接器** | LC, SC, ST, FC, MTP/MPO 等 | RJ45 (8P8C) |\n| **功耗** | **较低**。光模块通常功耗低于同等速率电口。 | **较高**。尤其在高速率、长距离传输时,驱动电信号需要更大功率。 |\n| **主要类型** | **单模光纤:** 细芯(~9µm),单束光,超长距离,高速。
**多模光纤:** 粗芯(50µm/62.5µm),多束光,中短距离,性价比高。 | **非屏蔽双绞线:** UTP(最常见),无屏蔽层,成本低。
**屏蔽双绞线:** STP/FTP/SFTP 等,带屏蔽层,抗干扰好,成本高。
**类别:** Cat5e (千兆), Cat6 (千兆/短距万兆), Cat6a (万兆), Cat7/7a/8 (更高性能) |\n| **典型应用场景** | 骨干网、城域网、数据中心互联、长距离传输、高干扰环境、高带宽需求(视频、云计算、存储网络)、FTTH/FTTx入户。 | 局域网接入层(电脑到交换机)、电话系统、监控系统(POE供电)、家庭网络、办公室布线、短距离设备互联。 |\n\n## 三、 总结\n\n* **选择光纤当:**\n * 你需要**极高的带宽**(10Gbps以上)。\n * 你需要**超长的传输距离**(几百米到几十公里)。\n * 你在**强电磁干扰**环境中。\n * 你对**安全性**要求非常高。\n * 你需要**节省空间和减轻重量**(如数据中心)。\n * 你需要**更低的传输延迟**(虽然差异很小,但对超低延迟场景重要)。\n * 你**不差钱**(尤其是一次性投入的设备成本)。\n\n* **选择双绞线当:**\n * 你的需求是**千兆或万兆(短距离)**。\n * 传输距离在**100米以内**。\n * 环境**电磁干扰较小**。\n * 你对**成本非常敏感**(尤其是设备端口成本)。\n * 你需要**简单易行的安装和维护**。\n * 你需要为设备提供**PoE供电**(目前光纤无法直接供电)。\n * 应用场景是**终端设备接入**(电脑、IP电话、摄像头、AP等)。\n\n**简单来说:光纤是“高速公路”,速度快、距离远、容量大、成本高、建设维护复杂;双绞线是“城市道路”,灵活方便、覆盖广、成本低、但速度和距离有限。** 现代网络通常是两者的结合:光纤做骨干和长距离互联,双绞线做最后100米的接入。", - "数据库/json文件储存和MongoDB储存优缺点.md": "游戏玩家数据储存在普通JSON文件和MongoDB中各有其适用场景,二者的优缺点对比可结合游戏数据的特性(如数据量、读写频率、结构灵活性、并发需求等)展开分析:\n \n一、普通JSON文件储存\n \n普通JSON文件储存指将玩家数据以JSON格式写入本地文件(单文件或多文件,如按玩家ID分文件),依赖文件系统直接读写。\n \n优点\n \n1. 简单轻量,开发成本低\n无需部署数据库服务,直接通过编程语言的文件操作API(如Python的 json 模块、Node.js的 fs 模块)即可读写,适合小型团队或开发初期快速验证功能,学习成本几乎为0。\n2. 资源占用少\n仅依赖文件系统,不消耗额外的数据库进程资源(如内存、CPU),适合设备性能有限的场景(如单机小游戏、轻量网页游戏)。\n3. 数据直观可见\nJSON文件为文本格式,可直接用编辑器打开查看或修改,便于开发调试(如临时修改玩家数据测试功能)。\n \n缺点\n \n1. 读写效率低,不适合大数据量\n- 每次读写需加载整个JSON文件到内存解析(或写入时覆盖整个文件),当玩家数据量增大(如10万+玩家),单文件体积膨胀,读写耗时会急剧增加(例如加载100MB的JSON文件可能需要数百毫秒)。\n- 若按玩家ID分文件,虽能缓解单文件压力,但批量查询(如排行榜、全服统计)需遍历所有文件,效率极低。\n2. 并发安全问题突出\n多玩家同时操作时(如多人在线游戏的并发读写),文件系统缺乏原生锁机制,易出现“写覆盖”(如A玩家写入时B玩家同时写入,导致其中一方数据丢失)或数据损坏(如写入中断导致JSON格式错误)。\n3. 结构扩展性差\n若玩家数据结构迭代(如新增“宠物属性”“公会信息”),需手动处理旧JSON文件的格式兼容(如遍历所有文件添加新字段),操作繁琐且易出错。\n4. 缺乏数据一致性保障\n无事务支持,例如玩家“扣金币+加道具”的原子操作,若中途程序崩溃,可能导致金币已扣但道具未加,数据不一致。\n \n二、MongoDB储存\n \nMongoDB是文档型NoSQL数据库,以BSON(JSON的二进制扩展)格式存储数据,天然适配半结构化的玩家数据。\n \n优点\n \n1. 高效读写与查询能力\n- 支持索引(如按玩家ID、等级建索引),可快速定位单玩家数据(毫秒级),解决JSON文件全量解析的性能问题。\n- 支持复杂查询(如“等级>50且在线的玩家”“道具列表包含某物品的玩家”),适合游戏中的排行榜、好友列表、任务统计等场景。\n2. 良好的并发与一致性\n- 内置多版本并发控制(MVCC),支持高并发读写( thousands of TPS),避免JSON文件的并发冲突。\n- 支持事务(MongoDB 4.0+),可保证“扣钱+加道具”“升级+解锁技能”等操作的原子性,防止数据不一致。\n3. 灵活扩展,适配数据增长\n- 玩家数据量随用户增长时,可通过“分片”横向扩展(将数据分布到多台服务器),支持百万级甚至亿级玩家数据。\n- 文档结构动态灵活,新增字段无需修改表结构,旧数据可兼容(查询时自动忽略不存在的字段),适配游戏版本迭代。\n4. 完善的数据管理能力\n提供备份( mongodump )、恢复( mongorestore )、监控(MongoDB Atlas)等工具,支持数据压缩、过期索引(如清理离线玩家缓存),适合长期运行的在线游戏。\n \n缺点\n \n1. 运维与学习成本高\n需要部署、维护数据库服务(如集群配置、索引优化、故障排查),对小型团队可能增加运维压力;开发人员需学习MongoDB的查询语法(如 find 、 aggregate )、索引设计等,门槛高于JSON文件。\n2. 资源占用较高\n相比JSON文件,MongoDB需要额外的内存(缓存索引和热数据)、CPU(处理查询)和磁盘空间(数据文件+日志),不适合资源受限的极简场景(如嵌入式小游戏)。\n3. 过度设计风险\n对于单机游戏、玩家数极少(如几百人)且无复杂查询的场景,MongoDB的优势无法体现,反而因配置复杂降低开发效率。\n \n总结:适用场景\n \n- 普通JSON文件:适合单人游戏、小型休闲游戏、开发测试阶段,或数据量极小(<1万玩家)、读写频率低、无复杂查询的场景。\n- MongoDB:适合多人在线游戏(MMO、MOBA等)、中大型游戏,或玩家数多(>1万)、需高频读写、复杂查询、结构迭代频繁的场景。\n \n实际开发中,也可根据规模过渡:初期用JSON文件快速上线,待用户增长后迁移至MongoDB,利用其扩展性支撑业务。", + "数据库/Linux控制台登录Mysql8,MongoDB,PostgresDB教程.md": "\n---\n\n## 1. MySQL\n\n### 登录命令\n\n```bash\nmysql -h <主机地址> -u <用户名> -p\n```\n\n例如:\n\n```bash\nmysql -h localhost -u root -p\n```\n\n然后系统会提示你输入密码。\n你还可以指定数据库:\n\n```bash\nmysql -h localhost -u user_name -p 数据库名\n```\n\n(登录后直接使用该数据库)\n\n### 注意事项\n\n- 常见选项: `-h`(主机)、`-u`(用户名)、`-p`(提示输入密码)\n- **为了安全**,建议使用 `-p` 而不直接在命令行后面写密码,因为其他用户可能通过进程列表看到。\n- 登录后你就会进入 MySQL 的交互提示符,比如 `mysql>`,可以执行 SQL 语句。 \n \n\n---\n\n## 2. PostgreSQL\n\n### 登录命令\n\n对于 PostgreSQL,一般使用 `psql` 客户端。常用方式如下:\n\n#### 本地切换为 postgres 系统用户然后登录\n\n```bash\nsudo -i -u postgres\npsql\n```\n\n或者直接:\n\n```bash\nsudo -u postgres psql\n```\n\n这样你以系统用户 `postgres`(PostgreSQL 默认超级用户)身份进入数据库。\n\n#### 使用指定用户、数据库、主机登录\n\n```bash\npsql -U <用户名> -d <数据库名> -h <主机地址> -p <端口>\n```\n\n例如:\n\n```bash\npsql -U myuser -d mydb -h localhost -p 5432\n```\n\n\n### 注意事项\n\n- 默认端口通常为 5432,如果你使用了非标准端口,则需指定 `-p`。\n- 用户 `postgres` 的 UNIX 账户通常是锁定的(不能用密码登录系统)——重点是用它来启动 `psql`。\n- 登录后提示符通常是 `postgres=#`(如果以超级用户身份)。\n \n\n---\n\n## 3. MongoDB\n\n### 登录命令\n\n以本地默认部署为例,使用 MongoDB shell(比如 `mongosh`)登录:\n\n```bash\nmongosh\n```\n\n这会连接到 `mongodb://localhost:27017` 默认端口。\n\n如果你需要指定主机、端口或用户认证:\n\n```bash\nmongosh --host <主机地址> --port <端口> --username <用户名> --password\n```\n\n或者使用连接字符串:\n\n```bash\nmongosh \"mongodb://<用户名>@<主机地址>:<端口>/<数据库>\" --password\n```\n\n\n### 在 shell 中认证用户\n\n登录进入 shell 后,如果还未认证,可以使用:\n\n```javascript\nuse <数据库名>;\ndb.auth(\"<用户名>\", \"<密码>\");\n```\n\n或者只输入用户名让系统提示你输入密码:\n\n```javascript\ndb.auth(\"<用户名>\");\n```\n\n\n\n### 注意事项\n\n- 默认端口为 27017。\n- 当启用了访问控制(authentication)时,需要提供用户名和密码。否则可能会连接但不能执行特定操作。\n- `mongosh`(新的 shell)正在取代旧的 `mongo` shell。 \n\n---\n", + "数据库/Linux控制台登录Redis教程.md": "\n---\n\n## 🔐 1. 在配置文件中设置密码\n\n1. 打开 Redis 的主配置文件(假设你安装在 Debian 12 上,通常为 `/etc/redis/redis.conf`):\n \n ```bash\n sudo nano /etc/redis/redis.conf\n ```\n \n2. 找到这一行(可能被注释 `#` 掉了):\n \n ```\n # requirepass foobared\n ```\n \n 根据官方文档,这个 `requirepass` 指令就是用于开启 “旧式”统一密码认证机制。([Redis](https://redis.io/docs/latest/operate/oss_and_stack/management/security/?utm_source=chatgpt.com \"Redis security | Docs\"))\n \n3. 去掉注释 `#`,并设置为你想要的强密码。例如:\n \n ```\n requirepass YourStr0ngPassword!123\n ```\n \n4. 保存并退出编辑器。\n \n5. 重启 Redis 服务使新配置生效:\n \n ```bash\n sudo systemctl restart redis-server\n ```\n \n\n> 注意:如果你用的是 Redis 6+ 且希望使用更先进的用户/ACL机制,也可以考虑使用 `acl setuser …` 等。但设置 `requirepass` 是最简单直接的方法。([Redis](https://redis.io/docs/latest/operate/oss_and_stack/management/security/?utm_source=chatgpt.com \"Redis security | Docs\"))\n\n---\n\n## 🧑‍💻 2. 使用 redis-cli 登录并认证\n\n1. 在终端运行 Redis 命令行工具:\n \n ```bash\n redis-cli\n ```\n \n 此时你可能会看到提示符,比如 `127.0.0.1:6379>`。如果已经设置了密码但还未认证,执行任何写操作会出现类似 `NOAUTH Authentication required.` 的错误。([Stack Overflow](https://stackoverflow.com/questions/7537905/how-to-set-password-for-redis?utm_source=chatgpt.com \"How to set password for Redis? - Stack Overflow\"))\n \n2. 在提示符下输入认证命令:\n \n ```\n AUTH YourStr0ngPassword!123\n ```\n \n 如果密码正确,会返回 `OK`。此后你就可以执行 `SET`, `GET` 等命令。([Redis](https://redis.io/docs/latest/commands/auth/?utm_source=chatgpt.com \"AUTH | Docs - Redis\"))\n \n3. 你也可以在连接时直接带上密码,这样就省一步认证:\n \n ```bash\n redis-cli -a YourStr0ngPassword!123\n ```\n \n 或者:\n \n ```bash\n redis-cli -h 127.0.0.1 -p 6379 -a YourStr0ngPassword!123\n ```\n \n ([Stack Overflow](https://stackoverflow.com/questions/35745481/redis-cli-with-password?utm_source=chatgpt.com \"Redis-cli with password - Stack Overflow\"))\n \n\n---\n\n## ✅ 快速示例\n\n假设你的密码是 `MyRedisPass123!`,步骤如下:\n\n```bash\nsudo nano /etc/redis/redis.conf\n# 修改:\n# requirepass MyRedisPass123!\nrequirepass MyRedisPass123!\nsudo systemctl restart redis-server\n\nredis-cli\n127.0.0.1:6379> AUTH MyRedisPass123!\nOK\n127.0.0.1:6379> PING\nPONG\n127.0.0.1:6379> SET foo bar\nOK\n127.0.0.1:6379> GET foo\n\"bar\"\n```\n\n---\n", "数据库/MongoDB数据库优化方式一览.md": "除了索引之外,MongoDB 在 CRUD 操作优化上还有多种有效策略,尤其在处理海量数据时更为关键。以下是综合各技术文档和实践总结的核心优化方法:\n\n---\n\n### 🔄 一、批量操作优化\n1. **使用 `bulkWrite` 替代单条操作** \n 通过批量写入减少网络开销和事务开销。基于 `ReplaceOneModel` 启用 `upsert`,实现存在更新、不存在插入的高效操作:\n ```java\n public void batchSave(List dataList) {\n List> bulkOps = dataList.stream()\n .map(item -> {\n Document doc = convertToDocument(item); // 转换为Document\n return new ReplaceOneModel<>(\n Filters.eq(\"_id\", doc.get(\"_id\")), \n doc, \n new UpdateOptions().upsert(true)\n );\n }).collect(Collectors.toList());\n collection.bulkWrite(bulkOps); // 批量执行\n }\n ```\n 此方法将多条操作合并为一次请求,写入性能提升显著。\n\n---\n\n### 📖 二、分页查询优化\n1. **避免精确 `count`** \n 当数据量超大时,`count` 可能极慢。采用阈值法:若跳过 `MAX_PAGE_COUNT`(如1万条)后仍有数据,则返回阈值提示“数据超过1万条”,避免全表扫描:\n ```java\n private long approxCount(MongoTemplate mongoTemplate, Query query) {\n query = query.with(PageRequest.of(MAX_PAGE_COUNT, 1));\n return mongoTemplate.find(query, Entity.class).isEmpty() \n ? mongoTemplate.count(query) \n : MAX_PAGE_COUNT;\n }\n 。\n ```\n\n2. **用条件替代 `skip`** \n 深度分页时(如第100页),避免 `skip(9900)`。改为记录上一页末尾的排序字段值(如时间戳),作为下一页查询条件:\n ```sql\n -- 原查询:db.collection.find().sort({time:-1}).skip(9900).limit(100)\n -- 优化后:\n db.collection.find({ time: { $lt: lastPageEndTime } })\n .sort({ time: -1 })\n .limit(100);\n ```\n 此方法将 **O(N)** 的跳过操作转为 **O(1)** 的条件过滤。\n\n---\n\n### 📤 三、全量导出优化\n1. **字段投影减少数据传输** \n 仅查询必要字段,降低网络与内存开销:\n ```java\n Query query = new Query();\n query.fields().include(\"_id\").include(\"name\"); // 只返回_id和name。\n ```\n\n2. **流式处理替代全量加载** \n 使用 `stream()` 逐条处理数据,避免 `findAll` 导致内存溢出:\n ```java\n try (CloseableIterator iter = mongoTemplate.stream(query, Entity.class)) {\n while (iter.hasNext()) {\n process(iter.next()); // 单条处理\n }\n }\n ```\n 相比分页查询,流式处理无 `skip` 开销,且内存占用恒定。\n\n---\n\n### 🧩 四、文档设计优化\n1. **打破第三范式** \n - **冗余字段**:将高频查询的关联字段(如部门名称)冗余到主文档,避免联表查询。\n - **内嵌设计**:一对多关系直接嵌套子文档(如订单内嵌商品列表),提升读取效率。但需注意文档大小限制(16MB)。\n - **引用设计**:多对多关系使用ID数组而非完整嵌套,避免文档膨胀:\n ```json\n // 学生文档\n {\n \"_id\": \"s001\",\n \"name\": \"Alice\",\n \"teachers\": [\"t01\", \"t02\"] // 仅存储ID\n }\n ```\n\n---\n\n### ⚙️ 五、分片集群优化\n1. **碎片整理(MongoDB <7.0)** \n 在早期版本中,分片集合可能因频繁写入产生碎片化小数据块,导致CRUD延迟。通过 `configureCollectionBalancing` 命令合并数据块,但需注意:\n - 整理期间可能短暂阻塞元数据更新。\n - MongoDB 7.0+ 已支持自动合并,通常无需手动操作。\n\n2. **负载均衡窗口设置** \n 在业务低峰期触发负载均衡器迁移数据块,减少对CRUD的影响。\n\n---\n\n### 💎 六、其他关键技巧\n1. **合理控制事务范围**:短事务减少锁竞争。\n2. **写入确认级别调整**:对非关键数据使用 `w:0`(无确认),提升写入速度(牺牲一致性)。\n3. **TTL索引自动清理**:为临时数据(如日志)设置过期时间,减少存储压力。\n\n---\n\n### 💎 优化方法效果对比表\n| **优化方向** | **适用场景** | **性能提升效果** | **实现复杂度** |\n|--------------------|--------------------------|----------------------|--------------|\n| **批量写入** | 数据导入、批量更新 | ⭐⭐⭐⭐⭐ (极高) | ⭐⭐ (中等) |\n| **流式导出** | 大数据量导出 | ⭐⭐⭐⭐ (避免OOM) | ⭐ (简单) |\n| **条件分页** | 深度分页(>100页) | ⭐⭐⭐⭐ (O(1) 跳转) | ⭐⭐ (中等) |\n| **冗余字段** | 高频关联查询 | ⭐⭐⭐ (减少联表) | ⭐⭐⭐ (较高) |\n| **分片碎片整理** | MongoDB 6.0以下分片集群 | ⭐⭐ (减少延迟) | ⭐⭐⭐⭐ (复杂) |\n\n---\n\n> 💡 **实践建议**:优先从**批量操作**和**分页策略**入手,这两类优化代码改动小且收益显著。海量数据场景下,**流式处理+字段投影**是导出标配方案。分片集群升级到 MongoDB 7.0+ 可减少运维负担。", + "数据库/MongoDB添加管理员账号.md": " \n接下来我们来 **一步步给 MongoDB 添加用户账户(角色管理)**。\n\n假设你希望创建一个:\n- 用户名:`shumengya`\n- 密码:`shumengya520`\n- 权限:对整个数据库系统有管理权限(root 权限)\n \n\n---\n\n## 🧭 步骤 1:进入 MongoDB Shell\n\nMongoDB 7.x 之后使用的是新客户端 `mongosh`:\n\n```bash\nmongosh\n```\n\n如果提示 `command not found`,可以执行:\n\n```bash\nmongo\n```\n\n---\n\n## 🧩 步骤 2:切换到 `admin` 数据库\n\n(MongoDB 的用户管理都存在 `admin` 数据库里)\n\n```javascript\nuse admin\n```\n\n---\n\n## 🧰 步骤 3:创建管理员用户\n\n运行下面的命令创建一个超级管理员账号:\n\n```javascript\ndb.createUser({\n user: \"shumengya\",\n pwd: \"shumengya520\",\n roles: [ { role: \"root\", db: \"admin\" } ]\n})\n```\n\n✅ 成功后会输出:\n\n```\nSuccessfully added user: {\n \"user\" : \"shumengya\",\n \"roles\" : [ { \"role\" : \"root\", \"db\" : \"admin\" } ]\n}\n```\n\n---\n\n## 🔐 步骤 4:启用身份验证\n\n编辑 MongoDB 的配置文件:\n\n```bash\nsudo nano /etc/mongod.conf\n```\n\n找到或添加以下部分(注意缩进):\n\n```yaml\nsecurity:\n authorization: enabled\n```\n\n保存退出后,重启 MongoDB:\n\n```bash\nsudo systemctl restart mongod\n```\n\n---\n\n## ✅ 步骤 5:验证登录是否成功\n\n```bash\nmongosh -u shumengya -p shumengya520 --authenticationDatabase admin\n```\n\n如果看到类似:\n\n```\ntest>\n```\n\n说明登录成功 ✅\n\n---\n\n## 💡 可选:为特定数据库创建普通用户\n\n比如你有个业务数据库叫 `farmgame`,可以创建普通读写用户:\n\n```javascript\nuse farmgame\ndb.createUser({\n user: \"gameuser\",\n pwd: \"gamepass123\",\n roles: [ { role: \"readWrite\", db: \"farmgame\" } ]\n})\n```\n\n---\n\n## 🧱 总结\n\n|操作|命令或说明|\n|---|---|\n|创建管理员|`db.createUser({user: \"shumengya\", pwd: \"...\", roles: [{role: \"root\", db: \"admin\"}]})`|\n|开启认证|`/etc/mongod.conf` → `security.authorization: enabled`|\n|登录验证|`mongosh -u shumengya -p shumengya520 --authenticationDatabase admin`|\n\n---\n", "数据库/MongoDB的索引一览.md": "\n**索引的核心作用:**\n\n1. **大幅减少查询需要扫描的文档数量:** 没有索引时,MongoDB 必须执行集合扫描(`COLLSCAN`),即检查集合中的*每一个*文档。有了合适的索引,MongoDB 可以使用索引扫描(`IXSCAN`)快速定位到包含所需数据的文档位置。\n2. **加速排序:** 如果排序字段包含在索引中,MongoDB 可以直接利用索引中已经排好的顺序返回结果,避免昂贵的在内存中排序。\n3. **支持高效的数据去重:** `$group` 聚合阶段的分组操作可以利用索引。\n4. **实现覆盖查询:** 如果查询只需要返回索引中包含的字段,MongoDB 可以*完全*从索引中获取结果,无需去读取实际的文档数据,速度极快。\n\n**MongoDB 支持的索引类型:**\n\n1. **单字段索引:**\n * 最基本的索引类型,在单个字段上创建。\n * 示例:`db.collection.createIndex({ name: 1 })` (1 表示升序,-1 表示降序。对于纯等值查询,顺序通常不重要;对于排序查询,顺序很重要)。\n\n2. **复合索引:**\n * 在多个字段上创建的索引。\n * 字段的顺序**极其重要**。它决定了索引如何组织和哪些查询模式可以利用该索引(最左前缀原则)。\n * 示例:`db.collection.createIndex({ status: 1, order_date: -1 })`。这个索引可以高效支持:\n * 只查询 `status` 的查询\n * 同时查询 `status` 和 `order_date` 的查询\n * 查询 `status` 并按 `order_date` 排序的查询\n * 但不支持只查询 `order_date` 的查询(不符合最左前缀)。\n\n3. **多键索引:**\n * 当索引字段是数组时,MongoDB 会自动为数组中的每个元素创建索引条目。\n * 用于高效查询数组字段中的元素。\n * 示例:索引 `db.collection.createIndex({ tags: 1 })` 可以高效支持查询 `db.collection.find({ tags: \"mongodb\" })`。\n\n4. **地理空间索引:**\n * **2dsphere:** 用于查询存储为 GeoJSON 对象或传统坐标对的地理空间数据(地球球面几何)。支持邻近查询(`$near`)、包含查询(`$geoWithin`)、相交查询(`$geoIntersects`)等。\n * **2d:** 用于在二维平面上(如地图游戏)查询存储为传统坐标对的数据。主要用于平面几何计算。\n\n5. **文本索引:**\n * 支持对字符串或字符串数组字段的内容进行文本搜索。\n * 支持词干提取、停用词过滤等基本文本处理功能。\n * 示例:`db.collection.createIndex({ description: \"text\" })`,然后使用 `$text` 操作符进行搜索。\n\n6. **哈希索引:**\n * 对字段值进行哈希运算,并在哈希值上建立索引。\n * 主要用途是为**分片键**提供更均匀的数据分布(使用`hashed`分片策略时)。\n * 只支持等值匹配查询,不支持范围查询、排序或其他操作。\n * 示例:`db.collection.createIndex({ _id: \"hashed\" })`。\n\n7. **通配符索引:**\n * 可以索引文档中未知或任意字段。适用于模式动态变化的场景。\n * 示例:\n * `db.collection.createIndex({ \"userMetadata.$**\": 1 })` 索引 `userMetadata` 子文档中的所有字段。\n * `db.collection.createIndex({ \"$**\": 1 })` 索引文档中的所有字段(谨慎使用,开销大)。\n\n8. **唯一索引:**\n * 强制索引字段的值在整个集合中是唯一的(`_id` 字段默认就有唯一索引)。\n * 可以用于单字段或复合字段。\n * 示例:`db.collection.createIndex({ email: 1 }, { unique: true })`。\n\n9. **TTL 索引:**\n * 一种特殊的单字段索引,用于在指定时间后或在指定时间点自动从集合中删除文档。字段必须是日期类型或包含日期元素的数组。\n * 适用于会话数据、日志、临时数据等。\n * 示例:`db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })` (文档在 `createdAt` 时间之后 3600 秒/1 小时被删除)。\n\n10. **稀疏索引:**\n * 只包含具有索引字段的文档的条目。即使索引字段值为 `null`,也会包含在内;但如果文档*完全缺失*该索引字段,则不会被索引。\n * 节省空间,提高索引效率(当字段在大部分文档中缺失时)。\n * 示例:`db.collection.createIndex({ optionalField: 1 }, { sparse: true })`。\n\n**如何管理和使用索引:**\n\n1. **创建索引:** 使用 `db.collection.createIndex()` 方法。\n * 示例:`db.products.createIndex({ category: 1, price: -1 })`\n2. **查看索引:** 使用 `db.collection.getIndexes()` 方法。\n3. **删除索引:** 使用 `db.collection.dropIndex()` 或 `db.collection.dropIndexes()` 方法。\n4. **分析查询性能:** 使用 `explain()` 方法查看查询的执行计划,确认是否使用了索引(`IXSCAN`)以及使用了哪个索引。这是优化查询的关键步骤。\n * 示例:`db.orders.find({ status: \"A\", amount: { $gt: 100 } }).sort({ order_date: -1 }).explain(\"executionStats\")`\n5. **索引管理最佳实践:**\n * **为常用查询模式创建索引:** 分析你的应用最常见的查询(`find`, `sort`, `aggregate`中的`$match`, `$group`, `$sort`等阶段),为这些查询涉及的字段创建合适的索引(通常是复合索引)。\n * **遵循最左前缀原则:** 设计复合索引时,将最常用于过滤或排序的字段放在左边。\n * **考虑选择性:** 选择性高的字段(如唯一值多的字段)放在复合索引的前面通常更有效。\n * **使用覆盖查询:** 尽量让查询只返回索引中包含的字段。\n * **监控索引使用率:** MongoDB Profiler 或 Atlas 性能监控可以查看索引的使用情况。使用率低的索引应考虑删除,因为它们会消耗写性能和存储空间。\n * **权衡读写性能:** 索引会加速读操作,但会减慢写操作(插入、更新、删除),因为写操作需要维护索引。不要过度索引。\n * **后台创建大索引:** 在大型集合上创建索引可能耗时很长并阻塞操作。使用 `{ background: true }` 选项可以在后台创建索引(虽然仍可能有性能影响,但不会完全阻塞读写)。\n * **合理使用内存:** 确保有足够的内存将常用索引(或其活跃部分)保存在内存中,避免频繁的磁盘 I/O。\n\n**总结:**\n\nMongoDB 提供了极其丰富和强大的索引类型(单字段、复合、多键、地理空间、文本、哈希、通配符、唯一、TTL、稀疏)来满足各种查询场景的优化需求。**创建和管理合适的索引是提升 MongoDB 查询性能最关键的手段。** 务必结合你的具体查询模式,使用 `explain()` 分析执行计划,遵循索引设计的最佳实践(特别是复合索引的最左前缀原则),并持续监控和调整索引策略。", "数据库/MySQL数据库支持的数据类型.md": " \n\n## 1️⃣ 数值类型(Numeric)\n\n| 类型分类 | 数据类型 | 说明 |\n| ---- | --------------------------------------------------------- | ------------- |\n| 整数型 | `TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`/`INTEGER`、`BIGINT` | 存储不同范围的整数 |\n| 精确小数 | `DECIMAL(M,D)`、`NUMERIC` | 高精度定点数(常用于金额) |\n| 浮点数 | `FLOAT`、`DOUBLE`/`REAL` | 近似数值(科学计算) |\n| 位类型 | `BIT(M)` | 存储二进制位 |\n| | | |\n| | | |\n\n---\n\n## 2️⃣ 日期与时间类型(Date & Time)\n\n|数据类型|格式|说明|\n|---|---|---|\n|`DATE`|YYYY-MM-DD|日期|\n|`DATETIME(fsp)`|YYYY-MM-DD HH:MM:SS|日期 + 时间|\n|`TIMESTAMP(fsp)`|YYYY-MM-DD HH:MM:SS|时间戳(支持自动更新)|\n|`TIME`|HH:MM:SS|时间或时间间隔|\n|`YEAR`|YYYY|年份(2 位或 4 位)|\n\n---\n\n## 3️⃣ 字符串与二进制类型(String & Binary)\n\n|类型分类|数据类型|说明|\n|---|---|---|\n|定长字符串|`CHAR(M)`|定长,最大 255|\n|变长字符串|`VARCHAR(M)`|可变长度,最大 65535(受行大小限制)|\n|定长二进制|`BINARY(M)`|定长二进制|\n|变长二进制|`VARBINARY(M)`|变长二进制|\n|文本|`TINYTEXT`、`TEXT`、`MEDIUMTEXT`、`LONGTEXT`|存储大文本|\n|二进制大对象|`TINYBLOB`、`BLOB`、`MEDIUMBLOB`、`LONGBLOB`|存储二进制数据|\n|枚举|`ENUM('a','b',...)`|单选固定集合|\n|集合|`SET('a','b',...)`|多选固定集合|\n\n---\n\n## 4️⃣ 空间数据类型(Spatial)\n\n|数据类型|说明|\n|---|---|\n|`GEOMETRY`|任意几何对象|\n|`POINT`|点|\n|`LINESTRING`|线|\n|`POLYGON`|多边形|\n|`MULTIPOINT`、`MULTILINESTRING`、`MULTIPOLYGON`、`GEOMETRYCOLLECTION`|组合空间对象|\n\n---\n\n## 5️⃣ JSON 类型\n\n|数据类型|说明|\n|---|---|\n|`JSON`|存储 JSON 文档,支持索引与函数操作|\n\n---\n", + "数据库/未命名.md": "", "数据结构与算法/二分查找右侧边界算法总结.md": "# 二分查找右侧边界算法总结\r\n\r\n\r\n\r\n## 题目描述\r\n\r\n\r\n\r\n在一个有序不递减的数组中(可能包含重复元素),使用二分查找找到某个值 `x` 最后一次出现的位置。如果该值不存在,则返回 -1。\r\n\r\n\r\n\r\n## 输入格式\r\n\r\n\r\n\r\n1. 第一行:一个整数 `n`,表示数组元素个数(`n <= 10^5`)。\r\n2. 第二行:`n` 个整数,代表数组元素(`1 <= 数组元素的值 <= 10^8`)。\r\n3. 第三行:一个整数 `q`,表示查询的数个数(`q <= 10^5`)。\r\n4. 第四行:`q` 个整数,代表要查找的值(`1 <= 要查找的数 <= 10^8`)。\r\n\r\n\r\n\r\n## 输出格式\r\n\r\n\r\n\r\n输出每个查询对应的最后一次出现的位置,若不存在则输出 -1。\r\n\r\n\r\n\r\n## 算法思路\r\n\r\n\r\n\r\n1. **初始化**:\r\n - 设置左右指针 `l` 和 `r`,分别指向数组的开始和结束。\r\n - 初始化结果 `res` 为 -1。\r\n2. **二分查找**:\r\n - 当l小于等于r时,执行以下步骤:\r\n - 计算中间索引 `m`。\r\n - 如果 `a[m]` 等于 `x`,更新 `res` 为 `m + 1`,并将 `l` 移动到 `m + 1` 继续向右查找。\r\n - 如果 `a[m]` 小于 `x`,将 `l` 移动到 `m + 1`。\r\n - 如果 `a[m]` 大于 `x`,将 `r` 移动到 `m - 1`。\r\n3. **输出结果**:\r\n - 返回结果 `res`。\r\n\r\n\r\n\r\n## 时间复杂度\r\n\r\n\r\n\r\n- 每次查找的时间复杂度为 O(log n),因此总时间复杂度为 O(q log n)。\r\n\r\n\r\n\r\n## 示例代码\r\n\r\n\r\n\r\n```c\r\nc#include \r\n\r\nint findRB(int a[], int n, int x) {\r\n int l = 0, r = n - 1, res = -1;\r\n\r\n while (l <= r) {\r\n int m = l + (r - l) / 2;\r\n\r\n if (a[m] == x) {\r\n res = m + 1;\r\n l = m + 1;\r\n } else if (a[m] < x) {\r\n l = m + 1;\r\n } else {\r\n r = m - 1;\r\n }\r\n }\r\n\r\n return res;\r\n}\r\n\r\nint main() {\r\n int n, q;\r\n\r\n scanf(\"%d\", &n);\r\n int a[n];\r\n\r\n for (int i = 0; i < n; i++) {\r\n scanf(\"%d\", &a[i]);\r\n }\r\n\r\n scanf(\"%d\", &q);\r\n int qry[q];\r\n\r\n for (int i = 0; i < q; i++) {\r\n scanf(\"%d\", &qry[i]);\r\n }\r\n\r\n for (int i = 0; i < q; i++) {\r\n int pos = findRB(a, n, qry[i]);\r\n printf(\"%d \", pos);\r\n }\r\n printf(\"\\n\");\r\n\r\n return 0;\r\n}\r\nc\r\n```\r\n\r\n\r\n\r\n## 总结\r\n\r\n\r\n\r\n该算法有效地使用二分查找来找到数组中元素的右侧边界,适合处理较大规模的输入数据。", "数据结构与算法/二分查找图书馆算法总结.md": "谢谢你的反馈。我们来修正代码。编译错误主要有两个原因:\r\n\r\n\r\n\r\n1. **变量大小问题**:在 C 语言中,数组的大小必须是固定的声明。我们使用 `#define` 或 `const` 来定义常量。\r\n2. **缺少比较函数**:`cmp` 函数必须在调用之前声明,或者将比较逻辑嵌入到 `main` 函数之前。\r\n\r\n\r\n\r\n我们可以做以下改变:\r\n\r\n\r\n\r\n- 使用 `#define` 来定义常量。\r\n- 在 `main` 函数之前声明比较函数。\r\n\r\n\r\n\r\n以下是经过修正的 C 语言代码:\r\n\r\n\r\n\r\n```c\r\n#include \r\n#include \r\n\r\n#define MAXN 1000010\r\nint nums[MAXN];\r\nint key, n;\r\n\r\nint left_bound() {\r\n if (n == 0) return -1;\r\n int left = 0;\r\n int right = n - 1;\r\n\r\n while (left <= right) { \r\n int mid = left + ((right - left) >> 1);\r\n if (nums[mid] == key) {\r\n right = mid - 1;\r\n } else if (nums[mid] < key) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1; \r\n }\r\n }\r\n if (left == n || nums[left] != key) return -1;\r\n return left;\r\n}\r\n\r\nint right_bound() {\r\n if (n == 0) return -1;\r\n int left = 0;\r\n int right = n - 1;\r\n\r\n while (left <= right) { \r\n int mid = left + ((right - left) >> 1);\r\n\r\n if (nums[mid] == key) {\r\n left = mid + 1;\r\n } else if (nums[mid] < key) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1; \r\n }\r\n }\r\n if (left == 0 || nums[left - 1] != key) return -1;\r\n return left - 1;\r\n}\r\n\r\n// Compare function for qsort\r\nint cmp(const void *a, const void *b) {\r\n return (*(int*)a - *(int*)b);\r\n}\r\n\r\nint main() {\r\n scanf(\"%d %d\", &n, &key);\r\n for (int i = 0; i < n; i++) {\r\n scanf(\"%d\", &nums[i]); \r\n }\r\n qsort(nums, n, sizeof(int), cmp);\r\n \r\n if (left_bound() == -1) {\r\n printf(\"Not Found\\n\");\r\n return 0; \r\n }\r\n int ans = (left_bound() + right_bound()) / 2 + 1;\r\n printf(\"%d\\n\", ans);\r\n return 0;\r\n}\r\n```\r\n\r\n\r\n\r\n### 关键点说明\r\n\r\n\r\n\r\n1. **常量定义**:使用 `#define MAXN 1000010` 来定义数组的最大长度。\r\n2. **比较函数**:在 `main` 函数之前定义 `cmp` 函数,以便在使用 `qsort` 时可以调用。\r\n3. **错误处理**:添加了换行符 `\\n` 在 \"Not Found\" 输出中,以确保输出格式正确。\r\n\r\n\r\n\r\n### 总结\r\n\r\n\r\n\r\n这个版本应该能够成功编译并正常工作。如果还有问题,请继续反馈!", "数据结构与算法/二分查找左侧边界算法总结.md": "# 二分查找左侧边界算法总结\r\n\r\n\r\n\r\n## 题目描述\r\n\r\n\r\n\r\n在一个有序不递减的数组中(可能包含重复元素),使用二分查找找到某个值 `x` 第一次出现的位置。如果该值不存在,则返回 -1。\r\n\r\n\r\n\r\n## 输入格式\r\n\r\n\r\n\r\n1. **第一行**:一个整数 `n`,表示数组元素个数(`n <= 10^5`)。\r\n2. **第二行**:`n` 个整数,代表数组元素(`1 <= 数组元素的值 <= 10^8`)。\r\n3. **第三行**:一个整数 `q`,表示查询的数个数(`q <= 10^5`)。\r\n4. **第四行**:`q` 个整数,代表要查找的值(`1 <= 要查找的数 <= 10^8`)。\r\n\r\n\r\n\r\n## 输出格式\r\n\r\n\r\n\r\n输出每个查询对应的第一次出现的位置,若不存在则输出 -1。\r\n\r\n\r\n\r\n## 算法思路\r\n\r\n\r\n\r\n1. **初始化**:\r\n - 设置左右指针 `l` 和 `r`,分别指向数组的开始和结束。\r\n - 初始化结果 `res` 为 -1。\r\n2. **二分查找**:\r\n - 当`l`小于等于`r`时,执行以下步骤:\r\n - 计算中间索引 `m`。\r\n - 如果 `a[m]` 等于 `x`,更新 `res` 为 `m + 1`,并将 `r` 移动到 `m - 1` 继续向左查找。\r\n - 如果 `a[m]` 小于 `x`,将 `l` 移动到 `m + 1`。\r\n - 如果 `a[m]` 大于 `x`,将 `r` 移动到 `m - 1`。\r\n3. **输出结果**:\r\n - 返回结果 `res`。\r\n\r\n\r\n\r\n## 时间复杂度\r\n\r\n\r\n\r\n- 每次查找的时间复杂度为 O(log n),因此总时间复杂度为 O(q log n)。\r\n\r\n\r\n\r\n## 示例代码\r\n\r\n\r\n\r\n```c\r\nc#include \r\n\r\nint findLB(int a[], int n, int x) {\r\n int l = 0, r = n - 1, res = -1;\r\n\r\n while (l <= r) {\r\n int m = l + (r - l) / 2;\r\n\r\n if (a[m] == x) {\r\n res = m + 1;\r\n r = m - 1;\r\n } else if (a[m] < x) {\r\n l = m + 1;\r\n } else {\r\n r = m - 1;\r\n }\r\n }\r\n\r\n return res;\r\n}\r\n\r\nint main() {\r\n int n, q;\r\n\r\n scanf(\"%d\", &n);\r\n int a[n];\r\n\r\n for (int i = 0; i < n; i++) {\r\n scanf(\"%d\", &a[i]);\r\n }\r\n\r\n scanf(\"%d\", &q);\r\n int qry[q];\r\n\r\n for (int i = 0; i < q; i++) {\r\n scanf(\"%d\", &qry[i]);\r\n }\r\n\r\n for (int i = 0; i < q; i++) {\r\n int pos = findLB(a, n, qry[i]);\r\n printf(\"%d \", pos);\r\n }\r\n printf(\"\\n\");\r\n\r\n return 0;\r\n}\r\nc\r\n```\r\n\r\n\r\n\r\n## 示例\r\n\r\n\r\n\r\n### 输入\r\n\r\n\r\n\r\n```\r\n6\r\n1 2 2 2 3 3\r\n3\r\n3 2 5\r\n```\r\n\r\n\r\n\r\n### 输出\r\n\r\n\r\n\r\n```\r\n5 2 -1 \r\n```\r\n\r\n\r\n\r\n## 总结\r\n\r\n\r\n\r\n该算法有效地使用二分查找来找到数组中元素的左侧边界,适合处理较大规模的输入数据。", @@ -110,8 +131,10 @@ "杂项/PTA好题-英文单词排序.md": "**7-4 英文单词排序**\r\n\r\n分数 25\r\n\r\n作者 张泳\r\n\r\n单位 浙大城市学院\r\n\r\n本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。\r\n\r\n### 输入格式:\r\n\r\n输入为若干英文单词,每行一个,以`#`作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。\r\n\r\n### 输出格式:\r\n\r\n输出为排序后的结果,每个单词后面都额外输出一个空格。\r\n\r\n### 输入样例:\r\n\r\n```in\r\nblue\r\nred\r\nyellow\r\ngreen\r\npurple\r\n#\r\n```\r\n\r\n### 输出样例:\r\n\r\n```out\r\nred blue green yellow purple \r\n```\r\n\r\n代码长度限制\r\n\r\n16 KB\r\n\r\n时间限制\r\n\r\n400 ms\r\n\r\n内存限制\r\n\r\n64 MB\r\n\r\n栈限制\r\n\r\n8192 KB\r\n\r\n\r\n\r\n```c\r\n#include \r\n#include \r\n\r\ntypedef struct {\r\n char word[10 + 1]; \r\n int index; \r\n} Word;\r\n\r\nint main() {\r\n Word words[20];\r\n int count = 0; //单词数量\r\n \r\n\r\n while (1) {\r\n char word[10 + 1];\r\n fgets(word, sizeof(word), stdin);\r\n \r\n\r\n if (word[0] == '#') {\r\n break;\r\n }\r\n\r\n\r\n word[strcspn(word, \"\\n\")] = '\\0';\r\n\r\n\r\n strcpy(words[count].word, word);\r\n words[count].index = count;\r\n count++;\r\n }\r\n\r\n //标准冒泡排序\r\n for (int i = 0; i < count - 1; i++) {\r\n for (int j = 0; j < count-1-i; j++) {\r\n if (strlen(words[j].word) > strlen(words[j+1].word)) {\r\n // 交换单词\r\n Word temp = words[j];\r\n words[j] = words[j+1];\r\n words[j+1] = temp;\r\n }\r\n }\r\n }\r\n\r\n for (int i = 0; i < count; i++) {\r\n printf(\"%s \", words[i].word);\r\n }\r\n printf(\"\\n\");\r\n\r\n return 0;\r\n}\r\n\r\n```\r\n\r\n", "杂项/PTA好题-计算众数.md": "**7-6 求整数序列中出现次数最多的数**\r\n\r\n分数 20\r\n\r\n作者 张彤彧\r\n\r\n单位 浙江大学\r\n\r\n本题要求统计一个整型序列中出现次数最多的整数及其出现次数。\r\n\r\n### 输入格式:\r\n\r\n输入在一行中给出序列中整数个数N(0\r\n\r\nint main() {\r\n int N;\r\n scanf(\"%d\", &N);\r\n int arr[N];\r\n for(int i = 0; i < N; i++) {\r\n scanf(\"%d\", &arr[i]);\r\n }\r\n\r\n int max_count = 0;\r\n int most_freq_num = arr[0];\r\n for(int i = 0; i < N; i++) {\r\n int count = 1;\r\n for(int j = i+1; j < N; j++) {\r\n if(arr[j] == arr[i]) {\r\n count++;\r\n }\r\n }\r\n if(count > max_count) {\r\n max_count = count;\r\n most_freq_num = arr[i];\r\n }\r\n }\r\n\r\n printf(\"%d %d\", most_freq_num, max_count);\r\n return 0;\r\n}\r\n\r\n```\r\n\r\n", "杂项/古诗.md": "知我者,谓我心忧;不知我者,谓我何求\n路漫漫其修远兮,吾将上下而求索\n夕阳西下,断肠人在天涯\n兴,百姓苦;亡,百姓苦\n封侯非我意,但愿海波平\n我自横刀向天笑,去留肝胆两昆仑\n海上生明月,天涯共此时\n红豆生南国,春来发几枝。愿君多采撷,此物最相思\n气蒸云梦泽,波撼岳阳城\n黄沙百战穿金甲,不破楼兰终不还\n天生我材必有用,千金散尽还复来\n长风破浪会有时,直挂云帆济沧海\n安能摧眉折腰事权贵,使我不得开心颜\n会当凌绝顶,一览众山小\n国破山河在,城春草木深。感时花溅泪,恨别鸟惊心\n烽火连三月,家书抵万金\n日出江花红胜火,春来江水绿如蓝。能不忆江南\n同是天涯沦落人,相逢何必曾相识\n春蚕到死丝方尽,蜡炬成灰泪始干\n身无彩凤双飞翼,心有灵犀一点通\n山有木兮木有枝,心悦君兮君不知\n生年不满百,常怀千岁忧\n人生如逆旅,我亦是行人\n桃李春风一杯酒,江湖夜雨十年灯\n劝君莫惜金缕衣,劝君惜取少年时\n\n\n但愿人长久,千里共婵娟\n抽刀断水水更流,举杯消愁愁更愁\n孤帆远影碧空尽,唯见长江天际流\n两岸猿声啼不住,轻舟已过万重山\n疏影横斜水清浅,暗香浮动月黄昏\n晚来天欲雪,能饮一杯无\n山重水复疑无路,柳暗花明又一村\n旧时王谢堂前燕,飞入寻常百姓家\n葡萄美酒夜光杯,欲饮琵琶马上催\n两岸青山相对出,孤帆一片日边来\n落霞与孤鹜齐飞,秋水共长天一色\n杨柳青青江水平,闻郎江上踏歌声\n近乡情更怯,不敢问来人\n洛阳亲友如相问,一片冰心在玉壶\n莫愁前路无知己,天下谁人不识君\n七八个星天外,两三点雨山前\n一年好景君须记,最是橙黄橘绿时\n今夜月明人尽望,不知秋思落谁家\n劝君更尽一杯酒,西出阳关无故人\n云想衣裳花想容,春风拂槛露华浓\n此情可待成追忆,只是当时已惘然\n问君能有几多愁,恰似一江春水向东流\n小荷才露尖尖角,早有蜻蜓立上头\n两个黄鹂鸣翠柳,一行白鹭上青天\n两岸荔枝红,万家烟雨中\n独在异乡为异客,每逢佳节倍思亲\n无边落木萧萧下,不尽长江滚滚来\n千山鸟飞绝,万径人踪灭\n相见时难别亦难,东风无力百花残\n人间四月芳菲尽,山寺桃花始盛开\n春风得意马蹄疾,一日看尽长安花\n竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生\n我花开后百花杀,秋草萋萋鹦鹉洲", + "杂项/带图片.md": "# 春日限定:\n赴一场自然与生机的约会 春回大地时,万物挣脱冬日的沉寂,以最鲜活的姿态铺满视野。无论是枝头抽芽的新绿、田间绽放的繁花,还是拂面而来的暖风,都在诉说着季节的温柔絮语。 \n--- \n## 一、春日限定的自然画卷 春日的美,藏在每一处细腻的景致里。清晨的林间,露珠挂在嫩绿的叶片上,折射着柔和的晨光;午后的花海,各色花朵竞相开放,蝴蝶在花丛中翩跹起舞;傍晚的河畔,夕阳为水面镀上金边,归鸟的鸣啼伴着流水声,构成一幅宁静而治愈的画面。 ![春日林间晨景](https://picsum.photos/id/15/800/450) *图注:清晨的林间,露珠与新绿交织出春日的清新气息* --- ## 二、解锁春日的正确打开方式 1. 踏青寻芳:走进公园、郊外或山林,沉浸式感受草木生长的力量,呼吸带着花香的新鲜空气。 2. 野餐小聚:约上好友,带着美食与餐布,在草坪上享受阳光与陪伴,记录惬意时光。 3. 绿植养护:在家中摆放几盆绿植或鲜花,让春日的生机延伸到室内,点缀日常空间。 ![草坪野餐时光](https://picsum.photos/id/26/800/450) *图注:在洒满阳光的草坪上,与好友共度轻松惬意的野餐时刻* --- ## 三、春日里的生活感悟 春天是充满希望的季节,它教会我们接纳变化、拥抱新生。就像树木在经历寒冬后重新发芽,生活也会在坚持与等待中迎来转机。不妨趁着春日正好,放慢脚步,感受身边的美好,为自己注入前行的力量。 --- 要不要我帮你生成**不同主题(如旅行、美食、读书)的带图片Markdown文章模板**?你只需告诉我具体主题,我就能快速适配内容和图片搭配。", "杂项/文本颜色测试.md": "我是逐浪圆体\r\n我是逐浪花体\r\n我是逐浪像素字\r\n我是逐浪立楷\r\n我是红色\r\n我是绿色\r\n我是黄色\r\n我是蓝色\r\n我是紫色\r\n我是浅灰色\r\n我是尺寸\r\n我是尺寸\r\n我是逐浪立楷,绿色,尺寸为5\r\n\r\n
背景色yellow
\r\n\r\n\r\n水果名称| 价格 | 数量 \r\n-|-|-\r\n香蕉 | $1 | 5 |\r\n苹果 | $1 | 6 |\r\n草莓 | $1 | 7 |\r\n\r\nname | 111 | 222 | 333 | 444\r\n- | :-: | :-: | :-: | -:\r\naaa | bbb | ccc | ddd | eee| \r\nfff | ggg| hhh | iii | 000|\r\n\r\nname | 111 | 222 | 333 | 444\r\n:-- | :-- | :-- | :-- | :--\r\naaa | bbb | ccc | ddd | eee\r\nfff | ggg| hhh | iii | 000\r\n\r\n颜色名 | 十六进制颜色值 | rgb颜色 \r\n-|-|-\r\n黑色(black) | 000000 | \trgb(0, 0, 0) |\r\n蓝色(blue) | 0000FF | rgb(0, 0, 255) |\r\n灰色(grey) | 808080 | rgb(128, 128, 128) |\r\n绿色(green) | 008000 | rgb(0, 128, 0) |\r\n橙色(orange) | FFA500 | rgb(255, 165, 0) |\r\n红色(red) | FF0000 | rgb(255, 0, 0) |\r\n黄色(yellow) | FFFF00 | rgb(255, 255, 0) |", "杂项/计算机刷题网站.md": "#### 计算机刷题网站\r\n\r\n1. 洛谷 https://www.luogu.com.cn/\r\n2. 牛客网 https://www.nowcoder.com/\r\n3. leetcode https://leetcode.cn/\r\n4. acm实验室 http://acm.mangata.ltd/\r\n5. PTA https://pintia.cn/home", + "正则表达式/简单举例.md": "\n\n---\n\n#### 1️⃣ 提取日志中的IP地址 🌐\n\n**场景**:从服务器日志(Nginx, Apache等)或系统日志中提取客户端的IP地址。\n\n* **表达式**:`\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b`\n* **分解说明**:\n * `\\b`:单词边界,确保IP地址是独立的\n * `(?: ... ){3}`:一个**非捕获分组**,重复3次\n * `[0-9]{1,3}`:1到3位数字(IP的每一段)\n * `\\.`:一个 literal 的点号\n* **测试文本**:\n ```\n 192.168.1.1 - - [05/Jan/2023:10:20:30] \"GET /api/user HTTP/1.1\"\n ERROR 10.0.0.45 Database connection failed\n ```\n* **匹配结果**:\n * `192.168.1.1`\n * `10.0.0.45`\n* 💡 **进阶**:更严格的IP校验正则复杂得多,但这个版本在日志分析中**足够好用**。\n\n---\n\n#### 2️⃣ 验证强密码强度 🔒\n\n**场景**:注册时要求密码必须包含大小写字母、数字和特殊字符,且长度至少8位。\n\n* **表达式**:`^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$`\n* **分解说明**(使用了**前瞻断言**):\n * `^`:字符串开始\n * `(?=.*[a-z])`:**断言**后面必须至少有一个小写字母\n * `(?=.*[A-Z])`:**断言**后面必须至少有一个大写字母\n * `(?=.*\\d)`:**断言**后面必须至少有一个数字\n * `(?=.*[@$!%*?&])`:**断言**后面必须至少有一个特殊字符\n * `[A-Za-z\\d@$!%*?&]{8,}`:匹配由这些字符组成,且长度至少为8的字符串\n * `$`:字符串结尾\n* **测试**:\n * `Password123!` ✅\n * `weak` ❌\n * `NoSpecialChar123` ❌\n* 🛡️ **价值**:前端或后端验证密码规则,无需写一堆 `if-else`。\n\n---\n\n#### 3️⃣ 解析和提取URL组件 🔗\n\n**场景**:从一段文本中提取所有URL的协议、域名和路径。\n\n* **表达式**:`(https?):\\/\\/([^\\/\\s]+)(\\/[^\\s?]*)?(\\?[^\\s#]*)?`\n* **分解说明**(使用了**捕获分组**):\n * `(https?)`:**分组1**,匹配 `http` 或 `https`\n * `:\\/\\/`:匹配 `://`\n * `([^\\/\\s]+)`:**分组2**,匹配域名(直到遇到 `/` 或空格)\n * `(\\/[^\\s?]*)?`:**分组3(可选)**,匹配路径\n * `(\\?[^\\s#]*)?`:**分组4(可选)**,匹配查询参数\n* **测试文本**:\n ```\n 访问我们的官网 https://www.example.com 和博客 https://blog.example.com/path/to/article?id=123\n ```\n* **匹配结果**:\n * 完整匹配1:`https://www.example.com`\n * 分组1:`https`\n * 分组2:`www.example.com`\n * 分组3:`undefined`\n * 完整匹配2:`https://blog.example.com/path/to/article?id=123`\n * 分组1:`https`\n * 分组2:`blog.example.com`\n * 分组3:`/path/to/article`\n * 分组4:`?id=123`\n* 🌟 **应用**:网络爬虫、链接分析、安全扫描。\n\n---\n\n#### 4️⃣ 清理和格式化用户输入 🧹\n\n**场景**:去除用户输入的字符串中所有多余的空白字符(包括换行符),只保留一个空格。\n\n* **表达式**:`\\s+`\n* **替换为**:一个空格 `\" \"`\n* **分解说明**:\n * `\\s+`:匹配**一个或多个**连续的空白字符(包括空格、制表符 `\\t`、换行符 `\\n`、回车符 `\\r`)\n* **处理前文本**:\n ```\n Hello, how are you\n today?\n I hope all is well.\n ```\n* **处理后结果**:\n ```\n Hello, how are you today? I hope all is well.\n ```\n* 🧽 **实用性**:在数据入库或文本分析前,做数据清洗的**必备操作**。\n\n---\n\n#### 5️⃣ 匹配中文内容 🇨🇳\n\n**场景**:在混合了中英文和数字的文本中,提取出所有中文字符。\n\n* **表达式**:`[\\u4e00-\\u9fff]+`\n* **分解说明**:\n * `[\\u4e00-\\u9fff]`:Unicode范围,涵盖了绝大多数常用汉字\n * `+`:一个或多个\n* **测试文本**:\n ```\n 我的电话是 138-1234-5678,欢迎致电!Welcome to 北京。\n ```\n* **匹配结果**:\n * `我的电话是`\n * `欢迎致电`\n * `北京`\n* 🔍 **用途**:中文NLP预处理、敏感词过滤、内容分类。\n\n---\n\n### 💡 给开发者的核心建议\n\n1. **不要重复造轮子** 🔄:像邮箱、URL、手机号验证,先去搜一下成熟的方案。但务必**理解**它的原理,并针对你的业务进行测试和微调。\n2. **在线测试工具是你的最佳伙伴** 🧪:在把正则写入代码前,一定要用 [Regex101](https://regex101.com/) 或 [RegExr](https://regexr.com/) 进行测试,它们能可视化解释你的表达式,并高亮匹配组。\n3. **注意性能** ⚡:过于复杂或嵌套很深的表达式可能导致“灾难性回溯”,在处理长文本时让程序卡死。尽量让表达式**精确**。", "游戏引擎/Godot/BBCode 标签学习.md": "\n以下是截至 Godot 最新稳定版(截至 Jul 2025)的 `RichTextLabel` 节点支持的所有 BBCode 标签,非常详尽:\n\n---\n\n## 🔧 基本格式标签\n\n这些都是官方文档中明确支持的基本标签:([Godot Engine documentation](https://docs.godotengine.org/en/3.5/tutorials/ui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel — Godot Engine (3.5) documentation in ...\"))\n\n- **`[b]{text}[/b]`**:**粗体**\n \n- **`[i]{text}[/i]`**:_斜体_\n \n- **`[u]{text}[/u]`**:下划线\n \n- **`[s]{text}[/s]`**:删除线\n \n- **`[code]{text}[/code]`**:等宽字体,保持空格格式\n \n- **`[center]{text}[/center]`**:水平居中\n \n- **`[right]{text}[/right]`**:右对齐\n \n- **`[fill]{text}[/fill]`**:填满整个控件宽度\n \n- **`[indent]{text}[/indent]`**:增加缩进\n \n- **`[url]{url_or_meta}[/url]`**:产生可点击的链接(需使用 `meta_clicked` 信号处理)\n \n- **`[url=]{text}[/url]`**:显示自定义文本的链接\n \n- **`[img]{path}[/img]`**:插入图片\n \n- **`[img=]{path}[/img]`**:指定宽度,等比缩放\n \n- **`[img=x]{path}[/img]`**:指定宽高\n \n- **`[font=]{text}[/font]`**:使用特定字体资源\n \n- **`[color=]{text}[/color]`**:设置文本颜色,其中 `` 支持常见颜色名如 aqua、black、blue、red 等,亦支持 `#RRGGBB` 或 `#AARRGGBB` 格式([Godot Engine documentation](https://docs.godotengine.org/en/3.5/tutorials/ui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel — Godot Engine (3.5) documentation in ...\"), [Godot Engine documentation](https://docs.godotengine.org/en/3.1/tutorials/gui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel - Godot Docs\"), [Godot Engine documentation](https://docs.godotengine.org/en/3.0/tutorials/gui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel - Godot Docs\"))\n \n\n---\n\n## 🧩 表格支持\n\nGodot 支持表格结构,但 **不支持** HTML 风格的 `` ``,也 **不支持** BBCode `[list]` 等列表标签([Stack Overflow](https://stackoverflow.com/questions/72568676/godot-richtextlabel-bbcode-table-and-list-support?utm_source=chatgpt.com \"Godot RichTextLabel BBCODE Table and List support\")):\n\n- **`[table=]{cells}[/table]`**:设定列数,所有内容以 `[cell]...[/cell]` 分隔\n \n- **`[cell]{content}[/cell]`**:单元格内容\n \n\n示例用法:\n\n```\n[table=2]\n[cell]你好[/cell]\n[cell][img=16]res://icon.png[/img][/cell]\n[/table]\n```\n\n---\n\n## ✨ 动画/效果标签\n\nGodot 自带几种内置动画效果 BBCode:([Godot Engine documentation](https://docs.godotengine.org/en/3.2/tutorials/gui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel - Godot Docs\"), [Godot Engine documentation](https://docs.godotengine.org/en/3.1/tutorials/gui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel - Godot Docs\"))\n\n- **`[wave amp=50 freq=2]{text}[/wave]`**:波浪式上下动画,`amp` 控制振幅,`freq` 控制频率\n \n- **`[fade start=4 length=14]{text}[/fade]`**:渐隐效果,从指定字符开始,长度控制影响范围\n \n- **`[rainbow freq=0.2 sat=10 val=20]{text}[/rainbow]`**:彩虹色循环动画,`freq` 控制速度,`sat` 饱和度,`val` 亮度\n \n\n此外,可通过继承 `RichTextEffect` 自定义动画标签([Godot Engine documentation](https://docs.godotengine.org/en/3.2/tutorials/gui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel - Godot Docs\"))。\n\n---\n\n## 💡 其他标签\n\n- **`[lb]` 与 `[rb]`**:左/右转义方括号,用于在纯文本中显示 `[` `]` 而不被解析([Godot Engine documentation](https://docs.godotengine.org/en/latest/tutorials/ui/bbcode_in_richtextlabel.html?utm_source=chatgpt.com \"BBCode in RichTextLabel - Godot Docs\"))。\n \n- **`[fill]`、`[indent]`** 已在基本标签中列出。\n \n\n---\n\n## ⚙️ 使用建议总结\n\n- 若需嵌套标签,**不要交叉**,如 `[b]bold[i]bold italic[/i][/b]` 是合法,但 `[b]bold[i]bold italic[/b]italic[/i]` 会报错([Godot Engine documentation](https://docs.godotengine.org/en/stable/classes/class_richtextlabel.html?utm_source=chatgpt.com \"RichTextLabel — Godot Engine (stable) documentation in English\"))。\n \n- 链接需配合脚本信号进行跳转处理。\n \n- 插入图片时,你可以显式指定尺寸保持布局需求。\n \n- 基本已覆盖所有官方支持的 BBCode 权能。\n \n\n---\n\n## ✅ 完整TIP参考\n\n|功能分类|支持标签|参数说明|\n|---|---|---|\n|文字样式|`[b,i,u,s,code]`|常见文本格式|\n|对齐、缩进|`[center,right,fill,indent]`|控制布局母体|\n|链接|`[url]`, `[url=..]`|需 signal 处理|\n|图片|`[img]`, 带尺寸控制|支持 `` 或 `x`|\n|字体颜色|`[font=]`, `[color=]`|支持路径 & named/hex 颜色|\n|表格|`[table=cols]...[/table]`, `[cell]`|创建简易表格|\n|动画效果|`[wave]`, `[fade]`, `[rainbow]`|`amp/freq/sat/val`等自定义参数|\n\n---\n\n", "游戏引擎/Godot/DisplayServer简单总结.md": "# DisplayServer API 参考文档\n\n \n\n## 类简介\n\n \n\n**继承**:Object\n\n \n\nDisplayServer 是用于低阶窗口管理的服务器接口。所有与窗口管理相关的内容都由 DisplayServer(显示服务器)处理。\n\n \n\n> **无头模式**:如果使用 `--headless` 命令行参数启动引擎,就会禁用所有渲染和窗口管理功能,此时 DisplayServer 的大多数函数都会返回虚设值。\n\n \n\n---\n\n \n\n## 方法列表\n\n \n\n### 🔔 系统交互\n\n \n\n#### `void beep()`\n\n发出系统提示音。\n\n \n\n#### `void enable_for_stealing_focus(process_id: int)`\n\n允许指定进程获取焦点。\n\n \n\n#### `void force_process_and_drop_events()`\n\n强制处理并丢弃所有事件。\n\n \n\n---\n\n \n\n### 📋 剪贴板操作\n\n \n\n#### `String clipboard_get()`\n\n获取剪贴板文本内容。\n\n \n\n#### `Image clipboard_get_image()`\n\n获取剪贴板图像内容。\n\n \n\n#### `String clipboard_get_primary()`\n\n获取主剪贴板文本内容(仅限 Linux)。\n\n \n\n#### `bool clipboard_has()`\n\n检查剪贴板是否有内容。\n\n \n\n#### `bool clipboard_has_image()`\n\n检查剪贴板是否有图像。\n\n \n\n#### `void clipboard_set(clipboard: String)`\n\n设置剪贴板文本内容。\n\n \n\n#### `void clipboard_set_primary(clipboard_primary: String)`\n\n设置主剪贴板文本内容(仅限 Linux)。\n\n \n\n---\n\n \n\n### 🖱️ 鼠标和光标\n\n \n\n#### `CursorShape cursor_get_shape()`\n\n获取当前光标形状。\n\n \n\n#### `void cursor_set_custom_image(cursor: Resource, shape: CursorShape = 0, hotspot: Vector2 = Vector2(0, 0))`\n\n设置自定义光标图像。\n\n \n\n#### `void cursor_set_shape(shape: CursorShape)`\n\n设置光标形状。\n\n \n\n#### `BitField[MouseButtonMask] mouse_get_button_state()`\n\n获取鼠标按键状态。\n\n \n\n#### `MouseMode mouse_get_mode()`\n\n获取鼠标模式。\n\n \n\n#### `Vector2i mouse_get_position()`\n\n获取鼠标位置。\n\n \n\n#### `void mouse_set_mode(mouse_mode: MouseMode)`\n\n设置鼠标模式。\n\n \n\n#### `void warp_mouse(position: Vector2i)`\n\n将鼠标光标移动到指定位置。\n\n \n\n---\n\n \n\n### 💬 对话框\n\n \n\n#### `Error dialog_input_text(title: String, description: String, existing_text: String, callback: Callable)`\n\n显示文本输入对话框。\n\n \n\n#### `Error dialog_show(title: String, description: String, buttons: PackedStringArray, callback: Callable)`\n\n显示系统对话框。\n\n \n\n#### `Error file_dialog_show(title: String, current_directory: String, filename: String, show_hidden: bool, mode: FileDialogMode, filters: PackedStringArray, callback: Callable)`\n\n显示文件选择对话框。\n\n \n\n#### `Error file_dialog_with_options_show(title: String, current_directory: String, root: String, filename: String, show_hidden: bool, mode: FileDialogMode, filters: PackedStringArray, options: Array[Dictionary], callback: Callable)`\n\n显示带扩展选项的文件选择对话框。\n\n \n\n---\n\n \n\n### 🎨 主题和颜色\n\n \n\n#### `Color get_accent_color()`\n\n获取系统强调色。\n\n \n\n#### `Color get_base_color()`\n\n获取系统基础色。\n\n \n\n#### `bool is_dark_mode()`\n\n检查系统是否为深色模式。\n\n \n\n#### `bool is_dark_mode_supported()`\n\n检查系统是否支持深色模式。\n\n \n\n#### `void set_system_theme_change_callback(callable: Callable)`\n\n设置系统主题变化时的回调。\n\n \n\n---\n\n \n\n### 📱 显示和屏幕\n\n \n\n#### `Array[Rect2] get_display_cutouts()`\n\n获取显示器刘海信息。\n\n \n\n#### `Rect2i get_display_safe_area()`\n\n获取显示器安全区域。\n\n \n\n#### `int get_keyboard_focus_screen()`\n\n获取键盘焦点所在屏幕。\n\n \n\n#### `String get_name()`\n\n获取显示服务器名称。\n\n \n\n#### `int get_primary_screen()`\n\n获取主屏幕索引。\n\n \n\n#### `int get_screen_count()`\n\n获取屏幕数量。\n\n \n\n#### `int get_screen_from_rect(rect: Rect2)`\n\n根据矩形位置获取屏幕索引。\n\n \n\n#### `bool get_swap_cancel_ok()`\n\n获取是否交换确定取消按钮。\n\n \n\n#### `int get_window_at_screen_position(position: Vector2i)`\n\n获取指定屏幕位置的窗口ID。\n\n \n\n#### `PackedInt32Array get_window_list()`\n\n获取所有窗口ID列表。\n\n \n\n---\n\n \n\n### 🖥️ 屏幕操作\n\n \n\n#### `int screen_get_dpi(screen: int = -1)`\n\n获取屏幕DPI。\n\n \n\n#### `Image screen_get_image(screen: int = -1)`\n\n获取屏幕截图。\n\n \n\n#### `Image screen_get_image_rect(rect: Rect2i)`\n\n获取屏幕指定区域截图。\n\n \n\n#### `float screen_get_max_scale()`\n\n获取所有屏幕的最大缩放系数。\n\n \n\n#### `ScreenOrientation screen_get_orientation(screen: int = -1)`\n\n获取屏幕朝向。\n\n \n\n#### `Color screen_get_pixel(position: Vector2i)`\n\n获取指定位置的像素颜色。\n\n \n\n#### `Vector2i screen_get_position(screen: int = -1)`\n\n获取屏幕位置。\n\n \n\n#### `float screen_get_refresh_rate(screen: int = -1)`\n\n获取屏幕刷新率。\n\n \n\n#### `float screen_get_scale(screen: int = -1)`\n\n获取屏幕缩放系数。\n\n \n\n#### `Vector2i screen_get_size(screen: int = -1)`\n\n获取屏幕大小。\n\n \n\n#### `Rect2i screen_get_usable_rect(screen: int = -1)`\n\n获取屏幕可用区域。\n\n \n\n#### `bool screen_is_kept_on()`\n\n检查屏幕是否保持开启。\n\n \n\n#### `void screen_set_keep_on(enable: bool)`\n\n设置屏幕保持开启。\n\n \n\n#### `void screen_set_orientation(orientation: ScreenOrientation, screen: int = -1)`\n\n设置屏幕朝向。\n\n \n\n---\n\n \n\n### 🖼️ 图标设置\n\n \n\n#### `void set_icon(image: Image)`\n\n设置窗口图标。\n\n \n\n#### `void set_native_icon(filename: String)`\n\n使用原生格式设置窗口图标。\n\n \n\n---\n\n \n\n### 💾 输出管理\n\n \n\n#### `bool has_additional_outputs()`\n\n检查是否有额外输出设备。\n\n \n\n#### `void register_additional_output(object: Object)`\n\n注册额外输出设备。\n\n \n\n#### `void unregister_additional_output(object: Object)`\n\n取消注册额外输出设备。\n\n \n\n---\n\n \n\n### ⚡ 功能检测\n\n \n\n#### `bool has_feature(feature: Feature)`\n\n检查是否支持指定功能。\n\n \n\n#### `bool has_hardware_keyboard()`\n\n检查是否有硬件键盘。\n\n \n\n#### `bool is_touchscreen_available()`\n\n检查是否支持触屏。\n\n \n\n#### `bool is_window_transparency_available()`\n\n检查是否支持窗口透明。\n\n \n\n---\n\n \n\n### ⌨️ 键盘\n\n \n\n#### `int keyboard_get_current_layout()`\n\n获取当前键盘布局。\n\n \n\n#### `Key keyboard_get_keycode_from_physical(keycode: Key)`\n\n从物理按键获取键码。\n\n \n\n#### `Key keyboard_get_label_from_physical(keycode: Key)`\n\n从物理按键获取标签。\n\n \n\n#### `int keyboard_get_layout_count()`\n\n获取键盘布局数量。\n\n \n\n#### `String keyboard_get_layout_language(index: int)`\n\n获取键盘布局语言。\n\n \n\n#### `String keyboard_get_layout_name(index: int)`\n\n获取键盘布局名称。\n\n \n\n#### `void keyboard_set_current_layout(index: int)`\n\n设置当前键盘布局。\n\n \n\n---\n\n \n\n### 📝 输入法\n\n#### `Vector2i ime_get_selection()`\n\n获取输入法选中范围。\n\n \n#### `String ime_get_text()`\n\n获取输入法文本。\n\n\n---\n\n \n\n### 🎯 状态指示器\n\n#### `int create_status_indicator(icon: Texture2D, tooltip: String, callback: Callable)`\n\n创建状态指示器。\n\n \n#### `void delete_status_indicator(id: int)`\n\n删除状态指示器。\n\n \n#### `Rect2 status_indicator_get_rect(id: int)`\n\n获取状态指示器位置。\n\n \n\n#### `void status_indicator_set_callback(id: int, callback: Callable)`\n\n设置状态指示器回调。\n\n \n\n#### `void status_indicator_set_icon(id: int, icon: Texture2D)`\n\n设置状态指示器图标。\n\n \n\n#### `void status_indicator_set_menu(id: int, menu_rid: RID)`\n\n设置状态指示器菜单。\n\n \n\n#### `void status_indicator_set_tooltip(id: int, tooltip: String)`\n\n设置状态指示器提示文本。\n\n \n\n---\n\n \n\n### 📱 数位板\n\n \n\n#### `String tablet_get_current_driver()`\n\n获取当前数位板驱动。\n\n \n\n#### `int tablet_get_driver_count()`\n\n获取数位板驱动数量。\n\n \n\n#### `String tablet_get_driver_name(idx: int)`\n\n获取数位板驱动名称。\n\n \n\n#### `void tablet_set_current_driver(name: String)`\n\n设置数位板驱动。\n\n \n\n---\n\n \n\n### 🗣️ 文本转语音\n\n \n\n#### `Array[Dictionary] tts_get_voices()`\n\n获取语音列表。\n\n \n\n#### `PackedStringArray tts_get_voices_for_language(language: String)`\n\n获取指定语言的语音列表。\n\n \n\n#### `bool tts_is_paused()`\n\n检查是否暂停。\n\n \n\n#### `bool tts_is_speaking()`\n\n检查是否正在朗读。\n\n \n\n#### `void tts_pause()`\n\n暂停朗读。\n\n \n\n#### `void tts_resume()`\n\n恢复朗读。\n\n \n\n#### `void tts_set_utterance_callback(event: TTSUtteranceEvent, callable: Callable)`\n\n设置朗读事件回调。\n\n \n\n#### `void tts_speak(text: String, voice: String, volume: int = 50, pitch: float = 1.0, rate: float = 1.0, utterance_id: int = 0, interrupt: bool = false)`\n\n开始朗读文本。\n\n \n\n#### `void tts_stop()`\n\n停止朗读。\n\n \n\n---\n\n \n\n### ⌨️ 虚拟键盘\n\n \n\n#### `int virtual_keyboard_get_height()`\n\n获取虚拟键盘高度。\n\n \n\n#### `void virtual_keyboard_hide()`\n\n隐藏虚拟键盘。\n\n \n\n#### `void virtual_keyboard_show(existing_text: String, position: Rect2 = Rect2(0, 0, 0, 0), type: VirtualKeyboardType = 0, max_length: int = -1, cursor_start: int = -1, cursor_end: int = -1)`\n\n显示虚拟键盘。\n\n \n\n---\n\n \n\n### 🪟 窗口管理\n\n \n\n#### `bool window_can_draw(window_id: int = 0)`\n\n检查窗口是否可绘制。\n\n \n\n#### `int window_get_active_popup()`\n\n获取活动弹出窗口ID。\n\n \n\n#### `int window_get_attached_instance_id(window_id: int = 0)`\n\n获取窗口附加的实例ID。\n\n \n\n#### `int window_get_current_screen(window_id: int = 0)`\n\n获取窗口所在屏幕。\n\n \n\n#### `bool window_get_flag(flag: WindowFlags, window_id: int = 0)`\n\n获取窗口标志。\n\n \n\n#### `Vector2i window_get_max_size(window_id: int = 0)`\n\n获取窗口最大尺寸。\n\n \n\n#### `Vector2i window_get_min_size(window_id: int = 0)`\n\n获取窗口最小尺寸。\n\n \n\n#### `WindowMode window_get_mode(window_id: int = 0)`\n\n获取窗口模式。\n\n \n\n#### `int window_get_native_handle(handle_type: HandleType, window_id: int = 0)`\n\n获取窗口原生句柄。\n\n \n\n#### `Rect2i window_get_popup_safe_rect(window: int)`\n\n获取弹出窗口安全区域。\n\n \n\n#### `Vector2i window_get_position(window_id: int = 0)`\n\n获取窗口位置。\n\n \n\n#### `Vector2i window_get_position_with_decorations(window_id: int = 0)`\n\n获取窗口位置(含边框)。\n\n \n\n#### `Vector3i window_get_safe_title_margins(window_id: int = 0)`\n\n获取标题栏安全边距。\n\n \n\n#### `Vector2i window_get_size(window_id: int = 0)`\n\n获取窗口大小。\n\n \n\n#### `Vector2i window_get_size_with_decorations(window_id: int = 0)`\n\n获取窗口大小(含边框)。\n\n \n\n#### `Vector2i window_get_title_size(title: String, window_id: int = 0)`\n\n获取标题栏大小。\n\n \n\n#### `VSyncMode window_get_vsync_mode(window_id: int = 0)`\n\n获取垂直同步模式。\n\n \n\n#### `bool window_is_focused(window_id: int = 0)`\n\n检查窗口是否有焦点。\n\n \n\n#### `bool window_is_maximize_allowed(window_id: int = 0)`\n\n检查窗口是否可最大化。\n\n \n\n#### `bool window_maximize_on_title_dbl_click()`\n\n检查双击标题栏是否最大化。\n\n \n\n#### `bool window_minimize_on_title_dbl_click()`\n\n检查双击标题栏是否最小化。\n\n \n\n#### `void window_move_to_foreground(window_id: int = 0)`\n\n将窗口移到前台。\n\n \n\n#### `void window_request_attention(window_id: int = 0)`\n\n请求窗口注意。\n\n \n\n#### `void window_set_current_screen(screen: int, window_id: int = 0)`\n\n设置窗口所在屏幕。\n\n \n\n#### `void window_set_drop_files_callback(callback: Callable, window_id: int = 0)`\n\n设置文件拖放回调。\n\n \n\n#### `void window_set_exclusive(window_id: int, exclusive: bool)`\n\n设置窗口独占模式。\n\n \n\n#### `void window_set_flag(flag: WindowFlags, enabled: bool, window_id: int = 0)`\n\n设置窗口标志。\n\n \n\n#### `void window_set_ime_active(active: bool, window_id: int = 0)`\n\n设置输入法是否激活。\n\n \n\n#### `void window_set_ime_position(position: Vector2i, window_id: int = 0)`\n\n设置输入法位置。\n\n \n\n#### `void window_set_input_event_callback(callback: Callable, window_id: int = 0)`\n\n设置输入事件回调。\n\n \n\n#### `void window_set_input_text_callback(callback: Callable, window_id: int = 0)`\n\n设置文本输入回调。\n\n \n\n#### `void window_set_max_size(max_size: Vector2i, window_id: int = 0)`\n\n设置窗口最大尺寸。\n\n \n\n#### `void window_set_min_size(min_size: Vector2i, window_id: int = 0)`\n\n设置窗口最小尺寸。\n\n \n\n#### `void window_set_mode(mode: WindowMode, window_id: int = 0)`\n\n设置窗口模式。\n\n \n\n#### `void window_set_mouse_passthrough(region: PackedVector2Array, window_id: int = 0)`\n\n设置鼠标穿透区域。\n\n \n\n#### `void window_set_popup_safe_rect(window: int, rect: Rect2i)`\n\n设置弹出窗口安全区域。\n\n \n\n#### `void window_set_position(position: Vector2i, window_id: int = 0)`\n\n设置窗口位置。\n\n \n\n#### `void window_set_rect_changed_callback(callback: Callable, window_id: int = 0)`\n\n设置窗口位置大小变化回调。\n\n \n\n#### `void window_set_size(size: Vector2i, window_id: int = 0)`\n\n设置窗口大小。\n\n \n\n#### `void window_set_title(title: String, window_id: int = 0)`\n\n设置窗口标题。\n\n \n\n#### `void window_set_transient(window_id: int, parent_window_id: int)`\n\n设置窗口为瞬态。\n\n \n\n#### `void window_set_vsync_mode(vsync_mode: VSyncMode, window_id: int = 0)`\n\n设置垂直同步模式。\n\n \n\n#### `void window_set_window_buttons_offset(offset: Vector2i, window_id: int = 0)`\n\n设置窗口按钮偏移。\n\n \n\n#### `void window_set_window_event_callback(callback: Callable, window_id: int = 0)`\n\n设置窗口事件回调。\n\n \n\n#### `void window_start_drag(window_id: int = 0)`\n\n开始拖拽窗口。\n\n \n\n#### `void window_start_resize(edge: WindowResizeEdge, window_id: int = 0)`\n\n开始调整窗口大小。\n\n \n\n---\n\n \n\n### 📞 帮助系统\n\n \n\n#### `void help_set_search_callbacks(search_callback: Callable, action_callback: Callable)`\n\n设置帮助系统搜索回调。\n\n \n\n#### `void show_emoji_and_symbol_picker()`\n\n显示表情符号选择器。\n\n \n\n---\n\n \n\n### ⚙️ 事件处理\n\n \n\n#### `void process_events()`\n\n处理事件。\n\n \n\n---\n\n \n\n## 常量\n\n \n\n- `SCREEN_WITH_MOUSE_FOCUS = -4`:鼠标焦点所在屏幕\n\n- `SCREEN_WITH_KEYBOARD_FOCUS = -3`:键盘焦点所在屏幕  \n\n- `SCREEN_PRIMARY = -2`:主屏幕\n\n- `SCREEN_OF_MAIN_WINDOW = -1`:主窗口所在屏幕\n\n- `MAIN_WINDOW_ID = 0`:主窗口ID\n\n- `INVALID_WINDOW_ID = -1`:无效窗口ID\n\n \n\n---\n\n \n\n## 枚举\n\n \n\n### Feature\n\n系统功能支持检测枚举,包含多种功能如子窗口、触屏、鼠标、剪贴板、虚拟键盘等支持检测。\n\n \n\n### MouseMode  \n\n鼠标模式枚举:可见、隐藏、捕获、限制等模式。\n\n \n\n### ScreenOrientation\n\n屏幕朝向枚举:横屏、竖屏及其反向,以及传感器自动模式。\n\n \n\n### VirtualKeyboardType\n\n虚拟键盘类型:默认、多行、数字、小数、电话、邮箱、密码、URL等。\n\n \n\n### CursorShape\n\n光标形状枚举:箭头、工字形、指向手形等多种光标样式。\n\n \n\n### WindowFlags\n\n窗口标志枚举:控制窗口的各种行为和外观属性。\n\n \n\n### WindowMode\n\n窗口模式枚举:窗口、最小化、最大化、全屏等模式。\n\n \n\n### HandleType\n\n句柄类型枚举:用于获取不同类型的原生窗口句柄。\n\n \n\n### VSyncMode\n\n垂直同步模式枚举:控制画面撕裂和帧率同步。\n\n \n\n### TTSUtteranceEvent\n\n语音朗读事件枚举:开始、结束、取消、边界等事件。\n\n \n\n---\n\n \n\n> **注意**:此文档已排除所有已弃用的方法。某些功能可能仅在特定平台上可用,请参考原始文档中的平台支持说明。", "游戏引擎/Godot/Godot字典的详细用法.md": "### **Godot `Dictionary` 类用法详解**\n\n#### **基础用法**\n\n------\n\n**1. 创建字典**\n\n```gdscript\n# 空字典\nvar empty_dict = {}\n\n# 初始化字典\nvar simple_dict = {\"name\": \"Godot\", \"version\": 4.0}\n\n# 使用变量作为键和值\nvar key_name = \"language\"\nvar key_value = \"GDScript\"\nvar variable_dict = {key_name: key_value}\n\n# 混合键和值类型\nvar mixed_dict = {\n \"integer_key\": 1,\n \"string_key\": \"value\",\n 3: [1, 2, 3], # 数组作为值\n \"nested_dict\": {\"nested_key\": \"nested_value\"}\n}\n```\n\n\n------\n\n**2. 访问字典值**\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\", \"version\": 4.0}\n\n# 通过键访问值\nprint(my_dict[\"name\"]) # 输出: Godot\n\n# 通过点语法访问(仅限字符串键)\nprint(my_dict.version) # 输出: 4.0\n\n# 使用 `get()` 方法访问\nprint(my_dict.get(\"nonexistent_key\", \"default_value\")) # 输出: default_value\n```\n\n------\n\n**3. 修改或添加键值对**\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\"}\n\n# 修改已有键的值\nmy_dict[\"name\"] = \"Godot Engine\"\n\n# 添加新的键值对\nmy_dict[\"year\"] = 2024\n\nprint(my_dict) # 输出: {\"name\": \"Godot Engine\", \"year\": 2024}\n```\n\n------\n\n**4. 删除键值对**\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\", \"version\": 4.0}\n\n# 使用 erase() 删除\nmy_dict.erase(\"version\")\n\nprint(my_dict) # 输出: {\"name\": \"Godot\"}\n```\n\n------\n\n**5. 检查键是否存在**\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\"}\n\n# 使用 has() 方法\nif my_dict.has(\"name\"):\n print(\"Key exists!\") # 输出: Key exists!\n\n# 等价的 `in` 语法\nif \"name\" in my_dict:\n print(\"Key exists!\") # 输出: Key exists!\n```\n\n------\n\n**6. 遍历字典**\n\n```gdscript\nvar groceries = {\"Apple\": 10, \"Banana\": 5, \"Cherry\": 12}\n\n# 遍历键\nfor fruit in groceries:\n print(fruit, groceries[fruit])\n\n# 遍历键和值\nfor key, value in groceries:\n print(\"Key:\", key, \"Value:\", value)\n```\n\n------\n\n#### **方法说明**\n\n**1. `clear()`** 清空字典的所有条目。\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\", \"version\": 4.0}\nmy_dict.clear()\nprint(my_dict) # 输出: {}\n```\n\n------\n\n**2. `duplicate(deep: bool = false)`** 创建字典的副本。若 `deep` 为 `true`,内部的嵌套字典或数组也会递归复制。\n\n```gdscript\nvar original = {\"key\": [1, 2, 3]}\nvar shallow_copy = original.duplicate()\nshallow_copy[\"key\"].append(4)\n\nprint(original) # 输出: {\"key\": [1, 2, 3, 4]}\nprint(shallow_copy) # 输出: {\"key\": [1, 2, 3, 4]}\n\nvar deep_copy = original.duplicate(true)\ndeep_copy[\"key\"].append(5)\n\nprint(original) # 输出: {\"key\": [1, 2, 3, 4]}\nprint(deep_copy) # 输出: {\"key\": [1, 2, 3, 4, 5]}\n```\n\n------\n\n**3. `erase(key: Variant)`** 移除与指定键关联的条目。\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\"}\nmy_dict.erase(\"name\")\nprint(my_dict) # 输出: {}\n```\n\n------\n\n**4. `find_key(value: Variant)`** 查找给定值对应的第一个键,未找到则返回 `null`。\n\n```gdscript\nvar my_dict = {\"key1\": \"value1\", \"key2\": \"value2\"}\nprint(my_dict.find_key(\"value1\")) # 输出: key1\nprint(my_dict.find_key(\"nonexistent\")) # 输出: null\n```\n\n------\n\n**5. `get(key: Variant, default: Variant = null)`** 安全地获取键对应的值,若键不存在则返回默认值。\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\"}\nprint(my_dict.get(\"name\", \"default\")) # 输出: Godot\nprint(my_dict.get(\"nonexistent_key\", \"default\")) # 输出: default\n```\n\n------\n\n**6. `has_all(keys: Array)`** 检查字典是否包含指定数组中的所有键。\n\n```gdscript\nvar my_dict = {\"width\": 10, \"height\": 20}\nprint(my_dict.has_all([\"width\", \"height\"])) # 输出: true\nprint(my_dict.has_all([\"width\", \"depth\"])) # 输出: false\n```\n\n------\n\n**7. `keys()`** 返回字典中所有键的数组。\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\", \"version\": 4.0}\nprint(my_dict.keys()) # 输出: [\"name\", \"version\"]\n```\n\n------\n\n**8. `values()`** 返回字典中所有值的数组。\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\", \"version\": 4.0}\nprint(my_dict.values()) # 输出: [\"Godot\", 4.0]\n```\n\n------\n\n**9. `merge(dictionary: Dictionary, overwrite: bool = false)`** 合并另一个字典的键值对。默认不覆盖已有键,若 `overwrite` 为 `true` 则覆盖。\n\n```gdscript\nvar dict1 = {\"key1\": \"value1\", \"key2\": \"value2\"}\nvar dict2 = {\"key2\": \"new_value2\", \"key3\": \"value3\"}\n\ndict1.merge(dict2)\nprint(dict1) # 输出: {\"key1\": \"value1\", \"key2\": \"value2\", \"key3\": \"value3\"}\n\ndict1.merge(dict2, true)\nprint(dict1) # 输出: {\"key1\": \"value1\", \"key2\": \"new_value2\", \"key3\": \"value3\"}\n```\n\n------\n\n**10. `size()`** 返回字典中条目的数量。\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\", \"version\": 4.0}\nprint(my_dict.size()) # 输出: 2\n```\n\n------\n\n# **运算符**\n\n------\n\n**1. `==` 和 `!=`** 比较两个字典的内容是否相同。\n\n```gdscript\nvar dict1 = {\"key1\": \"value1\", \"key2\": \"value2\"}\nvar dict2 = {\"key1\": \"value1\", \"key2\": \"value2\"}\nprint(dict1 == dict2) # 输出: true\n\nvar dict3 = {\"key2\": \"value2\", \"key1\": \"value1\"}\nprint(dict1 == dict3) # 输出: true (顺序无关)\n```\n\n**2. `[]` 访问操作符**\n\n```gdscript\nvar my_dict = {\"name\": \"Godot\"}\nprint(my_dict[\"name\"]) # 输出: Godot\n```\n\n------\n", @@ -134,10 +157,14 @@ "编程语言/Android/安卓Gradle构建常用命令总结.md": "\n\n##### **基础**\n\n- `./gradlew tasks` \n 列出可用的 Gradle 任务(查看当前项目能跑什么任务)。\n \n- `./gradlew dependencies` \n 列出项目依赖树(排查依赖冲突很有用)。\n \n- `./gradlew clean` \n 清理构建产物(删除 `build/` 目录)。\n \n\n##### **构建 APK / AAB**\n\n- `./gradlew assembleDebug` \n 构建 debug APK(输出:`app/build/outputs/apk/debug/*.apk`)。\n \n- `./gradlew assembleRelease` \n 构建 release APK(需签名配置,否则生成 unsigned apk)。\n \n- `./gradlew bundleRelease` \n 生成 AAB(Android App Bundle),输出:`app/build/outputs/bundle/release/*.aab`。\n \n- `./gradlew bundleDebug` \n 生成 debug bundle(少用,通常用于测试)。\n \n\n##### **按 module / productFlavor / buildType 构建**\n\n- `./gradlew :moduleName:assembleRelease` \n 构建指定 module(多模块项目时用)。\n \n- `./gradlew assembleFlavorNameRelease` \n 构建指定 flavor + buildType(例如 `assemblePaidRelease`)。\n \n\n##### **安装与卸载**\n\n- `./gradlew installDebug` \n 将 debug APK 安装到连接的设备/模拟器(需要 adb 可用)。\n \n- `./gradlew uninstallDebug` \n 从设备卸载 debug 包。\n \n- 如果用生成的 APK 手动安装:`adb install -r app/build/outputs/apk/debug/app-debug.apk`\n \n\n##### **测试**\n\n- 单元测试(JVM):`./gradlew test` 或 `./gradlew testDebugUnitTest`\n \n- 仪器/设备测试(connected devices):`./gradlew connectedAndroidTest` 或 `./gradlew connectedCheck`\n \n\n##### **静态检查 / 报表**\n\n- `./gradlew lint` 或 `./gradlew lintDebug` \n 运行 Android Lint。\n \n- `./gradlew signingReport` \n 输出签名信息(SHA1/SHA256),常用于配置 API key(Google/Firebase)。\n \n\n##### **调试构建问题的常用参数**\n\n- `--stacktrace` / `--full-stacktrace`:打印堆栈跟踪(排错用)\n \n- `--info` / `--debug`:更详细的日志级别\n \n- `--scan`:生成构建扫描(需要网络,便于深入分析)\n \n- `--no-daemon`:不使用 Gradle daemon(CI 时有时会用)\n \n- `--parallel`:并行构建模块(能加速多模块项目)\n \n- `-x test`:跳过测试(例如 `./gradlew assembleRelease -x test`)\n \n- `--offline`:离线构建(只用缓存依赖)\n \n- `--refresh-dependencies`:刷新依赖缓存\n \n\n##### **性能 / CI 常用组合示例**\n\n- 本地快速一把:`./gradlew clean assembleDebug --parallel --info`\n \n- CI (不使用 daemon,输出详细):`./gradlew clean assembleRelease --no-daemon --stacktrace -x test`\n \n- 只构建 moduleA 的 release:`./gradlew :moduleA:assembleRelease`\n \n\n##### **常见路径**\n\n- APK:`app/build/outputs/apk//...`\n \n- AAB:`app/build/outputs/bundle//...`\n \n- 临时构建缓存:`~/.gradle/caches/`\n \n\n##### **小贴士**\n\n- 始终用项目里的 Gradle Wrapper(`./gradlew`),保证 Gradle 版本一致。\n \n- Release 构建需要正确的 `signingConfig`(通常放在 `gradle.properties` + `build.gradle`),也可以在 CI 用 `-P` 传参数(注意不要把敏感信息放在日志里)。\n \n- 出问题先加 `--stacktrace --info` 看详情,再定位是依赖、ProGuard/R8、签名还是资源冲突。\n", "编程语言/C/C 代码概述:检查特定条件的素数.md": "# C 代码概述:检查特定条件的素数\r\n\r\n## 功能描述\r\n该程序对给定的整数范围内的每个整数进行检查,计算一个特定的函数,并判断该函数的结果是否为素数。\r\n\r\n## 主要组成部分\r\n\r\n### 1. `is_prime` 函数\r\n- **输入**: 一个整数 `n`\r\n- **输出**: 如果 `n` 是素数,返回 `1`,否则返回 `0`。\r\n- **逻辑**:\r\n - 如果 `n` 小于或等于 1,返回 `0`。\r\n - 通过循环检查从 `2` 到 `√n` 的所有整数,判断 `n` 是否可被整除。\r\n \r\n### 2. `main` 函数\r\n- **输入**: 从标准输入读取两个整数 `x` 和 `y`,直到输入为 `0 0`。\r\n- **逻辑**:\r\n - 使用 `x` 和 `y` 定义的范围内进行迭代。\r\n - 计算 `f = i * i + i + 41`。\r\n - 调用 `is_prime` 函数检查 `f` 是否为素数:\r\n - 如果发现任意 `f` 不是素数,输出 `\"Sorry\"` 并停止进一步检查。\r\n - 如果所有 `f` 都是素数,最终输出 `\"OK\"`。\r\n\r\n## 使用示例\r\n- **输入**:\r\n ```\r\n 1 5\r\n 0 0\r\n ```\r\n- **输出**:\r\n ```\r\n Sorry\r\n ```\r\n\r\n## 注意事项\r\n- 如果输入为 `0 0`,程序会终止。\r\n- 当范围内某个 `f` 不是素数时,输出 `\"Sorry\"`,并不再继续检查后续数字。\r\n\r\n\r\n\r\n\r\n\r\n```c\r\n#include \r\n\r\nint is_prime(int n) {\r\n if (n <= 1) return 0; \r\n for (int i = 2; i * i <= n; i++) {\r\n if (n % i == 0) return 0; \r\n }\r\n return 1; \r\n}\r\n\r\nint main() {\r\n int x, y;\r\n \r\n\r\n while (scanf(\"%d %d\", &x, &y) != EOF) {\r\n if (x == 0 && y == 0) break; \r\n \r\n int all_prime = 1; \r\n\r\n for (int i = x; i <= y; i++) {\r\n int f = i * i + i + 41; \r\n if (!is_prime(f)) { \r\n all_prime = 0; \r\n printf(\"Sorry\\n\");\r\n break; \r\n }\r\n }\r\n\r\n if (all_prime) {\r\n printf(\"OK\\n\"); \r\n }\r\n }\r\n \r\n return 0;\r\n}\r\n\r\n```\r\n\r\n", "编程语言/C/C语言不设置临时变量交换x和y的值(方法).md": "# C语言不设置临时变量交换x和y的值(方法)\n\n```c\n#include \n//异或\nint main() {\n int x = 10, y = 20;\n x = x ^ y;\n y = x ^ y;\n x = x ^ y;\n printf(\"x的值为:%d,y的值为:%d\\n\", x, y);\n return 0;\n}\n\n```\n\n```c\n#include \n\nint main() {\n int x = 10, y = 20;\n x = x + y;\n y = x - y;\n x = x - y;\n printf(\"x的值为:%d,y的值为:%d\\n\", x, y);\n return 0;\n}\n\n```\n\n", + "编程语言/C/代码片段/代码片段-标准HelloWorld输出.md": "```c\n#include \n\nint main() {\n printf(\"Hello, World!\\n\");\n return 0;\n}\n```", + "编程语言/C/代码片段/代码片段-特殊HelloWorld输出.md": "```c\n//不使用分号\n#include \n\nint main() {\n if (printf(\"Hello, World!\\n\")) {}\n}\n```", "编程语言/C++/C++中的语法糖.md": "C++中有不少语法糖,以下是一些常见的例子:\n \n范围-based for循环\n \n传统的 for 循环遍历容器需要使用迭代器,较为繁琐。范围 - based for循环则更简洁,例如:\n \n#include \n#include \n\nint main() {\n std::vector v = {1, 2, 3, 4, 5};\n for (int num : v) {\n std::cout << num << \" \";\n }\n return 0;\n}\n \n \n初始化列表\n \n可以使用花括号初始化列表来初始化对象或容器,例如:\n \n#include \n#include \n\nint main() {\n // 用初始化列表初始化vector\n std::vector v = {1, 2, 3, 4, 5};\n // 用初始化列表初始化自定义类对象\n class MyClass {\n public:\n int num;\n MyClass(int n) : num(n) {}\n };\n MyClass obj{10};\n std::cout << obj.num << std::endl;\n return 0;\n}\n \n \nauto关键字\n \n auto 关键字让编译器根据初始化表达式自动推导变量的类型,减少了类型声明的冗长,例如:\n \n#include \n#include \n\nint main() {\n std::vector v = {1, 2, 3, 4, 5};\n // 使用auto自动推导迭代器类型\n for (auto it = v.begin(); it!= v.end(); ++it) {\n std::cout << *it << \" \";\n }\n return 0;\n}\n \n \n模板别名\n \n通过 using 关键字定义模板别名,简化复杂的模板类型定义,例如:\n \n#include \n#include \n#include \n\nint main() {\n // 定义模板别名\n using MyMap = std::map;\n MyMap myMap;\n myMap[\"key\"] = 10;\n std::cout << myMap[\"key\"] << std::endl;\n return 0;\n}", - "编程语言/C++/C++关联文件.md": "### 源文件\r\n\r\n- **.cpp 或 .cxx 或 .cc :**C++源文件的扩展名,用于编写C++代码,包含函数、类、变量等定义和实现。\r\n- **.h 或 .hpp 或 .hxx :**头文件扩展名,用于声明函数原型、类定义、常量和变量等,以便在多个源文件中共享声明。\r\n\r\n### 项目和配置文件\r\n\r\n- **.vcxproj :**Visual C++项目文件,用于Visual Studio开发环境,包含项目的配置信息、源文件列表、引用等。\r\n- **.sln :**解决方案文件,用于组织多个相关的项目,包含项目之间的依赖关系等信息。\r\n- **CMakeLists.txt :**使用CMake构建系统时的项目配置文件,用于描述项目的源文件、目标、依赖等信息,可生成不同平台和编译器的项目文件。\r\n- **Makefile :**在Unix和类Unix系统中,用于定义编译规则和目标,指定源文件如何编译链接成可执行文件或库。\r\n\r\n### 库文件\r\n\r\n- **.lib :**Windows下的静态库文件,包含已编译的代码和数据,在链接时被直接复制到可执行文件中。\r\n- **.a :**Unix和类Unix系统下的静态库文件,作用与Windows下的 .lib 类似。\r\n- **.dll :**Windows下的动态链接库文件,包含可在运行时被加载和调用的代码和数据。\r\n- **.so :**Unix和类Unix系统下的共享库文件,类似于Windows的 .dll ,在运行时动态链接。\r\n\r\n### 可执行文件\r\n\r\n- **.exe :**Windows下的可执行文件,是编译链接后的最终产物,可在操作系统中直接运行。\r\n- 在Unix和类Unix系统中,可执行文件没有特定的扩展名,但通常具有可执行权限,通过命令行或图形界面启动。", + "编程语言/C++/C++关联文件.md": "### 源文件\n\n- **.cpp 或 .cxx 或 .cc :** C++源文件的扩展名,用于编写C++代码,包含函数、类、变量等定义和实现。\n- **.h 或 .hpp 或 .hxx :** 头文件扩展名,用于声明函数原型、类定义、常量和变量等,以便在多个源文件中共享声明。\n\n### 项目和配置文件\n\n- **.vcxproj :**Visual C++项目文件,用于Visual Studio开发环境,包含项目的配置信息、源文件列表、引用等。\n- **.sln :**解决方案文件,用于组织多个相关的项目,包含项目之间的依赖关系等信息。\n- **CMakeLists.txt :**使用CMake构建系统时的项目配置文件,用于描述项目的源文件、目标、依赖等信息,可生成不同平台和编译器的项目文件。\n- **Makefile :**在Unix和类Unix系统中,用于定义编译规则和目标,指定源文件如何编译链接成可执行文件或库。\n\n### 库文件\n\n- **.lib :**Windows下的静态库文件,包含已编译的代码和数据,在链接时被直接复制到可执行文件中。\n- **.a :**Unix和类Unix系统下的静态库文件,作用与Windows下的 .lib 类似。\n- **.dll :**Windows下的动态链接库文件,包含可在运行时被加载和调用的代码和数据。\n- **.so :**Unix和类Unix系统下的共享库文件,类似于Windows的 .dll ,在运行时动态链接。\n\n### 可执行文件\n\n- **.exe :**Windows下的可执行文件,是编译链接后的最终产物,可在操作系统中直接运行。\n- 在Unix和类Unix系统中,可执行文件没有特定的扩展名,但通常具有可执行权限,通过命令行或图形界面启动。", "编程语言/C++/C++模拟考试.md": "\r\n# 计算机二级 C++ 试题\r\n\r\n**考试时间:120 分钟** \r\n**满分:100 分**\r\n\r\n> **说明:** \r\n> 本试卷不涉及模板和智能指针,重点考查面向对象编程和简单算法的编程能力。\r\n\r\n---\r\n\r\n## 一、选择题 (共10题,每题2分,共20分)\r\n\r\n1. 关于 C++ 的面向对象特性,下列描述正确的是: D\r\n A. 封装使得数据与对数据的操作组合在一起 \r\n B. 继承支持代码复用 \r\n C. 多态允许同一操作在不同对象上表现出不同的行为 \r\n D. 以上全部\r\n\r\n2. 在 C++ 中,class的默认访问权限是: C\r\n A. public \r\n B. protected \r\n C. private \r\n D. 无默认权限\r\n\r\n3. 当类中存在虚函数时,运行时调用哪个函数版本取决于: A\r\n A. 指针或引用所指对象的实际类型 \r\n B. 指针或引用的类型 \r\n C. 编译时绑定 \r\n D. 函数的参数列表\r\n\r\n4. 如果希望禁止类对象的拷贝,通常的做法是: C\r\n A. 不提供拷贝构造函数和赋值运算符 \r\n B. 将拷贝构造函数和赋值运算符声明为私有 \r\n C. 使用 const 修饰所有成员变量 \r\n D. 以上都不正确\r\n\r\n5. 在 C++ 中,struct的默认访问权限是: A\r\n A. public \r\n B. protected \r\n C. private \r\n D. 无默认权限\r\n\r\n6. 以下哪条语句正确包含了 iostream 头文件? C\r\n A. `#import ` \r\n B. `#include iostream` \r\n C. `#include ` \r\n D. `using namespace std;` \r\n\r\n7. 在 C++ 中,下列哪个运算符用于获取变量的地址? A\r\n A. & \r\n B. * \r\n C. -> \r\n D. % \r\n\r\n8. 以下哪一项是正确的函数声明? B\r\n A. `int func(int a, b);` \r\n B. `int func(int a, int b);` \r\n C. `func(int a, int b);` \r\n D. `int func(a, b);` \r\n\r\n9. 下列选项中,哪一个不是 C++ 的访问控制符? D\r\n A. public \r\n B. private \r\n C. protected \r\n D. external \r\n\r\n10. 关于 C++ 中的引用,以下说法正确的是: A\r\n A. 引用必须在定义时初始化 \r\n B. 引用可以改变绑定的对象 \r\n C. 引用可以为 NULL \r\n D. 引用占用额外的内存空间 \r\n\r\n---\r\n\r\n## 二、填空题 (共4题,每题2.5分,共10分)\r\n\r\n1. C++ 的面向对象三大特性是封装、______继承__ 和多态。 \r\n \r\n2. 成员函数在类外定义时需要使用 ______::__ 运算符指定其所属的类。 \r\n \r\n3. 如果一个函数在基类中声明为虚函数,那么在派生类中重写该函数时可以选择在函数声明后加上 ______override__ 关键字以提高代码可读性。 \r\n \r\n4. 递归算法必须包含一个或多个 ______终止__ 条件,以确保递归能够终止。 \r\n\r\n---\r\n\r\n\r\n\r\n---\r\n\r\n## 三、代码分析题 (共2题,每题10分,共20分)\r\n\r\n\r\n### 题目1\r\n\r\n阅读下面的代码,并回答问题:\r\n\r\n```cpp\r\n#include \r\nusing namespace std;\r\n\r\nvoid modifyPointer(int *p) {\r\n *p = 20;\r\n}\r\n\r\nint main() {\r\n int a = 10;\r\n int *ptr = &a;\r\n \r\n modifyPointer(ptr);\r\n \r\n cout << a << endl;\r\n \r\n return 0;\r\n}\r\n```\r\n1.程序的输出结果是什么?20\r\n2.解释指针 ptr 在 modifyPointer 函数调用过程中的作用,以及它对变量 a 的影响。指向a的地址 修改a的值\r\n\r\n\r\n### 题目2\r\n\r\n阅读下面的代码,并回答问题:\r\n\r\n```cpp\r\n#include \r\nusing namespace std;\r\n\r\nclass A {\r\npublic:\r\n A() {\r\n cout << \"A Constructor\" << endl;\r\n }\r\n ~A() {\r\n cout << \"A Destructor\" << endl;\r\n }\r\n};\r\n\r\nclass B : public A {\r\npublic:\r\n B() {\r\n cout << \"B Constructor\" << endl;\r\n }\r\n ~B() {\r\n cout << \"B Destructor\" << endl;\r\n }\r\n};\r\n\r\nint main() {\r\n B obj;\r\n return 0;\r\n}\r\n```\r\n1.程序的输出结果是什么?\r\n\r\nA Constructor\r\n\r\nB Constructor\r\n\r\nB Destructor\r\n\r\nA Destructor\r\n\r\n2.解释下子类与父类的构造、析构函数的调用顺序。子类构造过了父类,子类析构过了父类\r\n\r\n## 四、编程题 (共3题,共40分)\r\n\r\n### 题目:基于继承与多态的学生管理系统设计 — 10分\r\n\r\n**要求:** \r\n- 定义一个基类 `Person`,包含下列内容:\r\n - **保护成员**:姓名(`string`)\r\n - 构造函数:用于初始化姓名\r\n - **虚函数** `display()`:用于输出人员的基本信息\r\n- 定义一个派生类 `Student`,继承自 `Person`,并添加下列私有成员:\r\n - 学号(`int`)\r\n - 成绩(`float`)\r\n- 在 `Student` 类中,重写基类中的 `display()` 函数,输出学生的姓名、学号和成绩。\r\n- 在 `main()` 函数中,创建至少两个 `Student` 对象,并使用基类 `Person` 类型的指针调用 `display()` 函数,体现虚函数的多态特性。\r\n- 注意:请确保在基类中定义虚析构函数,以便正确释放派生类对象,请填充下面的代码实现。\r\n\r\n**示例代码:**\r\n```cpp\r\n#include \r\n#include \r\nusing namespace std;\r\n\r\n// 基类 Person,包含姓名和虚函数 display()\r\nclass Person {\r\n protected:\r\n string name;\r\n public:\r\n\r\n Person(string n, int i, float g){\r\n name = n;\r\n }\r\n\r\n virtual void display(){\r\n\r\n }\r\n};\r\n\r\n// 派生类 Student,继承自 Person,并添加学号和成绩\r\nclass Student :public Person {\r\n private:\r\n int id;\r\n float grade;\r\n\r\n public:\r\n Student(string n,int i,float g) override{\r\n name =n;\r\n id = i;\r\n grade = g;\r\n }\r\n\r\n virtual void display() override{\r\n cout<<\"学生的姓名:\"<display();\r\n p2->display();\r\n\r\n // 释放内存\r\n delete p1;\r\n delete p2;\r\n \r\n return 0;\r\n}\r\n```\r\n\r\n\r\n---\r\n\r\n### 题目2:递归实现二分查找 — 20分\r\n\r\n**要求:** \r\n- 编写一个 C++ 程序,使用递归实现二分查找算法,在一个有序的整数数组中查找目标值。 \r\n- 程序应要求用户输入一个目标值,若目标值存在,则输出其在数组中的下标;否则输出 -1。 \r\n- 代码中应包含对输入数据的提示以及对边界条件的合理判断。\r\n\r\n**示例代码:**\r\n```cpp\r\n#include \r\nusing namespace std;\r\n\r\n// 递归实现二分查找函数 请你填充此函数实现\r\nint binarySearch(int arr[], int left, int right, int target) {\r\n while (left<=right){\r\n int mid = left + (right-left)/2;\r\n if(arr[mid]==target){\r\n return mid;\r\n }else if(arr[mid]> target;\r\n \r\n int index = binarySearch(arr, 0, n - 1, target);\r\n if(index != -1) {\r\n cout << \"目标值 \" << target << \" 在数组中的下标为:\" << index << endl;\r\n } else {\r\n cout << \"目标值 \" << target << \" 不在数组中。\" << endl;\r\n }\r\n return 0;\r\n}\r\n```\r\n\r\n---\r\n\r\n### 题目3:冒泡排序实现 — 10分\r\n\r\n**要求:** \r\n- 编写一个 C++ 程序,定义一个整数数组,对数组进行冒泡排序。\r\n- 程序应先输出排序前的数组,再输出排序后的数组。\r\n- 代码要求体现出对冒泡排序核心思想的理解,结构清晰、注释明确,并注意边界情况的处理。\r\n\r\n**示例代码:**\r\n```cpp\r\n#include \r\nusing namespace std;\r\n\r\n// 冒泡排序函数 请你填充这个函数\r\nvoid bubbleSort(int arr[], int n) {\r\n for(int i=0;iarr[j+1]){\r\n swap(arr[j],arr[j+1]);\r\n }\r\n }\r\n}\r\n\r\n// 打印数组函数\r\nvoid printArray(const int arr[], int n) {\r\n for (int i = 0; i < n; i++) {\r\n cout << arr[i] << \" \";\r\n }\r\n cout << endl;\r\n}\r\n\r\nint main() {\r\n int arr[] = { 5, 3, 8, 6, 2, 7, 4, 1 };\r\n int n = sizeof(arr) / sizeof(arr[0]);\r\n \r\n cout << \"排序前的数组:\" << endl;\r\n printArray(arr, n);\r\n \r\n bubbleSort(arr, n);\r\n \r\n cout << \"排序后的数组:\" << endl;\r\n printArray(arr, n);\r\n \r\n return 0;\r\n}\r\n```\r\n\r\n\r\n**注意事项:** \r\n- 请仔细阅读每道题目的要求,确保在答题时详细阐述思路及关键实现步骤。 \r\n- 编程题请在本地编译测试确保代码正确无误。 \r\n\r\n祝各位考生考试顺利!", "编程语言/C++/C语言学习笔记.md": "## C语言学习笔记\r\n\r\n1.scanf()不能输入空格,用fgets可以解决这个问题,但fgets需要对回车进行处理\r\n\r\n```c\r\n // 读取输入字符串\r\n fgets(str, 81, stdin);\r\n\r\n // 去除输入字符串中的换行符\r\n int len = strlen(str);\r\n if (str[len - 1] == '\\n') {\r\n str[len - 1] = '\\0';\r\n }\r\n```\r\n\r\n", + "编程语言/C++/代码片段/代码片段-标准HelloWorld输出.md": "```cpp\n#include \n\nint main() {\n std::cout << \"Hello, World!\" << std::endl;\n return 0;\n}\n```", + "编程语言/C++/代码片段/代码片段-特殊HelloWorld输出.md": "```cpp\n//使用模板元编程\n#include \n\ntemplate\nstruct Hello {\n static void print() {\n Hello::print();\n std::cout << \"Hello, World!\"[N-1];\n }\n};\n\ntemplate<>\nstruct Hello<0> {\n static void print() {}\n};\n\nint main() {\n Hello<13>::print();\n std::cout << std::endl;\n return 0;\n}\n```", "编程语言/C++/值传递和地址传递的区别.md": "在编程中,函数调用时的数据传递方式主要分为值传递和地址传递(也称为引用传递,在 C++ 中还有引用类型专门用于引用传递),下面详细介绍它们的区别:\r\n\r\n### 基本概念\r\n- **值传递**:在函数调用时,将实际参数的值复制一份传递给形式参数。函数内部对形式参数的修改不会影响到实际参数。\r\n- **地址传递**:在函数调用时,将实际参数的内存地址传递给形式参数。函数内部通过该地址可以直接访问和修改实际参数所指向的内存空间中的值。\r\n\r\n### 语法示例\r\n以下是 C++ 语言中值传递和地址传递的示例代码:\r\n```cpp\r\n#include \r\n\r\n// 值传递函数\r\nvoid valuePass(int num) {\r\n num = num + 1;\r\n std::cout << \"Inside valuePass, num: \" << num << std::endl;\r\n}\r\n\r\n// 地址传递函数(使用指针)\r\nvoid addressPass(int* numPtr) {\r\n *numPtr = *numPtr + 1;\r\n std::cout << \"Inside addressPass, *numPtr: \" << *numPtr << std::endl;\r\n}\r\n\r\nint main() {\r\n int value = 10;\r\n\r\n // 值传递调用\r\n std::cout << \"Before valuePass, value: \" << value << std::endl;\r\n valuePass(value);\r\n std::cout << \"After valuePass, value: \" << value << std::endl;\r\n\r\n // 地址传递调用\r\n std::cout << \"Before addressPass, value: \" << value << std::endl;\r\n addressPass(&value);\r\n std::cout << \"After addressPass, value: \" << value << std::endl;\r\n\r\n return 0;\r\n}\r\n```\r\n### 区别分析\r\n\r\n#### 1. 数据复制情况\r\n- **值传递**:会创建实际参数的副本,将副本传递给函数。这意味着在函数内部操作的是这个副本,而不是原始数据。例如上述代码中,`valuePass` 函数接收到的 `num` 是 `value` 的一个副本,对 `num` 的修改不会影响到 `main` 函数中的 `value`。\r\n- **地址传递**:不会复制实际参数的值,而是传递实际参数的地址。函数内部通过该地址直接访问和操作原始数据。如 `addressPass` 函数接收到的是 `value` 的地址,通过解引用操作可以直接修改 `value` 的值。\r\n\r\n#### 2. 内存开销\r\n- **值传递**:由于需要复制实际参数的值,对于大型数据结构(如大数组、大对象),会占用额外的内存空间,增加内存开销。\r\n- **地址传递**:只传递地址,无论实际参数的数据量多大,传递的地址通常只占用固定大小的内存空间(如在 32 位系统上指针通常占 4 字节,64 位系统上占 8 字节),内存开销较小。\r\n\r\n#### 3. 对实际参数的影响\r\n- **值传递**:函数内部对形式参数的修改不会影响到实际参数。在上述代码中,`valuePass` 函数执行完后,`main` 函数中的 `value` 值保持不变。\r\n- **地址传递**:函数内部对形式参数所指向的内存空间的修改会直接影响到实际参数。在 `addressPass` 函数中修改 `*numPtr` 的值,实际上就是修改了 `main` 函数中 `value` 的值。\r\n\r\n#### 4. 函数调用的安全性\r\n- **值传递**:由于函数内部操作的是副本,不会意外修改原始数据,因此在某些情况下可以保证数据的安全性。例如,当你不希望函数修改原始数据时,使用值传递是一个好选择。\r\n- **地址传递**:如果函数内部不小心对指针进行了错误的操作,可能会导致原始数据被意外修改,甚至可能引发内存错误(如空指针解引用、越界访问等)。\r\n\r\n#### 5. 代码可读性和可维护性\r\n- **值传递**:函数的行为相对简单,容易理解,因为它不会影响外部的实际参数。调用者可以清楚地知道函数内部不会修改传入的数据。\r\n- **地址传递**:使用地址传递可以在函数内部修改外部数据,这在某些情况下可以使代码更加简洁,但也可能会增加代码的复杂度,需要调用者更加小心地处理。", "编程语言/C++/变量使用set,get方法原因.md": "在面向对象编程中,不直接修改变量而使用get和set函数(通常称为访问器和修改器方法)有以下几个重要原因:\n \n数据封装\n \n- 将变量(通常称为成员变量或属性)通过get和set函数封装起来,可以隐藏类的内部实现细节。外部代码只能通过这些函数来访问和修改属性,而无法直接操作,这样可以避免外部代码对内部数据的随意访问和修改,增强了类的独立性和安全性。\n \n数据验证\n \n- 在set函数中,可以对要设置的值进行合法性验证。例如,一个表示人的年龄的属性,在set函数中可以添加逻辑来确保设置的年龄是一个合理的数值,防止出现负数或过大的不合理值,从而保证数据的完整性和正确性。\n \n控制访问权限\n \n- 通过get和set函数,可以更精确地控制对属性的访问权限。可以将某些属性设置为只读(只有get函数,没有set函数),或者只允许在特定条件下进行修改,这样可以更好地满足不同的业务需求。\n \n实现代码复用\n \n- 当需要对属性的访问或修改进行一些额外的操作时,比如记录属性的访问日志、在属性值变化时触发其他相关的操作等,只需要在get和set函数中添加相应的代码,而不需要在所有访问该属性的地方都进行修改,提高了代码的可维护性和复用性。\n \n便于代码扩展和维护\n \n- 如果未来需要对属性的存储方式或访问逻辑进行修改,只需要在get和set函数内部进行修改,而不会影响到外部调用代码,使得代码的扩展性和维护性更好。", "编程语言/C++/多个set方法.md": "当变量有多种 set 方法时,可以通过以下几种方式来处理:\n \n方法重载\n \n在支持方法重载的编程语言中,如Java、C#等,可以定义多个同名的 set 方法,但参数列表不同。例如,一个 set 方法可以接受一个整数参数来设置变量,另一个 set 方法可以接受一个字符串参数并根据字符串的内容来设置变量。\n \njava\n \npublic class MyClass {\n private int myVariable;\n\n public void setMyVariable(int value) {\n myVariable = value;\n }\n\n public void setMyVariable(String value) {\n myVariable = Integer.parseInt(value);\n }\n}\n \n \n不同的方法名\n \n如果方法的功能差异较大,也可以使用不同的方法名来表示不同的设置方式。比如,一个方法用于从文件中读取值来设置变量,另一个方法用于从网络获取值来设置变量,可以分别命名为 setVariableFromFile 和 setVariableFromNetwork 。\n \n使用参数标志或枚举\n \n可以在 set 方法中使用参数标志或枚举类型来区分不同的设置方式。例如,定义一个枚举类型来表示设置变量的不同来源,然后在 set 方法中根据传入的枚举值来执行不同的设置逻辑。\n \njava\n \npublic class MyClass {\n private int myVariable;\n\n public enum SetSource {\n FROM_FILE, FROM_NETWORK\n }\n\n public void setMyVariable(int value, SetSource source) {\n if (source == SetSource.FROM_FILE) {\n // 从文件设置变量的逻辑\n myVariable = value;\n } else if (source == SetSource.FROM_NETWORK) {\n // 从网络设置变量的逻辑\n myVariable = value;\n }\n }\n}\n \n \n这样可以根据不同的需求灵活选择合适的方式来设置变量,同时保持代码的清晰和可维护性。", @@ -153,18 +180,38 @@ "编程语言/C++/标准库解析/string库.md": "```cpp\n#include \n#include \n#include // 用于算法函数,如std::transform\n#include // 用于字符处理函数,如std::toupper\n#include // 用于字符串和数字的转换\n#include \n\nusing namespace std;\n\n/*\n * 本程序通过一个示例,详细总结和演示了C++中std::string库的各种使用方法。\n * 涵盖了字符串的初始化、连接、访问、修改、查找、替换、比较、遍历、转换等功能。\n */\n\nint main() {\n // 1. 字符串的初始化\n // a. 使用字面值初始化\n string str1 = \"Hello, World!\";\n \n // b. 使用字符数组初始化\n char charArray[] = \"Hello, C++!\";\n string str2(charArray);\n \n // c. 使用重复字符初始化\n string str3(5, 'A'); // \"AAAAA\"\n \n // d. 使用另一个字符串初始化(拷贝构造)\n string str4 = str1;\n \n // e. 使用字符串的一部分初始化\n string str5 = str1.substr(7, 5); // \"World\"\n\n // 输出初始化后的字符串\n cout << \"字符串初始化示例:\" << endl;\n cout << \"str1: \" << str1 << endl;\n cout << \"str2: \" << str2 << endl;\n cout << \"str3: \" << str3 << endl;\n cout << \"str4: \" << str4 << endl;\n cout << \"str5: \" << str5 << endl << endl;\n\n // 2. 字符串的连接\n // a. 使用 + 运算符\n string str6 = str1 + \" \" + str2; // \"Hello, World! Hello, C++!\"\n \n // b. 使用 += 运算符\n str6 += \" \" + str3; // \"Hello, World! Hello, C++! AAAAA\"\n \n // c. 使用 append() 函数\n str6.append(\" \").append(str4); // \"Hello, World! Hello, C++! AAAAA Hello, World!\"\n \n // 输出连接后的字符串\n cout << \"字符串连接示例:\" << endl;\n cout << \"str6: \" << str6 << endl << endl;\n\n // 3. 字符串的访问和修改\n // a. 使用下标访问字符(不安全,越界不会检查)\n char ch1 = str1[0]; // 'H'\n \n // b. 使用 at() 函数访问字符(安全,会检查越界)\n char ch2 = str1.at(7); // 'W'\n \n // c. 修改字符串中的字符\n str1[0] = 'h'; // \"hello, World!\"\n str1.at(7) = 'w'; // \"hello, world!\"\n \n // 输出访问和修改后的字符串\n cout << \"字符串访问和修改示例:\" << endl;\n cout << \"str1: \" << str1 << endl;\n cout << \"str1[0]: \" << ch1 << endl;\n cout << \"str1.at(7): \" << ch2 << endl << endl;\n\n // 4. 字符串的查找\n // a. 查找子字符串的位置\n size_t pos1 = str6.find(\"C++\"); // 返回第一次出现的位置\n size_t pos2 = str6.find(\"Python\"); // 如果未找到,返回 string::npos\n \n // b. 从特定位置开始查找\n size_t pos3 = str6.find(\"Hello\", 10);\n \n // 输出查找结果\n cout << \"字符串查找示例:\" << endl;\n cout << \"str6.find(\\\"C++\\\"): \" << pos1 << endl;\n if (pos2 == string::npos)\n cout << \"str6.find(\\\"Python\\\"): 未找到\" << endl;\n else\n cout << \"str6.find(\\\"Python\\\"): \" << pos2 << endl;\n cout << \"str6.find(\\\"Hello\\\", 10): \" << pos3 << endl << endl;\n\n // 5. 字符串的替换\n // a. 替换子字符串\n string str7 = str6;\n size_t replacePos = str7.find(\"World\");\n if (replacePos != string::npos) {\n str7.replace(replacePos, 5, \"C++\"); // 将 \"World\" 替换为 \"C++\"\n }\n \n // b. 替换特定位置的字符\n str7.replace(0, 5, \"Hi\"); // 将前5个字符替换为 \"Hi\"\n \n // 输出替换后的字符串\n cout << \"字符串替换示例:\" << endl;\n cout << \"str7: \" << str7 << endl << endl;\n\n // 6. 字符串的比较\n // a. 使用 == 运算符\n bool isEqual = (str1 == str2); // 比较内容是否相同\n \n // b. 使用 compare() 函数\n int cmpResult = str1.compare(str2); // 返回0表示相同,负数表示str1 < str2,正数表示str1 > str2\n \n // 输出比较结果\n cout << \"字符串比较示例:\" << endl;\n cout << \"str1 == str2: \" << (isEqual ? \"相同\" : \"不同\") << endl;\n cout << \"str1.compare(str2): \" << cmpResult << endl << endl;\n\n // 7. 字符串的遍历\n // a. 使用下标遍历\n cout << \"使用下标遍历 str1: \";\n for (size_t i = 0; i < str1.length(); ++i) {\n cout << str1[i] << ' ';\n }\n cout << endl;\n \n // b. 使用范围 for 循环遍历\n cout << \"使用范围 for 遍历 str2: \";\n for (char c : str2) {\n cout << c << ' ';\n }\n cout << endl;\n \n // c. 使用迭代器遍历\n cout << \"使用迭代器遍历 str3: \";\n for (string::iterator it = str3.begin(); it != str3.end(); ++it) {\n cout << *it << ' ';\n }\n cout << endl << endl;\n\n // 8. 字符串的插入和删除\n // a. 在指定位置插入子字符串\n string str8 = \"Hello World!\";\n str8.insert(5, \", C++\"); // \"Hello, C++ World!\"\n \n // b. 删除指定位置的字符\n str8.erase(5, 2); // 删除第5和第6个字符,变为 \"Hello C++ World!\"\n \n // 输出插入和删除后的字符串\n cout << \"字符串插入和删除示例:\" << endl;\n cout << \"str8: \" << str8 << endl << endl;\n\n // 9. 字符串的分割\n // C++标准库没有内置的字符串分割函数,这里使用stringstream实现简单的分割\n string str9 = \"apple,banana,cherry,dragonfruit\";\n vector fruits;\n stringstream ss(str9);\n string fruit;\n \n while (getline(ss, fruit, ',')) {\n fruits.push_back(fruit);\n }\n \n // 输出分割后的结果\n cout << \"字符串分割示例:\" << endl;\n for (const auto& f : fruits) {\n cout << f << ' ';\n }\n cout << endl << endl;\n\n // 10. 字符串的大小写转换\n // a. 转换为大写\n string str10 = \"Hello, World!\";\n transform(str10.begin(), str10.end(), str10.begin(), ::toupper); // \"HELLO, WORLD!\"\n \n // b. 转换为小写\n string str11 = \"Hello, World!\";\n transform(str11.begin(), str11.end(), str11.begin(), ::tolower); // \"hello, world!\"\n \n // 输出大小写转换后的字符串\n cout << \"字符串大小写转换示例:\" << endl;\n cout << \"str10 (大写): \" << str10 << endl;\n cout << \"str11 (小写): \" << str11 << endl << endl;\n\n // 11. 字符串与数字的转换\n // a. 数字转字符串\n int number = 12345;\n double pi = 3.14159;\n string numStr1 = to_string(number); // \"12345\"\n string numStr2 = to_string(pi); // \"3.141590\"\n \n // b. 字符串转数字\n string numStr3 = \"67890\";\n string numStr4 = \"2.71828\";\n int parsedInt = stoi(numStr3); // 67890\n double parsedDouble = stod(numStr4); // 2.71828\n \n // 输出转换结果\n cout << \"字符串与数字转换示例:\" << endl;\n cout << \"number: \" << number << \" -> numStr1: \" << numStr1 << endl;\n cout << \"pi: \" << pi << \" -> numStr2: \" << numStr2 << endl;\n cout << \"numStr3: \" << numStr3 << \" -> parsedInt: \" << parsedInt << endl;\n cout << \"numStr4: \" << numStr4 << \" -> parsedDouble: \" << parsedDouble << endl << endl;\n\n // 12. 字符串的其他常用函数\n // a. size() 和 length()\n string str12 = \"Sample String\";\n size_t size1 = str12.size(); // 13\n size_t size2 = str12.length(); // 13\n \n // b. empty()\n bool isEmpty = str12.empty(); // false\n \n // c. clear()\n string str13 = \"To be cleared\";\n str13.clear(); // str13 变为 \"\"\n \n // 输出其他函数的使用结果\n cout << \"字符串其他常用函数示例:\" << endl;\n cout << \"str12: \" << str12 << endl;\n cout << \"str12.size(): \" << size1 << endl;\n cout << \"str12.length(): \" << size2 << endl;\n cout << \"str12.empty(): \" << (isEmpty ? \"是空的\" : \"不是空的\") << endl;\n cout << \"str13 清空后: \\\"\" << str13 << \"\\\"\" << endl << endl;\n\n // 13. 字符串的子串提取\n // a. substr() 函数\n string str14 = \"The quick brown fox jumps over the lazy dog\";\n string subStr1 = str14.substr(4, 5); // \"quick\"\n string subStr2 = str14.substr(16); // \"fox jumps over the lazy dog\"\n \n // 输出子串提取的结果\n cout << \"字符串子串提取示例:\" << endl;\n cout << \"str14: \" << str14 << endl;\n cout << \"subStr1: \" << subStr1 << endl;\n cout << \"subStr2: \" << subStr2 << endl << endl;\n\n // 14. 字符串的插入\n // a. insert() 函数\n string str15 = \"Hello World!\";\n str15.insert(5, \", C++\"); // \"Hello, C++ World!\"\n \n // 输出插入后的字符串\n cout << \"字符串插入示例:\" << endl;\n cout << \"str15: \" << str15 << endl << endl;\n\n // 15. 字符串的比较\n // a. 使用 <, > 运算符\n string str16 = \"apple\";\n string str17 = \"banana\";\n bool isLess = str16 < str17; // true,因为 \"apple\" 小于 \"banana\"\n \n // 输出比较结果\n cout << \"字符串比较示例:\" << endl;\n cout << \"str16: \" << str16 << \", str17: \" << str17 << endl;\n cout << \"str16 < str17: \" << (isLess ? \"true\" : \"false\") << endl << endl;\n\n // 16. 字符串的替换\n // a. replace() 函数\n string str18 = \"I love programming.\";\n str18.replace(7, 11, \"C++\"); // \"I love C++.\"\n \n // 输出替换后的字符串\n cout << \"字符串替换示例:\" << endl;\n cout << \"str18: \" << str18 << endl << endl;\n\n // 17. 字符串的查找和替换\n // a. 使用 find() 和 replace() 结合\n string str19 = \"The rain in Spain stays mainly in the plain.\";\n size_t found = str19.find(\"ain\");\n while (found != string::npos) {\n str19.replace(found, 3, \"XYZ\");\n found = str19.find(\"ain\", found + 3);\n }\n \n // 输出查找和替换后的字符串\n cout << \"字符串查找和替换示例:\" << endl;\n cout << \"str19: \" << str19 << endl << endl;\n\n // 18. 字符串的插入和删除\n // a. insert() 和 erase() 函数\n string str20 = \"HelloWorld\";\n str20.insert(5, \" \"); // \"Hello World\"\n str20.erase(5, 1); // \"HelloWorld\"\n \n // 输出插入和删除后的字符串\n cout << \"字符串插入和删除示例:\" << endl;\n cout << \"str20: \" << str20 << endl << endl;\n\n // 19. 字符串的查找和计数\n // a. 查找所有出现的位置\n string str21 = \"banana\";\n size_t pos = str21.find(\"ana\");\n while (pos != string::npos) {\n cout << \"\\\"ana\\\" found at position: \" << pos << endl;\n pos = str21.find(\"ana\", pos + 1);\n }\n \n // b. 使用 count_if 统计特定字符的出现次数\n string str22 = \"Mississippi\";\n int vowelCount = count_if(str22.begin(), str22.end(), [](char c) {\n return c == 'i' || c == 'e' || c == 'a' || c == 'o' || c == 'u';\n });\n cout << \"\\n字符串查找和计数示例:\" << endl;\n cout << \"str21: \" << str21 << endl;\n cout << \"str22: \" << str22 << endl;\n cout << \"元音字母出现次数: \" << vowelCount << endl << endl;\n\n // 20. 字符串的格式化输出\n // 使用字符串流 (stringstream) 进行格式化\n string name = \"Alice\";\n int age = 30;\n double height = 5.6;\n stringstream ss;\n ss << \"Name: \" << name << \", Age: \" << age << \", Height: \" << height << \" feet.\";\n string str23 = ss.str();\n \n // 输出格式化后的字符串\n cout << \"字符串格式化输出示例:\" << endl;\n cout << \"str23: \" << str23 << endl << endl;\n\n return 0;\n}\n```\n\n### 代码详解\n\n1. **字符串的初始化**\n - **字面值初始化**:直接使用双引号括起来的字符串初始化 `std::string` 对象。\n - **字符数组初始化**:使用字符数组(C风格字符串)初始化 `std::string`。\n - **重复字符初始化**:使用构造函数初始化一个由指定数量的重复字符组成的字符串。\n - **拷贝构造**:通过拷贝另一个 `std::string` 对象来初始化。\n - **子字符串初始化**:使用 `substr` 函数提取字符串的一部分作为新字符串。\n\n2. **字符串的连接**\n - **使用 `+` 运算符**:将多个字符串通过 `+` 运算符连接起来,形成一个新的字符串。\n - **使用 `+=` 运算符**:在原有字符串的基础上追加另一个字符串。\n - **使用 `append()` 函数**:通过调用 `append` 方法追加字符串,可以链式调用。\n\n3. **字符串的访问和修改**\n - **下标访问**:通过下标直接访问字符串中的字符,不进行越界检查。\n - **`at()` 函数访问**:通过 `at` 方法访问字符,具有越界检查功能。\n - **修改字符**:可以直接通过下标或 `at` 方法修改字符串中的字符。\n\n4. **字符串的查找**\n - **`find()` 函数**:查找子字符串首次出现的位置,如果未找到返回 `string::npos`。\n - **从特定位置开始查找**:可以指定起始位置,从该位置开始查找子字符串。\n\n5. **字符串的替换**\n - **替换子字符串**:使用 `replace()` 函数将指定位置的子字符串替换为新的字符串。\n - **替换特定位置的字符**:可以通过 `replace()` 函数替换特定位置的字符或字符段。\n\n6. **字符串的比较**\n - **使用 `==` 运算符**:比较两个字符串的内容是否相同。\n - **使用 `compare()` 函数**:比较两个字符串,返回整数值表示大小关系。\n\n7. **字符串的遍历**\n - **下标遍历**:使用下标循环访问每个字符。\n - **范围 `for` 遍历**:使用范围 `for` 循环直接遍历每个字符。\n - **迭代器遍历**:使用迭代器从头到尾遍历字符串中的字符。\n\n8. **字符串的插入和删除**\n - **`insert()` 函数**:在指定位置插入子字符串。\n - **`erase()` 函数**:删除指定位置的字符或字符段。\n\n9. **字符串的分割**\n - **使用 `stringstream` 实现分割**:C++ 标准库没有内置的分割函数,使用 `stringstream` 和 `getline` 结合指定分隔符实现字符串分割。\n\n10. **字符串的大小写转换**\n - **转换为大写**:使用 `std::transform` 和 `::toupper` 将字符串中的字符转换为大写。\n - **转换为小写**:使用 `std::transform` 和 `::tolower` 将字符串中的字符转换为小写。\n\n11. **字符串与数字的转换**\n - **数字转字符串**:使用 `std::to_string` 将整数或浮点数转换为字符串。\n - **字符串转数字**:使用 `std::stoi`、`std::stod` 等函数将字符串转换为整数或浮点数。\n\n12. **字符串的其他常用函数**\n - **`size()` 和 `length()`**:获取字符串的长度,两者功能相同。\n - **`empty()`**:检查字符串是否为空。\n - **`clear()`**:清空字符串内容。\n\n13. **字符串的子串提取**\n - **`substr()` 函数**:提取字符串中的子字符串,指定起始位置和长度。\n\n14. **字符串的插入**\n - **`insert()` 函数**:在指定位置插入子字符串。\n\n15. **字符串的比较**\n - **使用 `<` 和 `>` 运算符**:比较两个字符串的字典序关系。\n\n16. **字符串的替换**\n - **`replace()` 函数**:替换字符串中的特定部分。\n\n17. **字符串的查找和替换**\n - **结合使用 `find()` 和 `replace()`**:查找所有匹配的子字符串并进行替换。\n\n18. **字符串的插入和删除**\n - **`insert()` 和 `erase()` 函数**:在指定位置插入和删除字符或子字符串。\n\n19. **字符串的查找和计数**\n - **查找所有出现的位置**:使用 `find()` 循环查找子字符串所有出现的位置。\n - **使用 `count_if` 统计特定字符的出现次数**:通过 `std::count_if` 和 Lambda 表达式统计满足条件的字符数量。\n\n20. **字符串的格式化输出**\n - **使用 `stringstream` 进行格式化**:结合字符串流 `stringstream` 实现复杂的字符串格式化操作。\n\n### 运行示例\n\n编译并运行上述代码,可以看到以下示例输出:\n\n```\n字符串初始化示例:\nstr1: Hello, World!\nstr2: Hello, C++!\nstr3: AAAAA\nstr4: Hello, World!\nstr5: World\n\n字符串连接示例:\nstr6: Hello, World! Hello, C++! AAAAA Hello, World!\n\n字符串访问和修改示例:\nstr1: hello, world!\nstr1[0]: H\nstr1.at(7): W\n\n字符串查找示例:\nstr6.find(\"C++\"): 20\nstr6.find(\"Python\"): 未找到\nstr6.find(\"Hello\", 10): 14\n\n字符串替换示例:\nstr7: Hi, C++ Hello, World!\n\n使用下标遍历 str1: h e l l o , w o r l d ! \n使用范围 for 遍历 str2: H e l l o , C + + ! \n使用迭代器遍历 str3: A A A A A \n\n字符串插入和删除示例:\nstr8: I love C++.\n\n字符串比较示例:\nstr1 == str2: 不同\nstr1.compare(str2): -1\n\n字符串分割示例:\napple banana cherry dragonfruit \n\n字符串大小写转换示例:\nstr10 (大写): HELLO, WORLD!\nstr11 (小写): hello, world!\n\n字符串与数字转换示例:\nnumber: 12345 -> numStr1: 12345\npi: 3.14159 -> numStr2: 3.141590\nnumStr3: 67890 -> parsedInt: 67890\nnumStr4: 2.71828 -> parsedDouble: 2.71828\n\n字符串其他常用函数示例:\nstr12: Sample String\nstr12.size(): 13\nstr12.length(): 13\nstr12.empty(): 不是空的\nstr13 清空后: \"\"\n\n字符串子串提取示例:\nstr14: The quick brown fox jumps over the lazy dog\nsubStr1: quick\nsubStr2: fox jumps over the lazy dog\n\n字符串插入和删除示例:\nstr15: Hello, C++ World!\n\n字符串比较示例:\nstr16: apple, str17: banana\nstr16 < str17: true\n\n字符串替换示例:\nstr18: I love C++.\n\n字符串查找和替换示例:\nstr19: The rXYZ in SpXYZ stays mXYZly in the plXYZ.\n\nstr21: banana\nstr22: Mississippi\n元音字母出现次数: 4\n\n字符串格式化输出示例:\nstr23: Name: Alice, Age: 30, Height: 5.600000 feet.\n```\n\n### 总结\n\n通过上述代码示例和详细注释,全面展示了C++ `std::string` 库的各种功能和使用方法。掌握这些基本操作对于进行高效的字符串处理和编程开发至关重要。希望本示例能够帮助您更好地理解和应用C++中的字符串库。", "编程语言/C++/标准库解析/vector库.md": "```cpp\n#include \n#include \n#include // 用于算法函数,如 std::sort, std::find\n#include // 用于迭代器\n#include // 用于数值算法,如 std::accumulate\n#include // 用于函数对象,如 std::greater\n\nusing namespace std;\n\n/*\n * 本程序通过一个示例,详细总结和演示了C++中std::vector库的各种使用方法。\n * 涵盖了向量的初始化、添加元素、访问元素、修改元素、遍历、插入和删除、\n * 迭代器的使用、排序和搜索、容量管理、二维向量、与算法的结合等功能。\n */\n\nint main() {\n // 1. 向量的初始化\n // a. 默认初始化(空向量)\n vector vec1;\n \n // b. 使用指定大小初始化,元素默认值为0\n vector vec2(5); // [0, 0, 0, 0, 0]\n \n // c. 使用指定大小和初始值初始化\n vector vec3(5, 10); // [10, 10, 10, 10, 10]\n \n // d. 使用数组初始化\n int arr[] = {1, 2, 3, 4, 5};\n vector vec4(arr, arr + sizeof(arr)/sizeof(int)); // [1, 2, 3, 4, 5]\n \n // e. 使用初始化列表\n vector vec5 = {\"apple\", \"banana\", \"cherry\"};\n \n // 输出初始化后的向量\n cout << \"向量初始化示例:\" << endl;\n cout << \"vec1 (空向量) 的大小: \" << vec1.size() << endl;\n cout << \"vec2: \";\n for(auto num : vec2) cout << num << ' ';\n cout << endl;\n cout << \"vec3: \";\n for(auto num : vec3) cout << num << ' ';\n cout << endl;\n cout << \"vec4: \";\n for(auto num : vec4) cout << num << ' ';\n cout << endl;\n cout << \"vec5: \";\n for(auto &str : vec5) cout << str << ' ';\n cout << endl << endl;\n\n // 2. 添加元素\n // a. 使用 push_back() 添加单个元素\n vec1.push_back(100);\n vec1.push_back(200);\n \n // b. 使用 emplace_back() 直接在末尾构造元素\n vec5.emplace_back(\"date\"); // 添加 \"date\" 到 vec5\n \n // c. 使用 insert() 在指定位置插入元素\n vec4.insert(vec4.begin() + 2, 99); // 在第三个位置插入99\n \n // 输出添加元素后的向量\n cout << \"添加元素示例:\" << endl;\n cout << \"vec1: \";\n for(auto num : vec1) cout << num << ' ';\n cout << endl;\n cout << \"vec4 (插入99): \";\n for(auto num : vec4) cout << num << ' ';\n cout << endl;\n cout << \"vec5 (emplace_back 'date'): \";\n for(auto &str : vec5) cout << str << ' ';\n cout << endl << endl;\n\n // 3. 访问元素\n // a. 使用下标访问(不安全,越界不会检查)\n int firstElement = vec4[0]; // 1\n \n // b. 使用 at() 函数访问(安全,会检查越界)\n int thirdElement = vec4.at(2); // 99\n \n // c. 使用 front() 和 back() 访问首尾元素\n int frontElement = vec4.front(); // 1\n int backElement = vec4.back(); // 5\n \n // 输出访问元素的结果\n cout << \"访问元素示例:\" << endl;\n cout << \"vec4[0]: \" << firstElement << endl;\n cout << \"vec4.at(2): \" << thirdElement << endl;\n cout << \"vec4.front(): \" << frontElement << endl;\n cout << \"vec4.back(): \" << backElement << endl << endl;\n\n // 4. 修改元素\n // a. 通过下标修改\n vec4[2] = 150; // 将第三个元素从99改为150\n \n // b. 通过 at() 修改\n vec5.at(1) = \"blueberry\"; // 将第二个元素从 \"banana\" 改为 \"blueberry\"\n \n // 输出修改后的向量\n cout << \"修改元素示例:\" << endl;\n cout << \"vec4 (修改第三个元素为150): \";\n for(auto num : vec4) cout << num << ' ';\n cout << endl;\n cout << \"vec5 (修改第二个元素为 'blueberry'): \";\n for(auto &str : vec5) cout << str << ' ';\n cout << endl << endl;\n\n // 5. 向量的遍历\n // a. 使用索引遍历\n cout << \"使用索引遍历 vec4: \";\n for(size_t i = 0; i < vec4.size(); ++i) {\n cout << vec4[i] << ' ';\n }\n cout << endl;\n \n // b. 使用范围-based for 循环遍历\n cout << \"使用范围-based for 遍历 vec5: \";\n for(auto &str : vec5) {\n cout << str << ' ';\n }\n cout << endl;\n \n // c. 使用迭代器遍历\n cout << \"使用迭代器遍历 vec3: \";\n for(vector::iterator it = vec3.begin(); it != vec3.end(); ++it) {\n cout << *it << ' ';\n }\n cout << endl << endl;\n\n // 6. 插入和删除元素\n // a. 在中间插入元素\n vec2.insert(vec2.begin() + 2, 50); // 在第三个位置插入50\n \n // b. 删除特定位置的元素\n vec2.erase(vec2.begin() + 1); // 删除第二个元素\n \n // c. 使用 pop_back() 删除末尾元素\n vec1.pop_back(); // 删除 vec1 的最后一个元素 (200)\n \n // d. 清空向量\n // vec3.clear(); // 取消注释将清空 vec3\n \n // 输出插入和删除后的向量\n cout << \"插入和删除元素示例:\" << endl;\n cout << \"vec2 (插入50并删除第二个元素): \";\n for(auto num : vec2) cout << num << ' ';\n cout << endl;\n cout << \"vec1 (pop_back): \";\n for(auto num : vec1) cout << num << ' ';\n cout << endl;\n // cout << \"vec3 清空后大小: \" << vec3.size() << endl;\n cout << endl;\n\n // 7. 迭代器的使用\n // a. 反向迭代器\n cout << \"使用反向迭代器遍历 vec4: \";\n for(auto rit = vec4.rbegin(); rit != vec4.rend(); ++rit) {\n cout << *rit << ' ';\n }\n cout << endl;\n \n // b. 常量迭代器\n cout << \"使用常量迭代器遍历 vec5: \";\n for(auto cit = vec5.cbegin(); cit != vec5.cend(); ++cit) {\n cout << *cit << ' ';\n }\n cout << endl << endl;\n\n // 8. 向量的大小和容量管理\n // a. size() 和 capacity()\n cout << \"向量大小和容量示例:\" << endl;\n cout << \"vec4 的大小: \" << vec4.size() << endl;\n cout << \"vec4 的容量: \" << vec4.capacity() << endl;\n \n // b. reserve() 预留容量\n vec4.reserve(20); // 预留至少20个元素的空间\n cout << \"vec4 预留容量后的容量: \" << vec4.capacity() << endl;\n \n // c. resize() 改变向量大小\n vec4.resize(10, 999); // 将 vec4 的大小调整为10,不足部分填充999\n cout << \"vec4 resize(10, 999) 后: \";\n for(auto num : vec4) cout << num << ' ';\n cout << endl << endl;\n\n // 9. 向量的排序和搜索\n // a. 使用 sort() 对向量进行排序\n vector vec6 = {5, 2, 9, 1, 5, 6};\n sort(vec6.begin(), vec6.end()); // [1, 2, 5, 5, 6, 9]\n \n // b. 使用 binary_search() 搜索元素(需要已排序)\n bool found = binary_search(vec6.begin(), vec6.end(), 5); // true\n bool notFound = binary_search(vec6.begin(), vec6.end(), 3); // false\n \n // c. 使用 find() 搜索元素\n auto it = find(vec6.begin(), vec6.end(), 6);\n \n // 输出排序和搜索的结果\n cout << \"向量排序和搜索示例:\" << endl;\n cout << \"vec6 排序后: \";\n for(auto num : vec6) cout << num << ' ';\n cout << endl;\n cout << \"binary_search 5: \" << (found ? \"找到\" : \"未找到\") << endl;\n cout << \"binary_search 3: \" << (notFound ? \"找到\" : \"未找到\") << endl;\n if(it != vec6.end())\n cout << \"find 6 的位置索引: \" << distance(vec6.begin(), it) << endl;\n else\n cout << \"find 6: 未找到\" << endl;\n cout << endl;\n\n // 10. 使用算法与向量结合\n // a. 计算向量元素的总和\n int sum = accumulate(vec6.begin(), vec6.end(), 0); // 1 + 2 + 5 + 5 + 6 + 9 = 28\n \n // b. 统计特定元素的数量\n int count_five = count(vec6.begin(), vec6.end(), 5); // 2\n \n // c. 使用 lambda 表达式和 for_each\n cout << \"使用算法与向量结合示例:\" << endl;\n cout << \"vec6 的总和: \" << sum << endl;\n cout << \"vec6 中5的数量: \" << count_five << endl;\n \n cout << \"vec6 的元素乘以2: \";\n for_each(vec6.begin(), vec6.end(), [](int &x) { x *= 2; });\n for(auto num : vec6) cout << num << ' ';\n cout << endl << endl;\n\n // 11. 二维向量\n // a. 创建二维向量\n vector> matrix;\n matrix.resize(3, vector(4, 0)); // 3行4列,所有元素初始化为0\n \n // b. 访问和修改二维向量元素\n matrix[0][0] = 1;\n matrix.at(1).at(2) = 5;\n matrix[2][3] = 9;\n \n // c. 遍历二维向量\n cout << \"二维向量示例:\" << endl;\n for(size_t i = 0; i < matrix.size(); ++i) {\n for(size_t j = 0; j < matrix[i].size(); ++j) {\n cout << matrix[i][j] << ' ';\n }\n cout << endl;\n }\n cout << endl;\n\n // 12. 向量的清空和检查\n // a. 使用 clear() 清空向量\n vec6.clear();\n \n // b. 使用 empty() 检查向量是否为空\n bool isVec6Empty = vec6.empty();\n \n // 输出清空和检查的结果\n cout << \"向量清空和检查示例:\" << endl;\n cout << \"vec6 清空后大小: \" << vec6.size() << endl;\n cout << \"vec6 是否为空: \" << (isVec6Empty ? \"是空的\" : \"不是空的\") << endl << endl;\n\n // 13. 向量的交换\n // a. 使用 swap() 交换两个向量的内容\n vector vec7 = {7, 8, 9};\n vector vec8 = {10, 11};\n cout << \"交换前:\" << endl;\n cout << \"vec7: \";\n for(auto num : vec7) cout << num << ' ';\n cout << endl;\n cout << \"vec8: \";\n for(auto num : vec8) cout << num << ' ';\n cout << endl;\n \n vec7.swap(vec8); // 交换 vec7 和 vec8 的内容\n \n cout << \"交换后:\" << endl;\n cout << \"vec7: \";\n for(auto num : vec7) cout << num << ' ';\n cout << endl;\n cout << \"vec8: \";\n for(auto num : vec8) cout << num << ' ';\n cout << endl << endl;\n\n // 14. 向量与自定义类型\n // a. 定义一个自定义结构体\n struct Person {\n string name;\n int age;\n \n // 重载输出运算符以便打印\n friend ostream& operator<<(ostream &os, const Person &p) {\n os << \"{Name: \" << p.name << \", Age: \" << p.age << \"}\";\n return os;\n }\n };\n \n // b. 创建向量并添加自定义类型元素\n vector people;\n people.push_back(Person{\"Alice\", 30});\n people.emplace_back(Person{\"Bob\", 25});\n \n // c. 访问和修改自定义类型元素\n people[0].age = 31;\n \n // d. 遍历自定义类型向量\n cout << \"向量与自定义类型示例:\" << endl;\n for(auto &person : people) {\n cout << person << ' ';\n }\n cout << endl << endl;\n\n // 15. 向量的复制和赋值\n // a. 使用拷贝构造函数\n vector vec9 = vec2;\n \n // b. 使用赋值运算符\n vector vec10;\n vec10 = vec4;\n \n // 输出复制和赋值后的向量\n cout << \"向量复制和赋值示例:\" << endl;\n cout << \"vec9 (拷贝自 vec2): \";\n for(auto num : vec9) cout << num << ' ';\n cout << endl;\n cout << \"vec10 (赋值自 vec4): \";\n for(auto num : vec10) cout << num << ' ';\n cout << endl << endl;\n\n // 16. 向量的比较\n // a. 使用 == 运算符\n bool areVec9Vec10Equal = (vec9 == vec10);\n \n // b. 使用 != 运算符\n bool areVec2Vec3NotEqual = (vec2 != vec3);\n \n // 输出比较结果\n cout << \"向量比较示例:\" << endl;\n cout << \"vec9 == vec10: \" << (areVec9Vec10Equal ? \"相等\" : \"不相等\") << endl;\n cout << \"vec2 != vec3: \" << (areVec2Vec3NotEqual ? \"不相等\" : \"相等\") << endl << endl;\n\n // 17. 向量的嵌套与操作\n // a. 创建一个向量的向量\n vector> vecOfVec;\n vecOfVec.push_back({\"C++\", \"Java\"});\n vecOfVec.emplace_back(vector{\"Python\", \"JavaScript\"});\n \n // b. 访问嵌套向量的元素\n cout << \"向量的嵌套与操作示例:\" << endl;\n for(size_t i = 0; i < vecOfVec.size(); ++i) {\n cout << \"子向量 \" << i << \": \";\n for(auto &lang : vecOfVec[i]) {\n cout << lang << ' ';\n }\n cout << endl;\n }\n cout << endl;\n\n // 18. 向量的迭代器高级用法\n // a. 使用 insert_iterator 和 back_inserter\n vector vec11 = {1, 2, 3};\n vector vec12 = {4, 5, 6};\n copy(vec12.begin(), vec12.end(), back_inserter(vec11)); // 将 vec12 追加到 vec11\n \n // b. 使用 reverse_iterator\n cout << \"使用 back_inserter 追加 vec12 到 vec11: \";\n for(auto num : vec11) cout << num << ' ';\n cout << endl;\n \n // c. 反转 vec11\n reverse(vec11.begin(), vec11.end());\n cout << \"反转后的 vec11: \";\n for(auto num : vec11) cout << num << ' ';\n cout << endl << endl;\n\n // 19. 向量的异常处理\n // a. 使用 try-catch 捕获 out_of_range 异常\n try {\n int invalidAccess = vec2.at(100); // 超出范围\n } catch(const out_of_range &e) {\n cout << \"异常处理示例:\" << endl;\n cout << \"尝试访问 vec2.at(100) 产生异常: \" << e.what() << endl << endl;\n }\n\n // 20. 向量的内存管理\n // a. 使用 shrink_to_fit() 缩减容量\n cout << \"向量内存管理示例:\" << endl;\n cout << \"vec4 的容量: \" << vec4.capacity() << endl;\n vec4.shrink_to_fit(); // 请求缩减容量以匹配大小\n cout << \"vec4 使用 shrink_to_fit() 后的容量: \" << vec4.capacity() << endl;\n \n return 0;\n}\n```\n\n### 代码详解\n\n1. **向量的初始化**\n - **默认初始化**:创建一个空的 `std::vector` 对象 `vec1`,初始大小为0。\n - **指定大小初始化**:`vec2` 被初始化为包含5个元素,每个元素的默认值为0。\n - **指定大小和初始值初始化**:`vec3` 被初始化为包含5个元素,每个元素的值为10。\n - **数组初始化**:使用一个整数数组 `arr` 初始化 `vec4`,向量中包含数组中的元素 `[1, 2, 3, 4, 5]`。\n - **初始化列表**:`vec5` 被初始化为包含字符串 `\"apple\"`, `\"banana\"`, `\"cherry\"`。\n\n2. **添加元素**\n - **`push_back()`**:向 `vec1` 添加两个元素 `100` 和 `200`,使其变为 `[100, 200]`。\n - **`emplace_back()`**:直接在 `vec5` 的末尾构造并添加字符串 `\"date\"`,变为 `[\"apple\", \"banana\", \"cherry\", \"date\"]`。\n - **`insert()`**:在 `vec4` 的第三个位置插入元素 `99`,使其变为 `[1, 2, 99, 3, 4, 5]`。\n\n3. **访问元素**\n - **下标访问**:通过 `vec4[0]` 访问第一个元素 `1`,但这种方式不安全,因为不会检查索引是否越界。\n - **`at()` 函数访问**:通过 `vec4.at(2)` 安全地访问第三个元素 `99`,如果索引越界,会抛出异常。\n - **`front()` 和 `back()`**:分别访问 `vec4` 的第一个元素 `1` 和最后一个元素 `5`。\n\n4. **修改元素**\n - **通过下标修改**:将 `vec4` 的第三个元素从 `99` 修改为 `150`,使其变为 `[1, 2, 150, 3, 4, 5]`。\n - **通过 `at()` 修改**:将 `vec5` 的第二个元素从 `\"banana\"` 修改为 `\"blueberry\"`,变为 `[\"apple\", \"blueberry\", \"cherry\", \"date\"]`。\n\n5. **向量的遍历**\n - **索引遍历**:使用传统的 `for` 循环通过索引访问 `vec4` 的每个元素。\n - **范围-based for 循环**:使用 C++11 的范围-based `for` 循环遍历 `vec5` 中的每个字符串。\n - **迭代器遍历**:使用迭代器从 `vec3` 的 `begin()` 到 `end()` 遍历其元素。\n\n6. **插入和删除元素**\n - **中间插入**:在 `vec2` 的第三个位置插入 `50`,使其变为 `[0, 0, 50, 0, 0]`。\n - **删除特定位置的元素**:删除 `vec2` 的第二个元素,结果为 `[0, 50, 0, 0]`。\n - **`pop_back()`**:删除 `vec1` 的最后一个元素 `200`,使其变为 `[100]`。\n - **清空向量**:通过 `vec3.clear()` 可以清空 `vec3` 的所有元素(此行代码被注释掉,可以根据需要取消注释)。\n\n7. **迭代器的使用**\n - **反向迭代器**:使用 `rbegin()` 和 `rend()` 反向遍历 `vec4` 的元素,从最后一个元素到第一个元素。\n - **常量迭代器**:使用 `cbegin()` 和 `cend()` 常量迭代器遍历 `vec5`,确保元素不被修改。\n\n8. **向量的大小和容量管理**\n - **`size()` 和 `capacity()`**:`size()` 返回向量当前包含的元素数量,`capacity()` 返回向量当前分配的内存空间(以元素为单位)。\n - **`reserve()`**:预留向量的容量,可以减少未来的内存重新分配。例如,`vec4.reserve(20)` 预留至少20个元素的空间。\n - **`resize()`**:调整向量的大小。`vec4.resize(10, 999)` 将 `vec4` 的大小调整为10,如果原本大小不足,新增的元素将被初始化为 `999`。\n\n9. **向量的排序和搜索**\n - **`sort()`**:使用 `std::sort` 对 `vec6` 进行排序,结果为 `[1, 2, 5, 5, 6, 9]`。\n - **`binary_search()`**:在已排序的 `vec6` 中搜索元素 `5` 和 `3`,分别返回 `true` 和 `false`。\n - **`find()`**:使用 `std::find` 在 `vec6` 中查找元素 `6`,并输出其位置索引。\n\n10. **使用算法与向量结合**\n - **`accumulate()`**:计算 `vec6` 中所有元素的总和,结果为 `28`。\n - **`count()`**:统计 `vec6` 中元素 `5` 的数量,结果为 `2`。\n - **`for_each()`**:使用 `std::for_each` 和 Lambda 表达式将 `vec6` 中的每个元素乘以2,修改后的 `vec6` 为 `[2, 4, 10, 10, 12, 18]`。\n\n11. **二维向量**\n - **创建二维向量**:`matrix` 被初始化为一个3行4列的二维向量,所有元素初始化为 `0`。\n - **访问和修改**:通过下标访问并修改特定位置的元素,如 `matrix[0][0] = 1`,`matrix.at(1).at(2) = 5`,`matrix[2][3] = 9`。\n - **遍历二维向量**:使用嵌套的 `for` 循环遍历 `matrix`,输出其元素。\n\n12. **向量的清空和检查**\n - **`clear()`**:清空 `vec6` 的所有元素,使其大小变为0。\n - **`empty()`**:检查 `vec6` 是否为空,返回 `true` 表示为空。\n\n13. **向量的交换**\n - **`swap()`**:交换 `vec7` 和 `vec8` 的内容。交换前 `vec7 = [7, 8, 9]`,`vec8 = [10, 11]`;交换后 `vec7 = [10, 11]`,`vec8 = [7, 8, 9]`。\n\n14. **向量与自定义类型**\n - **自定义结构体**:定义了一个 `Person` 结构体,包含 `name` 和 `age`,并重载了输出运算符以便打印。\n - **创建和操作自定义类型向量**:创建 `people` 向量,添加 `Person` 对象,修改元素,并遍历输出。\n\n15. **向量的复制和赋值**\n - **拷贝构造**:使用拷贝构造函数创建 `vec9`,复制自 `vec2`。\n - **赋值运算符**:使用赋值运算符将 `vec4` 的内容赋值给 `vec10`。\n - **输出复制和赋值后的向量**:展示 `vec9` 和 `vec10` 的内容。\n\n16. **向量的比较**\n - **`==` 运算符**:比较 `vec9` 和 `vec10` 是否相等。\n - **`!=` 运算符**:比较 `vec2` 和 `vec3` 是否不相等。\n - **输出比较结果**:根据比较结果输出相应的信息。\n\n17. **向量的嵌套与操作**\n - **创建向量的向量**:`vecOfVec` 被初始化为一个包含两个子向量的二维向量。\n - **访问嵌套向量的元素**:遍历 `vecOfVec` 并输出每个子向量的元素。\n\n18. **向量的迭代器高级用法**\n - **`back_inserter` 和 `copy()`**:使用 `std::back_inserter` 将 `vec12` 的元素复制并追加到 `vec11`。\n - **反转向量**:使用 `std::reverse` 反转 `vec11` 的元素。\n\n19. **向量的异常处理**\n - **异常捕获**:尝试通过 `vec2.at(100)` 访问超出范围的元素,使用 `try-catch` 捕获并处理 `out_of_range` 异常。\n\n20. **向量的内存管理**\n - **`shrink_to_fit()`**:请求 `vec4` 缩减其容量以匹配当前的大小,减少内存占用。\n\n### 运行示例\n\n编译并运行上述代码,可以看到以下示例输出:\n\n```\n向量初始化示例:\nvec1 (空向量) 的大小: 0\nvec2: 0 0 0 0 0 \nvec3: 10 10 10 10 10 \nvec4: 1 2 3 4 5 \nvec5: apple banana cherry \n\n添加元素示例:\nvec1: 100 200 \nvec4 (插入99): 1 2 99 3 4 5 \nvec5 (emplace_back 'date'): apple banana cherry date \n\n访问元素示例:\nvec4[0]: 1\nvec4.at(2): 99\nvec4.front(): 1\nvec4.back(): 5\n\n修改元素示例:\nvec4 (修改第三个元素为150): 1 2 150 3 4 5 \nvec5 (修改第二个元素为 'blueberry'): apple blueberry cherry date \n\n使用索引遍历 vec4: 1 2 150 3 4 5 \n使用范围-based for 遍历 vec5: apple blueberry cherry date \n使用迭代器遍历 vec3: 10 10 10 10 10 \n\n插入和删除元素示例:\nvec2 (插入50并删除第二个元素): 0 50 0 0 \nvec1 (pop_back): 100 \n\n使用反向迭代器遍历 vec4: 5 4 3 150 2 1 \n使用常量迭代器遍历 vec5: apple blueberry cherry date \n\n向量大小和容量示例:\nvec4 的大小: 6\nvec4 的容量: 6\nvec4 预留容量后的容量: 20\nvec4 resize(10, 999) 后: 1 2 150 3 4 5 999 999 999 999 \n\n向量排序和搜索示例:\nvec6 排序后: 1 2 5 5 6 9 \nbinary_search 5: 找到\nbinary_search 3: 未找到\nfind 6 的位置索引: 4\n\n使用算法与向量结合示例:\nvec6 的总和: 28\nvec6 中5的数量: 2\nvec6 的元素乘以2: 2 4 10 10 12 18 \n\n二维向量示例:\n1 0 0 0 \n0 0 5 0 \n0 0 0 9 \n\n向量清空和检查示例:\nvec6 清空后大小: 0\nvec6 是否为空: 是空的\n\n向量复制和赋值示例:\nvec9 (拷贝自 vec2): 0 50 0 0 \nvec10 (赋值自 vec4): 1 2 150 3 4 5 999 999 999 999 \n\n向量比较示例:\nvec9 == vec10: 不相等\nvec2 != vec3: 相等\n\n向量的嵌套与操作示例:\n子向量 0: C++ Java \n子向量 1: Python JavaScript \n\n使用 back_inserter 追加 vec12 到 vec11: 1 2 3 4 5 6 \n反转后的 vec11: 6 5 4 3 2 1 \n\n异常处理示例:\n尝试访问 vec2.at(100) 产生异常: vector::_M_range_check: __n (which is 100) >= this->size() (which is 4)\n\n向量内存管理示例:\nvec4 的容量: 20\nvec4 使用 shrink_to_fit() 后的容量: 10\n```\n\n### 总结\n\n通过上述代码示例和详细注释,全面展示了C++ `std::vector` 库的各种功能和使用方法。掌握这些基本操作对于进行高效的动态数组处理和编程开发至关重要。希望本示例能够帮助您更好地理解和应用C++中的向量库。", "编程语言/CSharp/mono和dotnet的区别.md": "Mono 和 .NET(尤其是 .NET Core/5+)均为跨平台的 .NET 生态实现,但在背景、定位和特性上存在显著差异:\n \n1. 背景与归属\n \n- .NET(官方)\n \n- 由微软主导开发,最初是 Windows 专属框架(.NET Framework)。\n- 2016 年推出开源跨平台的 .NET Core,后整合为 .NET 5+,成为统一的跨平台版本。\n- 官方支持 Windows、macOS、Linux 等主流系统,强调高性能和现代化开发。\n- Mono\n \n- 由第三方团队(Xamarin,后被微软收购)于 2000 年代初开发,是最早的跨平台 .NET 实现。\n- 目标是将 .NET 框架移植到非 Windows 系统(如 Linux、macOS、Android、iOS 等)。\n- 开源但实现进度滞后于官方版本,依赖社区维护。\n \n2. 核心差异\n \n特性 .NET(Core/5+) Mono \n类库 官方提供 CoreFX(精简且持续更新) 部分兼容 .NET 类库,但存在功能缺失或延迟 \n运行时 CoreCLR(优化性能,支持 JIT/AOT) Mono VM(需适配多平台,维护成本高) \n兼容性 高度兼容 .NET Framework 应用 对旧版 .NET 支持较好,但新特性支持不足 \n性能 针对现代工作负载优化,速度更快 性能稍弱,尤其在复杂场景(如 Web 服务) \n生态支持 官方支持力度大,社区活跃,第三方库丰富 社区较小,依赖特定领域(如 Unity 早期) \n \n3. 典型应用场景\n \n- .NET(Core/5+)\n \n- 现代 Web 应用、云服务、微服务、桌面应用(通过 MAUI)。\n- 适合追求高性能和长期稳定性的项目。\n- Mono\n \n- 遗留 .NET 应用跨平台迁移(如 Linux 服务器)。\n- 游戏开发(Unity 早期依赖 Mono,但现已转向 .NET)。\n- 对实时编译限制严格的场景(如 iOS 的 AOT 模式)。\n \n4. 总结\n \n- 选择 .NET:若需官方支持、高性能和最新技术(如云原生、微服务),优先选 .NET 5+。\n- 选择 Mono:若需兼容旧版 .NET 应用或特定平台(如早期 Unity 项目),可考虑 Mono。\n \n两者最终目标一致(跨平台运行 .NET 应用),但 .NET 作为官方方案更具前瞻性,而 Mono 更偏向历史兼容性。", - "编程语言/Flutter/Flutter安卓构建注意事项.md": "\n\n```powershell\n#国内优先使用这个地址构建\n$env:FLUTTER_STORAGE_BASE_URL=\"https://storage.flutter-io.cn\"; $env:PUB_HOSTED_URL=\"https://pub.flutter-io.cn\"; flutter build apk --release \n\n#再使用这个运行\nflutter run\n```\n\n\n记得修改一下项目android\\app\\build.gradle.kts文件的包名\n    namespace = \"com.example.farmvisualconfig\"", - "编程语言/Flutter/Flutter常用命令.md": "\n---\n\n## 🛠️ 环境配置相关\n\n```bash\nflutter --version # 查看 Flutter 版本\nflutter upgrade # 升级 Flutter SDK\nflutter downgrade # 降级到上一个版本\nflutter doctor # 检查环境配置\nflutter config --enable-windows-desktop # 启用 Windows 桌面支持\nflutter config --enable-web # 启用 Web 支持\nflutter devices # 查看可用设备\n```\n\n---\n\n## 📦 项目管理\n\n```bash\nflutter create my_app # 创建新项目\nflutter clean # 清理构建缓存\nflutter pub get # 获取依赖\nflutter pub upgrade # 升级依赖\nflutter pub outdated # 检查依赖可更新版本\nflutter pub add http # 添加依赖(例如 http)\nflutter pub remove http # 移除依赖\n```\n\n---\n\n## ▶️ 运行调试\n\n```bash\nflutter run # 在默认设备上运行\nflutter run -d windows # 在 Windows 桌面运行\nflutter run -d chrome # 在浏览器运行\nflutter run -d emulator-5554 # 指定设备运行(比如 Android 模拟器)\n```\n\n---\n\n## 🏗️ 构建打包\n\n```bash\nflutter build apk # 构建 Android APK\nflutter build appbundle # 构建 Android AAB (上传 Google Play)\nflutter build ios # 构建 iOS 应用\nflutter build windows # 构建 Windows 应用\nflutter build web # 构建 Web 应用\nflutter build linux # 构建 Linux 应用\nflutter build macos # 构建 macOS 应用\n```\n\n---\n\n## 🔄 热重载 / 热重启\n\n运行 `flutter run` 后,命令行里可以:\n\n- `r` → 热重载(Hot reload,保留状态)\n \n- `R` → 热重启(Hot restart,重启应用)\n \n- `q` → 退出运行\n \n\n---\n\n## 🔍 代码检查 & 性能\n\n```bash\nflutter analyze # 分析代码问题\nflutter format . # 格式化代码(整个项目)\nflutter test # 运行单元测试\nflutter pub run build_runner build # 代码生成(json_serializable 等常用)\n```\n\n---\n\n## 🌐 其他常用\n\n```bash\ndart --version # 查看 Dart 版本\ndart pub global activate devtools # 启用 DevTools\nflutter pub global run devtools # 启动 DevTools\n```\n\n---\n\n📌 **最常用的组合命令**:\n\n1. `flutter pub get` → 拉依赖\n \n2. `flutter run -d windows` → 运行调试\n \n3. `flutter build windows` → 打包 Windows\n \n4. `flutter clean && flutter pub get` → 出问题时清理依赖\n \n\n---\n", - "编程语言/Flutter/Flutter构建平台产物位置.md": "\n### 一、通用说明\n\nFlutter 项目的构建产物默认存放在项目根目录的 build 文件夹下,该文件夹会根据目标平台自动创建子目录,存放对应平台的编译文件、安装包等。\n\n### 二、各个平台构建产物位置\n\n#### 1. Android 平台\n\n**构建命令**:\nflutter build apk(默认 release 模式)、flutter build appbundle(AAB 格式)\n\n**产物位置**:\nAPK 文件:\n项目根目录/build/app/outputs/flutter-apk/\n文件名通常为 app-release.apk(release 模式)或 app-debug.apk(debug 模式)。\n\nAAB 文件(Android App Bundle):\n项目根目录/build/app/outputs/bundle/release/app-release.aab\n\n#### 2. iOS 平台\n\n**构建命令**:\nflutter build ios(release 模式)、flutter build ios --debug(debug 模式)\n\n**产物位置**:\n编译后的应用文件(.app 格式):\n项目根目录/build/ios/iphoneos/Runner.app(真机运行)或 build/ios/iphonesimulator/Runner.app(模拟器)。\n\nIPA 安装包(需通过 Xcode 导出):\n若使用 flutter build ipa 命令,产物会存放在 项目根目录/build/ios/ipa/,文件名为 Runner.ipa。\n\n#### 3. 桌面平台(Windows/macOS/Linux)\n\n需先通过 flutter config --enable-[windows/macos/linux]-desktop 开启对应平台支持。\n\n***Windows**:*\n\n**构建命令:**\nflutter build windows\n\n**产物位置:**\n项目根目录/build/windows/runner/Release/(release 模式),包含可执行文件 Runner.exe 及相关依赖库。\n\n***macOS:***\n\n**构建命令:**\nflutter build macos\n\n**产物位置:**\n项目根目录/build/macos/Build/Products/Release/Runner.app(release 模式),这是一个 macOS 应用包。\n\n***Linux**:*\n\n**构建命令:**\nflutter build linux\n\n**产物位置:**\n项目根目录/build/linux/x64/release/bundle/(64 位系统),包含可执行文件 runner 及依赖文件。\n\n#### 4. Web 平台\n\n**构建命令**:\nflutter build web(默认 release 模式)\n\n**产物位置**:\n项目根目录/build/web/,包含 HTML、CSS、JavaScript 等静态文件,可直接部署到 Web 服务器(如 Nginx、Apache 等)。\n\n### 三、注意事项\n\n- **debug 与 release 模式**:debug 模式的产物通常用于开发调试,体积较大且包含调试信息;release 模式产物经过优化,适合发布,默认存放在对应平台的 release 子目录中。\n\n- **自定义输出路径**:部分命令支持通过参数指定输出路径,例如 flutter build apk --output=./my_app.apk 可将 APK 输出到根目录并命名为 my_app.apk。\n", - "编程语言/Java/Java基础-导入java文件.md": "\n## 🔹 情况 1:同一个包里的多个.java文件\n\n如果两个类在同一个包(或者没写 `package`,都在默认包),\n只要把它们放在同一个目录下,直接编译就能互相使用。\n\n例子:\n\n📂 目录结构:\n\n```\nHelloWorld.java\nUtils.java\n```\n\n**HelloWorld.java**\n\n```java\npublic class HelloWorld {\n public static void main(String[] args) {\n Utils.sayHi();\n }\n}\n```\n\n**Utils.java**\n\n```java\npublic class Utils {\n public static void sayHi() {\n System.out.println(\"Hello from Utils!\");\n }\n}\n```\n\n**编译运行:**\n\n```bash\njavac HelloWorld.java Utils.java\njava HelloWorld\n```\n\n**输出:**\n\n```\nHello from Utils!\n```\n\n---\n\n## 🔹 情况 2:不同包的类\n\n如果你要用别的包里的类,需要用 import\n\n**目录结构:**\n\n```\nsrc/\n ├─ app/\n │ └─ HelloWorld.java\n └─ util/\n └─ Utils.java\n```\n\n**util/Utils.java**\n\n```java\npackage util;\n\npublic class Utils {\n public static void sayHi() {\n System.out.println(\"Hello from util.Utils!\");\n }\n}\n```\n\n**app/HelloWorld.java**\n\n```java\npackage app;\n\nimport util.Utils; // 导入 util 包里的 Utils 类\n\npublic class HelloWorld {\n public static void main(String[] args) {\n Utils.sayHi();\n }\n}\n```\n\n**编译:**\n\n```bash\njavac src/util/Utils.java src/app/HelloWorld.java -d out\n```\n\n**运行:**\n\n```bash\njava -cp out app.HelloWorld\n```\n\n---\n\n## 🔹 总结\n\n1. **同目录、同包**:直接用,不需要 `import`。\n2. **不同目录、不同包**:必须用 `package` 和 `import`,再用 `-d` 编译指定输出目录。\n\n---\n\n", + "编程语言/CSharp/代码片段/代码片段-标准HelloWorld输出.md": "```csharp\nusing System;\n\nclass Program {\n static void Main() {\n Console.WriteLine(\"Hello, World!\");\n }\n}\n```", + "编程语言/CSharp/代码片段/代码片段-特殊HelloWorld输出.md": "```csharp\n//使用特性(Attributes)\nusing System;\n\n[AttributeUsage(AttributeTargets.Class)]\npublic class HelloAttribute : Attribute {\n public HelloAttribute() {\n Console.WriteLine(\"Hello, World!\");\n }\n}\n\n[Hello]\nclass Program {\n static void Main() { }\n}\n```", + "编程语言/Flutter&Dart/Flutter安卓构建注意事项.md": "\n\n```powershell\n#国内优先使用这个地址构建\n$env:FLUTTER_STORAGE_BASE_URL=\"https://storage.flutter-io.cn\"; $env:PUB_HOSTED_URL=\"https://pub.flutter-io.cn\"; flutter build apk --release \n\n#再使用这个运行\nflutter run\n```\n\n\n记得修改一下项目android\\app\\build.gradle.kts文件的包名\n    namespace = \"com.example.farmvisualconfig\"", + "编程语言/Flutter&Dart/Flutter常用命令.md": "\n---\n\n## 🛠️ 环境配置相关\n\n```bash\nflutter --version # 查看 Flutter 版本\nflutter upgrade # 升级 Flutter SDK\nflutter downgrade # 降级到上一个版本\nflutter doctor # 检查环境配置\nflutter config --enable-windows-desktop # 启用 Windows 桌面支持\nflutter config --enable-web # 启用 Web 支持\nflutter devices # 查看可用设备\n```\n\n---\n\n## 📦 项目管理\n\n```bash\nflutter create my_app # 创建新项目\nflutter clean # 清理构建缓存\nflutter pub get # 获取依赖\nflutter pub upgrade # 升级依赖\nflutter pub outdated # 检查依赖可更新版本\nflutter pub add http # 添加依赖(例如 http)\nflutter pub remove http # 移除依赖\n```\n\n---\n\n## ▶️ 运行调试\n\n```bash\nflutter run # 在默认设备上运行\nflutter run -d windows # 在 Windows 桌面运行\nflutter run -d chrome # 在浏览器运行\nflutter run -d emulator-5554 # 指定设备运行(比如 Android 模拟器)\n```\n\n---\n\n## 🏗️ 构建打包\n\n```bash\nflutter build apk # 构建 Android APK\nflutter build appbundle # 构建 Android AAB (上传 Google Play)\nflutter build ios # 构建 iOS 应用\nflutter build windows # 构建 Windows 应用\nflutter build web # 构建 Web 应用\nflutter build linux # 构建 Linux 应用\nflutter build macos # 构建 macOS 应用\n```\n\n---\n\n## 🔄 热重载 / 热重启\n\n运行 `flutter run` 后,命令行里可以:\n\n- `r` → 热重载(Hot reload,保留状态)\n \n- `R` → 热重启(Hot restart,重启应用)\n \n- `q` → 退出运行\n \n\n---\n\n## 🔍 代码检查 & 性能\n\n```bash\nflutter analyze # 分析代码问题\nflutter format . # 格式化代码(整个项目)\nflutter test # 运行单元测试\nflutter pub run build_runner build # 代码生成(json_serializable 等常用)\n```\n\n---\n\n## 🌐 其他常用\n\n```bash\ndart --version # 查看 Dart 版本\ndart pub global activate devtools # 启用 DevTools\nflutter pub global run devtools # 启动 DevTools\n```\n\n---\n\n📌 **最常用的组合命令**:\n\n1. `flutter pub get` → 拉依赖\n \n2. `flutter run -d windows` → 运行调试\n \n3. `flutter build windows` → 打包 Windows\n \n4. `flutter clean && flutter pub get` → 出问题时清理依赖\n \n\n---\n", + "编程语言/Flutter&Dart/Flutter构建平台产物位置.md": "\n### 一、通用说明\n\nFlutter 项目的构建产物默认存放在项目根目录的 build 文件夹下,该文件夹会根据目标平台自动创建子目录,存放对应平台的编译文件、安装包等。\n\n### 二、各个平台构建产物位置\n\n#### 1. Android 平台\n\n**构建命令**:\nflutter build apk(默认 release 模式)、flutter build appbundle(AAB 格式)\n\n**产物位置**:\nAPK 文件:\n项目根目录/build/app/outputs/flutter-apk/\n文件名通常为 app-release.apk(release 模式)或 app-debug.apk(debug 模式)。\n\nAAB 文件(Android App Bundle):\n项目根目录/build/app/outputs/bundle/release/app-release.aab\n\n#### 2. iOS 平台\n\n**构建命令**:\nflutter build ios(release 模式)、flutter build ios --debug(debug 模式)\n\n**产物位置**:\n编译后的应用文件(.app 格式):\n项目根目录/build/ios/iphoneos/Runner.app(真机运行)或 build/ios/iphonesimulator/Runner.app(模拟器)。\n\nIPA 安装包(需通过 Xcode 导出):\n若使用 flutter build ipa 命令,产物会存放在 项目根目录/build/ios/ipa/,文件名为 Runner.ipa。\n\n#### 3. 桌面平台(Windows/macOS/Linux)\n\n需先通过 flutter config --enable-[windows/macos/linux]-desktop 开启对应平台支持。\n\n***Windows**:*\n\n**构建命令:**\nflutter build windows\n\n**产物位置:**\n项目根目录/build/windows/runner/Release/(release 模式),包含可执行文件 Runner.exe 及相关依赖库。\n\n***macOS:***\n\n**构建命令:**\nflutter build macos\n\n**产物位置:**\n项目根目录/build/macos/Build/Products/Release/Runner.app(release 模式),这是一个 macOS 应用包。\n\n***Linux**:*\n\n**构建命令:**\nflutter build linux\n\n**产物位置:**\n项目根目录/build/linux/x64/release/bundle/(64 位系统),包含可执行文件 runner 及依赖文件。\n\n#### 4. Web 平台\n\n**构建命令**:\nflutter build web(默认 release 模式)\n\n**产物位置**:\n项目根目录/build/web/,包含 HTML、CSS、JavaScript 等静态文件,可直接部署到 Web 服务器(如 Nginx、Apache 等)。\n\n### 三、注意事项\n\n- **debug 与 release 模式**:debug 模式的产物通常用于开发调试,体积较大且包含调试信息;release 模式产物经过优化,适合发布,默认存放在对应平台的 release 子目录中。\n\n- **自定义输出路径**:部分命令支持通过参数指定输出路径,例如 flutter build apk --output=./my_app.apk 可将 APK 输出到根目录并命名为 my_app.apk。\n", + "编程语言/Golang/Golang标准库热门模块.md": "\n**fmt — 字符串格式化、打印**\n常用:Print*、Sprintf、Fprintf、Errorf。\nImported by:5,417,076(go1.25.3 页面)。 \n\n**time — 时间/定时/计时**\n常用:Now、Sleep、Ticker/Timer、Parse/Format、Since/Until、time.Duration。\nImported by:2,690,536。 \n\n**strings — 字符串处理**\n常用:Contains/HasPrefix、Split/Join、Replace(All)、ToUpper/Lower、Trim*、Builder。\nImported by:2,527,595。 \n\n**os — 操作系统接口(文件、进程、环境变量)**\n常用:ReadFile/WriteFile、Open/Create、Mkdir(All)/Remove、Getenv/Setenv、Executable。\nImported by:2,364,233。 \n\n**strconv — 字符串与数字/布尔转换**\n常用:Atoi、Itoa、ParseInt/Uint/Float、FormatInt/Float、Append*。\nImported by:1,720,862。 \n\n**net/http — HTTP 客户端/服务端**\n常用:客户端 http.Client/Get/Do;服务端 ListenAndServe、Handle(Func)、Server.Shutdown、Cookie。\nImported by:1,705,800。 \n\n**io — 基础 I/O 抽象与工具**\n常用接口:Reader/Writer/Closer;工具:Copy/ReadAll/TeeReader/MultiReader/MultiWriter。\nImported by:1,492,765。 \n\n**errors — 错误构造与包装**\n常用:New、Is、As、Join、Unwrap。\nImported by:1,570,292。 \n\n**encoding/json — JSON 编解码**\n常用:Marshal/Unmarshal、NewEncoder/NewDecoder、RawMessage、Valid。\nImported by:1,437,939。 \n\n**log — 轻量日志**\n常用:Print*、Printf、SetOutput、SetFlags;(复杂需求多用第三方)\nImported by:1,357,278。 \n\n**sync — 并发原语**\n常用:Mutex/RWMutex、WaitGroup、Once、Cond、Pool。\nImported by:1,291,596。 \n\n**bytes — []byte 处理(与 strings 类似)**\n常用:Buffer、Reader、Split/Join、Replace(All)、ToUpper/Lower、Trim*。\nImported by:1,189,998。 \n\n**bufio — 带缓冲的 I/O**\n常用:Reader(ReadString/ReadBytes/Peek)、Writer(Flush)、Scanner。\nImported by:1,094,139。 \n\n**path/filepath — 跨平台文件路径**\n常用:Join/Split/Base/Dir、Ext、Abs/Rel、WalkDir、Glob。\nImported by:1,047,304。 \n\n**regexp — 正则表达式**\n常用:MustCompile、Match、ReplaceAll*、Find(All)*、SubexpNames。\nImported by:917,674。 \n\n**reflect — 反射(元编程/通用库常用)**\n常用:TypeOf/ValueOf、Value.Field/Method、DeepEqual(1.22 起也有 slices.Equal 可替代部分场景)。\nImported by:793,184。 \n", + "编程语言/Golang/代码片段/代码片段-标准HelloWorld输出.md": "```go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n fmt.Println(\"Hello, World!\")\n}\n```", + "编程语言/Golang/代码片段/代码片段-特殊HelloWorld输出.md": "```go\n//使用goroutine和channel\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n ch := make(chan string)\n go func() {\n ch <- \"Hello, World!\"\n }()\n fmt.Println(<-ch)\n}\n```", + "编程语言/Java/Java中的map,set,list比较.md": "\n---\n\n### 核心概念总览\n\n| 特性 | List(列表) | Set(集合) | Map(映射) |\n| :--- | :--- | :--- | :--- |\n| **核心接口** | `java.util.List` | `java.util.Set` | `java.util.Map` |\n| **继承关系** | 继承自 `Collection` | 继承自 `Collection` | 独立接口,不继承 `Collection` |\n| **元素顺序** | **有序**(插入顺序) | 通常**无序**(`LinkedHashSet`等除外) | 通常**无序**(`LinkedHashMap`等除外) |\n| **元素唯一性** | **允许重复** | **不允许重复** | **Key 不允许重复**,Value 可以重复 |\n| **元素访问** | 通过**索引**(index) | 只能通过**迭代器**或增强 for 循环 | 通过 **Key** 来访问 Value |\n| **常见实现类** | `ArrayList`, `LinkedList`, `Vector` | `HashSet`, `LinkedHashSet`, `TreeSet` | `HashMap`, `LinkedHashMap`, `TreeMap`, `Hashtable` |\n| **是否允许 null** | 是 | `HashSet` 允许一个 null,`TreeSet` 不允许 | `HashMap` 允许一个 null key,`Hashtable` 不允许 |\n\n---\n\n### 1. List(列表)\n\nList 是一个**有序**的、**允许重复元素**的集合。用户可以精确控制列表中每个元素的插入位置,并且可以通过整数索引(类似于数组下标)来访问元素。\n\n**核心特性:**\n* **有序(Ordered)**:元素按照插入的顺序存储。\n* **可重复(Allows Duplicates)**:可以添加多个相同的元素(包括多个 `null`)。\n* **索引访问(Indexed Access)**:提供了基于下标(从 0 开始)的 `get(int index)` 和 `set(int index, E element)` 方法。\n\n**主要实现类:**\n\n1. **`ArrayList`**\n * **底层结构**:基于**动态数组**。\n * **特点**:\n * **查询快**:因为实现了 `RandomAccess` 接口,通过索引随机访问元素的速度极快(时间复杂度 O(1))。\n * **增删慢**:在列表中间插入或删除元素时,需要移动后续所有元素,性能较差(平均时间复杂度 O(n))。\n * **使用场景**:**查询操作远多于增删操作**的场景。这是最常用的 List 实现。\n\n2. **`LinkedList`**\n * **底层结构**:基于**双向链表**。\n * **特点**:\n * **增删快**:在链表头部或尾部(已知位置)插入/删除元素很快(时间复杂度 O(1))。在中间位置需要先遍历找到位置。\n * **查询慢**:按索引查询需要从头或尾开始遍历链表(平均时间复杂度 O(n))。\n * 实现了 `Deque` 接口,可以被用作**栈**或**队列**。\n * **使用场景**:需要频繁在列表**首尾进行增删操作**,或者频繁使用栈/队列结构的场景。\n\n3. **`Vector`(已过时,不推荐使用)**\n * **底层结构**:基于动态数组,是线程安全的。\n * **特点**:其所有方法都是 `synchronized` 的,保证了线程安全,但性能开销大。\n * **替代品**:在需要线程安全时,可以使用 `Collections.synchronizedList(new ArrayList(...))` 或者 `CopyOnWriteArrayList`。\n\n**代码示例:**\n```java\nList arrayList = new ArrayList<>();\narrayList.add(\"Apple\"); // 索引 0\narrayList.add(\"Banana\"); // 索引 1\narrayList.add(\"Apple\"); // 允许重复\narrayList.add(null); // 允许 null\n\nSystem.out.println(arrayList); // 输出:[Apple, Banana, Apple, null]\nSystem.out.println(arrayList.get(1)); // 输出:Banana\n\nList linkedList = new LinkedList<>();\nlinkedList.addFirst(\"First\"); // 在头部添加\nlinkedList.addLast(\"Last\"); // 在尾部添加\n```\n\n---\n\n### 2. Set(集合)\n\nSet 是一个**不允许重复元素**的集合。它模拟了数学上的“集合”概念。最多只能包含一个 `null` 元素。\n\n**核心特性:**\n* **唯一性(Unique Elements)**:集合中不允许存在两个相等的元素。判断相等的依据是 `equals()` 和 `hashCode()` 方法。\n* **通常无序(Generally Unordered)**:大多数实现不保证元素的顺序(但 `LinkedHashSet` 和 `TreeSet` 例外)。\n\n**主要实现类:**\n\n1. **`HashSet`**\n * **底层结构**:基于 **HashMap**(本质上是只使用了 HashMap 的 Key)。\n * **特点**:\n * **无序**:不保证元素的迭代顺序。\n * **性能最好**:添加、删除、查找(`contains`)操作的时间复杂度都是 **O(1)**。\n * **使用场景**:最常用的 Set,用于需要快速查找且不关心顺序的场景。\n\n2. **`LinkedHashSet`**\n * **底层结构**:继承自 `HashSet`,但内部使用 **链表** 维护了元素的**插入顺序**。\n * **特点**:\n * **有序**:迭代顺序就是元素的插入顺序。\n * 性能略低于 `HashSet`,因为需要维护链表。\n * **使用场景**:既需要 Set 的**唯一性**,又希望保留元素的**插入顺序**。\n\n3. **`TreeSet`**\n * **底层结构**:基于 **红黑树**(一种自平衡的二叉查找树)。\n * **特点**:\n * **有序**:元素按照**自然顺序**(如数字从小到大,字符串字典序)或者根据构造时提供的 **Comparator** 进行排序。\n * 添加、删除、查找操作的时间复杂度是 **O(log n)**。\n * **不允许 `null` 元素**。\n * **使用场景**:需要元素**自动排序**的场景。\n\n**代码示例:**\n```java\nSet hashSet = new HashSet<>();\nhashSet.add(\"Apple\");\nhashSet.add(\"Banana\");\nhashSet.add(\"Apple\"); // 这个重复元素不会被添加\nhashSet.add(null);\n\nSystem.out.println(hashSet); // 输出可能是:[null, Apple, Banana] (无序)\n\nSet linkedHashSet = new LinkedHashSet<>();\nlinkedHashSet.add(\"Banana\");\nlinkedHashSet.add(\"Apple\");\nSystem.out.println(linkedHashSet); // 输出:[Banana, Apple] (保持插入顺序)\n\nSet treeSet = new TreeSet<>();\ntreeSet.add(3);\ntreeSet.add(1);\ntreeSet.add(2);\nSystem.out.println(treeSet); // 输出:[1, 2, 3] (自然排序)\n```\n\n---\n\n### 3. Map(映射)\n\nMap 是一个用于存储 **键值对(Key-Value Pairs)** 的集合。每个 Key 映射到一个 Value。Key 不允许重复,但不同的 Key 可以映射到相同的 Value。\n\n**核心特性:**\n* **键值对(Key-Value Pairs)**:数据以 `Key=Value` 的形式存储。\n* **Key 唯一(Unique Keys)**:一个 Map 中不能包含重复的 Key。判断 Key 是否重复的依据是 `equals()` 和 `hashCode()` 方法。\n* **每个 Key 对应一个 Value**:一个 Key 只能映射到一个 Value。\n\n**主要实现类:**\n\n1. **`HashMap`**\n * **底层结构**:基于 **数组+链表+红黑树**(JDK 8 以后)。\n * **特点**:\n * **无序**:不保证键值对的顺序。\n * **性能最好**:get 和 put 操作的时间复杂度在理想情况下是 **O(1)**。\n * **允许 `null` 作为 Key 和 Value**。\n * **使用场景**:最常用的 Map,适用于绝大多数键值对存储场景。\n\n2. **`LinkedHashMap`**\n * **底层结构**:继承自 `HashMap`,并使用**链表**维护了**插入顺序**或**访问顺序**。\n * **特点**:\n * **有序**:迭代顺序可以是**插入顺序**或**访问顺序**(最近最少使用的元素在前)。\n * 性能略低于 `HashMap`。\n * **使用场景**:需要保留键值对的**插入顺序**,或者用它来实现 **LRU(最近最少使用)缓存**。\n\n3. **`TreeMap`**\n * **底层结构**:基于 **红黑树**。\n * **特点**:\n * **有序**:Key 按照**自然顺序**或指定的 **Comparator** 进行排序。\n * 操作的时间复杂度为 **O(log n)**。\n * **不允许 `null` Key**。\n * **使用场景**:需要 Key **自动排序**的场景。\n\n4. **`Hashtable`(已过时,不推荐使用)**\n * **底层结构**:类似 `HashMap`,是线程安全的。\n * **特点**:所有方法都是 `synchronized` 的,性能差。\n * **不允许 `null` 作为 Key 或 Value**。\n * **替代品**:使用 `ConcurrentHashMap` 或 `Collections.synchronizedMap(new HashMap(...))`。\n\n**代码示例:**\n```java\nMap hashMap = new HashMap<>();\nhashMap.put(\"Alice\", 90);\nhashMap.put(\"Bob\", 85);\nhashMap.put(\"Alice\", 95); // 覆盖 Key \"Alice\" 原来的值\nhashMap.put(null, 100); // 允许 null key\n\nSystem.out.println(hashMap); // 输出可能是:{null=100, Bob=85, Alice=95}\nSystem.out.println(hashMap.get(\"Bob\")); // 输出:85\n\nMap linkedHashMap = new LinkedHashMap<>();\nlinkedHashMap.put(\"Bob\", 85);\nlinkedHashMap.put(\"Alice\", 95);\nSystem.out.println(linkedHashMap); // 输出:{Bob=85, Alice=95} (插入顺序)\n\nMap treeMap = new TreeMap<>();\ntreeMap.put(\"Orange\", 10);\ntreeMap.put(\"Apple\", 20);\nSystem.out.println(treeMap); // 输出:{Apple=20, Orange=10} (Key的字典序)\n```\n\n---\n\n### 总结与选择\n\n* **需要允许重复且有顺序?** -> 选择 **`List`**\n * 查询多,增删少 -> **`ArrayList`**\n * 增删多,查询少,或需要栈/队列 -> **`LinkedList`**\n\n* **需要元素唯一,不关心顺序?** -> 选择 **`Set`**\n * 只关心唯一性,追求最高性能 -> **`HashSet`**\n * 需要保留插入顺序 -> **`LinkedHashSet`**\n * 需要元素自动排序 -> **`TreeSet`**\n\n* **需要通过键(Key)来查找值(Value)?** -> 选择 **`Map`**\n * 绝大多数场景,不关心顺序 -> **`HashMap`**\n * 需要保留键值对的插入顺序或实现LRU -> **`LinkedHashMap`**\n * 需要键自动排序 -> **`TreeMap`**\n * 高并发场景 -> **`ConcurrentHashMap`**\n\n", + "编程语言/Java/Java基础-处理异常方法.md": "\n## 1. 异常分类\n\n### 1.1 检查型异常 (Checked Exceptions)\n- 必须处理,否则编译不通过\n- 继承自 `Exception`\n- 示例:`IOException`, `SQLException`, `ClassNotFoundException`\n\n### 1.2 非检查型异常 (Unchecked Exceptions)\n- 不需要强制处理\n- 继承自 `RuntimeException`\n- 示例:`NullPointerException`, `ArrayIndexOutOfBoundsException`, `IllegalArgumentException`\n\n### 1.3 错误 (Errors)\n- 系统级错误,程序通常无法恢复\n- 继承自 `Error`\n- 示例:`OutOfMemoryError`, `StackOverflowError`\n\n## 2. 异常处理机制\n\n### 2.1 try-catch-finally 块\n```java\ntry {\n // 可能抛出异常的代码\n FileInputStream file = new FileInputStream(\"test.txt\");\n int data = file.read();\n} catch (FileNotFoundException e) {\n // 处理特定异常\n System.out.println(\"文件未找到: \" + e.getMessage());\n} catch (IOException e) {\n // 处理IO异常\n System.out.println(\"IO错误: \" + e.getMessage());\n} finally {\n // 无论是否发生异常都会执行\n System.out.println(\"清理资源\");\n // file.close(); // 实际应该在这里关闭资源\n}\n```\n\n### 2.2 try-with-resources (Java 7+)\n```java\n// 自动关闭资源,实现AutoCloseable接口的资源\ntry (FileInputStream file = new FileInputStream(\"test.txt\");\n BufferedReader reader = new BufferedReader(new InputStreamReader(file))) {\n \n String line;\n while ((line = reader.readLine()) != null) {\n System.out.println(line);\n }\n} catch (IOException e) {\n System.out.println(\"读取文件失败: \" + e.getMessage());\n}\n// 不需要finally块,资源会自动关闭\n```\n\n### 2.3 多重捕获 (Java 7+)\n```java\ntry {\n // 可能抛出多种异常的代码\n processFile();\n} catch (FileNotFoundException | SecurityException e) {\n // 同时处理多种异常\n System.out.println(\"文件访问错误: \" + e.getMessage());\n} catch (IOException e) {\n System.out.println(\"IO错误: \" + e.getMessage());\n}\n```\n\n## 3. 抛出异常\n\n### 3.1 声明抛出异常 (throws)\n```java\npublic void readFile(String filename) throws FileNotFoundException, IOException {\n if (filename == null) {\n throw new IllegalArgumentException(\"文件名不能为null\");\n }\n // 读取文件操作\n}\n```\n\n### 3.2 手动抛出异常 (throw)\n```java\npublic void setAge(int age) {\n if (age < 0 || age > 150) {\n throw new IllegalArgumentException(\"年龄必须在0-150之间: \" + age);\n }\n this.age = age;\n}\n```\n\n## 4. 自定义异常\n\n```java\n// 自定义检查型异常\nclass InsufficientFundsException extends Exception {\n private double amount;\n \n public InsufficientFundsException(double amount) {\n super(\"资金不足,缺少: \" + amount);\n this.amount = amount;\n }\n \n public double getAmount() {\n return amount;\n }\n}\n\n// 自定义非检查型异常\nclass BusinessException extends RuntimeException {\n public BusinessException(String message) {\n super(message);\n }\n \n public BusinessException(String message, Throwable cause) {\n super(message, cause);\n }\n}\n```\n\n## 5. 异常链\n\n```java\npublic void processData() throws DataProcessingException {\n try {\n // 某些操作\n readFromDatabase();\n } catch (SQLException e) {\n // 保留原始异常信息\n throw new DataProcessingException(\"数据处理失败\", e);\n }\n}\n```\n\n## 6. 异常处理的最佳实践\n\n### 6.1 应该做的 ✅\n```java\n// 1. 提供有意义的异常信息\nthrow new IllegalArgumentException(\"用户名不能为空\");\n\n// 2. 保留异常链\ncatch (IOException e) {\n throw new BusinessException(\"业务处理失败\", e);\n}\n\n// 3. 在合适的层次处理异常\npublic void processUserRequest() {\n try {\n validateRequest();\n processBusiness();\n } catch (ValidationException e) {\n logger.warn(\"请求验证失败\", e);\n sendErrorResponse(\"请求参数错误\");\n } catch (BusinessException e) {\n logger.error(\"业务处理失败\", e);\n sendErrorResponse(\"系统繁忙,请稍后重试\");\n }\n}\n\n// 4. 使用具体的异常类型\n// 好:\n} catch (FileNotFoundException e) {\n// 不好:\n} catch (Exception e) {\n```\n\n### 6.2 不应该做的 ❌\n```java\n// 1. 不要忽略异常\ntry {\n file.delete();\n} catch (SecurityException e) {\n // 错误:空的catch块\n}\n\n// 2. 不要过度使用检查型异常\npublic void someMethod() throws Exception { // 太宽泛\n\n// 3. 不要在finally块中抛出异常\nfinally {\n resource.close(); // 如果close()抛出异常,会掩盖原始异常\n}\n\n// 4. 不要用异常控制流程\n// 错误示例:\ntry {\n while (true) {\n list.get(index);\n index++;\n }\n} catch (IndexOutOfBoundsException e) {\n // 用异常来结束循环\n}\n```\n\n## 7. 常见的异常处理模式\n\n### 7.1 重试机制\n```java\npublic void retryOperation(int maxRetries) {\n int retries = 0;\n while (retries < maxRetries) {\n try {\n performOperation();\n break; // 成功则退出循环\n } catch (TemporaryException e) {\n retries++;\n if (retries >= maxRetries) {\n throw new PermanentException(\"操作失败,已达到最大重试次数\", e);\n }\n waitForRetry(retries);\n }\n }\n}\n```\n\n### 7.2 优雅降级\n```java\npublic String getConfigValue(String key) {\n try {\n return readFromDatabase(key);\n } catch (DatabaseException e) {\n logger.warn(\"数据库读取失败,使用默认配置\", e);\n return getDefaultValue(key); // 降级方案\n }\n}\n```\n\n## 总结\n\n| 场景 | 推荐做法 | 不推荐做法 |\n|------|----------|------------|\n| 资源管理 | try-with-resources | 手动try-catch-finally |\n| 异常信息 | 提供具体描述 | 使用泛泛的消息 |\n| 异常处理 | 在合适层级处理 | 过早捕获或完全忽略 |\n| 异常类型 | 使用具体异常类型 | 捕获过于宽泛的Exception |\n| 自定义异常 | 继承合适的父类 | 滥用RuntimeException |\n\n**核心原则**:异常应该用于处理真正\"异常\"的情况,不应该用于控制正常的程序流程。合理的异常处理能够提高代码的健壮性和可维护性。", + "编程语言/Java/Java基础-实现多线程方法.md": "\n## 1. 继承Thread类\n```java\nclass MyThread extends Thread {\n @Override\n public void run() {\n System.out.println(\"线程执行: \" + Thread.currentThread().getName());\n }\n}\n\n// 使用\nMyThread thread = new MyThread();\nthread.start();\n```\n\n## 2. 实现Runnable接口(推荐)\n```java\nclass MyRunnable implements Runnable {\n @Override\n public void run() {\n System.out.println(\"线程执行: \" + Thread.currentThread().getName());\n }\n}\n\n// 使用\nThread thread = new Thread(new MyRunnable());\nthread.start();\n\n// 或使用Lambda表达式\nThread thread2 = new Thread(() -> {\n System.out.println(\"Lambda线程执行\");\n});\nthread2.start();\n```\n\n## 3. 实现Callable接口(可返回结果)\n```java\nclass MyCallable implements Callable {\n @Override\n public String call() throws Exception {\n return \"线程执行结果\";\n }\n}\n\n// 使用\nExecutorService executor = Executors.newSingleThreadExecutor();\nFuture future = executor.submit(new MyCallable());\nString result = future.get(); // 获取返回值\nexecutor.shutdown();\n```\n\n## 4. 使用线程池(生产环境推荐)\n```java\n// 创建线程池\nExecutorService executor = Executors.newFixedThreadPool(5);\n\n// 提交任务\nfor (int i = 0; i < 10; i++) {\n executor.execute(() -> {\n System.out.println(\"线程池任务执行: \" + Thread.currentThread().getName());\n });\n}\n\n// 关闭线程池\nexecutor.shutdown();\n```\n\n## 5. 使用CompletableFuture(Java 8+)\n```java\n// 异步执行\nCompletableFuture future = CompletableFuture.supplyAsync(() -> {\n return \"异步任务结果\";\n});\n\n// 处理结果\nfuture.thenAccept(result -> System.out.println(\"收到结果: \" + result));\n```\n\n## 6. Timer和TimerTask\n```java\nTimer timer = new Timer();\ntimer.schedule(new TimerTask() {\n @Override\n public void run() {\n System.out.println(\"定时任务执行\");\n }\n}, 1000, 2000); // 延迟1秒,每2秒执行一次\n```\n\n## 总结对比\n\n| 方法 | 优点 | 缺点 | 适用场景 |\n|------|------|------|----------|\n| 继承Thread | 简单直接 | 不能继承其他类 | 简单任务 |\n| 实现Runnable | 灵活,可继承其他类 | 无返回值 | 大多数场景 |\n| 实现Callable | 有返回值,可抛异常 | 使用相对复杂 | 需要返回结果的场景 |\n| 线程池 | 资源管理,性能优化 | 配置复杂 | 生产环境,高并发 |\n| CompletableFuture | 异步编程,链式调用 | Java 8+ | 复杂的异步任务 |\n\n## 最佳实践建议\n\n1. **优先使用Runnable接口** - 更灵活,符合面向接口编程\n2. **生产环境使用线程池** - 避免频繁创建销毁线程的开销\n3. **使用Callable获取返回值** - 当需要任务执行结果时\n4. **Java 8+推荐CompletableFuture** - 提供更强大的异步编程能力\n5. **注意线程安全** - 合理使用同步机制\n\n最常用的组合是:**Runnable接口 + 线程池**,这种组合既灵活又高效。", + "编程语言/Java/Java基础-导入java文件方法.md": "\n## 🔹 情况 1:同一个包里的多个.java文件\n\n如果两个类在同一个包(或者没写 `package`,都在默认包),\n只要把它们放在同一个目录下,直接编译就能互相使用。\n\n例子:\n\n📂 目录结构:\n\n```\nHelloWorld.java\nUtils.java\n```\n\n**HelloWorld.java**\n\n```java\npublic class HelloWorld {\n public static void main(String[] args) {\n Utils.sayHi();\n }\n}\n```\n\n**Utils.java**\n\n```java\npublic class Utils {\n public static void sayHi() {\n System.out.println(\"Hello from Utils!\");\n }\n}\n```\n\n**编译运行:**\n\n```bash\njavac HelloWorld.java Utils.java\njava HelloWorld\n```\n\n**输出:**\n\n```\nHello from Utils!\n```\n\n---\n\n## 🔹 情况 2:不同包的类\n\n如果你要用别的包里的类,需要用 import\n\n**目录结构:**\n\n```\nsrc/\n ├─ app/\n │ └─ HelloWorld.java\n └─ util/\n └─ Utils.java\n```\n\n**util/Utils.java**\n\n```java\npackage util;\n\npublic class Utils {\n public static void sayHi() {\n System.out.println(\"Hello from util.Utils!\");\n }\n}\n```\n\n**app/HelloWorld.java**\n\n```java\npackage app;\n\nimport util.Utils; // 导入 util 包里的 Utils 类\n\npublic class HelloWorld {\n public static void main(String[] args) {\n Utils.sayHi();\n }\n}\n```\n\n**编译:**\n\n```bash\njavac src/util/Utils.java src/app/HelloWorld.java -d out\n```\n\n**运行:**\n\n```bash\njava -cp out app.HelloWorld\n```\n\n---\n\n## 🔹 总结\n\n1. **同目录、同包**:直接用,不需要 `import`。\n2. **不同目录、不同包**:必须用 `package` 和 `import`,再用 `-d` 编译指定输出目录。\n\n---\n\n", + "编程语言/Java/Java标准库常用异常类.md": "\n## 1. java.lang包中的核心异常类\n\n### 1.1 Error及其子类(系统错误)\n\n```java\n// 虚拟机错误\nVirtualMachineError\n ├── OutOfMemoryError // 内存不足\n ├── StackOverflowError // 栈溢出\n ├── InternalError // 虚拟机内部错误\n └── UnknownError // 未知错误\n\n// 链接错误\nLinkageError\n ├── NoClassDefFoundError // 类定义未找到\n ├── ClassFormatError // 类格式错误\n ├── VerifyError // 验证错误\n ├── IncompatibleClassChangeError // 不兼容的类变更\n │ ├── NoSuchFieldError // 字段未找到\n │ ├── NoSuchMethodError // 方法未找到\n │ └── IllegalAccessError // 非法访问错误\n └── UnsatisfiedLinkError // 未满足的链接错误\n```\n\n### 1.2 Exception及其子类\n\n```java\n// 运行时异常(非检查型)\nRuntimeException\n ├── NullPointerException // 空指针异常\n ├── ArrayIndexOutOfBoundsException // 数组越界\n ├── StringIndexOutOfBoundsException // 字符串索引越界\n ├── ClassCastException // 类转换异常\n ├── IllegalArgumentException // 非法参数异常\n │ ├── NumberFormatException // 数字格式异常\n │ ├── IllegalThreadStateException // 非法线程状态\n │ └── InvalidParameterException // 无效参数异常\n ├── IllegalStateException // 非法状态异常\n ├── UnsupportedOperationException // 不支持的操作异常\n ├── ArithmeticException // 算术异常\n ├── NegativeArraySizeException // 负数组大小异常\n ├── ArrayStoreException // 数组存储异常\n ├── SecurityException // 安全异常\n ├── ConcurrentModificationException // 并发修改异常\n ├── IndexOutOfBoundsException // 索引越界异常\n ├── NoSuchElementException // 无此元素异常\n └── EmptyStackException // 空栈异常\n\n// 检查型异常\nException\n ├── IOException (在java.io包中,但继承自Exception)\n ├── SQLException (在java.sql包中)\n ├── ReflectiveOperationException\n │ ├── ClassNotFoundException // 类未找到\n │ ├── NoSuchMethodException // 方法未找到\n │ ├── NoSuchFieldException // 字段未找到\n │ └── IllegalAccessException // 非法访问异常\n ├── CloneNotSupportedException // 克隆不支持异常\n ├── InterruptedException // 线程中断异常\n └── ParseException (在java.text包中)\n```\n\n## 2. java.io包中的IO异常类\n\n```java\nIOException\n ├── FileNotFoundException // 文件未找到异常\n ├── EOFException // 文件结束异常\n ├── SocketException (在java.net包中)\n ├── InterruptedIOException // 中断IO异常\n ├── UnsupportedEncodingException // 不支持的编码异常\n ├── UTFDataFormatException // UTF数据格式异常\n ├── SyncFailedException // 同步失败异常\n ├── CharConversionException // 字符转换异常\n ├── ObjectStreamException // 对象流异常\n │ ├── InvalidClassException // 无效类异常\n │ ├── NotSerializableException // 不可序列化异常\n │ ├── StreamCorruptedException // 流损坏异常\n │ └── WriteAbortedException // 写入中止异常\n ├── ZipException (在java.util.zip包中)\n └── JarException (在java.util.jar包中)\n```\n\n## 3. java.net包中的网络异常类\n\n```java\nIOException\n └── SocketException\n ├── BindException // 绑定异常\n ├── ConnectException // 连接异常\n ├── NoRouteToHostException // 无路由到主机异常\n └── PortUnreachableException // 端口不可达异常\n\n// 其他网络异常\nMalformedURLException // 错误的URL格式异常\nProtocolException // 协议异常\nUnknownHostException // 未知主机异常\nUnknownServiceException // 未知服务异常\nURISyntaxException // URI语法异常\n```\n\n## 4. java.util包中的工具类异常\n\n```java\n// 并发异常\nConcurrentModificationException // 并发修改异常\n\n// 其他工具异常\nEmptyStackException // 空栈异常\nInputMismatchException // 输入不匹配异常\nNoSuchElementException // 无此元素异常\nTooManyListenersException // 监听器过多异常\nIllegalFormatException // 非法格式异常\nDuplicateFormatFlagsException // 重复格式标志异常\nUnknownFormatConversionException // 未知格式转换异常\nMissingFormatArgumentException // 缺少格式参数异常\nMissingFormatWidthException // 缺少格式宽度异常\nMissingResourceException // 缺少资源异常\n```\n\n## 5. java.util.concurrent包中的并发异常\n\n```java\nExecutionException // 执行异常\nCancellationException // 取消异常\nTimeoutException // 超时异常\nBrokenBarrierException // 屏障损坏异常\nRejectedExecutionException // 拒绝执行异常\nCompletionException // 完成异常\n```\n\n## 6. java.security包中的安全异常\n\n```java\nAccessControlException // 访问控制异常\nGeneralSecurityException // 通用安全异常\n ├── InvalidKeyException // 无效密钥异常\n ├── KeyManagementException // 密钥管理异常\n ├── KeyStoreException // 密钥库异常\n ├── NoSuchAlgorithmException // 无此算法异常\n ├── SignatureException // 签名异常\n ├── CertificateException // 证书异常\n ├── InvalidAlgorithmParameterException // 无效算法参数异常\n └── UnrecoverableKeyException // 不可恢复密钥异常\n```\n\n## 7. java.text包中的文本处理异常\n\n```java\nParseException // 解析异常\n```\n\n## 8. java.time包中的时间异常\n\n```java\nDateTimeException // 日期时间异常\n```\n\n## 9. java.nio包中的NIO异常\n\n```java\nBufferOverflowException // 缓冲区溢出异常\nBufferUnderflowException // 缓冲区下溢异常\nInvalidMarkException // 无效标记异常\nReadOnlyBufferException // 只读缓冲区异常\n```\n\n## 10. 其他重要的异常类\n\n```java\n// javax包中的异常\njavax.management.JMException\njavax.naming.NamingException\njavax.servlet.ServletException\njavax.transaction.TransactionException\n\n// 企业级异常\njavax.ejb.EJBException\njavax.persistence.PersistenceException\n```\n\n## 11. 常见的自定义异常基类\n\n虽然这些不是Java内置的,但经常被用作自定义异常的基类:\n\n```java\n// 业务异常\nBusinessException\nApplicationException\nServiceException\nDAOException\n\n// 系统异常\nSystemException\nTechnicalException\nInfrastructureException\n```\n\n## 异常类层次结构总结\n\n```\nThrowable\n├── Error (系统错误,不可恢复)\n│ ├── VirtualMachineError\n│ ├── LinkageError\n│ └── ...\n│\n└── Exception (应用程序异常)\n ├── RuntimeException (非检查型异常)\n │ ├── NullPointerException\n │ ├── IllegalArgumentException\n │ ├── IllegalStateException\n │ └── ...\n │\n └── 其他Exception (检查型异常)\n ├── IOException\n ├── SQLException\n ├── ReflectiveOperationException\n └── ...\n```\n\n## 使用建议\n\n1. **选择合适的异常类型**:根据具体场景选择最合适的异常类\n2. **避免捕获过于宽泛的异常**:不要轻易捕获 `Exception` 或 `Throwable`\n3. **自定义异常**:当内置异常无法准确描述问题时,创建自定义异常\n4. **异常信息**:提供清晰、有用的异常信息\n5. **异常链**:保留原始异常信息,便于问题追踪\n\n这个列表涵盖了Java标准库中大部分常用的异常类,实际开发中还会遇到各种框架和库提供的特定异常类。", + "编程语言/Java/代码片段/代码片段-标准HelloWorld输出.md": "```java\npublic class HelloWorld {\n public static void main(String[] args) {\n System.out.println(\"Hello, World!\");\n }\n}\n```", + "编程语言/Java/代码片段/代码片段-特殊HelloWorld输出.md": "```java\n//使用反射\nimport java.lang.reflect.Method;\n\npublic class ReflectiveHello {\n public static void main(String[] args) throws Exception {\n Method method = System.class.getMethod(\"out\");\n Object out = method.invoke(null);\n Method println = out.getClass().getMethod(\"println\", String.class);\n println.invoke(out, \"Hello, World!\");\n }\n}\n```", "编程语言/Python/Kivy/kivy编译安卓APK.md": "\n\n```bash\nsudo apt update && sudo apt upgrade -y\n\n#安装必要的依赖\nsudo apt install -y \\\n build-essential \\\n git \\\n python3 \\\n python3-pip \\\n python3-venv \\\n openjdk-17-jdk \\\n unzip \\\n zip \\\n libffi-dev \\\n libssl-dev \\\n libsqlite3-dev \\\n libjpeg-dev \\\n libfreetype6-dev \\\n libgl1-mesa-dev \\\n libgles2-mesa-dev \\\n zlib1g-dev \\\n autoconf \\\n automake \\\n libtool \\\n pkg-config \\\n cmake \\\n curl \\\n lld \\\n libncurses5\n\n#创建虚拟环境 \npython3 -m venv kivy_env\nsource kivy_env/bin/activate\n\n#升级pip\npip install --upgrade pip setuptools wheel cython\n\n#安装kivy\npip install \"kivy[base]\" kivy_examples\n#检查是否安装成功\npython -m kivy.examples.demo.touchtracer\n\n#安装 Buildozer构建环境\npip install buildozer\n#验证是否安装成功\nbuildozer --version\n\n#初始化 buildozer 配置文件\nbuildozer init\n\n#打包构建apk 开梯子!\nbuildozer android debug\n\n\n```\n\n\n```python\nfrom kivy.app import App\nfrom kivy.uix.label import Label\n\nclass MyApp(App):\n def build(self):\n return Label(text=\"Hello Android from Kivy!\")\n\nif __name__ == \"__main__\":\n MyApp().run()\n\n```\n\n\n\n\n\n\n\n\n\n", "编程语言/Python/Python国内pip加速镜像.md": "\n---\n\n## 一、常见国内镜像源推荐\n\n以下是一些稳定且速度优异的国内 PyPI 镜像源:\n\n- **清华大学** \n `https://pypi.tuna.tsinghua.edu.cn/simple`\n- **阿里云** \n `https://mirrors.aliyun.com/pypi/simple/`\n- **中国科技大学(USTC)** \n `https://pypi.mirrors.ustc.edu.cn/simple/` \n- **网易** \n `https://mirrors.163.com/pypi/simple/`\n- **豆瓣** \n `http://pypi.douban.com/simple/`(推荐使用 HTTPS 若可用)\n\n---\n\n## 二、临时使用镜像方法(每次安装时添加)\n\n在你激活的虚拟环境中,使用以下方式安装包时手动指定镜像源:\n\n```bash\npip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple\n```\n\n如果镜像为 HTTP,并提示“不受信任”,可额外加上 `--trusted-host` 参数:\n\n```bash\npip install 包名 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n```\n\n\n---\n\n## 三、永久配置镜像(适用于当前虚拟环境)\n\n若希望省去每次输入 -i 参数的麻烦,可以在虚拟环境中创建或修改配置文件,使 pip 默认使用国内镜像:\n\n- **Unix / macOS 下虚拟环境:** \n 在虚拟环境目录下 `$VIRTUAL_ENV/pip.conf`\n \n- **Windows 虚拟环境:** \n 在 `%VIRTUAL_ENV%\\pip.ini`\n \n\n在其中添加以下内容(以清华源为例):\n\n```ini\n[global]\ntimeout = 120\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple\ntrusted-host = pypi.tuna.tsinghua.edu.cn\n```\n\n- `timeout`:设置最长等待时间,例如 **120 秒**,避免连接中断 \n \n- `index-url`:指定清华镜像为默认源\n \n- `trusted-host`:将镜像主机设为可信,避免 HTTPS 以外的警告\n \n\n记住,pip 配置的优先级如下(高到低):\n\n1. 虚拟环境中的配置\n \n2. 当前用户目录中的配置\n \n3. 全局配置(系统范围)\n \n\n---\n\n## 四、另一种永久配置方式:使用 pip config 命令\n\n你也可以通过 pip 自带的命令来设置全局配置(不限于虚拟环境):\n\n```bash\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\n```\n\n随后你可以用 `pip config list` 来验证是否设置成功\n\n若想恢复到默认的官方 PyPI 源,可使用:\n\n```bash\npip config unset global.index-url\n```\n\n\n---\n\n## 五、方式对比一览\n\n|方式|优点|缺点|\n|---|---|---|\n|临时 `-i` 指定|简单快速,不改配置|每次需手动指定|\n|虚拟环境配置|仅对该虚拟环境生效|需进入每个环境配置|\n|全局配置|全局生效,无需重复配置|不够灵活,不适每个项目情况|\n\n---\n\n", "编程语言/Python/Pywebview库功能一览.md": "\n---\n\n## 一、基本概述\n\n- **跨平台原生 WebView 窗口** \n pywebview 是一个轻量级包装库,可在 Python 程序中使用 HTML/CSS/JavaScript 构建 GUI,打开原生的 WebView 窗口,适用于 Windows、macOS、Linux(GTK 或 QT)、Android 平台 ([GitHub](https://github.com/r0x0r/pywebview?utm_source=chatgpt.com \"r0x0r/pywebview: Build GUI for your Python program with ...\"), [pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview5.html?utm_source=chatgpt.com \"5.0 has landed - pywebview - Example\"))。\n \n\n---\n\n## 二、核心功能分类\n\n### 1. 窗口管理功能\n\n- 使用 `webview.create_window(...)` 创建窗口,可设置属性包括:标题、加载方式(URL 或直接传 HTML)、尺寸(宽高)、位置坐标(x, y)、是否可调整大小、是否全屏、最小尺寸、隐藏窗口、无边框、阴影效果(仅限 Windows)、窗口置顶、关闭确认、背景颜色、透明、文本选择、缩放能力、拖拽能力、暗色模式等 ([pywebview.idepy.com](https://pywebview.idepy.com/guide/api?utm_source=chatgpt.com \"API - pywebview中文文档\"), [pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview6?utm_source=chatgpt.com \"6.0 is here | pywebview - Example\"))。\n \n- `webview.start(...)` 启动 GUI 消息循环,可额外配置回调函数、调试模式、HTTP 服务器、用户代理、隐私模式、存储路径、本地化、菜单设置、图标、SSL 等参数 ([pywebview.idepy.com](https://pywebview.idepy.com/guide/api?utm_source=chatgpt.com \"API - pywebview中文文档\"))。\n \n\n---\n\n### 2. JavaScript ↔ Python 双向通信\n\n- 通过 `js_api` 参数将 Python 对象暴露给 JavaScript,以便 JS 调用 Python 方法(返回 Promise);也支持运行时调用: `window.expose(func)` ([pywebview.idepy.com](https://pywebview.idepy.com/guide/api?utm_source=chatgpt.com \"API - pywebview中文文档\"), [pywebview.flowrl.com](https://pywebview.flowrl.com/guide/usage?utm_source=chatgpt.com \"Usage | pywebview - Example\"))。\n \n\n---\n\n### 3. 内建 HTTP 服务器支持\n\n- 自动为相对路径启动 Bottle HTTP 服务器;可在 `webview.start(http_server=True, ssl=True)` 中启用,并可传入自定义 WSGI 服务(如 Flask)作为 `url` 参数,或修改默认服务器的 SSL 行为 ([pywebview.flowrl.com](https://pywebview.flowrl.com/guide/usage?utm_source=chatgpt.com \"Usage | pywebview - Example\"), [pywebview.idepy.com](https://pywebview.idepy.com/guide/api?utm_source=chatgpt.com \"API - pywebview中文文档\"))。\n \n\n---\n\n### 4. DOM 操作能力\n\n- 支持在 Python 端进行 DOM 操作,如元素创建、搜索、修改属性或样式,事件注册等,类似 jQuery 操作体验。提供 `window.dom` API,包括 `dom.body`、`dom.document`、`dom.create_element()`、`dom.get_element(s)`,并支持事件监听,如 click、scroll 等 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview5.html?utm_source=chatgpt.com \"5.0 has landed - pywebview - Example\"))。\n \n- 还支持拖拽文件,并获取完整文件路径 `event['dataTransfer']['files'][0]['pywebviewFullPath']` ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview5.html?utm_source=chatgpt.com \"5.0 has landed - pywebview - Example\"))。\n \n\n---\n\n### 5. 事件机制\n\n- pywebview 5 引入 DOM 操作及基本事件支持(如 click 等)。\n \n- pywebview 6 提供更先进的网络事件支持,包括 `request_sent` 和 `response_received`,可拦截并修改请求头,还新增 `initialized` 事件(GUI 渲染器选择前触发)可用于配置判定 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview6?utm_source=chatgpt.com \"6.0 is here | pywebview - Example\"))。\n \n\n---\n\n### 6. 全新共享状态管理(v6)\n\n- `window.state` 对象允许自动同步 JavaScript 和 Python 间的顶层属性状态,无需额外手动同步。例如在 Python 端设置 `window.state.user_name = \"Test\"`,在 JavaScript 中通过 `window.pywebview.state.user_name` 即可访问 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview6?utm_source=chatgpt.com \"6.0 is here | pywebview - Example\"))。\n \n\n---\n\n### 7. 平台增强功能\n\n- **Android 支持**:pywebview 5 开始支持 Android(虽然功能较限,如不支持文件对话框、多窗口、窗口控制,但基本功能可用)([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview5.html?utm_source=chatgpt.com \"5.0 has landed - pywebview - Example\"))。\n \n- **pywebview 6 优化 Android**:引入 Kivyless 实现,提高启动速度、减小包体,并支持全屏模式 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview6?utm_source=chatgpt.com \"6.0 is here | pywebview - Example\"))。\n \n\n---\n\n### 8. 应用设置与 UI 菜单\n\n- **应用级设置**(v5):通过 `webview.settings` 定制行为,如控制文件下载、允许 file:// URL、外链跳转行为、调试模式下自动打开 DevTools 等 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview5.html?utm_source=chatgpt.com \"5.0 has landed - pywebview - Example\"))。\n \n- **窗口级菜单**(v6):可以为每个窗口定义自定义菜单(Menu/MenueAction),类似桌面应用的菜单栏;部分平台(如 GTK + Unity)暂不支持 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview6?utm_source=chatgpt.com \"6.0 is here | pywebview - Example\"))。\n \n\n---\n\n### 9. 平台尤其增强与现代化\n\n- **现代化 API 调整**:pywebview 6 改进了 FileDialog 枚举、设置项存放路径、移除废弃 DOM API 等 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview6?utm_source=chatgpt.com \"6.0 is here | pywebview - Example\"))。\n \n- **平台特定增强**:\n \n - Windows:支持暗色模式自动识别\n \n - macOS:可隐藏默认菜单、更好的 JS prompt 支持\n \n - 全平台:改进屏幕坐标处理和 SSL 支持 ([pywebview.flowrl.com](https://pywebview.flowrl.com/blog/pywebview6?utm_source=chatgpt.com \"6.0 is here | pywebview - Example\"))。\n \n\n---\n\n## 三、总结表格\n\n|功能分类|详细内容描述|\n|---|---|\n|窗口管理|多平台窗口创建与控制(尺寸、位置、样式等)|\n|JS ↔ Python 通信|js_api 和 expose 提供双向调用|\n|HTTP 服务器|内建 Bottle 服务器,可配置 SSL 与自定义 WSGI|\n|DOM 操作|从 Python 端操作 DOM 元素、事件绑定、拖拽功能|\n|事件机制|DOM 事件、网络请求事件、初始化事件|\n|状态同步|自动同步 window.state(Python ↔ JS)|\n|平台支持|Desktop 各平台 + Android,含特性差异|\n|应用配置 & 菜单|settings 配置项 + 窗口级菜单|\n|平台增强|暗色模式、JS prompt 优化、屏幕坐标、SSL 优化等|\n\n---\n", - "编程语言/前端/css注入代码合集.md": "# CSS 效果字典 — 注入代码合集\n\n> 本文档收集了 *30+* 个常用且有趣的 CSS 注入片段。每个片段都包含:\n> - **名称**(用途)\n> - **代码**(可直接复制到控制台或写入 ` +``` + + +```html + + + + + + + + +``` + + +```html + + + + + +``` + +```html + +``` \ No newline at end of file diff --git a/public/mengyanote/.trash/PM格式化输出.md b/mengyanote-frontend/public/mengyanote/.trash/PM格式化输出.md similarity index 100% rename from public/mengyanote/.trash/PM格式化输出.md rename to mengyanote-frontend/public/mengyanote/.trash/PM格式化输出.md diff --git a/public/mengyanote/.trash/README.md b/mengyanote-frontend/public/mengyanote/.trash/README.md similarity index 100% rename from public/mengyanote/.trash/README.md rename to mengyanote-frontend/public/mengyanote/.trash/README.md diff --git a/mengyanote-frontend/public/mengyanote/.trash/React打包成Windows和Android软件方案.md b/mengyanote-frontend/public/mengyanote/.trash/React打包成Windows和Android软件方案.md new file mode 100644 index 0000000..351dc4b --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/React打包成Windows和Android软件方案.md @@ -0,0 +1,146 @@ + +# 核心思路(快速决策) + +- **Windows(成熟 & 快)**:用 **Electron** + `electron-builder`(或 Electron Forge)把 web 前端放进 WebView,桌面端直接运行/或同时启动本地后端进程。成熟、生态完善、发布流程(安装包、自动更新、签名)有现成方案。 +- **Windows(瘦体积)**:若关心体积、原生安全,考虑 **Tauri**(Rust 后端,最终二进制更小)。但学习/环境比 Electron 略复杂。 +- **Android(快 & 直接把现有 web 变原生)**:用 **Capacitor**(Ionic 团队)把生产构建的前端打包成 Android 原生工程,再用 Android Studio 打包签名上传 Play。对保留现有 React 网页最省力。 +- **Android(PWA 路线,最快上线)**:如果你的 React 是 PWA(有 service worker、HTTPS、manifest),可以做 **Trusted Web Activity (TWA)**,用 Bubblewrap/PWABuilder 生成 Android 包并上架(适合想最小工作量上 Play 的场景)。 + +下面给出每条路线的**实战步骤、常见陷阱和示例命令**。 + +--- + +# 路线 A — 推荐(最快、最成熟):**Electron(Windows) + Capacitor(Android)** + +适合:不想重写、后端可以继续作为远端服务(推荐),要快速得到桌面 + Android 双端。 + +## 1) 通用准备(前端) + +1. 把 React 做生产构建(示例用 CRA / Vite): + `npm run build`(或 `yarn build`),生成 `dist/` 或 `build/`。 +2. 确保所有 API 用 HTTPS、CORS、并把生产 API 域配置好(不要在客户端明文放敏感秘钥)。 + + +## 2) Windows:Electron + electron-builder(快速、成熟) + +概念:Electron 启一个 native 窗口并加载你的静态 `build/`。用 `electron-builder` 打包成 installer(NSIS/MSI/portable)并可做代码签名与自动更新。 + +快速步骤(最小): + +- 项目根目录加入 `electron` 主进程文件(`main.js`),让它加载 `build/index.html`。 +- 安装依赖并配置打包: + + +```bash +# 依赖 +npm install --save-dev electron electron-builder +# package.json scripts 示例 +"scripts": { + "build:web": "npm run build", # 你的 React build + "start:electron": "electron .", + "dist": "npm run build:web && electron-builder" +}, +"build": { + "appId": "com.yourcompany.app", + "files": ["build/**/*", "main.js", "package.json"], + "win": {"target":["nsis","portable"]} +} +``` + +- 本地测试:`npm run start:electron`。 + +- 生成发布包:`npm run dist`(electron-builder 会产出 `.exe` / `.msi` / installer)。 + + +**如果需要把后端随应用打包(可选但更复杂)**: +常见做法是把 Node 后端打成独立 exe(用 `pkg` 或 `nexe`),在 Electron 启动时用 `child_process.spawn()` 启动本地服务,再让前端调用 `http://localhost:xxxx`。这样用户本地拥有完整后端(适合离线或内网部署)。示例工具:`pkg`、`nexe`。注意:安全、端口冲突、自动更新、杀进程清理等需要处理。 + +常见注意点: + +- Electron 应用体积通常较大(几十 MB 起);自动更新、签名(Authenticode)建议上线前完成。 +- 在 CI(如 GitHub Actions)上可以交叉构建,但 Windows 的代码签名通常在 Windows runner 或专门流程中完成。 + + +--- + +## 3) Android:Capacitor(把 web 打包成原生 APK/AAB) + +概念:Capacitor 将你的 `build/` 内容嵌入到一个原生 Android 项目(WebView),并提供与原生桥接的插件 API。非常适合把现有 web 转 app。 + +快速步骤(最小): + +```bash +# 在项目根(build 已存在) +npm install @capacitor/core @capacitor/cli +npx cap init "MyApp" com.example.myapp --web-dir=build +npx cap add android +# 每次 web 有新 build: +npm run build +npx cap copy android +npx cap open android # 在 Android Studio 中打开,构建、签名、导出 AAB +``` + +在 Android Studio 中使用 **Build → Generate Signed Bundle / APK** 来生成签名的 AAB 上传到 Play(Play 推荐上传 AAB)。发布与签名细节见 Google Play 签名文档(Play App Signing)。 + +常见注意点: + +- 若后端是远端 API,Android 里可直接请求远端;若需要本地 DB,使用 SQLite 或 Capacitor 的 Storage/插件而不是在设备上运行完整 Node 后端。 +- 调试网络(开发时指向本地 dev server)可用 `npx cap open android` 并在 `capacitor.config.*` 设置 `server.url` 来启用 live reload(但生产请编译静态文件)。 + + +--- + +# 路线 B — 可选:**Tauri(Windows 更小) + Capacitor/TWA(Android)** + +- 若你很在意桌面体积与原生安全性,**Tauri** 是比 Electron 更轻量的替代品(用 Rust 来打包、使用系统 WebView),生成的二进制更小且性能好。缺点:本地构建环境(Rust / MSVC)和插件生态比 Electron 小一些。 +- Android 仍建议用 Capacitor 或 TWA 路线(Tauri 的移动支持还在发展中)。 + + +Tauri 打包基本:`npm run build`(前端)然后 `tauri build`(生成 Windows installer / exe)——详见 Tauri 分发文档(Windows 打包细节、WebView2 要求等)。 + +--- + +# 路线 C — 直接 PWA → Play(最快上架 Android) + +如果你的 React 已经是 PWA(manifest + SW),通过 **TWA**(Trusted Web Activity)把 PWA 裹进一个最小的 Android 应用是最快的上 Play 方式:用 **Bubblewrap** / PWABuilder 生成项目,然后签名上传 Play。适合不需要本地原生 API,仅需离线缓存与简单推送的场景。 + +--- + +# 后端打包 vs 远端服务的建议(关键设计决策) + +- **优先把后端作为远端服务**(部署到云/内网)——理由:升级、补丁、数据库统一管理、安全容易;前端变体(桌面/Android/PWA)都指向同一 API,开发运维简单。 +- 仅在必须(离线、内网隔离)时,把后端打包到桌面:用 `pkg` / `nexe` 做 Node -> exe,再由 Electron 启动子进程(`child_process.spawn`)。Android 上嵌入 Node 很麻烦(可选 nodejs-mobile,但生态少),因此若后端要内嵌,桌面比手机更现实。 + + +--- + +# 上线前必须做的成熟化步骤(checklist) + +1. **安全**:HTTPS、CSP、Key/Secret 不放前端;XSS/CSRF/认证策略。 +2. **签名与发布**:Windows 用 Authenticode 证书签名;Android 用 Play App Signing(上传签名/上传 key)。 +3. **自动更新**:Electron 有 `electron-updater`/electron-builder 集成;考虑 OTA 策略。 +4. **CI/CD**:用 GitHub Actions / Azure / CircleCI 自动构建 web、electron dist、Android AAB(包含签名步骤)。 +5. **测试**:多架构/多机型测试、模拟断网、升级回滚测试。 +6. **体积优化**:压缩静态资源、剔除 dev 依赖、考虑 Tauri 以减小 exe 体积。 + + +--- + +# 推荐组合(按你想要的结果选) + +- **最快上手 + 最成熟**:Electron(Windows) + Capacitor(Android),后端保留云端。 +- **追求二进制最瘦**:Tauri(Windows) + Capacitor/TWA(Android)。 +- **只想最快上线到 Play(不做原生功能)**:PWA → TWA(Bubblewrap/PWABuilder)。 + + +--- + +# 我可以直接帮你做的事(选一项即可回复) + +1. 给你一份针对你 current React 项目的 **具体脚本(package.json)+ Electron 主进程示例 + electron-builder 配置**(Windows 一键打包脚本)。 +2. 给你一份 **Capacitor 打包到 Android 的 step-by-step 脚本 & Android Studio 签名操作流水线**(含 AAB 签名命令示例)。 +3. 或者把 **把后端打包为 exe 的示例(pkg/nexe)并在 Electron 中 spawn 的最小示例** 发给你。 + +告诉我你要哪一项(例如“给我 Electron + 打包脚本”),我立刻把完整代码/命令/CI 配置直接生成给你(无需你再提供额外信息即可开始)。 + +--- diff --git a/mengyanote-frontend/public/mengyanote/.trash/React项目初始化教程.md b/mengyanote-frontend/public/mengyanote/.trash/React项目初始化教程.md new file mode 100644 index 0000000..580e4c2 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/React项目初始化教程.md @@ -0,0 +1,79 @@ + +--- + +# ✅ **方式一:使用 Vite 初始化 React 项目(推荐,最快最轻量)** + +### **1. 安装 Node.js(必须)** + +确保 Node 版本 ≥ 18 +检查: +```bash +node -v +``` + +--- + +### **2. 使用 Vite 创建 React 项目** + +```bash +npm create vite@latest my-react-app -- --template react +``` +如果你想要 TypeScript 版本: +```bash +npm create vite@latest my-react-app -- --template react-ts +``` + +--- + +### **3. 安装依赖** + +```bash +cd my-react-app +npm install +``` + +--- + +### **4. 启动开发环境** + +```bash +npm run dev +``` +浏览器访问提示的 localhost 地址即可。 + +--- + +# ✅ **方式二:使用 Create-React-App(传统方案,不推荐但能用)** + +(CRA 已多年未更新,官方推荐迁移到 Vite) + +### 1. 创建项目 + +```bash +npx create-react-app my-react-app +``` + +### 2. 启动项目 + +```bash +cd my-react-app +npm start +``` + +--- + +# ✅ **方式三:使用 Next.js(如果你准备做大一点的项目)** + +如果你想做: +✔ SEO +✔ 服务端渲染 +✔ 大型项目结构 +✔ API 路由 + +推荐 Next.js: + +```bash +npx create-next-app@latest +``` + +--- diff --git a/public/mengyanote/.trash/TCP的三次握手四次握手.md b/mengyanote-frontend/public/mengyanote/.trash/TCP的三次握手四次握手.md similarity index 100% rename from public/mengyanote/.trash/TCP的三次握手四次握手.md rename to mengyanote-frontend/public/mengyanote/.trash/TCP的三次握手四次握手.md diff --git a/public/mengyanote/计算机网络/TCP的三次握手四次握手总结.md b/mengyanote-frontend/public/mengyanote/.trash/TCP的三次握手四次握手总结.md similarity index 100% rename from public/mengyanote/计算机网络/TCP的三次握手四次握手总结.md rename to mengyanote-frontend/public/mengyanote/.trash/TCP的三次握手四次握手总结.md diff --git a/mengyanote-frontend/public/mengyanote/.trash/Vue项目初始化教程.md b/mengyanote-frontend/public/mengyanote/.trash/Vue项目初始化教程.md new file mode 100644 index 0000000..2cd7a14 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/Vue项目初始化教程.md @@ -0,0 +1,324 @@ + +## 1. 环境准备 + +### 1.1 安装Node.js +- 访问 [Node.js官网](https://nodejs.org/) 下载LTS版本 +- 验证安装: +```bash +node --version +npm --version +``` + +### 1.2 安装Vue CLI(可选,推荐使用Vite) +```bash +npm install -g @vue/cli +# 或 +yarn global add @vue/cli +``` + +## 2. 使用Vite创建Vue项目(推荐方式) + +### 2.1 创建项目 +```bash +# 使用npm +npm create vue@latest + +# 或使用yarn +yarn create vue + +# 或使用pnpm +pnpm create vue +``` + +### 2.2 交互式配置 +执行命令后,你会看到以下选项: +``` +✔ Project name: … +✔ Add TypeScript? … No / Yes +✔ Add JSX Support? … No / Yes +✔ Add Vue Router for Single Page Application development? … No / Yes +✔ Add Pinia for state management? … No / Yes +✔ Add Vitest for Unit Testing? … No / Yes +✔ Add an End-to-End Testing Solution? … No / Cypress / Playwright +✔ Add ESLint for code quality? … No / Yes +✔ Add Prettier for code formatting? … No / Yes +``` + +### 2.3 进入项目并运行 +```bash +cd +npm install +npm run dev +``` + +## 3. 使用Vue CLI创建项目(传统方式) + +### 3.1 创建项目 +```bash +vue create my-project +``` + +### 3.2 选择预设 +``` +? Please pick a preset: + Default ([Vue 2] babel, eslint) + Default (Vue 3) ([Vue 3] babel, eslint) +❯ Manually select features +``` + +### 3.3 选择功能 +``` +? Check the features needed for your project: + ◉ Babel + ◯ TypeScript + ◯ Progressive Web App (PWA) Support +❯◉ Router + ◉ Vuex + ◉ CSS Pre-processors + ◉ Linter / Formatter + ◯ Unit Testing + ◯ E2E Testing +``` + +## 4. 项目结构说明 + +使用Vite创建的典型项目结构: +``` +my-vue-project/ +├── node_modules/ +├── public/ +│ └── favicon.ico +├── src/ +│ ├── assets/ +│ │ └── logo.svg +│ ├── components/ +│ │ └── HelloWorld.vue +│ ├── router/ +│ │ └── index.js +│ ├── stores/ +│ │ └── counter.js +│ ├── views/ +│ │ ├── AboutView.vue +│ │ └── HomeView.vue +│ ├── App.vue +│ └── main.js +├── .gitignore +├── index.html +├── package.json +├── README.md +└── vite.config.js +``` + +## 5. 基础配置示例 + +### 5.1 修改vite.config.js +```javascript +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' + +export default defineConfig({ + plugins: [vue()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src') + } + }, + server: { + port: 3000, + open: true + } +}) +``` + +### 5.2 配置ESLint + Prettier +`.eslintrc.cjs`: +```javascript +module.exports = { + root: true, + env: { + node: true, + browser: true, + es2021: true + }, + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-essential', + '@vue/eslint-config-prettier' + ], + rules: { + 'vue/multi-word-component-names': 'off' + } +} +``` + +`.prettierrc`: +```json +{ + "semi": false, + "singleQuote": true, + "printWidth": 80, + "trailingComma": "none", + "tabWidth": 2 +} +``` + +## 6. 安装常用依赖 + +```bash +# 状态管理 +npm install pinia + +# UI框架(按需选择) +npm install element-plus +# 或 +npm install ant-design-vue +# 或 +npm install vuetify + +# HTTP客户端 +npm install axios + +# 路由 +npm install vue-router@4 + +# 日期处理 +npm install dayjs + +# 工具函数 +npm install lodash-es +``` + +## 7. 创建第一个组件 + +`src/components/HelloWorld.vue`: +```vue + + + + + +``` + +## 8. 配置路由 + +`src/router/index.js`: +```javascript +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '../views/HomeView.vue' + +const routes = [ + { + path: '/', + name: 'home', + component: HomeView + }, + { + path: '/about', + name: 'about', + component: () => import('../views/AboutView.vue') + } +] + +const router = createRouter({ + history: createWebHistory(), + routes +}) + +export default router +``` + +## 9. 启动和构建 + +```bash +# 开发模式 +npm run dev + +# 生产构建 +npm run build + +# 预览生产构建 +npm run preview + +# 代码检查 +npm run lint +``` + +## 10. 最佳实践建议 + +### 10.1 项目组织 +``` +src/ +├── api/ # API接口 +├── assets/ # 静态资源 +├── components/ # 公共组件 +├── composables/ # 组合式函数 +├── directives/ # 自定义指令 +├── router/ # 路由配置 +├── stores/ # 状态管理 +├── styles/ # 全局样式 +├── utils/ # 工具函数 +└── views/ # 页面组件 +``` + +### 10.2 Git提交规范 +```bash +# 安装commitlint +npm install @commitlint/config-conventional @commitlint/cli -D + +# 创建.commitlintrc.js +echo "module.exports = { extends: ['@commitlint/config-conventional'] }" > .commitlintrc.js +``` + +### 10.3 环境变量配置 +创建`.env`文件: +```env +VITE_API_BASE_URL=https://api.example.com +VITE_APP_TITLE=My Vue App +``` + +## 常见问题 + +### Q: 安装缓慢? +- 使用淘宝镜像:`npm config set registry https://registry.npmmirror.com` +- 使用pnpm:`npm install -g pnpm` + +### Q: 端口被占用? +```javascript +// vite.config.js +server: { + port: 3000 // 修改端口号 +} +``` + +### Q: 需要支持旧浏览器? +```javascript +// vite.config.js +import legacy from '@vitejs/plugin-legacy' + +export default { + plugins: [ + legacy({ + targets: ['defaults', 'not IE 11'] + }) + ] +} +``` diff --git a/public/mengyanote/.trash/_config.yml b/mengyanote-frontend/public/mengyanote/.trash/_config.yml similarity index 100% rename from public/mengyanote/.trash/_config.yml rename to mengyanote-frontend/public/mengyanote/.trash/_config.yml diff --git a/public/mengyanote/编程语言/前端/css注入代码合集.md b/mengyanote-frontend/public/mengyanote/.trash/css注入代码合集.md similarity index 100% rename from public/mengyanote/编程语言/前端/css注入代码合集.md rename to mengyanote-frontend/public/mengyanote/.trash/css注入代码合集.md diff --git a/public/mengyanote/Linux/docker配置.md b/mengyanote-frontend/public/mengyanote/.trash/docker配置.md similarity index 100% rename from public/mengyanote/Linux/docker配置.md rename to mengyanote-frontend/public/mengyanote/.trash/docker配置.md diff --git a/public/mengyanote/Linux/frp配置.md b/mengyanote-frontend/public/mengyanote/.trash/frp配置.md similarity index 100% rename from public/mengyanote/Linux/frp配置.md rename to mengyanote-frontend/public/mengyanote/.trash/frp配置.md diff --git a/public/mengyanote/杂项/markdown格式(没什么用).md b/mengyanote-frontend/public/mengyanote/.trash/markdown格式(没什么用).md similarity index 100% rename from public/mengyanote/杂项/markdown格式(没什么用).md rename to mengyanote-frontend/public/mengyanote/.trash/markdown格式(没什么用).md diff --git a/public/mengyanote/Linux/nodejsmarkdown库.md b/mengyanote-frontend/public/mengyanote/.trash/nodejs的markdown库.md similarity index 100% rename from public/mengyanote/Linux/nodejsmarkdown库.md rename to mengyanote-frontend/public/mengyanote/.trash/nodejs的markdown库.md diff --git a/public/mengyanote/Linux/systemctl命令详细总结-豆包.md b/mengyanote-frontend/public/mengyanote/.trash/systemctl命令详细总结-豆包.md similarity index 100% rename from public/mengyanote/Linux/systemctl命令详细总结-豆包.md rename to mengyanote-frontend/public/mengyanote/.trash/systemctl命令详细总结-豆包.md diff --git a/public/mengyanote/.trash/专栏-关于我们常见的那些坑.md b/mengyanote-frontend/public/mengyanote/.trash/专栏-关于我们常见的那些坑.md similarity index 100% rename from public/mengyanote/.trash/专栏-关于我们常见的那些坑.md rename to mengyanote-frontend/public/mengyanote/.trash/专栏-关于我们常见的那些坑.md diff --git a/public/mengyanote/.trash/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md b/mengyanote-frontend/public/mengyanote/.trash/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md similarity index 100% rename from public/mengyanote/.trash/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md rename to mengyanote-frontend/public/mengyanote/.trash/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md diff --git a/mengyanote-frontend/public/mengyanote/.trash/代码片段-标准HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/.trash/代码片段-标准HelloWorld输出.md new file mode 100644 index 0000000..0279b37 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/代码片段-标准HelloWorld输出.md @@ -0,0 +1,3 @@ +```javascript +console.log("Hello, World!"); +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/.trash/代码片段-特殊HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/.trash/代码片段-特殊HelloWorld输出.md new file mode 100644 index 0000000..75ed544 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/代码片段-特殊HelloWorld输出.md @@ -0,0 +1,17 @@ +```javascript +//各种奇奇怪怪的方法 +// 方法1: 使用Unicode转义 +console.log('\u0048\u0065\u006c\u006c\u006f\u002c\u0020\u0057\u006f\u0072\u006c\u0064\u0021'); + +// 方法2: 使用Array和join +console.log(['Hello', 'World!'].join(', ')); + +// 方法3: 使用定时器 +setTimeout(() => console.log('Hello, World!'), 0); + +// 方法4: 使用Promise +Promise.resolve('Hello, World!').then(console.log); + +// 方法5: 使用函数式编程 +[].concat('Hello, World!').map(console.log); +``` \ No newline at end of file diff --git a/public/mengyanote/.trash/内网穿透方案.md b/mengyanote-frontend/public/mengyanote/.trash/内网穿透方案.md similarity index 100% rename from public/mengyanote/.trash/内网穿透方案.md rename to mengyanote-frontend/public/mengyanote/.trash/内网穿透方案.md diff --git a/mengyanote-frontend/public/mengyanote/.trash/前端html导入css和js方法.md b/mengyanote-frontend/public/mengyanote/.trash/前端html导入css和js方法.md new file mode 100644 index 0000000..e3b233a --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/前端html导入css和js方法.md @@ -0,0 +1,85 @@ + +--- + +## 1) 本地文件(Local) + +**说明**:把资源放在自己服务器 / 项目目录,通过相对或绝对路径引用(`/assets/`、`./`、`../` 等)。 + +**示例** + +```html + + + + + +``` + +**优点** + +- 完全可控:部署、版本、更新由自己管理。 +- 离线/内网可用(不依赖外部网络)。 +- 容易与构建流程(hash、cache-bust)集成。 + +**缺点** + +- 需要自己承担带宽与缓存策略。 +- 同一资源不会被不同站点共享缓存(除非使用统一 CDN)。 +- 初次请求可能比公共 CDN 略慢(取决于服务器配置/地域)。 + +--- + +## 2) 网页链接 / CDN(Remote) + +**说明**:引用第三方 URL(例如公用 CDN、第三方库托管),常用于库(jQuery、Bootstrap)、字体、图标或通用资源。 + +**示例** + +```html + + + + + + + + +``` + +**优点** + +- 全球分发、通常延迟更低、CDN 节点可被多站点共享缓存。 +- 节省自家带宽;外部资源常有高可用性。 +- 快速集成常用库(省去打包/托管工作)。 + +**缺点** + +- 依赖第三方可用性与隐私/合规(跨域、GDPR、内网限制)。 +- 安全风险:若 CDN 被劫持会影响站点(可用 SRI + crossorigin 缓解)。 +- 访问受限时(企业内网、无外网环境)会失败。 + +--- + +## 对比速览(关键点) + +- 控制权:本地 ✅✅ | CDN ✅(较弱) +- 性能(首屏/全球):CDN ✅ | 本地 视服务器而定 +- 可用性(离线/内网):本地 ✅ | CDN ❌ +- 缓存共享:CDN ✅ | 本地 ❌ +- 安全(篡改风险):本地 ✅ | CDN 需 SRI+cors + +--- + +## 最佳实践(简短清单) + +- **CSS**:放 ``;关键 CSS 可内联;非关键可 `preload` + onload 切换。 +- **JS**:外部脚本优先用 `defer`(保持顺序),第三方可用 `async`(若相互独立)。 +- **版本管理**:本地资源使用 hash(`app.abc123.js`)或 querystring(`?v=20251030`)做 cache-bust。 +- **安全**:使用 CDN 时为第三方静态资源加 `integrity` + `crossorigin`。 +- **回退/兼容**:必要时对重要外部资源提供本地回退(先尝试 CDN,失败再加载本地)。 +- **隐私合规**:评估第三方脚本会不会传输用户数据,必要时加载前征得同意。 + + +--- diff --git a/mengyanote-frontend/public/mengyanote/.trash/带图片.md b/mengyanote-frontend/public/mengyanote/.trash/带图片.md new file mode 100644 index 0000000..6b8f961 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/带图片.md @@ -0,0 +1,4 @@ +# 春日限定: +赴一场自然与生机的约会 春回大地时,万物挣脱冬日的沉寂,以最鲜活的姿态铺满视野。无论是枝头抽芽的新绿、田间绽放的繁花,还是拂面而来的暖风,都在诉说着季节的温柔絮语。 +--- +## 一、春日限定的自然画卷 春日的美,藏在每一处细腻的景致里。清晨的林间,露珠挂在嫩绿的叶片上,折射着柔和的晨光;午后的花海,各色花朵竞相开放,蝴蝶在花丛中翩跹起舞;傍晚的河畔,夕阳为水面镀上金边,归鸟的鸣啼伴着流水声,构成一幅宁静而治愈的画面。 ![春日林间晨景](https://picsum.photos/id/15/800/450) *图注:清晨的林间,露珠与新绿交织出春日的清新气息* --- ## 二、解锁春日的正确打开方式 1. 踏青寻芳:走进公园、郊外或山林,沉浸式感受草木生长的力量,呼吸带着花香的新鲜空气。 2. 野餐小聚:约上好友,带着美食与餐布,在草坪上享受阳光与陪伴,记录惬意时光。 3. 绿植养护:在家中摆放几盆绿植或鲜花,让春日的生机延伸到室内,点缀日常空间。 ![草坪野餐时光](https://picsum.photos/id/26/800/450) *图注:在洒满阳光的草坪上,与好友共度轻松惬意的野餐时刻* --- ## 三、春日里的生活感悟 春天是充满希望的季节,它教会我们接纳变化、拥抱新生。就像树木在经历寒冬后重新发芽,生活也会在坚持与等待中迎来转机。不妨趁着春日正好,放慢脚步,感受身边的美好,为自己注入前行的力量。 --- 要不要我帮你生成**不同主题(如旅行、美食、读书)的带图片Markdown文章模板**?你只需告诉我具体主题,我就能快速适配内容和图片搭配。 \ No newline at end of file diff --git a/public/mengyanote/Linux/我想全局执行某个sh脚本,该放在Linux哪个目录.md b/mengyanote-frontend/public/mengyanote/.trash/我想全局执行某个sh脚本,该放在Linux哪个目录.md similarity index 94% rename from public/mengyanote/Linux/我想全局执行某个sh脚本,该放在Linux哪个目录.md rename to mengyanote-frontend/public/mengyanote/.trash/我想全局执行某个sh脚本,该放在Linux哪个目录.md index f3412ca..a0bdfd9 100644 --- a/public/mengyanote/Linux/我想全局执行某个sh脚本,该放在Linux哪个目录.md +++ b/mengyanote-frontend/public/mengyanote/.trash/我想全局执行某个sh脚本,该放在Linux哪个目录.md @@ -75,5 +75,3 @@ - **最推荐的目录:** `/usr/local/bin/`,适用于系统范围内的自定义脚本。 - **其他可选目录:** `/usr/bin/`(不推荐),如果需要放系统级命令可以选择该目录。 - **特定用户的脚本:** 用户自己的 `~/bin/` 目录。 - -将脚本放入上述目录,并设置执行权限后,你就可以在系统中的任何地方执行该脚本了。如果有任何问题,请随时告知! \ No newline at end of file diff --git a/public/mengyanote/.trash/搭建derp和headscale避坑与指南.md b/mengyanote-frontend/public/mengyanote/.trash/搭建derp和headscale避坑与指南.md similarity index 100% rename from public/mengyanote/.trash/搭建derp和headscale避坑与指南.md rename to mengyanote-frontend/public/mengyanote/.trash/搭建derp和headscale避坑与指南.md diff --git a/mengyanote-frontend/public/mengyanote/.trash/未命名.base b/mengyanote-frontend/public/mengyanote/.trash/未命名.base new file mode 100644 index 0000000..f165474 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/未命名.base @@ -0,0 +1,3 @@ +views: + - type: table + name: 表格 diff --git a/public/mengyanote/计算机科普/术语科普-CVM.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-CVM.md similarity index 100% rename from public/mengyanote/计算机科普/术语科普-CVM.md rename to mengyanote-frontend/public/mengyanote/.trash/术语科普-CVM.md diff --git a/public/mengyanote/计算机科普/术语科普-IT行业的A端B端C端.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-IT行业的A端B端C端.md similarity index 100% rename from public/mengyanote/计算机科普/术语科普-IT行业的A端B端C端.md rename to mengyanote-frontend/public/mengyanote/.trash/术语科普-IT行业的A端B端C端.md diff --git a/public/mengyanote/计算机科普/术语科普-MCU.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-MCU.md similarity index 100% rename from public/mengyanote/计算机科普/术语科普-MCU.md rename to mengyanote-frontend/public/mengyanote/.trash/术语科普-MCU.md diff --git a/public/mengyanote/计算机科普/术语科普-MQ.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-MQ.md similarity index 100% rename from public/mengyanote/计算机科普/术语科普-MQ.md rename to mengyanote-frontend/public/mengyanote/.trash/术语科普-MQ.md diff --git a/public/mengyanote/计算机科普/术语科普-POI.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-POI.md similarity index 100% rename from public/mengyanote/计算机科普/术语科普-POI.md rename to mengyanote-frontend/public/mengyanote/.trash/术语科普-POI.md diff --git a/public/mengyanote/计算机科普/术语科普-QPS.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-QPS.md similarity index 100% rename from public/mengyanote/计算机科普/术语科普-QPS.md rename to mengyanote-frontend/public/mengyanote/.trash/术语科普-QPS.md diff --git a/mengyanote-frontend/public/mengyanote/.trash/术语科普-SaaS.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-SaaS.md new file mode 100644 index 0000000..417da62 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/术语科普-SaaS.md @@ -0,0 +1,55 @@ +# 什么是 SaaS(Software as a Service)? + +**一句话**:SaaS 就是把软件放在厂商的云端,通过互联网提供给你用,你按月/年订阅即可,无需自己买服务器、装软件、打补丁。 + +## 它和传统软件/其他“_aaS_”的区别 + +- **传统本地部署**:你买许可证+买服务器+自己维护 → 成本高、上线慢。 +- **SaaS**:厂商托管一切(基础设施、应用、更新、备份),你用浏览器/APP直接用。 +- **IaaS**(基础设施即服务):租云上的“硬件”(算力/存储/网络)。 +- **PaaS**(平台即服务):租开发与运行平台(数据库/函数/中间件)。 +- **SaaS**:直接是“成品应用”(如CRM、协作工具)。 + +## 关键特性 + +- 订阅计费(按用户/按用量/套餐分级) +- 通过浏览器或移动端访问,零安装 +- 自动更新与弹性扩容 +- 多租户架构(共享一套系统,数据逻辑隔离) +- 开放接口(API/SSO/SCIM)便于与现有系统集成 +- 明确的**SLA**(可用性、支持时效) + +## 优点 & 潜在不足 + +**优点** + +- 低启动成本,快速上线 +- 省运维与升级,持续获得新功能 +- 按需扩缩,适合中小团队和快速试错 + +**潜在不足** + +- 深度定制受限(更多是“配置”而非“改代码”) +- 数据合规/数据驻留要求需确认 +- 依赖网络与厂商,存在一定“供应商锁定” +- 长期订阅成本需要核算 + +## 常见场景与例子 + +- 协作与沟通:Slack、Zoom、Notion +- 客户与销售:Salesforce、HubSpot +- 电商与支付:Shopify、Stripe(偏API型SaaS) +- 人事财务:Workday、QuickBooks Online + +## 选型时的速查清单 + +1. **合规与安全**:是否支持你所在行业/地区的合规(如 ISO 27001、SOC 2、GDPR、数据驻留选项)。 +2. **SLA 与可靠性**:可用性承诺、备份与灾备、支持响应时效。 +3. **集成**:是否支持 SSO/SCIM、现有系统的数据同步与 API 能力。 +4. **可配置度**:工作流、权限、报表、低代码/自动化能力到什么程度。 +5. **数据进出**:导入/导出、数据可携带与停用后的数据处理。 +6. **成本模型**:按用户/用量/功能包的组合,三年总拥有成本(TCO)。 + +## 一个小比喻 + +把软件当“自来水”:SaaS 负责建厂、铺管、净水和维护,你拧开水龙头就能用水(功能),按量付费。 diff --git a/public/mengyanote/计算机科普/术语科普-pwn.md b/mengyanote-frontend/public/mengyanote/.trash/术语科普-pwn.md similarity index 100% rename from public/mengyanote/计算机科普/术语科普-pwn.md rename to mengyanote-frontend/public/mengyanote/.trash/术语科普-pwn.md diff --git a/public/mengyanote/计算机科普/术语解释-DMZ.md b/mengyanote-frontend/public/mengyanote/.trash/术语解释-DMZ.md similarity index 100% rename from public/mengyanote/计算机科普/术语解释-DMZ.md rename to mengyanote-frontend/public/mengyanote/.trash/术语解释-DMZ.md diff --git a/mengyanote-frontend/public/mengyanote/.trash/术语解释-UGC.md b/mengyanote-frontend/public/mengyanote/.trash/术语解释-UGC.md new file mode 100644 index 0000000..20d312c --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/.trash/术语解释-UGC.md @@ -0,0 +1,74 @@ +**UGC(User Generated Content,用户生成内容)** 是指由普通用户而非专业机构或企业生产、发布和分享的内容。UGC 的出现和发展是互联网尤其是 Web 2.0 时代的核心特征之一,它极大地改变了信息传播的方式、内容生态和商业逻辑。以下是从**定义、类型、特点、商业价值和应用场景**五个方面对 UGC 的专业解释: + +--- + +### 一、UGC 的定义 + +UGC 是指由互联网用户主动创作并发布到各类平台上的内容。这些内容通常非付费创作,而是用户基于个人兴趣、经验或观点产生。它涵盖文字、图片、视频、音频、评论等多种形式。 +👉 **关键点**:内容由“用户”创造,而非“平台”或“机构”生产。 + +常见的 UGC 平台包括: + +- **社交媒体**:微博、小红书、Instagram、抖音、Twitter; +- **视频与直播平台**:YouTube、Bilibili; +- **社区论坛**:知乎、Reddit; +- **内容分享平台**:豆瓣、Medium、Pinterest。 + +--- + +### 二、UGC 的类型 + +1. **文本类**:博客、影评、产品评论、论坛帖子、微博内容; +2. **图片类**:摄影作品、绘画、表情包; +3. **视频类**:短视频、Vlog、直播内容; +4. **音频类**:播客、配音作品; +5. **交互类**:问答、评论、弹幕、点赞行为(属于轻量级 UGC)。 + +--- + +### 三、UGC 的特点 + +1. **去中心化**:创作主体分散,人人皆可成为“内容生产者”; +2. **高参与度与互动性**:用户不只是观众,更是参与者与传播者; +3. **真实性与多样性**:内容往往反映用户真实的使用体验、生活状态; +4. **长尾效应明显**:少数“头部创作者”贡献大量流量,但“腰部”和“尾部”用户共同维持生态活力; +5. **传播性强**:社交关系链促进内容病毒式扩散。 + +--- + +### 四、UGC 的商业价值 + +1. **品牌营销与口碑传播** + 用户自发分享的体验(如“种草”、“测评”)具备高度信任度,成为品牌营销的重要资产。 + 例如:小红书的“笔记”体系即基于 UGC 建立口碑传播机制。 + +2. **内容生态建设** + 平台依赖 UGC 提供持续的新内容来源,形成丰富多样的内容生态。 + +3. **数据与算法优化** + 用户内容反映偏好与趋势,可用于算法推荐与广告精准投放。 + +4. **社区粘性与用户留存** + UGC 让用户既是消费者又是贡献者,从而增强平台粘性。 + + +--- + +### 五、UGC 的应用场景 + +- **电商领域**:用户评价、晒图、开箱视频; +- **旅游行业**:游记、攻略分享(如马蜂窝、TripAdvisor); +- **教育平台**:用户笔记、课程反馈; +- **游戏社区**:玩家创作的关卡、MOD; +- **AI 内容生成**:UGC 与 AIGC(AI Generated Content)结合,用于内容共创和辅助创作。 + +--- + +### 六、与 PGC / AIGC 的区别 + +|内容类型|主体|特征|代表平台| +|---|---|---|---| +|**UGC**|普通用户|自发、真实、多样|小红书、Bilibili、知乎| +|**PGC**(Professionally Generated Content)|专业机构或个人|专业性强、质量高|优酷、爱奇艺、媒体网站| +|**AIGC**(AI Generated Content)|人工智能生成|自动化、规模化|ChatGPT、Midjourney 等| + diff --git a/public/mengyanote/树萌芽的小本本/树萌芽の编程想法.md b/mengyanote-frontend/public/mengyanote/.trash/树萌芽の编程想法.md similarity index 81% rename from public/mengyanote/树萌芽的小本本/树萌芽の编程想法.md rename to mengyanote-frontend/public/mengyanote/.trash/树萌芽の编程想法.md index 670d61d..7b9d32d 100644 --- a/public/mengyanote/树萌芽的小本本/树萌芽の编程想法.md +++ b/mengyanote-frontend/public/mengyanote/.trash/树萌芽の编程想法.md @@ -1,30 +1,30 @@ - + - [ ] 1.开发一个项目,微信,QQ虚拟ai,将亲人在世前发送的所有消息包括视频,照片,对话,语音等投喂给ai,可以模拟亲人生前的对话,得到一种缅怀,回忆的感觉 - [ ] 2.做个专门保存QQ,微信表情包的软件/网站 - [ ] 3.做个专门保存各种编程语言代码块(最好有语法高亮,很难,毕竟不太会正则表达式),封装库,小知识 -- [ ] 4.免费帮做网站(学习前端实践)(可附带安卓app),如生日祝福,情侣小站,人物简介 -- [ ] 5.做一个收录网络API大全软件/网站 +- [x] 4.免费帮做网站(学习前端实践)(可附带安卓app),如生日祝福,情侣小站,人物简介 +- [x] 5.做一个收录网络API大全软件/网站 - [x] 6.萌芽农场(类似于QQ农场)✅ 2024-10-25 -- [ ] 7.抽奖,签到,测运软件 -- [ ] 8.专门投票问卷软件/网站,需要邮箱验证 +- [x] 7.抽奖,签到,测运软件 +- [x] 8.专门投票问卷软件/网站,需要邮箱验证 - [ ] 9.尝试封装扩展一下C语言/C++,做一个C语言加强版?,或者更牛逼一点一种接近新的编程语言? - [ ] 10.一个桌宠 - [x] 11.普通画转像素画(像素风格) - [x] 12.做一个ai写诗软件 -- [ ] 13.给萌芽农场聊天做个彩蛋类似于 +- [x] 13.给萌芽农场聊天做个彩蛋类似于 - [x] 14.做一个灵创赛博英灵殿结合QQ获取头像和昵称,一颗树来延伸,分哪些组 -- [ ] 15.做一个ai小智模拟,ai萌小芽,小萌芽 +- [x] 15.做一个ai小智模拟,ai萌小芽,小萌芽 - [ ] 16.写一个最小操作系统,跑在qemu或者docker上 - [ ] 17.写一个python脚本自动批量注释/解除注释print,log等打印语句,减少生产环境的性能损耗(针对不同语言) - [ ] 18.做一个Linux一键安装脚本,支持termux,Debian系 -- [ ] 19.做一个图床 +- [x] 19.做一个图床 - [ ] 20.做一个二维码/条形码生成系统 -- [ ] 21.做一个Linux命令帮手 用户输入要求 系统输出命令 +- [x] 21.做一个Linux命令帮手 用户输入要求 系统输出命令 - [ ] 22.做一个剪切版同步软件,支持Windows和安卓分别储存剪切板内容,然后同步 - [ ] 23.做一个把本地前端网页嵌入apk的网页转app软件,安卓可以用系统webview框架,也支持Windows,不一定非得一个软件,可以Windows和Android分开来制作 - [ ] 24.做一个网页ssh连接,adb连接客户端,添加自定义命令 - [ ] 搭建一个安卓构建平台,然后手机端配置好一些请求发送给服务端编译下载好后发送给手机端安装 -- [ ] 写一个文章美化ai助手,加入更多的makdwon格式美化和emoji美化 +- [x] 写一个文章美化ai助手,加入更多的makdwon格式美化和emoji美化 - [ ] 写一个待办事项网站,记录要办的事情 - [x] ai 大模型测试名字的稀有度 - [x] ai大模型说一个词汇返回一个Emoji和颜文字 @@ -34,11 +34,12 @@ - [ ] 做一个树萌芽的宝库,收集从各路来的好用的软件 - [x] 用户发送一个Linux下的需求 AI返回相关的Linux命令 - [ ] 做一个聊天室软件,支持Windows,Linux,安卓,网页 -- [ ] 用AI制作一个亲戚称呼关系计算器 -- [ ] 以30列30行的形式随机展示各种Emoji,点击对应Emoji可以直接一键复制,有刷新按钮可以刷新相应Emoji +- [x] 用AI制作一个亲戚称呼关系计算器 +- [x] 以30列30行的形式随机展示各种Emoji,点击对应Emoji可以直接一键复制,有刷新按钮可以刷新相应Emoji - [ ] 用python写个随机系列:随机一言,随机音乐,随机视频,随机诗歌,随机编程题,随机占卜/算命的后端API==, - [ ] 做一个TCP,udp,websocket连接器,服务端和客户端,用来学习和测试 - [ ] 写一个插件,模组,玩家可以用钻石驯服幻翼,腐肉,幻翼膜修复幻翼,驯服后可以跟随玩家打怪,可以被栓绳拴住,白天免疫燃烧伤害 - [ ] 写一个撅屁股的网页,支持输入被撅人和撅人的QQ号然后自动获取QQ头像,生成撅屁股动图 +- [ ] 网页临时邮箱,可以直接显示接收的邮件 diff --git a/public/mengyanote/.trash/章外篇之—-用指令设置玩家实体大小(简单版).md b/mengyanote-frontend/public/mengyanote/.trash/章外篇之—-用指令设置玩家实体大小(简单版).md similarity index 100% rename from public/mengyanote/.trash/章外篇之—-用指令设置玩家实体大小(简单版).md rename to mengyanote-frontend/public/mengyanote/.trash/章外篇之—-用指令设置玩家实体大小(简单版).md diff --git a/public/mengyanote/.trash/章外篇之二-多语言解决方案.md b/mengyanote-frontend/public/mengyanote/.trash/章外篇之二-多语言解决方案.md similarity index 100% rename from public/mengyanote/.trash/章外篇之二-多语言解决方案.md rename to mengyanote-frontend/public/mengyanote/.trash/章外篇之二-多语言解决方案.md diff --git a/public/mengyanote/.trash/第一章-主要的事件介绍.md b/mengyanote-frontend/public/mengyanote/.trash/第一章-主要的事件介绍.md similarity index 100% rename from public/mengyanote/.trash/第一章-主要的事件介绍.md rename to mengyanote-frontend/public/mengyanote/.trash/第一章-主要的事件介绍.md diff --git a/public/mengyanote/.trash/第一章-如何搭建环境.md b/mengyanote-frontend/public/mengyanote/.trash/第一章-如何搭建环境.md similarity index 100% rename from public/mengyanote/.trash/第一章-如何搭建环境.md rename to mengyanote-frontend/public/mengyanote/.trash/第一章-如何搭建环境.md diff --git a/public/mengyanote/.trash/第一部分前言.md b/mengyanote-frontend/public/mengyanote/.trash/第一部分前言.md similarity index 100% rename from public/mengyanote/.trash/第一部分前言.md rename to mengyanote-frontend/public/mengyanote/.trash/第一部分前言.md diff --git a/public/mengyanote/.trash/第七章-PluginBase类.md b/mengyanote-frontend/public/mengyanote/.trash/第七章-PluginBase类.md similarity index 100% rename from public/mengyanote/.trash/第七章-PluginBase类.md rename to mengyanote-frontend/public/mengyanote/.trash/第七章-PluginBase类.md diff --git a/public/mengyanote/.trash/第七章-如何发送数据包.md b/mengyanote-frontend/public/mengyanote/.trash/第七章-如何发送数据包.md similarity index 100% rename from public/mengyanote/.trash/第七章-如何发送数据包.md rename to mengyanote-frontend/public/mengyanote/.trash/第七章-如何发送数据包.md diff --git a/public/mengyanote/.trash/第三章-如何编写监听器.md b/mengyanote-frontend/public/mengyanote/.trash/第三章-如何编写监听器.md similarity index 100% rename from public/mengyanote/.trash/第三章-如何编写监听器.md rename to mengyanote-frontend/public/mengyanote/.trash/第三章-如何编写监听器.md diff --git a/public/mengyanote/.trash/第三章-计时器的介绍.md b/mengyanote-frontend/public/mengyanote/.trash/第三章-计时器的介绍.md similarity index 100% rename from public/mengyanote/.trash/第三章-计时器的介绍.md rename to mengyanote-frontend/public/mengyanote/.trash/第三章-计时器的介绍.md diff --git a/public/mengyanote/.trash/第二章-事件相关方法.md b/mengyanote-frontend/public/mengyanote/.trash/第二章-事件相关方法.md similarity index 100% rename from public/mengyanote/.trash/第二章-事件相关方法.md rename to mengyanote-frontend/public/mengyanote/.trash/第二章-事件相关方法.md diff --git a/public/mengyanote/.trash/第二章-插件要素.md b/mengyanote-frontend/public/mengyanote/.trash/第二章-插件要素.md similarity index 100% rename from public/mengyanote/.trash/第二章-插件要素.md rename to mengyanote-frontend/public/mengyanote/.trash/第二章-插件要素.md diff --git a/public/mengyanote/.trash/第二部分前言.md b/mengyanote-frontend/public/mengyanote/.trash/第二部分前言.md similarity index 100% rename from public/mengyanote/.trash/第二部分前言.md rename to mengyanote-frontend/public/mengyanote/.trash/第二部分前言.md diff --git a/public/mengyanote/.trash/第五章-各种实体类的方法介绍.md b/mengyanote-frontend/public/mengyanote/.trash/第五章-各种实体类的方法介绍.md similarity index 100% rename from public/mengyanote/.trash/第五章-各种实体类的方法介绍.md rename to mengyanote-frontend/public/mengyanote/.trash/第五章-各种实体类的方法介绍.md diff --git a/public/mengyanote/.trash/第五章-如何使用配置文件.md b/mengyanote-frontend/public/mengyanote/.trash/第五章-如何使用配置文件.md similarity index 100% rename from public/mengyanote/.trash/第五章-如何使用配置文件.md rename to mengyanote-frontend/public/mengyanote/.trash/第五章-如何使用配置文件.md diff --git a/public/mengyanote/.trash/第八章-案例玩家进入信息等效果.md b/mengyanote-frontend/public/mengyanote/.trash/第八章-案例玩家进入信息等效果.md similarity index 100% rename from public/mengyanote/.trash/第八章-案例玩家进入信息等效果.md rename to mengyanote-frontend/public/mengyanote/.trash/第八章-案例玩家进入信息等效果.md diff --git a/public/mengyanote/.trash/第六章-各种工具类的介绍.md b/mengyanote-frontend/public/mengyanote/.trash/第六章-各种工具类的介绍.md similarity index 100% rename from public/mengyanote/.trash/第六章-各种工具类的介绍.md rename to mengyanote-frontend/public/mengyanote/.trash/第六章-各种工具类的介绍.md diff --git a/public/mengyanote/.trash/第六章-如何编写plugin.yml.md b/mengyanote-frontend/public/mengyanote/.trash/第六章-如何编写plugin.yml.md similarity index 100% rename from public/mengyanote/.trash/第六章-如何编写plugin.yml.md rename to mengyanote-frontend/public/mengyanote/.trash/第六章-如何编写plugin.yml.md diff --git a/public/mengyanote/.trash/第四章-Server类和PluginManager类.md b/mengyanote-frontend/public/mengyanote/.trash/第四章-Server类和PluginManager类.md similarity index 100% rename from public/mengyanote/.trash/第四章-Server类和PluginManager类.md rename to mengyanote-frontend/public/mengyanote/.trash/第四章-Server类和PluginManager类.md diff --git a/public/mengyanote/.trash/第四章-如何编写命令.md b/mengyanote-frontend/public/mengyanote/.trash/第四章-如何编写命令.md similarity index 100% rename from public/mengyanote/.trash/第四章-如何编写命令.md rename to mengyanote-frontend/public/mengyanote/.trash/第四章-如何编写命令.md diff --git a/public/mengyanote/编程语言/前端/纯静态网页的强大功能与应用.md b/mengyanote-frontend/public/mengyanote/.trash/纯静态网页的强大功能与应用.md similarity index 100% rename from public/mengyanote/编程语言/前端/纯静态网页的强大功能与应用.md rename to mengyanote-frontend/public/mengyanote/.trash/纯静态网页的强大功能与应用.md diff --git a/public/mengyanote/.trash/计算机面试经典八股.md b/mengyanote-frontend/public/mengyanote/.trash/计算机面试经典八股.md similarity index 100% rename from public/mengyanote/.trash/计算机面试经典八股.md rename to mengyanote-frontend/public/mengyanote/.trash/计算机面试经典八股.md diff --git a/public/mengyanote/临时/跨平台软件开发总结.md b/mengyanote-frontend/public/mengyanote/.trash/跨平台软件开发总结.md similarity index 100% rename from public/mengyanote/临时/跨平台软件开发总结.md rename to mengyanote-frontend/public/mengyanote/.trash/跨平台软件开发总结.md diff --git a/public/mengyanote/Linux/飞牛os切换root.md b/mengyanote-frontend/public/mengyanote/.trash/飞牛os切换root.md similarity index 100% rename from public/mengyanote/Linux/飞牛os切换root.md rename to mengyanote-frontend/public/mengyanote/.trash/飞牛os切换root.md diff --git a/public/mengyanote/AI/AI大模型应用拆解.md b/mengyanote-frontend/public/mengyanote/AI/AI大模型应用拆解.md similarity index 57% rename from public/mengyanote/AI/AI大模型应用拆解.md rename to mengyanote-frontend/public/mengyanote/AI/AI大模型应用拆解.md index 0fbadfa..504f8ad 100644 --- a/public/mengyanote/AI/AI大模型应用拆解.md +++ b/mengyanote-frontend/public/mengyanote/AI/AI大模型应用拆解.md @@ -1,7 +1,10 @@ > 此笔记记录一些AI工具的应用原理,给自己制作此类工具提供一点思路 -AI老师阅卷批改: +**AI老师阅卷批改:** OCR文字识别->大语言模型文本处理 -AI视频总结(bilinote): -下载视频->提取音频->音频转文字->大语言模型文本处理 \ No newline at end of file +**AI视频总结(bilinote):** +下载视频->提取音频->音频转文字->大语言模型文本处理 + +**AI一键解读医学报告:** +OCR文字识别->大语言模型文本处理 diff --git a/public/mengyanote/AI/AI提示词工程/AI绘画提示词.md b/mengyanote-frontend/public/mengyanote/AI/AI提示词工程/AI绘画提示词.md similarity index 100% rename from public/mengyanote/AI/AI提示词工程/AI绘画提示词.md rename to mengyanote-frontend/public/mengyanote/AI/AI提示词工程/AI绘画提示词.md diff --git a/mengyanote-frontend/public/mengyanote/AI/AI提示词工程/大模型驱动应用功能的实现.md b/mengyanote-frontend/public/mengyanote/AI/AI提示词工程/大模型驱动应用功能的实现.md new file mode 100644 index 0000000..0e9f1bf --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/AI/AI提示词工程/大模型驱动应用功能的实现.md @@ -0,0 +1,83 @@ + +**大模型本身不能直接执行任何任务。它像一个超级大脑,但缺少手和脚。它通过生成“指令”或“代码”,然后由一个“执行环境”来真正驱动任务。** + +让我们来分解这个过程: + +### 核心原理:工具使用与函数调用 + +大模型驱动任务的核心能力被称为 **“工具使用”** 或 **“函数调用”** 。你可以把这个过程想象成一个聪明的分析师和一个高效的执行秘书之间的配合: + +- **大模型(分析师):** 负责理解你的自然语言指令、分析意图、制定计划,并决定下一步该调用哪个“工具”(函数)。 +- **执行环境/应用程序(秘书):** 它拥有真正的“手和脚”。它准备好了各种工具(API、函数),并严格按照分析师的指令去执行。 + +### 具体工作流程(以“订机票”为例) + +假设你对一个集成了大模型的AI助手说:“帮我订一张明天从北京到上海的最便宜的机票。” + +这个过程并不是大模型直接去登录航空公司的系统,而是如下步骤: + +1. **意图理解与规划:** + - 大模型解析你的指令,识别出关键信息: + - **意图:** 订机票 + - **出发地:** 北京 + - **目的地:** 上海 + - **时间:** 明天 + - **偏好:** 最便宜 + - 它在内部规划出一个步骤序列:`查询航班 -> 比较价格 -> 填写订单 -> 完成支付`。 + +2. **识别可用工具:** + - 应用程序(AI助手)已经向大模型“注册”了它可以调用的各种工具函数,比如: + - `search_flights(departure, destination, date)` + - `compare_prices(flight_list)` + - `book_flight(flight_id, passenger_info)` + - `process_payment(booking_id, payment_details)` + +3. **生成函数调用:** + - 大模型意识到第一步需要查询航班。于是,它不会用自然语言回复你,而是会生成一个**结构化的函数调用请求**,格式通常是JSON: + ```json + { + "function": "search_flights", + "arguments": { + "departure": "北京", + "destination": "上海", + "date": "2024-06-02" + } + } + ``` + +4. **执行函数:** + - 应用程序接收到这个请求后,**在自己的安全环境内**,调用真正的 `search_flights` 函数。这个函数可能连接着航司的API、携程的接口,或者一个内部的航班数据库。 + - **关键点:** 执行代码、访问网络、操作数据库等危险或实际的操作,都是由应用程序完成的,而不是大模型本身。 + +5. **获取结果并继续:** + - `search_flights` 函数返回一个结构化的航班列表给应用程序。 + - 应用程序把这个结果(数据)再次作为上下文提供给大模型。 + - 大模型看到查询结果后,进行下一步分析,比如调用 `compare_prices` 来筛选出最便宜的选项。 + - 然后,它可能会生成下一个函数调用,比如 `book_flight`,并提示你提供乘机人信息。 + +6. **循环直至完成:** + - 这个“模型分析 -> 生成调用 -> 环境执行 -> 返回结果”的循环会一直持续,直到任务完成(比如订单确认号生成)。 + +### “打开网页”是如何工作的? + +这个例子更直观: + +1. 你说:“打开百度首页。” +2. 大模型识别出你的意图是“打开网页”,并且目标网址是“百度首页”。 +3. 它生成一个函数调用,比如 `open_browser(url="https://www.baidu.com")`。 +4. 应用程序(比如你的操作系统 shell 或一个自动化脚本)执行这个函数,启动你的默认浏览器并导航到该网址。 +5. 大模型回复你:“已为您打开百度首页。” + +### 为什么大模型“能够”做这些事?它的能力来源是什么? + +1. **代码理解与生成能力:** 大模型在训练时学习了海量的公开代码(如GitHub),因此它非常理解编程逻辑和API的调用方式。它知道 `search_flights` 这个函数需要哪些参数,以及返回的数据大概是什么样子。 +2. **逻辑推理与规划能力:** 它将复杂的用户请求(“订最便宜的机票”)分解成一系列可执行的、有序的步骤。 +3. **自然语言到结构化数据的转换能力:** 这是最关键的一步。它能将你模糊的、非结构化的口语指令(“帮我找个便宜的航班”),精确地转换成计算机可以理解的结构化参数(`{“max_price": 500, "sort_by": "price"}`)。 + +### 总结 + +- **大模型是“策略大脑”,不是“执行手脚”。** 它通过**工具使用(函数调用)** 来驱动任务。 +- **真正的执行者是外部的应用程序或系统**,它提供了安全的执行环境和真实的工具。 +- 大模型的价值在于充当了一个**极其强大的“自然语言到代码/指令”的翻译器和规划器**,让人类可以用最自然的方式与复杂的计算机系统交互。 + +所以,当你看到一个大模型能“订机票”或“打开网页”时,背后其实是一个精心设计的系统,在这个系统中,大模型扮演着指挥中心的角色,而具体的脏活累活则由它指挥的其他专业模块来完成。 \ No newline at end of file diff --git a/public/mengyanote/AI/AI提示词工程/开发前后端分离网站提示词.md b/mengyanote-frontend/public/mengyanote/AI/AI提示词工程/开发前后端分离网站提示词.md similarity index 100% rename from public/mengyanote/AI/AI提示词工程/开发前后端分离网站提示词.md rename to mengyanote-frontend/public/mengyanote/AI/AI提示词工程/开发前后端分离网站提示词.md diff --git a/mengyanote-frontend/public/mengyanote/AI/Claude code斜杠命令.md b/mengyanote-frontend/public/mengyanote/AI/Claude code斜杠命令.md new file mode 100644 index 0000000..115dd8d --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/AI/Claude code斜杠命令.md @@ -0,0 +1,35 @@ + +| 命令 | 功能说明 | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| /add-dir | 添加额外工作目录到当前会话的可读/可操作范围(多仓库/子目录协作)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /agents | 管理/使用自定义子代理(针对专门任务的 agent 配置)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /bashes | 列出并管理后台 Bash 任务/执行记录。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /bug | 报告 Claude Code 的问题/bug(可上传当前对话给 Anthropic)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /clear | 清空当前对话历史(重置上下文)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /compact | 压缩当前对话为更短总结,可带指令指定保留重点。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /config | 打开设置界面(配置选项卡)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /context | 以可视化网格展示当前上下文使用情况(token/文件/对话占用)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /cost | 显示 token 使用与成本统计。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /doctor | 健康检查/自检安装与环境(权限、依赖、CLI 状态)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /exit | 退出 Claude Code 交互 REPL。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /export | 导出当前对话到文件或剪贴板(可指定文件名)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /help | 显示帮助与所有可用斜杠命令(含自定义命令)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /hooks | 管理工具事件 hooks(在工具调用前/后触发的钩子配置)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /init | 初始化项目并生成/引导配置 `CLAUDE.md`(项目规则/记忆)。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /login | 登录/切换 Anthropic 账户。([Claude Code](https://code.claude.com/docs/zh-CN/slash-commands?utm_source=chatgpt.com "斜杠命令 - Claude Code Docs")) | +| /logout | 登出 Anthropic 账户。 | +| /mcp | 管理 MCP 服务器连接及 OAuth 鉴权(外部工具/数据源接入)。 | +| /memory | 打开并编辑 `CLAUDE.md` 的“项目记忆/规则”。 | +| /model | 选择/切换当前会话使用的模型。 | +| /output-style | 设置输出风格(如简洁/详细/偏代码等,具体风格随版本)。 | +| /permissions | 查看或更新工具权限(允许哪些工具/命令可被调用)。 | +| /privacy-settings | 查看/修改隐私设置。 | +| /review | 发起代码审查请求(让 Claude review 变更/文件)。 | +| /rewind | 回退对话/代码到之前的状态(撤销最近步骤)。 | +| /sandbox | 开启沙箱化 Bash 工具(文件系统/网络隔离,更安全的自动执行)。 | +| /status | 打开状态页(显示版本、模型、账户、连接性等)。 | +| /statusline | 设置/管理 Claude Code 的状态行 UI。 | +| /terminal-setup | 安装终端快捷键/绑定(如 Shift+Enter 换行,iTerm2/VSCode)。 | +| /todos | 列出当前会话/项目待办事项。 | +| /usage | 显示订阅计划的使用上限/速率限制状态。 | +| /vim | 进入 vim 模式(插入/命令模式切换)。 | diff --git a/public/mengyanote/AI/Qwen-Code命令行安装使用教程.md b/mengyanote-frontend/public/mengyanote/AI/Qwen-Code命令行安装使用教程.md similarity index 100% rename from public/mengyanote/AI/Qwen-Code命令行安装使用教程.md rename to mengyanote-frontend/public/mengyanote/AI/Qwen-Code命令行安装使用教程.md diff --git a/public/mengyanote/AI/Qwen-Code官方文档使用教程.md b/mengyanote-frontend/public/mengyanote/AI/Qwen-Code官方文档使用教程.md similarity index 100% rename from public/mengyanote/AI/Qwen-Code官方文档使用教程.md rename to mengyanote-frontend/public/mengyanote/AI/Qwen-Code官方文档使用教程.md diff --git a/mengyanote-frontend/public/mengyanote/AI/大模型上下文记忆功能的实现.md b/mengyanote-frontend/public/mengyanote/AI/大模型上下文记忆功能的实现.md new file mode 100644 index 0000000..c2a678f --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/AI/大模型上下文记忆功能的实现.md @@ -0,0 +1,51 @@ + +**大模型本身不具备记忆功能,并且是无状态的。我们感受到的“记忆”和“上下文”能力,是由使用大模型的应用程序(或框架)提供的。** + +### 1. 大模型本身:一个“无状态”的函数 + +你可以把一个大模型(比如 GPT-4)想象成一个极其复杂、聪明的**数学函数**。 + +- **无状态:** 这个函数本身不存储任何关于上一次被调用(即上一次对话)的信息。就像你计算 `f(x) = x + 2` 这个函数,你输入 `3`,它输出 `5`。你再次输入 `3`,它还是会输出 `5`。它不会“记得”你上一次输入了什么。大模型在每次被调用时,都只基于**当前这一次的输入**进行计算,然后产生输出。计算完成后,它内部不保存任何这次对话的“状态”。 +- **核心输入:** 大模型最核心的输入就是一个**文本序列**,也就是一个由词汇(Token)组成的字符串。它在这个序列的范围内进行模式识别和文本生成。 + +### 2. “记忆”从何而来?—— 上下文窗口 + +既然模型本身无记忆,我们感受到的连贯对话是怎么来的呢?答案是 **“上下文窗口”**。 + +- **什么是上下文窗口?** 这是模型**单次处理**所能接受的最大文本长度(例如 128K Tokens)。这个窗口不仅包含你**刚刚提出的新问题**,还包含了应用程序**特意塞进去的、之前所有的对话历史**。 +- **工作流程是这样的:** + 1. 你第一次说:“你好,我叫小明。” + 2. 应用程序(比如ChatGPT界面)会收到这条消息。它不会只把“你好,我叫小明。”发给模型,而是会组装一个完整的“提示”。这个提示可能看起来像这样(高度简化): + `[系统指令:你是一个友好的助手...] 用户:你好,我叫小明。 助手:` + 3. 模型收到这个提示,生成回答:“你好小明!很高兴认识你。” + 4. **关键一步:** 当你接着问第二个问题:“你还记得我叫什么吗?”时,应用程序会把**迄今为止所有的对话**都组装成一个新的、更长的提示,发给模型: + `[系统指令:你是一个友好的助手...] 用户:你好,我叫小明。 助手:你好小明!很高兴认识你。 用户:你还记得我叫什么吗? 助手:` + 5. 模型看到这个包含了全部历史的提示,它就能“看到”之前你提到了名字叫“小明”,从而生成正确的回答:“当然记得,你叫小明!” + +所以,**模型的“记忆”本质上是“回顾”**。它并没有真正记住,而是每次都被给予了一份完整的“剧本”以供参考。这个剧本就是**上下文窗口**。 + +### 3. 应用程序的角色:有状态的“对话管理者” + +真正“有状态”的,是和你交互的**应用程序或服务**。 + +- **它负责维护对话历史:** 这个应用(比如ChatGPT网页、API后端服务)有一个数据库或缓存,用来存储你整个会话的所有消息。 +- **它负责组装和修剪提示:** 每次你发送新消息,它都会从存储中取出历史记录,拼接到新消息前面,形成一个完整的提示,再发送给无状态的大模型。当对话很长,超过了模型的上下文窗口限制时,它还需要智能地修剪或总结早期的对话内容,以腾出空间。 +- **它可能管理长期记忆:** 一些更高级的应用(如GPTs、某些AI聊天机器人)可能会提供“长期记忆”或“核心记忆”功能。这通常是应用程序将你认为重要的信息提取出来,存储在独立的向量数据库里。在后续对话中,它会动态地从数据库中检索相关的“记忆”,并将其作为上下文的一部分塞给模型。 + +### 总结与类比 + +为了让你更好地理解,我们可以做一个类比: + +- **大模型本身:** 像一个**世界顶级的、但患有短期失忆症的厨师**。他厨艺精湛,能根据你给他的所有食材(输入提示)做出一道完美的菜(输出回答)。但做完之后,他就把这次烹饪忘得一干二净。 +- **应用程序:** 像这个厨师的**助手和服务员**。他负责记录每一位顾客(用户)点过的所有菜(对话历史)。当顾客要点新菜时,服务员会把顾客过去的点单记录和新的要求一起交给厨师,这样厨师就能做出符合顾客口味和需求的菜。 + +**所以,回到你的问题:** + +1. **你觉得这个记忆的功能是大模型提供的能力吗?** + - 不完全是。**基础能力**(在给定上下文中理解关联信息)是模型提供的,但**实现记忆的机制**(存储、组装、传递上下文)是由应用程序提供的。两者缺一不可。 + +2. **大模型是有状态的吗?** + - **大模型本身是无状态的。** 它是一个纯粹的函数。 + - **但以大模型为核心构建的AI应用或服务是“有状态”的。** 这个状态就是它维护的对话历史、用户偏好等数据。 + +这种“无状态模型 + 有状态应用”的设计,既保证了模型本身的纯粹和可扩展性(可以同时服务海量用户而状态不冲突),又通过应用程序赋予了它进行连贯、个性化对话的强大能力。 \ No newline at end of file diff --git a/public/mengyanote/AI/大语言模型的API key.md b/mengyanote-frontend/public/mengyanote/AI/大语言模型的API key.md similarity index 100% rename from public/mengyanote/AI/大语言模型的API key.md rename to mengyanote-frontend/public/mengyanote/AI/大语言模型的API key.md diff --git a/public/mengyanote/AI/大语言模型的API 调用.md b/mengyanote-frontend/public/mengyanote/AI/大语言模型的API 调用.md similarity index 100% rename from public/mengyanote/AI/大语言模型的API 调用.md rename to mengyanote-frontend/public/mengyanote/AI/大语言模型的API 调用.md diff --git a/mengyanote-frontend/public/mengyanote/AI/控制台AI大模型.md b/mengyanote-frontend/public/mengyanote/AI/控制台AI大模型.md new file mode 100644 index 0000000..2924560 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/AI/控制台AI大模型.md @@ -0,0 +1,5 @@ +- **Codex Cli** +- **Claude Code Cli** +- **Gemini Cli** +- **GitHub Copilot Cli** + diff --git a/public/mengyanote/AI/阿里云百炼平台模型API调用示例.md b/mengyanote-frontend/public/mengyanote/AI/阿里云百炼平台模型API调用示例.md similarity index 100% rename from public/mengyanote/AI/阿里云百炼平台模型API调用示例.md rename to mengyanote-frontend/public/mengyanote/AI/阿里云百炼平台模型API调用示例.md diff --git a/public/mengyanote/Docker/Docker 镜像相关.md b/mengyanote-frontend/public/mengyanote/Docker/Docker 镜像相关.md similarity index 100% rename from public/mengyanote/Docker/Docker 镜像相关.md rename to mengyanote-frontend/public/mengyanote/Docker/Docker 镜像相关.md diff --git a/public/mengyanote/Docker/Docker命令集合.md b/mengyanote-frontend/public/mengyanote/Docker/Docker命令集合.md similarity index 90% rename from public/mengyanote/Docker/Docker命令集合.md rename to mengyanote-frontend/public/mengyanote/Docker/Docker命令集合.md index b458617..48e013e 100644 --- a/public/mengyanote/Docker/Docker命令集合.md +++ b/mengyanote-frontend/public/mengyanote/Docker/Docker命令集合.md @@ -15,7 +15,7 @@ docker-compose build --no-cache **Docker容器一键更新到最新版镜像(以60s API举例)** ```bash #拉取最新镜像 -docker pull vikiboss/60s:latest + docker pull mlikiowa/napcat-docker:latest docker pull couchdb:latest #Obsidian同步的数据库 docker pull aceberg/watchyourlan #扫描局域网的工具 @@ -24,8 +24,7 @@ docker pull dpanel/dpanel:latest #停止并删除旧容器 -docker stop 60s -docker rm 60s + docker stop napcat docker rm napcat @@ -72,12 +71,7 @@ docker run -d \ -p 5984:5984 \ couchdb:latest -#60s api后端 -docker run -d \ - --restart always \ - --name 60s \ - -p 4399:4399 \ - vikiboss/60s:latest + #napcat QQ机器人 docker run -d \ diff --git a/public/mengyanote/Docker/Docker镜像快速迁移.md b/mengyanote-frontend/public/mengyanote/Docker/Docker镜像快速迁移.md similarity index 100% rename from public/mengyanote/Docker/Docker镜像快速迁移.md rename to mengyanote-frontend/public/mengyanote/Docker/Docker镜像快速迁移.md diff --git a/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/60sAPI-一款多功能丰富的后端接口集合.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/60sAPI-一款多功能丰富的后端接口集合.md new file mode 100644 index 0000000..1d32afe --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/60sAPI-一款多功能丰富的后端接口集合.md @@ -0,0 +1,20 @@ + +```bash + +#60s api后端 +docker run -d \ + --restart always \ + --name 60s \ + -p 4399:4399 \ + vikiboss/60s:latest + +``` + +```bash +docker pull vikiboss/60s:latest +``` + +```bash +docker stop 60s +docker rm 60s +``` \ No newline at end of file diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md similarity index 78% rename from public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md index bf3d6ea..a87a491 100644 --- a/public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md +++ b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md @@ -7,14 +7,13 @@ docker run -d \ -p 8022:22 \ -e USER_UID=1000 \ -e USER_GID=1000 \ - -v /shumengya/docker/storage/gitea:/data \ + -v /shumengya/docker/gitea:/data \ --restart=always \ gitea/gitea:latest ``` ```bash -#典型的非关系型数据库(json) docker pull gitea/gitea:latest ``` diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/MongoDB-数据库.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/MongoDB-数据库.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/MongoDB-数据库.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/MongoDB-数据库.md diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/MySQL-数据库.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/MySQL-数据库.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/MySQL-数据库.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/MySQL-数据库.md diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/NapCat-QQ机器人框架.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/NapCat-QQ机器人框架.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/NapCat-QQ机器人框架.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/NapCat-QQ机器人框架.md diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/Ntfy-萌芽通知.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Ntfy-萌芽通知.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/Ntfy-萌芽通知.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Ntfy-萌芽通知.md diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/Postgres-数据库.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Postgres-数据库.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/Postgres-数据库.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Postgres-数据库.md diff --git a/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Redis-内存数据库.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Redis-内存数据库.md new file mode 100644 index 0000000..3dc4d1b --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/Redis-内存数据库.md @@ -0,0 +1,20 @@ + +```bash +#Redis数据库 +docker run -d --name redis-server \ + -p 6379:6379 \ + -v /shumengya/docker/storage/redis:/data \ + redis:latest \ + redis-server --requirepass "shumengya520" --appendonly yes + +docker run -d --name redis-server \ + -p 6379:6379 \ + -v /shumengya/docker/storage/redis:/data \ + redis:latest \ + redis-server --requirepass "shumengya520" --appendonly yes --save 900 1 --save 300 10 --save 60 10000 +``` + +```bash + +docker pull redis +``` \ No newline at end of file diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/SurveyKing-强大的问卷调查服务.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/SurveyKing-强大的问卷调查服务.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/SurveyKing-强大的问卷调查服务.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/SurveyKing-强大的问卷调查服务.md diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/frp-内网穿透神器.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/frp-内网穿透神器.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/frp-内网穿透神器.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/frp-内网穿透神器.md diff --git a/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/kkfileview-文件格式预览大全.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/kkfileview-文件格式预览大全.md new file mode 100644 index 0000000..2f467bb --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/kkfileview-文件格式预览大全.md @@ -0,0 +1,19 @@ + +```bash + +docker run -d \ + --name kkfileview \ + -p 8289:8012 \ + --restart unless-stopped \ + keking/kkfileview:latest + + +``` + +```bash + +``` + +``` + +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/registry-轻量级自建Docker镜像仓库.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/registry-轻量级自建Docker镜像仓库.md new file mode 100644 index 0000000..6ba9b75 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/registry-轻量级自建Docker镜像仓库.md @@ -0,0 +1,25 @@ + +```bash + +docker run -d \ + --name registry \ + --restart always \ + --cpus="1" \ + --memory="512m" \ + --log-opt max-size=1m \ + --log-opt max-file=3 \ + -p 5000:5000 \ + -v /shumengya/docker/storage/registry:/var/lib/registry \ + -e TZ=Asia/Shanghai \ + -e REGISTRY_STORAGE_DELETE_ENABLED=true \ + registry:3.0.0 + +``` + +```bash + +``` + +``` + +``` \ No newline at end of file diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/tailscale-ip-derp.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/tailscale-ip-derp.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/tailscale-ip-derp.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/tailscale-ip-derp.md diff --git a/public/mengyanote/Docker/优秀好用的Docker镜像/模板.md b/mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/模板.md similarity index 100% rename from public/mengyanote/Docker/优秀好用的Docker镜像/模板.md rename to mengyanote-frontend/public/mengyanote/Docker/优秀好用的Docker镜像/模板.md diff --git a/public/mengyanote/Github/Github仓库公共API总结.md b/mengyanote-frontend/public/mengyanote/Github/Github仓库公共API总结.md similarity index 100% rename from public/mengyanote/Github/Github仓库公共API总结.md rename to mengyanote-frontend/public/mengyanote/Github/Github仓库公共API总结.md diff --git a/public/mengyanote/Github/Github获取仓库密钥.md b/mengyanote-frontend/public/mengyanote/Github/Github获取仓库密钥.md similarity index 100% rename from public/mengyanote/Github/Github获取仓库密钥.md rename to mengyanote-frontend/public/mengyanote/Github/Github获取仓库密钥.md diff --git a/public/mengyanote/Linux/Git常用命令.md b/mengyanote-frontend/public/mengyanote/Github/Git常用命令.md similarity index 100% rename from public/mengyanote/Linux/Git常用命令.md rename to mengyanote-frontend/public/mengyanote/Github/Git常用命令.md diff --git a/mengyanote-frontend/public/mengyanote/Github/Git提交临时禁用https.md b/mengyanote-frontend/public/mengyanote/Github/Git提交临时禁用https.md new file mode 100644 index 0000000..bd46967 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Github/Git提交临时禁用https.md @@ -0,0 +1,41 @@ +在 Git 中临时禁用 HTTPS 证书认证(主要用于解决自签名证书、证书过期或不可信证书导致的连接问题),可以通过修改 Git 的 http.sslVerify 配置实现 + +### **1. 单次命令临时禁用(推荐)** +在执行具体 Git 命令(如 clone、pull、push 等)时,通过 -c 参数临时指定禁用 SSL 验证,仅对当前命令生效: + +```bash +# 示例1:克隆仓库时临时禁用 +git clone -c http.sslVerify=false https://远程仓库地址.git +# 示例2:拉取代码时临时禁用 +git pull -c http.sslVerify=false origin 分支名 +# 示例3:推送代码时临时禁用 +git push -c http.sslVerify=false origin 分支名 +``` + +### **2. 当前仓库临时禁用(有效期至手动恢复)** +如果需要在当前仓库中临时禁用(多次操作生效),可修改当前仓库的局部配置: + +```bash +# 进入仓库目录后执行,禁用当前仓库的HTTPS证书验证 +git config http.sslVerify false +# 此时执行 pull/push 等操作会跳过证书验证 +git pull origin 分支名 +``` + +**使用完毕后务必恢复验证**(避免长期暴露风险): + +```bash +# 恢复当前仓库的HTTPS证书验证(默认值) +git config http.sslVerify true +``` + +### **3. 全局临时禁用(不推荐,影响所有仓库)** +如果需要对所有仓库临时禁用(不建议,风险较高),可修改全局配置: + +```bash +# 全局禁用(所有仓库生效) +git config --global http.sslVerify false +# 恢复全局默认设置 +git config --global http.sslVerify true +``` + diff --git a/public/mengyanote/Github/Linux下使用git探索.md b/mengyanote-frontend/public/mengyanote/Github/Linux下使用git探索.md similarity index 100% rename from public/mengyanote/Github/Linux下使用git探索.md rename to mengyanote-frontend/public/mengyanote/Github/Linux下使用git探索.md diff --git a/public/mengyanote/Github/linux常用git命令.md b/mengyanote-frontend/public/mengyanote/Github/linux常用git命令.md similarity index 100% rename from public/mengyanote/Github/linux常用git命令.md rename to mengyanote-frontend/public/mengyanote/Github/linux常用git命令.md diff --git a/public/mengyanote/LeetCode/力扣-两数之和详解.md b/mengyanote-frontend/public/mengyanote/LeetCode/力扣-两数之和详解.md similarity index 100% rename from public/mengyanote/LeetCode/力扣-两数之和详解.md rename to mengyanote-frontend/public/mengyanote/LeetCode/力扣-两数之和详解.md diff --git a/public/mengyanote/LeetCode/力扣1-两数相加问题.md b/mengyanote-frontend/public/mengyanote/LeetCode/力扣1-两数相加问题.md similarity index 100% rename from public/mengyanote/LeetCode/力扣1-两数相加问题.md rename to mengyanote-frontend/public/mengyanote/LeetCode/力扣1-两数相加问题.md diff --git a/public/mengyanote/LeetCode/力扣2-两数之和.md b/mengyanote-frontend/public/mengyanote/LeetCode/力扣2-两数之和.md similarity index 91% rename from public/mengyanote/LeetCode/力扣2-两数之和.md rename to mengyanote-frontend/public/mengyanote/LeetCode/力扣2-两数之和.md index f5a1f8c..41b9074 100644 --- a/public/mengyanote/LeetCode/力扣2-两数之和.md +++ b/mengyanote-frontend/public/mengyanote/LeetCode/力扣2-两数之和.md @@ -80,6 +80,17 @@ def twoSum(nums, target): return [num_map[complement], i] # 如果在,返回两个索引 num_map[num] = i # 如果不在,将当前数字和索引存入字典 return [] # 如果没有找到,返回空列表(但题目保证有解,所以不会执行到这里) + +#最简单方法 +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + n=len(nums) + for i in range(n): + for j in range(i+1,n): + if nums[i]+nums[j]==target: + return[i,j] + return[] + ``` 代码解释 @@ -91,4 +102,3 @@ def twoSum(nums, target): 5. 存储当前元素:如果补数不存在,将当前元素及其索引存入哈希表,以便后续查找 6. 返回结果:如果遍历结束仍未找到,返回空列表(但题目保证有解,所以不会执行到此) -这种方法确保了高效查找,适用于大规模数据输入,是解决此类问题的标准方法。 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/Linux/ADB/ADB常用命令.md b/mengyanote-frontend/public/mengyanote/Linux/ADB/ADB常用命令.md new file mode 100644 index 0000000..ba47b91 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/ADB/ADB常用命令.md @@ -0,0 +1,236 @@ + + +### 1. **基本命令** + +- **连接设备** + ```bash + adb devices + ``` + + 列出连接的设备,显示设备ID和状态。 + +- **启动ADB服务器** + ```bash + adb start-server + ``` + + 启动ADB服务。 + +- **停止ADB服务器** + ```bash + adb kill-server + ``` + + 停止ADB服务。 + + +### 2. **设备管理** + +- **查看设备信息** + ```bash + adb shell getprop + ``` + + 获取设备的各种信息(如型号、Android版本等)。 + +- **重启设备** + ```bash + adb reboot + ``` + + 重新启动设备。 + +- **重启到bootloader** + ```bash + adb reboot bootloader + ``` + + 将设备重启到bootloader模式(用于解锁、刷机等)。 + +- **进入恢复模式** + ```bash + adb reboot recovery + ``` + + 重新启动设备并进入恢复模式。 + + +### 3. **文件传输** + +- **从设备拷贝文件到电脑** + ```bash + adb pull <设备路径> <本地路径> + ``` + + 例如: + + ```bash + adb pull /sdcard/test.txt ./test.txt + ``` + +- **从电脑拷贝文件到设备** + ```bash + adb push <本地路径> <设备路径> + ``` + + 例如: + + ```bash + adb push test.txt /sdcard/ + ``` + + +### 4. **执行命令** + +- **进入设备的Shell** + ```bash + adb shell + ``` + + 进入设备的命令行界面,可以执行Linux命令。 + +- **执行单个命令** + ```bash + adb shell <命令> + ``` + + 例如,查看设备的文件系统: + + ```bash + adb shell ls /sdcard/ + ``` + + +### 5. **应用管理** + +- **安装应用** + ```bash + adb install + ``` + + 例如: + + ```bash + adb install app.apk + ``` + +- **卸载应用** + ```bash + adb uninstall <包名> + ``` + + 例如: + + ```bash + adb uninstall com.example.app + ``` + +- **列出所有已安装的应用** + ```bash + adb shell pm list packages + ``` + +- **清除应用数据** + ```bash + adb shell pm clear <包名> + ``` + + 例如: + + ```bash + adb shell pm clear com.example.app + ``` + + +### 6. **日志与调试** + +- **查看日志输出** + ```bash + adb logcat + ``` + + 实时显示设备的日志输出,常用于调试。 + +- **过滤日志** + ```bash + adb logcat <标签>:<等级> + ``` + + 例如: + + ```bash + adb logcat *:E + ``` + + 显示所有错误级别(Error)及以上的日志。 + +- **查看设备的进程** + ```bash + adb shell ps + ``` + + +### 7. **屏幕截图与录屏** + +- **截取屏幕截图** + + ```bash + adb shell screencap /sdcard/screenshot.png + ``` + + 将截图保存到设备存储中。 + +- **录制屏幕视频** + ```bash + adb shell screenrecord /sdcard/demo.mp4 + ``` + + +### 8. **开发与调试** + +- **开启开发者选项与USB调试** + 需要在设备的设置里开启开发者选项,并启用USB调试。 + +- **远程调试** + ```bash + adb tcpip 5555 + ``` + + 让设备进入无线调试模式(通过IP连接设备)。 + +- **连接到指定IP设备** + ```bash + adb connect <设备IP>:5555 + ``` + + +### 9. **设备状态与操作** + +- **查看设备状态** + ```bash + adb devices -l + ``` + +- **查看设备的存储** + ```bash + adb shell df + ``` + +- **获取设备电池状态** + ```bash + adb shell dumpsys battery + ``` + + +### 10. **其他常用命令** + +- **获取设备信息(硬件、系统信息)** + ```bash + adb shell dumpsys + ``` + +- **查看设备的CPU使用情况** + ```bash + adb shell top + ``` + diff --git a/mengyanote-frontend/public/mengyanote/Linux/ADB/ADB应用启动命令.md b/mengyanote-frontend/public/mengyanote/Linux/ADB/ADB应用启动命令.md new file mode 100644 index 0000000..5409f4d --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/ADB/ADB应用启动命令.md @@ -0,0 +1,13 @@ +**shizuku** +```bash +adb shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh + +sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh +``` + +**黑阈** +```bash +adb -d shell 'output=$(pm path me.piebridge.brevent); export CLASSPATH=${output#*:}; app_process /system/bin me.piebridge.brevent.server.BreventServer bootstrap; /system/bin/sh /data/local/tmp/brevent.sh' + +output=$(pm path me.piebridge.brevent); export CLASSPATH=${output#*:}; app_process /system/bin me.piebridge.brevent.server.BreventServer bootstrap; /system/bin/sh /data/local/tmp/brevent.sh +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/Linux/ADB/某安卓板子不知名初始化脚本.md b/mengyanote-frontend/public/mengyanote/Linux/ADB/某安卓板子不知名初始化脚本.md new file mode 100644 index 0000000..7795b7f --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/ADB/某安卓板子不知名初始化脚本.md @@ -0,0 +1,7 @@ +adb push busybox /tmp +adb shell +cd /tmp +chmod 777 * +./busybox ifconfig wlan0 up + +人总是孤独的,不要去搞过于偏门的东西,大学时间很有限,不要花太多时间在一些虚无缥缈的东西上 diff --git a/mengyanote-frontend/public/mengyanote/Linux/Debian 12安装MySQL教程.md b/mengyanote-frontend/public/mengyanote/Linux/Debian 12安装MySQL教程.md new file mode 100644 index 0000000..f9ab7d6 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Debian 12安装MySQL教程.md @@ -0,0 +1,182 @@ + +--- + +## 🧩 一、卸载旧版本(如果你之前装过 5.7 或 MariaDB) + +为了避免冲突,建议先清理旧包: + +```bash +sudo systemctl stop mysql || true +sudo apt remove --purge -y mysql-server mysql-client mysql-common mariadb-server mariadb-client mariadb-common +sudo apt autoremove --purge -y +sudo rm -rf /var/lib/mysql /etc/mysql +``` + +--- + +## ⚙️ 二、添加官方 MySQL APT 仓库 + +### 1️⃣ 下载并安装配置包 + +```bash +wget https://dev.mysql.com/get/mysql-apt-config_0.8.36-1_all.deb +sudo dpkg -i mysql-apt-config_0.8.36-1_all.deb +``` + +安装时会弹出交互菜单,请仔细选择: + +- **MySQL Server & Cluster → mysql-8.4-lts** + +- 其他(如 Tools、Connector 等)可保持默认。 + + +然后退出(选择 “OK” 保存配置)。 + +--- + +## ⚙️ 三、更新并安装 MySQL 8.4 LTS + +```bash +sudo apt update +sudo apt install -y mysql-server +``` + +这个命令会自动安装最新的 MySQL 8.4(LTS 版),包含 `mysql-community-server` 和相关依赖。 + +--- + +## 🔍 四、验证安装 + +```bash +mysql --version +``` + +你应看到类似输出: + +``` +mysql Ver 8.4.2 for Linux on x86_64 (MySQL Community Server - GPL) +``` + +--- + +## 🧠 五、启动与开机自启 + +```bash +sudo systemctl enable mysql +sudo systemctl start mysql +sudo systemctl status mysql +``` + +如果输出里状态是 `active (running)` ✅,说明服务正常运行。 + +--- + +## 🔐 六、安全配置 + +执行官方安全脚本: + +```bash +sudo mysql_secure_installation +``` + +它会引导你: + +- 设置 root 密码 + +- 移除匿名用户 + +- 禁止 root 远程登录(可选) + +- 删除 test 数据库 + +- 重载权限表 + + +建议全部选择“是(Y)”。 + +--- + +## 🧭 七、登录测试 + +```bash +mysql -u root -p +``` + +输入刚刚设置的密码,进入后执行: + +```sql +SELECT VERSION(); +``` + +输出应为: + +``` ++-----------+ +| VERSION() | ++-----------+ +| 8.4.x | ++-----------+ +``` + +--- + +## 🧰 八、(可选)修改 MySQL 配置文件 + +主配置路径: + +``` +/etc/mysql/mysql.conf.d/mysqld.cnf +``` + +如果你想修改端口、字符集等: + +```bash +sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf +``` + +推荐添加以下配置以支持中文与 emoji: + +```ini +[mysqld] +character-set-server = utf8mb4 +collation-server = utf8mb4_unicode_ci + +[client] +default-character-set = utf8mb4 +``` + +然后重启服务: + +```bash +sudo systemctl restart mysql +``` + +--- + +## 🧱 九、测试端口与启动情况 + +```bash +ss -tunlp | grep mysql +``` + +输出类似: + +``` +tcp LISTEN 0 80 127.0.0.1:3306 *:* users:(("mysqld",pid=xxxx,fd=xxx)) +``` + +说明 MySQL 已在 3306 端口监听。 + +--- + +## 🚀 十、总结 + +|项目|状态| +|---|---| +|系统|Debian 12 (Bookworm) ✅| +|MySQL 版本|8.4 LTS ✅| +|官方支持|完全兼容| +|安装难度|简单(无依赖冲突)| +|推荐用途|长期开发 / 生产环境| + +--- diff --git a/mengyanote-frontend/public/mengyanote/Linux/Debian 12安装PostgresDB教程.md b/mengyanote-frontend/public/mengyanote/Linux/Debian 12安装PostgresDB教程.md new file mode 100644 index 0000000..c2efe06 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Debian 12安装PostgresDB教程.md @@ -0,0 +1,171 @@ +下面给出在 PostgreSQL (PostgreSQL)在 Debian 12 (Bookworm) 上安装及基本配置的**一步步教程** + +--- + +## 前置条件 + +1. 已有一台 Debian 12 系统(可以是物理机、VM、或者云上实例)。 + +2. 使用拥有 `sudo` 权限的用户登录。 + +3. 网络可访问外部软件源。 + + +--- + +## 安装过程 + +### 1. 更新系统软件包 + +```bash +sudo apt update +sudo apt upgrade -y +``` + +这是一个好习惯,确保系统软件包为最新。 + +### 2. 安装 PostgreSQL + +有两种方式:使用 Debian 默认仓库或使用官方 PostgreSQL 仓库。 + +#### 方法 A:使用 Debian 默认仓库 + +```bash +sudo apt install -y postgresql postgresql-contrib +``` + +这会安装 PostgreSQL 及一些附加工具。 +安装后,服务一般会自动启动。可用 `sudo systemctl status postgresql` 查看。 + +#### 方法 B:使用 PostgreSQL 官方 PGDG 仓库(推荐如果你想安装特定版本) + +1. 安装 `postgresql-common`(生成脚本等): + + ```bash + sudo apt install -y postgresql-common + ``` + + + +2. 运行脚本将 PGDG 仓库添加到系统: + + ```bash + sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh + ``` + + 或者手动:导入签名密钥、创建 `/etc/apt/sources.list.d/pgdg.list`。 + +3. 更新软件包列表: + + ```bash + sudo apt update + ``` + +4. 安装你想的版本,比如: + + ```bash + sudo apt install -y postgresql-18 + ``` + + (版本号根据仓库显示为止) + + +--- + +### 3. 检查服务状态 & 设置开机启动 + +```bash +sudo systemctl status postgresql +sudo systemctl enable postgresql +``` + +确认服务已运行并且开机启动。 + +--- + +### 4. 切换用户、设置 postgres 用户密码 + +安装完成后,系统默认创建一个系统用户 `postgres`,以及 PostgreSQL 内部用户 `postgres`。你可以切换并为它设密码: + +```bash +sudo -i -u postgres +psql +\password postgres +\q +exit +``` + +这样为超级用户设置了密码。 + +--- + +### 5. 创建数据库和用户(基本操作) + +切换为 `postgres` 用户后,在 psql 中执行: + +```sql +CREATE DATABASE mydb; +CREATE USER myuser WITH PASSWORD 'strongpassword'; +GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; +``` + +然后退出 `\q`。 +你可以用以下方式连接: + +```bash +psql -d mydb -U myuser -h localhost +``` + +--- + +### 6. 配置远程访问(如果你希望其他机器也能访问数据库) + +默认 PostgreSQL 只监听本地 localhost。若要允许远程连接,需要两步: + +1. 编辑 `postgresql.conf`,修改 listen_addresses : + + ```bash + sudo nano /etc/postgresql/12/main/postgresql.conf + # 找到 + listen_addresses = 'localhost' + # 改为 + listen_addresses = '*' + ``` + + 然后保存。 + +2. 编辑 `pg_hba.conf`,允许特定 IP 或网段连接: + + ```bash + sudo nano /etc/postgresql/12/main/pg_hba.conf + # 添加一行,例如: + host all all 192.168.100.0/24 md5 + ``` + + 然后重启服务: + + ```bash + sudo systemctl restart postgresql + ``` + + +> **警告**:允许远程访问时要注意安全(防火墙、强密码、只限可信IP)。 + +--- + +### 7. (可选)安装 pgAdmin4 图形管理工具 + +如果你更倾向图形界面管理数据库,可以考虑安装 pgAdmin 4。 ([HowtoForge](https://www.howtoforge.com/how-to-install-postgresql-and-pgadmin-tool-on-debian-12/?utm_source=chatgpt.com "How to Install PostgreSQL and pgAdmin Tool on Debian 12")) +大致步骤:添加 pgAdmin 仓库、安装 `pgadmin4-web`、运行配置脚本、然后通过浏览器访问管理界面。 + +--- + +### 8. 卸载或清理(如果需要) + +如果你想移除 PostgreSQL,建议使用 `purge` 而不仅仅 `remove`,以清理配置文件。有人经验如下: + +> “使用 apt purge —purge … 然后 rm -rf 残余目录” ([Reddit](https://www.reddit.com/r/debian/comments/16cn3zx/how_to_properly_install_postgresql_remove_it_and/?utm_source=chatgpt.com "how to properly install postgresql, remove it, and install it again?")) +> 但在你的场景里(你打算长期使用 PostgreSQL),通常不需要卸载。 + + +--- diff --git a/mengyanote-frontend/public/mengyanote/Linux/Debian11挂载U盘记录.md b/mengyanote-frontend/public/mengyanote/Linux/Debian11挂载U盘记录.md new file mode 100644 index 0000000..214a7b4 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Debian11挂载U盘记录.md @@ -0,0 +1,87 @@ +下面是帮你整理后的 Markdown 排版版本(内容不改,只做结构和代码块美化): + +--- + +## 1. 查看设备与分区 + +```bash +lsusb +lsblk +``` + +--- + +## 2. 创建挂载目录 + +```bash +mkdir -p /mnt/usb1 /mnt/usb2 /mnt/usb3 +``` + +--- + +## 3. 手动挂载(Linux 常规挂载) + +```bash +mount /dev/sdb3 /mnt/usb1 +mount /dev/sdc3 /mnt/usb2 +mount /dev/sdd3 /mnt/usb3 +``` + +--- + +## 4. 手动挂载(NTFS 分区专用) + +```bash +mount -t ntfs-3g /dev/sdb3 /mount/usb1 +mount -t ntfs-3g /dev/sdc3 /mount/usb2 +mount -t ntfs-3g /dev/sdd3 /mount/usb3 +``` + +--- + +## 5. 没有 ntfs 驱动时安装 + +```bash +apt update +apt install -y ntfs-3g +``` + +--- + +## 6. 设置开机自动挂载 + +编辑 fstab: + +```bash +nano /etc/fstab +``` + +写入以下内容: + +### 6.1 只能 root 读写 + +```fstab +UUID=07D4D4B211B07E02 /mount/usb1 ntfs-3g defaults,nofail,uid=0,gid=0,umask=022 0 0 +UUID=5372C6CA45FABB99 /mount/usb2 ntfs-3g defaults,nofail,uid=0,gid=0,umask=022 0 0 +UUID=1CAA88DDC37F2300 /mount/usb3 ntfs-3g defaults,nofail,uid=0,gid=0,umask=022 0 0 +``` + +### 6.2 普通用户也可以读写 + +```fstab +UUID=07D4D4B211B07E02 /mount/usb1 ntfs-3g defaults,nofail,uid=1000,gid=1000,umask=022 0 0 +UUID=5372C6CA45FABB99 /mount/usb2 ntfs-3g defaults,nofail,uid=1000,gid=1000,umask=022 0 0 +UUID=1CAA88DDC37F2300 /mount/usb3 ntfs-3g defaults,nofail,uid=1000,gid=1000,umask=022 0 0 +``` + + +--- + +## 7. 检查 fstab 语法 + +```bash +mount -a +``` + +--- + diff --git a/mengyanote-frontend/public/mengyanote/Linux/Debian12卸载宝塔面板命令.md b/mengyanote-frontend/public/mengyanote/Linux/Debian12卸载宝塔面板命令.md new file mode 100644 index 0000000..d7dd650 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Debian12卸载宝塔面板命令.md @@ -0,0 +1,83 @@ +在 **Debian 12** 上彻底卸载 **宝塔面板(BT Panel)**,包括其服务、目录和残留配置文件,可以按以下步骤执行。 + +--- + +### 🧹 一键卸载命令(官方脚本) + +宝塔官方提供了卸载脚本,最安全的做法是: + +```bash +bt uninstall +``` + +如果命令不存在,可用下面的方式: + +```bash +bash /www/server/panel/install/uninstall.sh +``` + +--- + +### 🧨 手动彻底清理残留(推荐完整执行以下步骤) + +如果你想**完全删除所有宝塔相关文件与服务**,执行以下命令(逐条复制): + +```bash +# 1. 停止宝塔服务 +/etc/init.d/bt stop || systemctl stop bt + +# 2. 删除宝塔主目录 +rm -rf /www + +# 3. 删除宝塔执行脚本及命令链接 +rm -f /usr/bin/bt +rm -f /etc/init.d/bt + +# 4. 删除启动服务项 +systemctl disable bt --now 2>/dev/null + +# 5. 删除宝塔日志和缓存 +rm -rf /tmp/*bt* +rm -rf /var/log/bt* +rm -rf /var/lib/btpanel + +# 6. 删除宝塔安装脚本可能残留的位置 +rm -rf /root/.bt_backup +rm -rf /root/bt.* +rm -rf /root/panel +rm -rf /root/.ssh_bt + +# 7. 删除 Nginx、MySQL、PHP 等由宝塔安装的服务(如需要) +# ⚠️ 若系统中其它服务依赖这些组件,请谨慎执行! +apt purge -y nginx* mysql* mariadb* php* pure-ftpd* redis* memcached* mongod* vsftpd* +apt autoremove -y +apt clean +``` + +--- + +### 🧾 可选清理(防止端口和用户残留) + +```bash +# 删除宝塔可能创建的用户 +userdel -r www 2>/dev/null + +# 清理面板端口防火墙规则(默认为 8888) +ufw delete allow 8888 2>/dev/null || iptables -D INPUT -p tcp --dport 8888 -j ACCEPT 2>/dev/null +``` + +--- + +### ✅ 验证是否卸载干净 + +执行以下命令检查: + +```bash +ps aux | grep bt +ls /www +ls /usr/bin/bt +``` + +若无输出或显示“无此文件或目录”,说明已彻底卸载。 + +--- diff --git a/mengyanote-frontend/public/mengyanote/Linux/Debian12安装MongoDB教程.md b/mengyanote-frontend/public/mengyanote/Linux/Debian12安装MongoDB教程.md new file mode 100644 index 0000000..12a053d --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Debian12安装MongoDB教程.md @@ -0,0 +1,127 @@ +在 **Debian 12 (Bookworm)** 上安装 MongoDB 的正确方式是使用 **MongoDB 官方仓库**(推荐)或 **APT 默认仓库**(版本较旧)。下面给出详细步骤(推荐安装 **MongoDB 7.0** 最新稳定版)。 + +--- + +## 🧩 一、使用 MongoDB 官方仓库安装(推荐) + +### 1️⃣ 导入 MongoDB 公钥 + +```bash +sudo apt-get install -y curl gnupg +curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \ + sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor +``` + +--- + +### 2️⃣ 添加 MongoDB 官方 APT 源 + +```bash +echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] \ +https://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" | \ +sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list +``` + +--- + +### 3️⃣ 更新软件源并安装 MongoDB + +```bash +sudo apt-get update +sudo apt-get install -y mongodb-org +``` + +--- + +### 4️⃣ 启动并设置开机自启 + +```bash +sudo systemctl start mongod +sudo systemctl enable mongod +``` + +--- + +### 5️⃣ 查看运行状态 + +```bash +sudo systemctl status mongod +``` + +如果显示 `active (running)`,说明安装成功。 + +--- + +### 6️⃣ 进入 Mongo Shell(测试) + +```bash +mongosh +``` + +退出: + +```bash +exit +``` + +--- + +## 🧩 二、(可选)如果想卸载 MongoDB + +```bash +# 1️⃣ 停止服务 +sudo systemctl stop mongod 2>/dev/null || true +sudo systemctl disable mongod 2>/dev/null || true + +# 2️⃣ 卸载所有相关包 +sudo apt-get purge -y mongodb-org* mongodb* mongosh* + +# 3️⃣ 删除残留的数据和日志目录 +sudo rm -rf /var/lib/mongo +sudo rm -rf /var/lib/mongodb +sudo rm -rf /var/log/mongodb +sudo rm -rf /tmp/mongodb-* + +# 4️⃣ 删除配置文件和 systemd 服务文件 +sudo rm -f /etc/mongod.conf +sudo rm -rf /etc/mongodb.conf +sudo rm -f /lib/systemd/system/mongod.service +sudo rm -f /etc/systemd/system/mongod.service + +# 5️⃣ 删除 apt 源文件 +sudo rm -f /etc/apt/sources.list.d/mongodb-org-*.list + +# 6️⃣ 清理包缓存 +sudo apt-get autoremove -y +sudo apt-get autoclean -y + + +# 1️⃣ 导入官方 GPG 密钥 +curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \ + sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor + +# 2️⃣ 添加官方源 +echo "deb [signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] \ +https://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" | \ + sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list + +# 3️⃣ 更新包并安装 +sudo apt-get update +sudo apt-get install -y mongodb-org + +# 4️⃣ 启动并设置开机自启 +sudo systemctl enable mongod +sudo systemctl start mongod +sudo systemctl status mongod + +``` + +--- + +## ✅ 验证版本 + +```bash +mongod --version +``` + +--- diff --git a/mengyanote-frontend/public/mengyanote/Linux/Debian12安装Redis教程.md b/mengyanote-frontend/public/mengyanote/Linux/Debian12安装Redis教程.md new file mode 100644 index 0000000..10774e7 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Debian12安装Redis教程.md @@ -0,0 +1,85 @@ + +--- + +## ① 卸载当前 Debian 仓库版本 + +执行以下命令以删除 Redis 及其依赖,并清理旧配置/服务残留: + +```bash +sudo systemctl stop redis-server.service +sudo systemctl disable redis-server.service + +sudo apt remove --purge -y redis-server redis-tools +# 可选清理相关包 +sudo apt autoremove -y + +# 删除可能的配置和数据目录(如果你数据可以丢弃或已备份): +sudo rm -rf /etc/redis +sudo rm -rf /var/lib/redis +sudo rm -rf /var/log/redis +``` + +这样可以确保旧版本几乎完全被移除。 + +--- + +## ② 添加官方 Redis 仓库 & 安装最新版 + +从官方文档添加仓库并安装最新版。根据官方说明: ([Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/archive/install-redis/install-redis-on-linux/?utm_source=chatgpt.com "Install Redis on Linux | Docs")) + +```bash +sudo apt update + +# 安装必要工具 +sudo apt install -y lsb-release curl gpg + +# 添加官方 GPG key +curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg +sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg + +# 添加 Redis 官方仓库 +echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list + +# 更新仓库索引 +sudo apt update + +# 安装 Redis 最新版本(官方名称可能是 “redis” 或 “redis-server”,看包名) +sudo apt install -y redis +``` + +安装完成后,启动服务并设为开机启动: + +```bash +sudo systemctl enable redis-server +sudo systemctl start redis-server +``` + +验证安装: + +```bash +redis-server --version +redis-cli ping # 应返回 PONG +``` + +--- + +## ③ 注意事项 &提示 + +- 由于你之前遇到过 “`/usr/bin/redis-server -> redis-check-rdb`” 的链接问题,这次用官方仓库安装后,务必检查 `which redis-server`、`ls -l /usr/bin/redis-server`,确认 `redis-server` 是正确的守护进程可执行体。 + +- 配置文件可能变化,最好检查 `/etc/redis/redis.conf` 中 `supervised systemd` 或 `daemonize no`、`bind` 等项是否与你的环境相符。 + +- 若你的服务端(你开发的游戏服务端)使用 Redis 作为缓存或消息队列,建议备份关键配置或数据,以避免在卸载过程中丢失。 + +- 安装后再次测试服务状态: + + ```bash + sudo systemctl status redis-server + ``` + + 确认 “Active: active (running)”。 + +- 安全建议:设置强密码、开启绑定本地(或限制访问)、配置持久化策略等。 + + +--- diff --git a/public/mengyanote/Linux/Linux zip 命令总结.md b/mengyanote-frontend/public/mengyanote/Linux/Linux zip 命令总结.md similarity index 100% rename from public/mengyanote/Linux/Linux zip 命令总结.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux zip 命令总结.md diff --git a/public/mengyanote/Linux/Linux一些奇奇怪怪的命令.md b/mengyanote-frontend/public/mengyanote/Linux/Linux一些奇奇怪怪的命令.md similarity index 100% rename from public/mengyanote/Linux/Linux一些奇奇怪怪的命令.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux一些奇奇怪怪的命令.md diff --git a/mengyanote-frontend/public/mengyanote/Linux/Linux一键脚本.md b/mengyanote-frontend/public/mengyanote/Linux/Linux一键脚本.md new file mode 100644 index 0000000..ff744ce --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Linux一键脚本.md @@ -0,0 +1,14 @@ +**一键ssh开启root登录** +```bash +sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/; s/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config && systemctl restart ssh && echo "SSH root 登录已开启。请确保root密码已设置。" +``` + +**Linux一键换源** +```bash +bash <(curl -sSL https://linuxmirrors.cn/main.sh) +``` + +**Docker一键换源** +```bash +bash <(curl -sSL https://linuxmirrors.cn/docker.sh) +``` \ No newline at end of file diff --git a/public/mengyanote/Linux/Linux下的scp命令总结.md b/mengyanote-frontend/public/mengyanote/Linux/Linux下的scp命令总结.md similarity index 100% rename from public/mengyanote/Linux/Linux下的scp命令总结.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux下的scp命令总结.md diff --git a/public/mengyanote/Linux/Linux不同格式解压命令.md b/mengyanote-frontend/public/mengyanote/Linux/Linux不同格式解压命令.md similarity index 100% rename from public/mengyanote/Linux/Linux不同格式解压命令.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux不同格式解压命令.md diff --git a/public/mengyanote/Linux/Linux后台运行程序.md b/mengyanote-frontend/public/mengyanote/Linux/Linux后台运行程序.md similarity index 100% rename from public/mengyanote/Linux/Linux后台运行程序.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux后台运行程序.md diff --git a/public/mengyanote/Linux/Linux命令风格解析.md b/mengyanote-frontend/public/mengyanote/Linux/Linux命令风格解析.md similarity index 100% rename from public/mengyanote/Linux/Linux命令风格解析.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux命令风格解析.md diff --git a/public/mengyanote/Linux/Linux复制文件命令.md b/mengyanote-frontend/public/mengyanote/Linux/Linux复制文件命令.md similarity index 100% rename from public/mengyanote/Linux/Linux复制文件命令.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux复制文件命令.md diff --git a/public/mengyanote/Linux/Linux安装ollama.md b/mengyanote-frontend/public/mengyanote/Linux/Linux安装ollama.md similarity index 100% rename from public/mengyanote/Linux/Linux安装ollama.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux安装ollama.md diff --git a/public/mengyanote/Linux/Linux常用软件包安装.md b/mengyanote-frontend/public/mengyanote/Linux/Linux常用软件包安装.md similarity index 100% rename from public/mengyanote/Linux/Linux常用软件包安装.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux常用软件包安装.md diff --git a/public/mengyanote/Linux/Linux查看无线网口.md b/mengyanote-frontend/public/mengyanote/Linux/Linux查看无线网口.md similarity index 100% rename from public/mengyanote/Linux/Linux查看无线网口.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux查看无线网口.md diff --git a/public/mengyanote/Linux/Linux的Proc目录解析.md b/mengyanote-frontend/public/mengyanote/Linux/Linux的Proc目录解析.md similarity index 100% rename from public/mengyanote/Linux/Linux的Proc目录解析.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux的Proc目录解析.md diff --git a/public/mengyanote/Linux/Linux软件包存放地址.md b/mengyanote-frontend/public/mengyanote/Linux/Linux软件包存放地址.md similarity index 100% rename from public/mengyanote/Linux/Linux软件包存放地址.md rename to mengyanote-frontend/public/mengyanote/Linux/Linux软件包存放地址.md diff --git a/public/mengyanote/Linux/QQ机器人napcat命令.md b/mengyanote-frontend/public/mengyanote/Linux/QQ机器人napcat命令.md similarity index 100% rename from public/mengyanote/Linux/QQ机器人napcat命令.md rename to mengyanote-frontend/public/mengyanote/Linux/QQ机器人napcat命令.md diff --git a/public/mengyanote/Linux/SSH服务端配置.md b/mengyanote-frontend/public/mengyanote/Linux/SSH服务端配置.md similarity index 95% rename from public/mengyanote/Linux/SSH服务端配置.md rename to mengyanote-frontend/public/mengyanote/Linux/SSH服务端配置.md index 19febdb..c432f78 100644 --- a/public/mengyanote/Linux/SSH服务端配置.md +++ b/mengyanote-frontend/public/mengyanote/Linux/SSH服务端配置.md @@ -197,6 +197,3 @@ AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server ``` -### 总结 - -正确配置 SSH 服务端对于保障服务器的安全至关重要。请根据您的具体需求和环境,结合上述指南进行配置。同时,定期审查和更新配置,以应对潜在的安全威胁。 \ No newline at end of file diff --git a/public/mengyanote/Linux/Termux-SSH相关.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-SSH相关.md similarity index 65% rename from public/mengyanote/Linux/Termux-SSH相关.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-SSH相关.md index 428d7ae..9f73c18 100644 --- a/public/mengyanote/Linux/Termux-SSH相关.md +++ b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-SSH相关.md @@ -1,77 +1,36 @@ Termux更改终端密码: - ``` passwd ``` - 重启SSH服务 - ``` pkill sshd sshd ``` - 查看本机IP - ``` ifconfig ``` - 生成SSH主机密钥 - ``` ssh-keygen -A ``` - 更新Termux包 - ``` pkg update && pkg upgrade ``` - Termux退出chroot容器 - ``` exit ``` - Termux安装软件 - ``` pkg install ``` - 查看终端用户名 - ``` whoami ``` - - - - - - - - - - -妈的旧手机termux终端用户名 - -u0_a143 - -爸的旧手机termux终端用户名 - -u0_a135 - -Termux执行sh脚本 - -``` -bash 脚本名.sh -``` - - - diff --git a/public/mengyanote/Linux/Termux/Termux-api用法总结/弹窗.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/弹窗.md similarity index 100% rename from public/mengyanote/Linux/Termux/Termux-api用法总结/弹窗.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/弹窗.md diff --git a/public/mengyanote/Linux/Termux/Termux-api用法总结/录音.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/录音.md similarity index 100% rename from public/mengyanote/Linux/Termux/Termux-api用法总结/录音.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/录音.md diff --git a/public/mengyanote/Linux/Termux/Termux-api用法总结/所有支持的api.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/所有支持的api.md similarity index 100% rename from public/mengyanote/Linux/Termux/Termux-api用法总结/所有支持的api.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/所有支持的api.md diff --git a/public/mengyanote/Linux/Termux/Termux-api用法总结/闪光灯.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/闪光灯.md similarity index 100% rename from public/mengyanote/Linux/Termux/Termux-api用法总结/闪光灯.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/Termux-api用法总结/闪光灯.md diff --git a/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux常用命令.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux常用命令.md new file mode 100644 index 0000000..80a6a23 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux常用命令.md @@ -0,0 +1,9 @@ + +**termux-setup-storage** +挂载外部储存目录 + +**termux-wake-lock** +获取唤醒锁(免杀后台) + +**termux-battery-status** +查看设备电池状态 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux常用软件包.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux常用软件包.md new file mode 100644 index 0000000..f2f6eea --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux常用软件包.md @@ -0,0 +1,8 @@ +**termux-services** +持久化后台服务,类似于systemctl + +**openlist** +网页云盘 + +**frp** +内网穿透工具 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux问题小总结.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux问题小总结.md new file mode 100644 index 0000000..7f07b7d --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Termux/Termux问题小总结.md @@ -0,0 +1,15 @@ + +#### 使用termux-setup-storage无法访问外部储存 +>在报告问题前,请务必在 Android `14` 上运行 `pkg install termux-am`。 +> +>存储权限的授予方式如下。 +> +>- Android `< 11`: `Android Settings` -> `Apps` -> `Termux` -> `Permissions` -> `Storage` +>- Android `>= 11`: `Android 设置`  ->  `应用`  -> `Termux` ->  `权限`  ->  `文件和媒体`  ->  `允许管理所有文件` +>- Android `>= 13`: `Android Settings` -> `Apps` -> (`Advanced` ->)  `特殊应用访问`  ->  `所有文件访问`  -> `Termux` +> +>如果使用 GitHub 动作构建,运行 `test -d "$HOME/storage" || termux-am broadcast --user 0 --es com.termux.app.reload_style storage -a com.termux.app.reload_style com.termux > /dev/null` 应该可以。 +> +>至于 `termux-setup-storage` 不工作,运行命令后,请发送或发送邮件给我 `adb logcat -d > logcat.txt` 输出。 + + diff --git a/mengyanote-frontend/public/mengyanote/Linux/Termux/service-frpc.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/service-frpc.md new file mode 100644 index 0000000..57e65dd --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Termux/service-frpc.md @@ -0,0 +1,23 @@ +```bash +bash -lc ' +set -e +mkdir -p "$PREFIX/var/service/frpc/log" +ln -sf "$PREFIX/share/termux-services/svlogger" \ + "$PREFIX/var/service/frpc/log/run" + +cat > "$PREFIX/var/service/frpc/run" <<'"'"'EOF'"'"' +#!/data/data/com.termux/files/usr/bin/sh +exec 2>&1 +cd "$HOME/frpc" +exec frpc -c "$HOME/frpc/frpc.toml" +EOF + +chmod +x "$PREFIX/var/service/frpc/run" \ + "$PREFIX/var/service/frpc/log/run" + +echo "✅ frpc service 已创建" +echo "👉 启动:sv up frpc" +echo "👉 状态:sv status frpc" +echo "👉 日志:tail -n 200 $PREFIX/var/log/sv/frpc/current" +' +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/Linux/Termux/service-openlist.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/service-openlist.md new file mode 100644 index 0000000..68a535b --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/Termux/service-openlist.md @@ -0,0 +1,35 @@ +```shell +bash -lc ' +set -e + +# 1) 准备 service 目录 + log 目录 +mkdir -p "$PREFIX/var/service/openlist/log" + +# 2) 绑定官方 logger +ln -sf "$PREFIX/share/termux-services/svlogger" \ + "$PREFIX/var/service/openlist/log/run" + +# 3) 写 run 脚本(沿用你现有的 ~/data 数据目录) +cat > "$PREFIX/var/service/openlist/run" <<'"'"'EOF'"'"' +#!/data/data/com.termux/files/usr/bin/sh +exec 2>&1 +cd "$HOME" +exec openlist server --data "$HOME/data" +EOF + +chmod +x "$PREFIX/var/service/openlist/run" \ + "$PREFIX/var/service/openlist/log/run" + +echo "✅ openlist service 已创建" +echo "👉 现在可用:sv up openlist" +echo "👉 查看状态:sv status openlist" +echo "👉 查看日志:tail -n 200 $PREFIX/var/log/sv/openlist/current" +' +``` + +```bash +sv up openlist +sv status openlist +# 想让 Termux 每次打开就自动拉起: +sv-enable openlist +``` \ No newline at end of file diff --git a/public/mengyanote/Linux/Termux/shell2HTTP软件简单总结.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/shell2HTTP软件简单总结.md similarity index 100% rename from public/mengyanote/Linux/Termux/shell2HTTP软件简单总结.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/shell2HTTP软件简单总结.md diff --git a/public/mengyanote/Linux/Termux/shell2http举例.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/shell2http举例.md similarity index 100% rename from public/mengyanote/Linux/Termux/shell2http举例.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/shell2http举例.md diff --git a/public/mengyanote/Linux/Termux/termux的pkg命令总结.md b/mengyanote-frontend/public/mengyanote/Linux/Termux/termux的pkg命令总结.md similarity index 100% rename from public/mengyanote/Linux/Termux/termux的pkg命令总结.md rename to mengyanote-frontend/public/mengyanote/Linux/Termux/termux的pkg命令总结.md diff --git a/public/mengyanote/Linux/Windows文件一键上传到Linux.md b/mengyanote-frontend/public/mengyanote/Linux/Windows文件一键上传到Linux.md similarity index 100% rename from public/mengyanote/Linux/Windows文件一键上传到Linux.md rename to mengyanote-frontend/public/mengyanote/Linux/Windows文件一键上传到Linux.md diff --git a/public/mengyanote/Linux/busybox v1.36命令简介.md b/mengyanote-frontend/public/mengyanote/Linux/busybox v1.36命令简介.md similarity index 98% rename from public/mengyanote/Linux/busybox v1.36命令简介.md rename to mengyanote-frontend/public/mengyanote/Linux/busybox v1.36命令简介.md index a6d5736..df21113 100644 --- a/public/mengyanote/Linux/busybox v1.36命令简介.md +++ b/mengyanote-frontend/public/mengyanote/Linux/busybox v1.36命令简介.md @@ -151,292 +151,149 @@ 149. **losetup**:管理环回设备。 150. **ls**:列出目录内容。 -继续接着之前的命令列表进行总结: 151. **lsattr**:显示文件的属性。 - 152. **lsmod**:显示加载的内核模块。 - 153. **lsof**:列出打开的文件。 - 154. **lspci**:显示所有 PCI 设备。 - 155. **lsscsi**:显示 SCSI 设备信息。 - 156. **lsusb**:列出 USB 设备。 - 157. **lzcat**:解压 `.lz` 文件并显示内容。 - 158. **lzma**:压缩文件为 `.lzma` 格式。 - 159. **lzop**:快速的文件压缩工具。 - 160. **lzopcat**:查看 `.lzo` 格式文件内容。 - 161. **makedevs**:创建设备节点。 - 162. **makemime**:生成 MIME 类型文件。 - 163. **man**:查看手册页(如果有)。 - 164. **md5sum**:计算文件的 MD5 校验和。 - 165. **mesg**:控制终端消息的接收。 - 166. **microcom**:串行通信工具。 - 167. **mim**:提取文件的 MIME 类型。 - 168. **mkdir**:创建目录。 - 169. **mkdosfs**:创建 FAT 文件系统。 - 170. **mke2fs**:创建 ext2 文件系统。 - 171. **mkfifo**:创建命名管道。 - 172. **mkfs.ext2**:创建 ext2 文件系统。 - 173. **mkfs.minix**:创建 Minix 文件系统。 - 174. **mkfs.reiser**:创建 Reiser 文件系统。 - 175. **mkfs.vfat**:创建 VFAT 文件系统。 - 176. **mknod**:创建块设备或字符设备文件。 - 177. **mkswap**:创建交换分区。 - 178. **mktemp**:创建临时文件。 - 179. **modinfo**:显示内核模块的信息。 - 180. **modprobe**:加载或卸载内核模块。 - 181. **more**:分页显示文件内容。 - 182. **mount**:挂载文件系统。 - 183. **mountpoint**:检查是否为挂载点。 - 184. **mpstat**:显示 CPU 使用统计信息。 - 185. **mv**:移动或重命名文件。 - 186. **nameif**:根据 MAC 地址设置网络接口名称。 - 187. **nanddump**:转储 NAND 闪存的内容。 - 188. **nandwrite**:将数据写入 NAND 闪存。 - 189. **nbd-client**:连接到网络块设备。 - 190. **nc**:Netcat 工具,用于读写网络连接。 - 191. **netstat**:显示网络连接状态。 - 192. **nice**:调整进程的优先级。 - 193. **nl**:显示带有行号的文件内容。 - 194. **nmeter**:网络带宽监控工具。 - 195. **nohup**:在后台运行命令并忽略挂起信号。 - 196. **nologin**:禁止用户登录。 - 197. **nsenter**:进入其他命名空间。 - 198. **nslookup**:查询 DNS 信息。 - 199. **nuke**:终止所有与特定进程相关的网络连接。 - 200. **od**:以不同格式显示文件内容(如十六进制)。 - 201. **openvt**:在指定的虚拟终端上运行命令。 - 202. **partprobe**:通知操作系统重新读取分区表。 - 203. **paste**:合并多个文件按列显示。 - 204. **patch**:应用补丁文件。 - 205. **pgrep**:查找匹配指定模式的进程。 - 206. **pidof**:查找指定进程的 PID。 - 207. **ping**:向网络主机发送 ICMP 请求。 - 208. **ping6**:向网络主机发送 ICMPv6 请求。 - 209. **pipe_progress**:显示管道中的数据传输进度。 - 210. **pivot_root**:更改文件系统根目录。 - 211. **pkill**:根据进程名终止进程。 - 212. **pmap**:显示进程的内存映射。 - 213. **popmaildir**:从邮件目录中获取邮件。 - 214. **poweroff**:关闭计算机。 - 215. **powertop**:用于优化电源管理的工具。 - 216. **printenv**:显示所有环境变量。 - 217. **printf**:格式化并输出文本。 - 218. **ps**:显示当前进程信息。 - 219. **pscan**:扫描当前进程的状态。 - 220. **pstree**:以树形结构显示进程。 - 221. **pwd**:显示当前工作目录。 - 222. **pwdx**:显示指定进程的工作目录。 - 223. **raidautorun**:自动启动 RAID 配置。 - 224. **rdate**:同步时间。 - 225. **rdev**:显示或设置设备的特殊属性。 - 226. **readlink**:显示符号链接的目标。 - 227. **readprofile**:读取并显示应用的性能配置。 - 228. **realpath**:返回文件的绝对路径。 - 229. **reboot**:重启系统。 - 230. **reformime**:转换 MIME 格式。 - 231. **renice**:改变进程的优先级。 - 232. **reset**:重置终端。 - 233. **resize**:调整终端大小。 - 234. **resume**:恢复挂起的进程。 - 235. **rev**:反转每行文本。 - 236. **rfkill**:管理无线设备的开关。 - 237. **rm**:删除文件。 - 238. **rmdir**:删除空目录。 - 239. **rmmod**:卸载内核模块。 - 240. **route**:显示或修改路由表。 - 241. **rtcwake**:设置系统的 RTC 来定时唤醒。 - 242. **run-init**:运行初始化程序。 - 243. **run-parts**:按顺序运行目录中的脚本。 - 244. **runcon**:设置进程的 SELinux 上下文。 - 245. **rx**:接收串口数据。 - 246. **script**:记录终端会话。 - 247. **scriptreplay**:重放记录的终端会话。 - 248. **sed**:流编辑器,用于处理文本数据。 - 249. **seedrng**:种子随机数生成器。 - 250. **selinuxenabled**:检查 SELinux 是否启用。 - 251. **sendmail**:发送电子邮件。 - 252. **seq**:生成一个数字序列。 - 253. **sestatus**:显示 SELinux 状态。 - 254. **setconsole**:设置控制台的终端类型。 - 255. **setenforce**:启用或禁用 SELinux 强制模式。 - 256. **setfattr**:设置文件的扩展属性。 - 257. **setfont**:设置终端的字体。 - 258. **setkeycodes**:设置键盘扫描码到键值的映射。 - 259. **setlogcons**:设置日志控制台。 - 260. **setpriv**:设置进程的特权级别。 - 261. **setserial**:设置串口设备的参数。 - 262. **setsid**:创建新的会话并运行命令。 - 263. **setuidgid**:设置进程的用户和组标识。 - 264. **sh**:启动一个新的 shell。 - 265. **sha1sum**:计算文件的 SHA-1 校验和。 - 266. **sha256sum**:计算文件的 SHA-256 校验和。 - 267. **sha3sum**:计算文件的 SHA-3 校验和。 - 268. **sha512sum**:计算文件的 SHA-512 校验和。 - 269. **showkey**:显示键盘输入的键值。 - 270. **shred**:擦除文件,防止数据恢复。 - 271. **shuf**:随机排列输入行。 - 272. **slattach**:设置串行连接。 - 273. **sleep**:暂停一段时间。 - 274. **smemcap**:设置进程内存使用限制。 - 275. **sort**:按行排序文本文件。 - 276. **split**:将文件分割成多个小文件。 - 277. **ssl_client**:通过 SSL 连接远程主机。 - 278. **start-stop-daemon**:启动或停止后台守护进程。 - 279. **stat**:显示文件或文件系统的状态。 - 280. **strings**:显示文件中的可打印字符串。 - 281. **stty**:设置终端行属性。 - 282. **sum**:计算文件的校验和。 - 283. **svc**:启动、停止或重启服务。 - 284. **svok**:检查服务的状态。 - 285. **swapoff**:禁用交换空间。 - 286. **swapon**:启用交换空间。 - 287. **switch_root**:切换到新的根文件系统。 - 288. **sync**:同步文件系统。 - 289. **sysctl**:显示或设置内核参数。 - 290. **syslogd**:启动系统日志守护进程。 - 291. **tac**:反向显示文件内容。 - 292. **tail**:显示文件的最后部分。 - 293. **tar**:创建和解压 tar 归档。 294. **tc**:配置网络流量控制。 diff --git a/public/mengyanote/Linux/busybox玩法总结.md b/mengyanote-frontend/public/mengyanote/Linux/busybox玩法总结.md similarity index 82% rename from public/mengyanote/Linux/busybox玩法总结.md rename to mengyanote-frontend/public/mengyanote/Linux/busybox玩法总结.md index fb1b360..afb0b03 100644 --- a/public/mengyanote/Linux/busybox玩法总结.md +++ b/mengyanote-frontend/public/mengyanote/Linux/busybox玩法总结.md @@ -4,7 +4,7 @@ busybox httpd -f -p 端口 -h 目录 ``` -### 使用 `busybox netstat` 查看端口占用情况 +### 查看端口占用情况 - `-t`:显示 TCP 连接 - `-u`:显示 UDP 连接 @@ -26,7 +26,7 @@ sudo chmod 755 目录 ``` -### 启动 `busybox` 的 Telnet 服务器(不安全的ssh) +### 启动 `busybox` 的 Telnet 服务器 ``` busybox telnetd -l /bin/login diff --git a/public/mengyanote/Linux/crontab的使用.md b/mengyanote-frontend/public/mengyanote/Linux/crontab的使用.md similarity index 96% rename from public/mengyanote/Linux/crontab的使用.md rename to mengyanote-frontend/public/mengyanote/Linux/crontab的使用.md index 3d0c02e..e89d48f 100644 --- a/public/mengyanote/Linux/crontab的使用.md +++ b/mengyanote-frontend/public/mengyanote/Linux/crontab的使用.md @@ -1,4 +1,5 @@ -`crontab` 是一个用于在 Unix 和类 Unix 系统(如 Linux)中设置定时任务的工具。它允许用户根据指定的时间间隔安排脚本或命令的执行。以下是关于 `crontab` 使用方法的详细介绍和示例。 +`crontab` 是一个用于在 Unix 和类 Unix 系统(如 Linux)中设置定时任务的工具。它允许用户根据指定的时间间隔安排脚本或命令的执行。 +> 目前我用来代替 systemctl的服务 ### 基本概念 `crontab` 的配置文件由一系列行组成,每行代表一个定时任务,其基本格式如下: diff --git a/public/mengyanote/Linux/docker,LXC,qemu,k8s,chroot等的特点.md b/mengyanote-frontend/public/mengyanote/Linux/docker,LXC,qemu,k8s,chroot等的特点.md similarity index 100% rename from public/mengyanote/Linux/docker,LXC,qemu,k8s,chroot等的特点.md rename to mengyanote-frontend/public/mengyanote/Linux/docker,LXC,qemu,k8s,chroot等的特点.md diff --git a/public/mengyanote/Linux/screen常用指令.md b/mengyanote-frontend/public/mengyanote/Linux/screen常用指令.md similarity index 100% rename from public/mengyanote/Linux/screen常用指令.md rename to mengyanote-frontend/public/mengyanote/Linux/screen常用指令.md diff --git a/mengyanote-frontend/public/mengyanote/Linux/shell2http官方案例.md b/mengyanote-frontend/public/mengyanote/Linux/shell2http官方案例.md new file mode 100644 index 0000000..3d012ac --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/shell2http官方案例.md @@ -0,0 +1,129 @@ + + +1. 基础命令执行 + +```bash +shell2http /top "top -l 1 | head -10" \ + /date "date" \ + /ps "ps aux" +``` + +2. 环境变量管理 + +```bash +shell2http -export-all-vars \ + /env 'printenv | sort' \ + /env/path 'echo $PATH' \ + /env/gopath 'echo $GOPATH' + +# 导出特定变量 +shell2http -export-vars=GOPATH /get 'echo $GOPATH' +``` + +3. HTML页面生成 + +```bash +shell2http /cal_html 'echo "

Calendar

Date: $(date)
$(cal $(date +%Y))
"' +``` + +4. 表单参数处理 + +```bash +# 处理查询参数 http://localhost:8080/form?from=10&to=100 +shell2http -form /form 'echo $v_from, $v_to' +``` + +5. CGI模式运行 + +```bash +shell2http -cgi \ + /user_agent 'echo $HTTP_USER_AGENT' \ + /set 'touch file; echo "Location: /another_path\n"' \ # 重定向 + /404 'echo "Status: 404"; echo; echo "404 page"' # 自定义HTTP状态码 +``` + +6. 文件上传功能 + +```bash +shell2http -form \ + GET:/form 'echo "
"' \ + POST:/file 'cat $filepath_uplfile > uploaded_file.dat; echo Ok' +``` + +7. HTTP代理服务器 + +```bash +shell2http -log=/dev/null -cgi / 'echo $REQUEST_URI 1>&2; [ "$REQUEST_METHOD" == "POST" ] && post_param="-d@-"; curl -sL $post_param "$REQUEST_URI" -A "$HTTP_USER_AGENT"' +``` + +8. 慢速连接测试 + +```bash +shell2http -form /slow 'sleep ${v_duration:-1}; echo "sleep ${v_duration:-1} seconds"' +``` + +9. 缓存代理服务器 + +```bash +shell2http -form \ + /form 'echo "
URL: "' \ + /get 'MD5=$(printf "%s" $v_url | md5); cat cache_$MD5 || (curl -sL $v_url | tee cache_$MD5)' +``` + +10. Mac OS远程音量控制 + +```bash +shell2http \ + /get 'osascript -e "output volume of (get volume settings)"' \ + /up 'osascript -e "set volume output volume (($(osascript -e "output volume of (get volume settings)")+10))"' \ + /down 'osascript -e "set volume output volume (($(osascript -e "output volume of (get volume settings)")-10))"' +``` + +11. Vox播放器远程控制(Mac OS) + +```bash +shell2http \ + /play_pause 'osascript -e "tell application \"Vox\" to playpause" && echo ok' \ + /get_info 'osascript -e "tell application \"Vox\"" -e "\"Artist: \" & artist & \"\n\" & \"Album: \" & album & \"\n\" & \"Track: \" & track" -e "end tell"' +``` + +12. JSON API模拟服务 + +```bash +# 创建JSON文件 +echo '{"status": "ok"}' > 1.json + +shell2http -cgi \ + /call1 'cat 1.json' \ + /call2 'echo "Content-Type: application/json\n"; echo "{\"error\": \"ok\"}"' +``` + +13. Windows环境示例 + +```cmd +shell2http.exe -form /test "echo %v_var%" +``` + +14. Docker容器运行示例 + +```dockerfile +# test.Dockerfile +FROM msoap/shell2http +CMD ["/date", "date"] +``` + +15. SSL/TLS安全连接 + +```bash +# 生成自签名证书 +go run $(go env GOROOT)/src/crypto/tls/generate_cert.go -host localhost + +# 运行HTTPS服务器 +shell2http -cert=./cert.pem -key=./key.pem /date "date" +``` + +16. HTTP基本认证 + +```bash +shell2http -basic-auth="user:password" /secret "echo 'Secret content'" +``` diff --git a/mengyanote-frontend/public/mengyanote/Linux/ssh切换root登录通用方法.md b/mengyanote-frontend/public/mengyanote/Linux/ssh切换root登录通用方法.md new file mode 100644 index 0000000..922f401 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/ssh切换root登录通用方法.md @@ -0,0 +1,6 @@ +1. 给root新建密码:sudo passwd root +2. 配置权限文件:sudo nano /etc/ssh/sshd_config +3. 光标移动到:permitrootlogin no 把no 改为yes ctrl+o(写入文本)回车 ctrl+x(退出) +4. 重启服务器:sudo reboot +5. 重启ssh服务:sudo service sshd restart +6. 用命令切换root账号:su -(或者sudo su -) \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/Linux/systemctl命令详细总结.md b/mengyanote-frontend/public/mengyanote/Linux/systemctl命令详细总结.md new file mode 100644 index 0000000..1aa9e38 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/systemctl命令详细总结.md @@ -0,0 +1,282 @@ + +### Linux `systemctl` 命令常用用法总结 + + +#### **一、服务管理(核心功能)** +`systemctl` 主要用于管理系统服务(`.service` 文件),支持启动、停止、重启、查看状态、设置开机启动等操作。 + +##### 1. 服务状态操作 +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 启动服务 | `systemctl start <服务名>` | 启动指定服务(仅临时生效,重启后不保留) | +| 停止服务 | `systemctl stop <服务名>` | 停止指定服务 | +| 重启服务 | `systemctl restart <服务名>` | 重启服务(若服务未运行则启动) | +| 重新加载配置 | `systemctl reload <服务名>` | 重新加载服务配置文件(不重启服务,适用于支持此功能的服务,如 Nginx) | +| 平滑重启(优雅重启)| `systemctl try-restart <服务名>` | 仅在服务运行时重启,避免报错 | + +##### 2. 服务状态查询 +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 查看状态 | `systemctl status <服务名>` | 显示服务运行状态、日志及依赖关系(按 `Q` 退出) | +| 简洁状态 | `systemctl is-active <服务名>` | 仅显示服务是否激活(active/running) | +| 查看是否启用开机启动| `systemctl is-enabled <服务名>` | 显示服务是否设置为开机启动(enabled/disabled) | +| 列出所有服务 | `systemctl list-units --type=service` | 列出所有运行中的服务 | +| 列出所有服务(含未激活)| `systemctl list-units --type=service --all` | 显示所有服务,包括未激活的(状态为 inactive/failed 等) | +| 列出失败的服务 | `systemctl --failed --type=service` | 查看启动失败的服务 | + +##### 3. 开机启动管理 +| 操作 | 命令 | 说明 | +| ------------- | ------------------------------- | -------------------------- | +| 启用开机启动 | `systemctl enable <服务名>` | 设置服务开机自动启动(永久生效,关联到默认运行目标) | +| 禁用开机启动 | `systemctl disable <服务名>` | 取消服务开机启动 | +| 临时启用(仅本次启动) | `systemctl enable --now <服务名>` | 立即启动服务并设置开机启动 | +| 临时禁用(停止并取消启动) | `systemctl disable --now <服务名>` | 立即停止服务并取消开机启动 | + +##### 4. 服务依赖与依赖关系 +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 查看依赖关系 | `systemctl list-dependencies <服务名>` | 显示服务的依赖项(依赖它的服务 + 它依赖的服务) | +| 查看直接依赖 | `systemctl list-dependencies --reverse <服务名>` | 仅显示依赖该服务的其他服务 | + + +#### **二、系统状态与控制** +##### 1. 系统基本状态 +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 查看系统运行时间 | `systemctl uptime` | 显示系统已运行时间(类似 `uptime` 命令) | +| 查看启动耗时 | `systemctl time` | 显示系统启动总耗时及各阶段(内核、用户空间、服务)耗时 | +| 查看登录会话 | `systemctl list-sessions` | 列出当前登录的用户会话 | + +##### 2. 电源管理(需管理员权限) +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 关机 | `systemctl poweroff` | 立即关机 | +| 重启 | `systemctl reboot` | 立即重启 | +| 休眠(挂起到硬盘) | `systemctl hibernate` | 系统进入休眠状态 | +| 睡眠(挂起到内存) | `systemctl suspend` | 系统进入睡眠状态(低功耗,断电数据丢失) | +| 混合休眠 | `systemctl hybrid-sleep` | 同时休眠到内存和硬盘,结合两者优势 | +| 取消挂起/休眠 | `systemctl wakeup` | 唤醒系统(需配合定时器使用) | + +##### 3. 运行目标(替代传统运行级别) +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 查看当前目标 | `systemctl get-default` | 显示默认运行目标(如 `graphical.target` 对应图形界面) | +| 切换目标 | `systemctl isolate <目标名>` | 切换到指定目标(如 `multi-user.target` 为无图形多用户模式) | +| 设置默认目标 | `systemctl set-default <目标名>` | 设置开机默认目标(需管理员权限) | + +**常用目标对应关系**: +- `graphical.target`:图形界面(对应传统运行级别 5) +- `multi-user.target`:无图形多用户模式(对应级别 3) +- `rescue.target`:单用户救援模式(对应级别 1) +- `emergency.target`:紧急模式(无文件系统挂载,仅基本命令) + + +#### **三、定时器管理(systemd.timer)** +`systemctl` 可管理定时任务(替代传统 `cron`),需配合 `.timer` 文件使用。 + +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 列出所有定时器 | `systemctl list-timers` | 显示激活的定时器及其下一次触发时间 | +| 查看定时器状态 | `systemctl status <定时器名>` | 显示定时器详细状态及日志 | +| 启用/禁用定时器 | `systemctl enable/disable <定时器名>` | 控制定时器是否开机启动 | +| 立即触发定时器任务 | `systemctl start <定时器名>` | 强制立即执行定时器关联的服务 | + + +#### **四、资源控制与限制(高级功能)** +可对服务设置 CPU、内存、IO 等资源限制(需在服务文件中配置,或临时生效)。 + +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 设置 CPU 核心限制 | `systemctl set-property <服务名> CPUAffinity=0,1` | 限制服务仅运行在 CPU 0 和 1 核心 | +| 设置内存上限 | `systemctl set-property <服务名> MemoryMax=1G` | 限制服务最大内存使用量为 1GB | +| 恢复默认资源配置 | `systemctl unset-property <服务名> CPUAffinity MemoryMax` | 清除已设置的资源限制 | + + +#### **五、日志相关(结合 journalctl)** +| 操作 | 命令 | 说明 | +|---------------------|---------------------------------------|----------------------------------------------------------------------| +| 查看服务日志 | `systemctl status <服务名> -l` | 显示服务状态并附带日志(`-l` 展开完整日志) | +| 实时监控日志 | `journalctl -u <服务名> -f` | 实时追踪服务日志(需结合 `journalctl` 命令) | +| 查看历史日志 | `journalctl -u <服务名> --since "2025-05-01"` | 查看指定时间后的服务日志 | + + +#### **六、常用选项与技巧** +- **通配符匹配**: + 可使用通配符管理同类服务,例如: + ```bash + systemctl start nginx*.service # 启动所有以 nginx 开头的服务 + systemctl stop *.timer # 停止所有定时器服务 + ``` + +- **强制操作**: + `--force` 用于强制停止/重启服务(可能终止进程): + ```bash + systemctl --force stop <服务名> + ``` + +- **临时生效(不修改配置)**: + 使用 `--now` 可立即执行操作并关联开机启动(或取消): + ```bash + systemctl enable --now <服务名> # 启动并启用开机启动 + systemctl disable --now <服务名> # 停止并禁用开机启动 + ``` + +- **查看帮助**: + ```bash + systemctl --help # 查看全局帮助 + systemctl help <子命令> # 查看子命令详细用法(如 systemctl help start) + ``` + + +#### **七、示例场景** +1. **管理 Nginx 服务**: + ```bash + systemctl start nginx # 启动 Nginx + systemctl enable nginx # 设置开机启动 + systemctl status nginx # 查看运行状态 + systemctl reload nginx # 重新加载配置 + ``` + +2. **系统关机与重启**: + ```bash + systemctl reboot # 立即重启 + systemctl poweroff # 立即关机 + systemctl suspend # 进入睡眠 + ``` + +3. **设置默认运行目标**: + ```bash + systemctl set-default multi-user.target # 设为无图形多用户模式 + systemctl isolate rescue.target # 进入单用户救援模式 + ``` + + +### 总结 +`systemctl` 是 systemd 生态的核心工具,覆盖服务管理、系统控制、定时任务、资源限制等功能。熟练掌握其常用命令可高效管理 Linux 系统服务与状态,替代传统 SysVinit 的 `service`、`chkconfig` 等工具。建议结合 `journalctl` 分析服务日志,通过服务文件(`/etc/systemd/system/`)自定义复杂配置。`systemctl` 是 Linux 系统中用于控制 `systemd` 系统和服务管理器的命令。以下是 `systemctl` 命令的一些常用用法总结: + +### 1. 服务管理 +#### 启动服务 +```bash +systemctl start <服务名> +``` +例如,启动 `httpd` 服务: +```bash +systemctl start httpd +``` + +#### 停止服务 +```bash +systemctl stop <服务名> +``` +例如,停止 `httpd` 服务: +```bash +systemctl stop httpd +``` + +#### 重启服务 +```bash +systemctl restart <服务名> +``` +例如,重启 `httpd` 服务: +```bash +systemctl restart httpd +``` + +#### 重新加载服务配置 +```bash +systemctl reload <服务名> +``` +例如,重新加载 `nginx` 服务配置: +```bash +systemctl reload nginx +``` + +#### 查看服务状态 +```bash +systemctl status <服务名> +``` +例如,查看 `httpd` 服务状态: +```bash +systemctl status httpd +``` + +### 2. 服务的开机自启管理 +#### 设置服务开机自启 +```bash +systemctl enable <服务名> +``` +例如,设置 `httpd` 服务开机自启: +```bash +systemctl enable httpd +``` + +#### 禁止服务开机自启 +```bash +systemctl disable <服务名> +``` +例如,禁止 `httpd` 服务开机自启: +```bash +systemctl disable httpd +``` + +#### 查看服务是否开机自启 +```bash +systemctl is-enabled <服务名> +``` +例如,查看 `httpd` 服务是否开机自启: +```bash +systemctl is-enabled httpd +``` + +### 3. 系统管理 +#### 重启系统 +```bash +systemctl reboot +``` + +#### 关机 +```bash +systemctl poweroff +``` + +#### 挂起系统 +```bash +systemctl suspend +``` + +#### 休眠系统 +```bash +systemctl hibernate +``` + +#### 混合休眠(挂起并休眠) +```bash +systemctl hybrid-sleep +``` + +### 4. 查看系统状态 +#### 查看系统当前运行级别 +```bash +systemctl get-default +``` + +#### 设置系统默认运行级别 +```bash +systemctl set-default <目标运行级别> +``` +例如,设置系统默认运行级别为多用户模式: +```bash +systemctl set-default multi-user.target +``` + +### 5. 查看服务列表 +#### 查看所有已激活的服务 +```bash +systemctl list-units --type=service --state=active +``` + +#### 查看所有服务(包括未激活的) +```bash +systemctl list-units --type=service --all +``` + diff --git a/public/mengyanote/Linux/ubuntu设置root登陆.md b/mengyanote-frontend/public/mengyanote/Linux/ubuntu设置root登陆.md similarity index 100% rename from public/mengyanote/Linux/ubuntu设置root登陆.md rename to mengyanote-frontend/public/mengyanote/Linux/ubuntu设置root登陆.md diff --git a/public/mengyanote/Linux/wlan0简单介绍.md b/mengyanote-frontend/public/mengyanote/Linux/wlan0简单介绍.md similarity index 100% rename from public/mengyanote/Linux/wlan0简单介绍.md rename to mengyanote-frontend/public/mengyanote/Linux/wlan0简单介绍.md diff --git a/mengyanote-frontend/public/mengyanote/Linux/全局执行某个sh脚本,该放在Linux哪个目录.md b/mengyanote-frontend/public/mengyanote/Linux/全局执行某个sh脚本,该放在Linux哪个目录.md new file mode 100644 index 0000000..a0bdfd9 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/全局执行某个sh脚本,该放在Linux哪个目录.md @@ -0,0 +1,77 @@ +要使得某个 `.sh` 脚本能够在系统中全局执行,你可以将该脚本放在 **系统的 `PATH` 路径中**,使其在任何地方都能被执行。常见的目录有: + +### 1. **`/usr/local/bin/`** +这是推荐的目录,因为它是用来放置系统管理员手动安装或编译的软件及脚本的。脚本放在这个目录中,可以确保它对所有用户可用,并且不会与系统自带的命令冲突。 + +步骤: +1. 将你的 `.sh` 脚本复制到 `/usr/local/bin/` 目录下。 + + ```bash + sudo cp your_script.sh /usr/local/bin/ + ``` + +2. 赋予脚本执行权限: + + ```bash + sudo chmod +x /usr/local/bin/your_script.sh + ``` + +3. 确保脚本能被执行,可以通过命令行直接调用(例如 `your_script.sh`),无需指定路径。 + +### 2. **`/usr/bin/`** +这个目录通常用于系统范围内的二进制文件,和 `/usr/local/bin/` 类似。但是,建议将自定义脚本放在 `/usr/local/bin/` 目录下,因为 `/usr/bin/` 通常用于通过包管理器安装的系统级命令。 + +步骤: +1. 将脚本复制到 `/usr/bin/` 目录: + + ```bash + sudo cp your_script.sh /usr/bin/ + ``` + +2. 赋予执行权限: + + ```bash + sudo chmod +x /usr/bin/your_script.sh + ``` + +### 3. **`/bin/`**(不推荐) +`/bin/` 目录通常用于存放系统核心命令和工具,普通用户通常不建议将自定义脚本放在这个目录中,除非它们确实是系统必需的命令。通常会将脚本放置在 `/usr/local/bin/` 或 `/usr/bin/` 中。 + +### 4. **用户特定的目录(例如 `/home/username/bin/`)** +如果你只想为某个特定用户设置全局脚本,而不是所有用户可以访问的脚本,你可以将脚本放在该用户的 `~/bin/` 目录下(如果该目录不存在,可以自己创建)。确保将 `~/bin/` 添加到用户的 `PATH` 环境变量中。 + +步骤: +1. 创建 `~/bin/` 目录(如果没有的话): + + ```bash + mkdir -p ~/bin + ``` + +2. 将脚本复制到 `~/bin/` 目录: + + ```bash + cp your_script.sh ~/bin/ + ``` + +3. 赋予执行权限: + + ```bash + chmod +x ~/bin/your_script.sh + ``` + +4. 编辑 `~/.bashrc` 或 `~/.profile`,将 `~/bin/` 添加到 `PATH`: + + ```bash + export PATH=$PATH:~/bin + ``` + +5. 使 `~/.bashrc` 变更生效: + + ```bash + source ~/.bashrc + ``` + +### 总结 +- **最推荐的目录:** `/usr/local/bin/`,适用于系统范围内的自定义脚本。 +- **其他可选目录:** `/usr/bin/`(不推荐),如果需要放系统级命令可以选择该目录。 +- **特定用户的脚本:** 用户自己的 `~/bin/` 目录。 diff --git a/public/mengyanote/Linux/手动配置alist.md b/mengyanote-frontend/public/mengyanote/Linux/手动配置alist.md similarity index 100% rename from public/mengyanote/Linux/手动配置alist.md rename to mengyanote-frontend/public/mengyanote/Linux/手动配置alist.md diff --git a/public/mengyanote/Linux/把Ubuntu镜像源切换到阿里云.md b/mengyanote-frontend/public/mengyanote/Linux/把Ubuntu镜像源切换到阿里云.md similarity index 92% rename from public/mengyanote/Linux/把Ubuntu镜像源切换到阿里云.md rename to mengyanote-frontend/public/mengyanote/Linux/把Ubuntu镜像源切换到阿里云.md index 1efdbed..d39503e 100644 --- a/public/mengyanote/Linux/把Ubuntu镜像源切换到阿里云.md +++ b/mengyanote-frontend/public/mengyanote/Linux/把Ubuntu镜像源切换到阿里云.md @@ -49,5 +49,4 @@ sudo apt update sudo apt upgrade ``` -完成这些步骤后,你的 Ubuntu 系统应该就会使用阿里云的镜像源了,下载速度会更加快速稳定。 diff --git a/public/mengyanote/Linux/构建最小Linux系统.md b/mengyanote-frontend/public/mengyanote/Linux/构建最小Linux系统.md similarity index 100% rename from public/mengyanote/Linux/构建最小Linux系统.md rename to mengyanote-frontend/public/mengyanote/Linux/构建最小Linux系统.md diff --git a/public/mengyanote/Linux/树萌芽常用Linux命令集合.md b/mengyanote-frontend/public/mengyanote/Linux/树萌芽常用Linux命令集合.md similarity index 100% rename from public/mengyanote/Linux/树萌芽常用Linux命令集合.md rename to mengyanote-frontend/public/mengyanote/Linux/树萌芽常用Linux命令集合.md diff --git a/public/mengyanote/Linux/树萌芽的局域网中网IP分配.md b/mengyanote-frontend/public/mengyanote/Linux/树萌芽的局域网中网IP分配.md similarity index 79% rename from public/mengyanote/Linux/树萌芽的局域网中网IP分配.md rename to mengyanote-frontend/public/mengyanote/Linux/树萌芽的局域网中网IP分配.md index 6ff2a6e..a8e1d14 100644 --- a/public/mengyanote/Linux/树萌芽的局域网中网IP分配.md +++ b/mengyanote-frontend/public/mengyanote/Linux/树萌芽的局域网中网IP分配.md @@ -1,6 +1,6 @@ # IP分段:192.168.31.1-192.168.31.255 -## ------------------------------------------------------------ +## ------------------------------- ## 10 20 30 40 50 60 70 @@ -12,7 +12,7 @@ ## 233 -## ------------------------------------------------------------ +## ------------------------------- ## x86电脑系列 diff --git a/public/mengyanote/Linux/编译alist.md b/mengyanote-frontend/public/mengyanote/Linux/编译alist.md similarity index 100% rename from public/mengyanote/Linux/编译alist.md rename to mengyanote-frontend/public/mengyanote/Linux/编译alist.md diff --git a/public/mengyanote/Linux/编译busybox步骤.md b/mengyanote-frontend/public/mengyanote/Linux/编译busybox步骤.md similarity index 100% rename from public/mengyanote/Linux/编译busybox步骤.md rename to mengyanote-frontend/public/mengyanote/Linux/编译busybox步骤.md diff --git a/mengyanote-frontend/public/mengyanote/Linux/随身WiFi/随身WiFi一些记录.md b/mengyanote-frontend/public/mengyanote/Linux/随身WiFi/随身WiFi一些记录.md new file mode 100644 index 0000000..5a0a421 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Linux/随身WiFi/随身WiFi一些记录.md @@ -0,0 +1 @@ +export TERM=linux diff --git a/mengyanote-frontend/public/mengyanote/Minecraft/Minecraft命名彩蛋.md b/mengyanote-frontend/public/mengyanote/Minecraft/Minecraft命名彩蛋.md new file mode 100644 index 0000000..3a531b9 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Minecraft/Minecraft命名彩蛋.md @@ -0,0 +1,9 @@ +在 Minecraft Java 版(以及很多情况下 Bedrock 版也适用)里,给生物使用命名牌(Name Tag)命名时,有几种**彩蛋效果**(Easter Eggs)可以触发。以下是主要已知的几种: + +| 名称 | 生物 | 效果 | 备注 | +| -------------------------- | ---------------------------- | -------------------------------------------- | ---------------------------------------------- | +| **“Dinnerbone” 或 “Grumm”** | 任何可命名的生物(除某些Boss如末影龙) | 生物会“倒立”——模型翻转,看起来在头朝下走路 | 这是对开发者 Nathan Adams(昵称 Dinnerbone)和 Grumm 的致敬。 | +| **“jeb_”**(注意结尾的下划线) | 羊(Sheep) | 羊的羊毛会不断在所有颜色之间切换,形成“彩虹羊”效果 | 虽然羊毛颜色看上去在变,但剪下或杀掉后掉落的仍然是原始颜色的羊毛 | +| **“Toast”** | 兔子(Rabbit) | 命名为 “Toast” 的兔子会变成黑白皮肤(纪念性皮肤) | 背后故事是某玩家丢失了一只叫 Toast 的兔子,开发者为其添加了这一皮肤。 | +| **“Johnny”** | 复仇者(Vindicator)或在某版本中 Zoglin | 命名为 “Johnny” 的复仇者会变得对几乎所有生物(包括动物/敌对/中立)都敌对攻击 | 这是对电影 The Shining 中 “Here’s Johnny” 场景的致敬。 | +| | | | | diff --git a/public/mengyanote/Minecraft/Minecraft常用命令.md b/mengyanote-frontend/public/mengyanote/Minecraft/Minecraft常用命令.md similarity index 72% rename from public/mengyanote/Minecraft/Minecraft常用命令.md rename to mengyanote-frontend/public/mengyanote/Minecraft/Minecraft常用命令.md index cd1b8b7..cf35ceb 100644 --- a/public/mengyanote/Minecraft/Minecraft常用命令.md +++ b/mengyanote-frontend/public/mengyanote/Minecraft/Minecraft常用命令.md @@ -5,4 +5,7 @@ 清除所有掉落物 ***/gamerule mobGriefing true*** -设置生物破坏开启或者禁用 (禁用后村民不会繁殖,雪傀儡不会产雪) \ No newline at end of file +设置生物破坏开启或者禁用 (禁用后村民不会繁殖,雪傀儡不会产雪) + +***/gamerule keepInventory true*** +设置玩家死亡不掉落 \ No newline at end of file diff --git a/public/mengyanote/Obsidion/Obsidion美化.md b/mengyanote-frontend/public/mengyanote/Obsidion/Obsidion美化.md similarity index 100% rename from public/mengyanote/Obsidion/Obsidion美化.md rename to mengyanote-frontend/public/mengyanote/Obsidion/Obsidion美化.md diff --git a/mengyanote-frontend/public/mengyanote/Windows/NSSM使用教程.md b/mengyanote-frontend/public/mengyanote/Windows/NSSM使用教程.md new file mode 100644 index 0000000..41e9d1e --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/Windows/NSSM使用教程.md @@ -0,0 +1,305 @@ + +# NSSM 使用教程(Windows 下的 systemctl 替代方案) +> 适用场景:把 **控制台程序**(如 frpc、openlist、各种 exe/bat/cmd) +> 做成 **开机自启 + 后台运行 + 崩溃自动重启 + 日志管理** 的 Windows 服务。 + +--- + +## 目录 +1. **NSSM** 是什么 +2. 下载与准备 +3. 安装服务(GUI) +4. 安装服务(纯命令行) +5. 服务启停与状态查看 +6. 修改服务配置(GUI/命令行) +7. 崩溃自动重启策略 +8. 日志捕获与轮转 +9. 权限、依赖与进程设置(可选) +10. 卸载服务 +11. 常见问题与排错 +12. frpc/openlist 成品脚本示例 + +--- + +## 1. **NSSM** 是什么 +NSSM(Non-Sucking Service Manager)是一个 Windows Service Wrapper,能: +- 把任何控制台程序包装成 Windows 服务 +- 进程退出/崩溃时自动重启 +- 捕获 stdout/stderr 写日志并支持轮转 + +--- + +## 2. 下载与准备 +1. 下载 NSSM 压缩包,解压 +2. 根据系统位数选择: + - 64 位:`win64\nssm.exe` + - 32 位:`win32\nssm.exe` +3. 放到固定目录,例如: +```powershell +C:\tools\nssm\nssm.exe +```` +4. (推荐)将 `C:\tools\nssm` 加到系统 PATH + +> **注意**:后续所有安装/启动/删除服务命令,都建议在 **管理员 CMD/PowerShell** 中执行。 + +--- + +## 3. 安装服务(GUI 最常用) +管理员 CMD: + +```bat +nssm install frpc +```` + +弹出 GUI 后在 **Application** 页填写: +- **Path**:程序路径 + 例:`E:\控制台软件\frpc\frpc.exe` +- **Startup directory**:工作目录 + 例:`E:\控制台软件\frpc` +- **Arguments**:启动参数 + 例:`-c E:\控制台软件\frpc\frpc.ini` + +填完点 **Install service**。 + +--- + +## 4. 安装服务(纯命令行) + +适合脚本化部署: + +```bat +nssm install frpc "E:\控制台软件\frpc\frpc.exe" "-c E:\控制台软件\frpc\frpc.ini" +``` + +然后补充工作目录等: + +```bat +nssm set frpc AppDirectory "E:\控制台软件\frpc" +``` + +--- + +## 5. 服务启停与状态查看 + +```bat +nssm start frpc +nssm stop frpc +nssm restart frpc +nssm status frpc +``` + +常见 `status` 结果: +- `SERVICE_RUNNING`:运行中 +- `SERVICE_STOPPED`:已停止 + +--- + +## 6. 修改服务配置(GUI / 命令行) + +### 6.1 GUI 编辑 + +```bat +nssm edit frpc +``` + +### 6.2 命令行修改(set/get/reset/dump) + +**通用格式**: + +```bat +nssm set <服务名> <参数名> <值> +nssm get <服务名> <参数名> +nssm reset <服务名> <参数名> +nssm dump <服务名> +``` + +示例: + +```bat +nssm set frpc AppDirectory "E:\控制台软件\frpc" +nssm get frpc AppDirectory +nssm dump frpc +``` + +--- + +## 7. 崩溃自动重启策略(两层保险) + +### 7.1 NSSM 自带 Exit actions + +GUI:**Exit actions** 标签页 +- **AppExit Default** = `Restart` +- **AppRestartDelay** = `5000`(毫秒) +- **AppThrottle** = `1500`(默认,一般不用改) + +命令行等价: + +```bat +nssm set frpc AppExit Default Restart +nssm set frpc AppRestartDelay 5000 +nssm set frpc AppThrottle 1500 +``` + +### 7.2 Windows 服务“恢复”策略(推荐开启) + +`Win + R → services.msc` +找到服务 → 属性 → **恢复**: +- 第一次失败:重新启动服务 +- 第二次失败:重新启动服务 +- 后续失败:重新启动服务 +- 延迟:5~10 秒 + +--- + +## 8. 日志捕获与轮转 + +### 8.1 捕获 stdout / stderr + +GUI:**I/O** 页 +- **Output (stdout)**:`C:\logs\frpc.out.log` +- **Error (stderr)**:`C:\logs\frpc.err.log` + +命令行: + +```bat +nssm set frpc AppStdout "C:\logs\frpc.out.log" +nssm set frpc AppStderr "C:\logs\frpc.err.log" +``` + +### 8.2 日志轮转 + +GUI:**File rotation** 页 +- 勾 `Rotate while service is running` +- `Rotate files bigger than X bytes`(如 50MB) +- 可选勾 `Replace existing files` + +命令行示例(轮转阈值 50MB): + +```bat +nssm set frpc AppRotateFiles 1 +nssm set frpc AppRotateOnline 1 +nssm set frpc AppRotateBytes 52428800 +nssm set frpc AppRotateSeconds 0 +``` + +--- + +## 9. 权限、依赖与进程设置(可选) + +### 9.1 用指定账户跑服务 + +GUI:**Log on** 页 +默认 `LocalSystem` 已够用。 +需要访问网络共享时才换普通用户。 +命令行: + +```bat +nssm set frpc ObjectName ".\someuser" "password" +``` + +### 9.2 设置依赖(等某服务起来再启动) + +GUI:**Dependencies** 页 +命令行: + +```bat +nssm set frpc DependOnService Tcpip +``` + +### 9.3 设置优先级/CPU 亲和性 + +GUI:**Process** 页 +命令行: + +```bat +nssm set frpc AppPriority NORMAL_PRIORITY_CLASS +nssm set frpc AppAffinity All +``` + +--- + +## 10. 卸载服务(安全删除) + +先停再删: + +```bat +nssm stop frpc +nssm remove frpc confirm +``` + +--- + +## 11. 常见问题与排错 + +### 11.1 `Can't open service! OpenService(): 拒绝访问` + +原因:**没有管理员权限控制服务** + +解决: +1. 关闭当前 CMD +2. 以管理员身份打开 CMD +3. 再执行: + +```bat +nssm start frpc +``` + +### 11.2 服务启动后立刻停止 + +常见原因:**Path / Arguments / Startup directory 错** +排查: + +```bat +nssm edit frpc +nssm dump frpc +``` + +### 11.3 日志没内容 + +原因: +- 没设置 `AppStdout/AppStderr` +- 目录没权限 + +--- + +## 12. frpc / openlist 成品脚本示例 + +### 12.1 frpc + +```bat +nssm install frpc "E:\控制台软件\frpc\frpc.exe" "-c \"E:\控制台软件\frpc\frpc.ini\"" +nssm set frpc AppDirectory "E:\控制台软件\frpc" +nssm set frpc AppStdout "C:\logs\frpc.out.log" +nssm set frpc AppStderr "C:\logs\frpc.err.log" +nssm set frpc AppExit Default Restart +nssm set frpc AppRestartDelay 5000 +nssm start frpc +``` + +### 12.2 openlist(按你实际参数改) + +```bat +nssm install openlist "E:\控制台软件\openlist\openlist.exe" "server --config E:\控制台软件\openlist\config.yaml" +nssm set openlist AppDirectory "E:\控制台软件\openlist" +nssm set openlist AppStdout "C:\logs\openlist.out.log" +nssm set openlist AppStderr "C:\logs\openlist.err.log" +nssm set openlist AppExit Default Restart +nssm set openlist AppRestartDelay 5000 +nssm start openlist +``` + +--- + +## 速查表 + +```bat +nssm install "" "" +nssm edit +nssm start|stop|restart +nssm status +nssm set/get/reset [value] +nssm dump +nssm remove confirm +``` + +--- diff --git a/public/mengyanote/ignore.json b/mengyanote-frontend/public/mengyanote/ignore.json similarity index 100% rename from public/mengyanote/ignore.json rename to mengyanote-frontend/public/mengyanote/ignore.json diff --git a/public/mengyanote/临时/Code-Server配置.md b/mengyanote-frontend/public/mengyanote/临时/Code-Server配置.md similarity index 100% rename from public/mengyanote/临时/Code-Server配置.md rename to mengyanote-frontend/public/mengyanote/临时/Code-Server配置.md diff --git a/public/mengyanote/临时/HomePage美化配置.md b/mengyanote-frontend/public/mengyanote/临时/HomePage美化配置.md similarity index 100% rename from public/mengyanote/临时/HomePage美化配置.md rename to mengyanote-frontend/public/mengyanote/临时/HomePage美化配置.md diff --git a/public/mengyanote/临时/IDE快捷键.md b/mengyanote-frontend/public/mengyanote/临时/IDE快捷键.md similarity index 100% rename from public/mengyanote/临时/IDE快捷键.md rename to mengyanote-frontend/public/mengyanote/临时/IDE快捷键.md diff --git a/public/mengyanote/临时/Termux安装nodejs失败.md b/mengyanote-frontend/public/mengyanote/临时/Termux安装nodejs失败.md similarity index 100% rename from public/mengyanote/临时/Termux安装nodejs失败.md rename to mengyanote-frontend/public/mengyanote/临时/Termux安装nodejs失败.md diff --git a/public/mengyanote/临时/临时.md b/mengyanote-frontend/public/mengyanote/临时/临时.md similarity index 100% rename from public/mengyanote/临时/临时.md rename to mengyanote-frontend/public/mengyanote/临时/临时.md diff --git a/public/mengyanote/临时/修改hosts方式来直连Github.md b/mengyanote-frontend/public/mengyanote/临时/修改hosts方式来直连Github.md similarity index 100% rename from public/mengyanote/临时/修改hosts方式来直连Github.md rename to mengyanote-frontend/public/mengyanote/临时/修改hosts方式来直连Github.md diff --git a/public/mengyanote/临时/快速开启一个http服务器.md b/mengyanote-frontend/public/mengyanote/临时/快速开启一个http服务器.md similarity index 100% rename from public/mengyanote/临时/快速开启一个http服务器.md rename to mengyanote-frontend/public/mengyanote/临时/快速开启一个http服务器.md diff --git a/mengyanote-frontend/public/mengyanote/临时/未命名 1.md b/mengyanote-frontend/public/mengyanote/临时/未命名 1.md new file mode 100644 index 0000000..2a6c3dd --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/临时/未命名 1.md @@ -0,0 +1,26 @@ +通过ADB修改系统进程限制、添加后台豁免权限等操作,能大幅提升Termux的保活能力,以下是适配Android 12及以上的完整步骤,电脑或Termux内操作均可实现: + +1. 前期准备 +1. 开启手机开发者模式:进入设置→关于手机,连续点击版本号7次;再到开发者选项中开启USB调试(连电脑用)或无线调试(无电脑用)。 +2. 环境搭建:连电脑需在电脑装Android SDK Platform-Tools;无电脑则打开Termux输入 pkg update && pkg install android-tools 安装ADB工具。 +3. 设备连接:电脑端用USB线连手机,输入 adb devices 确认连接;Termux内可分屏打开无线调试,执行 adb pair localhost:配对端口 完成配对,再用 adb connect localhost:调试端口 连接。 +2. 执行核心保活ADB命令 +依次在电脑终端或Termux内输入以下命令,赋予Termux系统级保活权限: +bash + +# 禁用配置同步,避免修改被系统覆盖 +adb shell device_config set_sync_disabled_for_tests persistent +# 大幅提升后台幻影进程上限,设为高数值避免被查杀 +adb shell device_config put activity_manager max_phantom_processes 65536 +# 加入低电耗模式白名单,避免休眠时被杀 +adb shell cmd deviceidle whitelist + com.termux +# 授予多种后台运行豁免权限 +adb shell cmd app ops set com.termux run_in_background allow +adb shell cmd app ops set com.termux system_exempt_from_power_restrictions allow +adb shell cmd app ops set com.termux wake_lock allow +  +3. 收尾与辅助保活 +1. 输入 adb reboot 重启手机,让所有设置生效。 +2. 打开手机电池设置,将Termux设为“无限制”或“不优化”;回到Termux输入 termux-wake-lock ,可临时锁定进程防止休眠。 + +这些操作能让Termux接近系统自带软件的保活优先级,但修改系统配置可能增加耗电量,低内存设备需注意性能影响。 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/临时/未命名.md b/mengyanote-frontend/public/mengyanote/临时/未命名.md new file mode 100644 index 0000000..e04f05c --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/临时/未命名.md @@ -0,0 +1,5 @@ +docker exec -it headscale headscale apikeys create + +docker exec -it headscale headscale apikeys list + +tailscale up --login-server https://headscale.shumengya.top --authkey 60bd774f2faa68f5399113bf641685348501e0f5a07f2e77 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/临时/灵创盘底部说明.md b/mengyanote-frontend/public/mengyanote/临时/灵创盘底部说明.md new file mode 100644 index 0000000..12bdb8e --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/临时/灵创盘底部说明.md @@ -0,0 +1,17 @@ +### 灵创实验室相关网站 + +#### 招新官网: [https://www.lcxm.site](https://www.lcxm.site) +#### 灵创作品集: [https://show.lcxm.site](https://show.lcxm.site) +#### 灵创云盘: [https://pan.lcxm.site](https://pan.lcxm.site) + +--- + +### 📞 网盘问题联系 + +| 联系人 | QQ号码 | +| ---- | ---------- | +| 北冥有鱼 | 1151175089 | +| 语棄 | 3961448694 | +| 树萌芽 | 3205788256 | + +> 如有网盘相关问题和需求,请联系以上负责人 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/临时/灵创盘顶部说明.md b/mengyanote-frontend/public/mengyanote/临时/灵创盘顶部说明.md new file mode 100644 index 0000000..61a4fbf --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/临时/灵创盘顶部说明.md @@ -0,0 +1,3 @@ +# 🎯 灵创新媒实验室网盘 + +>⚠️ 上传文件前请遵守相应上传规则,避免文件乱放 diff --git a/public/mengyanote/临时/灵创第14周个人汇报.md b/mengyanote-frontend/public/mengyanote/临时/灵创第14周个人汇报.md similarity index 100% rename from public/mengyanote/临时/灵创第14周个人汇报.md rename to mengyanote-frontend/public/mengyanote/临时/灵创第14周个人汇报.md diff --git a/public/mengyanote/临时/灵创第15周周报.md b/mengyanote-frontend/public/mengyanote/临时/灵创第15周周报.md similarity index 100% rename from public/mengyanote/临时/灵创第15周周报.md rename to mengyanote-frontend/public/mengyanote/临时/灵创第15周周报.md diff --git a/public/mengyanote/临时/第11周学习内容.md b/mengyanote-frontend/public/mengyanote/临时/第11周学习内容.md similarity index 100% rename from public/mengyanote/临时/第11周学习内容.md rename to mengyanote-frontend/public/mengyanote/临时/第11周学习内容.md diff --git a/public/mengyanote/临时/第11周汇报.md b/mengyanote-frontend/public/mengyanote/临时/第11周汇报.md similarity index 100% rename from public/mengyanote/临时/第11周汇报.md rename to mengyanote-frontend/public/mengyanote/临时/第11周汇报.md diff --git a/public/mengyanote/临时/第12周周报.md b/mengyanote-frontend/public/mengyanote/临时/第12周周报.md similarity index 100% rename from public/mengyanote/临时/第12周周报.md rename to mengyanote-frontend/public/mengyanote/临时/第12周周报.md diff --git a/public/mengyanote/临时/第13周周报.md b/mengyanote-frontend/public/mengyanote/临时/第13周周报.md similarity index 100% rename from public/mengyanote/临时/第13周周报.md rename to mengyanote-frontend/public/mengyanote/临时/第13周周报.md diff --git a/public/mengyanote/临时/第16周灵创汇报.md b/mengyanote-frontend/public/mengyanote/临时/第16周灵创汇报.md similarity index 100% rename from public/mengyanote/临时/第16周灵创汇报.md rename to mengyanote-frontend/public/mengyanote/临时/第16周灵创汇报.md diff --git a/public/mengyanote/临时/萌芽云剪切板.md b/mengyanote-frontend/public/mengyanote/临时/萌芽云剪切板.md similarity index 100% rename from public/mengyanote/临时/萌芽云剪切板.md rename to mengyanote-frontend/public/mengyanote/临时/萌芽云剪切板.md diff --git a/public/mengyanote/内网穿透/frp服务端配置.md b/mengyanote-frontend/public/mengyanote/内网穿透/Frp/Frp服务端配置.md similarity index 100% rename from public/mengyanote/内网穿透/frp服务端配置.md rename to mengyanote-frontend/public/mengyanote/内网穿透/Frp/Frp服务端配置.md diff --git a/mengyanote-frontend/public/mengyanote/内网穿透/Tailscale/Tailscale客户端常用命令.md b/mengyanote-frontend/public/mengyanote/内网穿透/Tailscale/Tailscale客户端常用命令.md new file mode 100644 index 0000000..87ded79 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/内网穿透/Tailscale/Tailscale客户端常用命令.md @@ -0,0 +1,63 @@ +### tailscale 命令 + +- **up** + 连接到 Tailscale,如有需要会进行登录 +- **down** + 从 Tailscale 断开连接 +- **set** + 修改指定的偏好设置 +- **login** + 登录到 Tailscale 账号 +- **logout** + 从 Tailscale 断开并使当前节点密钥失效 +- **switch** + 切换到另一个 Tailscale 账号 +- **configure** + 配置主机以启用更多 Tailscale 功能 +- **syspolicy** + 诊断 MDM(移动设备管理)与系统策略配置 +- **netcheck** + 显示本地网络状况的分析 +- **ip** + 显示 Tailscale 的 IP 地址 +- **dns** + 诊断内部 DNS 转发器 +- **status** + 显示 tailscaled 及其连接的状态 +- **metrics** + 显示 Tailscale 的指标数据 +- **ping** + 在 Tailscale 层对主机执行 Ping,并显示路由情况 +- **nc** + 连接到主机的某个端口,并连接到标准输入/输出(类似 netcat) +- **ssh** + 通过 Tailscale SSH 到一台 Tailscale 机器 +- **funnel** + 将内容或本地服务器公开到互联网 +- **serve** + 在你的 tailnet( Tailscale 网络)中提供内容或本地服务 +- **version** + 显示 Tailscale 版本 +- **web** + 运行一个用于控制 Tailscale 的 Web 服务器 +- **file** + 发送或接收文件 +- **bugreport** + 输出用于诊断问题的可分享标识符 +- **cert** + 获取 TLS 证书 +- **lock** + 管理 tailnet lock(网络锁) +- **licenses** + 获取开源许可证信息 +- **exit-node** + 显示你的 tailnet 中配置为出口节点的机器 +- **update** + 将 Tailscale 更新到最新或其他版本 +- **whois** + 显示与某个 Tailscale IP(v4 或 v6)对应的机器和用户 +- **drive** + 与你的 tailnet 共享目录 +- **completion** + 生成 shell 自动补全脚本 + diff --git a/public/mengyanote/内网穿透/搭建derp和headscale避坑与指南.md b/mengyanote-frontend/public/mengyanote/内网穿透/Tailscale/搭建derp和headscale避坑与指南.md similarity index 100% rename from public/mengyanote/内网穿透/搭建derp和headscale避坑与指南.md rename to mengyanote-frontend/public/mengyanote/内网穿透/Tailscale/搭建derp和headscale避坑与指南.md diff --git a/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/Wireguard基础命令.md b/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/Wireguard基础命令.md new file mode 100644 index 0000000..1a6dd28 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/Wireguard基础命令.md @@ -0,0 +1,58 @@ + +--- + +服务端(公网): +默认开放UDP端口:51820 +```bash +# 服务端确认内核转发已开启,返回值应为1 +sysctl net.ipv4.ip_forward +# 如果返回值是0,需要开启并使其生效 +sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf +sudo sysctl -p + +#生成公钥私钥 +cd /etc/wireguard +sudo wg genkey | tee client_privatekey | wg pubkey > client_publickey + +sudo wg-quick down wgs-alycd +sudo wg-quick up wgs-alycd + +sudo wg + +#查看当前WireGuard状态和连接详情 +sudo wg show  + +#设置隧道开机自启 +sudo systemctl enable wg-quick@wgs-alycd +``` + +```bash +#中转服务器记得开启ip转发 +# 永久启用 IPv4 转发 +echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf +echo "net.ipv4.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.conf + +# 应用配置 +sudo sysctl -p +``` + +--- + + +客户端(私网): +```bash +#生成公钥私钥 +cd /etc/wireguard +sudo wg genkey | tee client_privatekey | wg pubkey > client_publickey + +sudo wg-quick down wg-bigmengya +sudo wg-quick up wg-bigmengya + +sudo wg + +#查看当前WireGuard状态和连接详情 +sudo wg show  + +#设置隧道开机自启 +sudo systemctl enable wg-quick@wg-server-alycd +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/wireguard命令手册.md b/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/wireguard命令手册.md new file mode 100644 index 0000000..78fa495 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/wireguard命令手册.md @@ -0,0 +1,25 @@ + +### 📋 核心命令速查表 + +| 类别 | 命令示例 | 作用与说明 | +| :----------- | :-------------------------------------------- | :---------------------------- | +| **密钥管理** | `wg genkey > private.key` | 生成私钥。 | +| | `wg pubkey < private.key > public.key` | 从私钥导出公钥。 | +| | `wg genpsk > preshared.key` | 生成预共享密钥(可选,增强安全性)。 | +| **接口控制** | `sudo wg-quick up wg0` | 启动名为 `wg0` 的接口。 | +| | `sudo wg-quick down wg0` | 关闭接口。 | +| | `sudo wg-quick strip wg0` | 将配置文件转换为 `wg` 命令可识别的格式,用于热重载。 | +| **状态与配置** | `sudo wg` 或 `sudo wg show` | **查看所有接口状态**(握手时间、流量统计等),最常用。 | +| | `sudo wg show wg0` | 查看特定接口 `wg0` 的详细信息。 | +| | `sudo wg showconf wg0` | 显示当前运行中的配置。 | +| | `sudo wg syncconf wg0 <(wg-quick strip wg0)` | **热重载配置文件**(不中断连接)。 | +| **服务管理** | `sudo systemctl start wg-quick@wg0` | 启动服务(systemd 系统)。 | +| | `sudo systemctl enable wg-quick@wg0` | 设置开机自启。 | +| | `sudo systemctl stop wg-quick@wg0` | 停止服务。 | +| **手动配置(进阶)** | `sudo ip link add dev wg0 type wireguard` | 手动创建 WireGuard 接口。 | +| | `sudo wg set wg0 private-key /path/to/key` | 手动为接口设置私钥。 | +| | `sudo wg set wg0 peer <公钥> allowed-ips ` | 手动添加对等体。 | +| **网络与排错** | `sudo ip link show wg0` | 查看接口链路状态(如 MTU)。 | +| | `sudo ip addr show wg0` | 查看接口的 IP 地址。 | +| | `sudo ip route show` | 查看系统路由表,检查VPN路由是否生效。 | +| | `ping -c 4 10.0.0.1` | 测试到VPN内其他对等体的连通性。 | diff --git a/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/两个特殊网段的区别.md b/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/两个特殊网段的区别.md new file mode 100644 index 0000000..45f9fcd --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/内网穿透/Wireguard/两个特殊网段的区别.md @@ -0,0 +1,25 @@ +`10.0.0.0/32` 和 `10.0.0.0/24` 在 WireGuard 中的区别,本质上是 **“一个精确的IP地址”** 与 **“一个包含256个IP的网段”** 的区别,它们在配置中承担着完全不同的角色。 + +### 📍 在 WireGuard 配置中的具体作用 + + +**1. `10.0.0.0/32` 在服务器的 `[Peer]` 段 (如 `AllowedIPs = 10.0.0.2/32`)** +* **作用**:这是一个 **“身份绑定”和“路由条目”**。 +* **解读**:告诉 WireGuard 服务器:“`10.0.0.2` 这个IP地址**属于**我这个对等体(客户端)。任何需要发往 `10.0.0.2` 的数据包,都应该通过这个加密隧道送给我。” + +**2. `10.0.0.0/24` 在客户端的 `[Peer]` 段 (如 `AllowedIPs = 10.0.0.0/24`)** +* **作用**:这是一个 **“流量筛选规则”**。 +* **解读**:告诉 WireGuard 客户端:“如果我需要访问**任何一个**属于 `10.0.0.0` 到 `10.0.0.255` 这个范围的IP地址,那么就把这些网络流量全部扔进通往这个服务器Peer的隧道里。” + +### 🎯 核心总结与配置黄金法则 + +记住这个最简单的法则: + +| 配置位置 | `AllowedIPs` 应设为 | 目的 | +| :--- | :--- | :--- | +| **服务器的 `[Peer]` 段** | `10.0.0.x/32` (单个IP) | **唯一标识**一个客户端,并为其**分配IP**。 | +| **客户端的 `[Peer]` 段** | `10.0.0.0/24` (整个网段) | 让客户端能访问VPN**局域网内的所有设备**。 | + +**你之前遇到的 `10.0.0.0/32` 错误**,正是因为把它用在了客户端的 `[Peer]` 段。这等于告诉客户端:“只有去 `10.0.0.0` 这一个地址(通常无效)才走VPN”,自然无法访问服务器 (`10.0.0.1`) 和其他客户端了。 + +**一个补充**:在客户端的 `[Peer]` 段,如果你设 `AllowedIPs = 0.0.0.0/0`,意思就变成了:“**所有**互联网流量都走VPN隧道”,这就是“全局代理”模式。而 `10.0.0.0/24` 则是“仅局域网”模式。 diff --git a/mengyanote-frontend/public/mengyanote/内网穿透/内网穿透方案.md b/mengyanote-frontend/public/mengyanote/内网穿透/内网穿透方案.md new file mode 100644 index 0000000..f84f6f2 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/内网穿透/内网穿透方案.md @@ -0,0 +1,19 @@ + +--- + +## 一、开源替代方案 /工具清单 + +下面是目前社区里比较流行 /有实用性的开源方案: + +| 名称 | 语言 / 技术栈 | 支持协议 /功能 | 特点 /亮点 | 可能缺点 /注意 | +| ---------------------------------------- | -------------------- | ----------------------- | ------------------------------------------------ | ----------------------------------------------------- | +| **rathole** | Rust | TCP / HTTP /TLS | 轻量、高性能,内存占用低,支持热重载、服务令牌认证等。被设计为 FRP / ngrok 的替代品 | 文档 /社区可能不如 FRP 那么成熟;一些边缘功能可能欠缺 | +| **NSmartProxy** | .NET Core / C# | TCP / HTTP 反向代理 /穿透 | 跨平台支持好,用异步 I/O 架构驱动穿透代理 | 在 Linux /非 .NET 平台上的稳定性 /优化要测试;社区规模可能偏小 | +| **Tunnelmole** | Node.js / TypeScript | HTTP / HTTPS 隧道 | 100% 开源、可自托管、方便给本地 Web 服务生成公开 URL | 主要面向 HTTP/HTTPS,游戏 /通用 TCP 服务可能支持不够好;对于高并发 /大流量性能需要评估 | +| **Reverse Proxy Tool(基于 Netty 的)** | Java / Netty | 支持任意 TCP 上层协议和 HTTP | 支持 HTTP 升级、SSL 验证、协议透传等功能 | Java 程序可能资源占用较高;配置可能稍复杂;性能需要根据 JVM 优化 | +| **nps / NPS** / **lanproxy** / **holer** | Go /其他 | TCP / HTTP /UDP 穿透、反向代理 | 在「开源内网穿透工具」合集 /对比文章里经常被提及 | 各工具在稳定性、协议支持深度、社区维护度上有差别;需要逐个评估 | +| **reverse-tunnel(snsi nfu 的项目)** | (未知 /社区项目) | 公网 → 私网 隧道 /映射 | 提供反向隧道映射能力,据社区介绍可以做安全隧道 | 项目可能成熟度不高,文档 /示例可能不足;功能边界需自己测试 | +| **tiny-frpc** | Go / 精简 FRP 客户端 | frp 协议子集 | 体积小、适合资源紧张的嵌入式 /小设备使用 | 只是 frpc 的子集,用于客户端,不是完整替代;功能限制较多 | + +--- + diff --git a/public/mengyanote/华为ICT/MAC地址由多少位16进制组成.md b/mengyanote-frontend/public/mengyanote/华为ICT/MAC地址由多少位16进制组成.md similarity index 100% rename from public/mengyanote/华为ICT/MAC地址由多少位16进制组成.md rename to mengyanote-frontend/public/mengyanote/华为ICT/MAC地址由多少位16进制组成.md diff --git a/public/mengyanote/华为ICT/子网划分后计算广播地址.md b/mengyanote-frontend/public/mengyanote/华为ICT/子网划分后计算广播地址.md similarity index 100% rename from public/mengyanote/华为ICT/子网划分后计算广播地址.md rename to mengyanote-frontend/public/mengyanote/华为ICT/子网划分后计算广播地址.md diff --git a/mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 01 上.md b/mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 01 上.md new file mode 100644 index 0000000..a4c8cea --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 01 上.md @@ -0,0 +1,234 @@ +1.💡解答 + +要解决这道题,需逐一分析每个选项关于PSK(预共享密钥)认证的描述是否正确: + +选项A + +PSK认证的核心要求就是无线客户端(如手机、电脑等)和网络设备端(如无线路由器)配置相同的预共享密钥,这样才能通过密钥匹配完成认证,该描述正确。 + +选项B + +WPA(Wi - Fi Protected Access,Wi - Fi保护访问)和WPA2作为保障无线网络安全的协议,都支持PSK认证(此外也支持基于802.1X的认证等),该描述正确。 + +选项C + +PSK认证虽和共享密钥认证过程有相似之处,但安全性不同。PSK结合了更安全的加密算法(如TKIP、AES等),而早期共享密钥认证(如WEP的共享密钥认证)存在诸多安全漏洞(如密钥易被破解、加密强度不足等)。所以“安全性一样”的表述错误。 + +选项D + +PSK认证确实是通过4次握手(4 - Way Handshake)的Key协商过程,来验证STA(无线客户端站点)侧Key的合法性,确保通信双方密钥一致且合法,该描述正确。 + +综上,答案为\boxed{C}。 + +继续问→ + +2.💡解答 + +答案:D。 + +解析:AP(无线接入点)的绑定模板通常包含射频模板(配置射频参数,如信道、功率等)、AP模板(针对AP自身的配置模板)、ESS模板(扩展服务集模板,关联无线服务等)。“规划表模板”不属于AP直接绑定的模板类型。 + +继续问→ + +3.💡解答 + +答案:A。 + +解析:华为插卡式控制器ACU板可管理AP的最大数量为1024个。 + +继续问→ + +4.💡解答 +答案:A。 +解析:AAA(认证、授权、计费)管理框架常用RADIUS协议来实现。CAPWAP是无线AP与控制器的隧道协议;802.11a/b/g/n是无线局域网的技术标准;802.1X是端口接入控制协议,主要用于认证接入,而非AAA的核心实现协议。 + + +5.题目问的是: +> 工程中使用的网线理论上不能超过( )米。 + +选项为: +A. 50  B. 80  C. 100  D. 150 +正确答案是 B. 80 米。 +这个题目考察的是无线网络工程中使用的网线长度限制(而不是普通以太网布线标准)。 + +在华为 HCIA-WLAN(无线网络)课程中有明确说明: + +AP(无线接入点)与交换机之间的网线长度要求,由于涉及到供电(PoE)和信号衰减问题,理论上线缆长度不能超过 80 米。 + +超过 80 米后,虽然仍可能工作,但电压下降、信号衰减会导致 AP 不稳定或供电不足。 + +因此,在无线工程施工规范中,一般会预留 20 米裕量(用于跳线和布线路径弯折),所以虽然以太网标准规定最大长度是 100 米,但在无线项目中,为了确保稳定供电与信号质量,建议控制在 80 米以内。 + +应用场景 理论上限 推荐长度 说明 +普通以太网(Cat5e/Cat6) 100 米 90 米 + 2×5 米跳线 IEEE 802.3 标准 +无线工程(AP 到交换机) 100 米 ≤ 80 米 考虑供电与信号损耗 +工业环境 70–80 米 视环境电磁干扰而定 建议短一些以提高可靠性 +理论上网线最长 100 米(标准以太网) +无线工程中建议不超过 80 米(考试正确答案) +所以正确答案是:B. 80 米 + +6.题目问的是: +“Mesh 组网在以下哪个协议中定义的?” + +选项如下: +A. 802.11a +B. 802.11g +C. 802.11e +D. 802.11s + +✅ **正确答案:D. 802.11s** +IEEE 802.11 是无线局域网(WLAN)的标准系列,不同后缀对应不同的扩展功能: + +- **802.11a**:工作在 5GHz 频段,传输速率最高可达 54 Mbps。 +- **802.11g**:工作在 2.4GHz 频段,向下兼容 802.11b,速率也可达 54 Mbps。 +- **802.11e**:主要定义了 **QoS(服务质量)** 的改进,用于语音视频的优先传输。 +- **802.11s**:定义了 **无线 Mesh(自组网)** 的标准,用于在多个无线节点之间自动形成网状结构,实现多跳传输和更广的无线覆盖。 +📘 **补充知识:** 802.11s 的核心特征包括: + +- 基于 IEEE 802.11 的无线 Mesh 网络(WMN)架构; +- 支持多跳通信; +- 使用 HWMP(Hybrid Wireless Mesh Protocol,混合无线 Mesh 协议)作为路由协议; +- 常用于大范围无线覆盖场景,如园区网络、应急通信、物联网等。 +**总结:** + +> Mesh 组网是在 **IEEE 802.11s** 协议中定义的。 + +7.题目: + +> 802.11 帧中,用来记载网络分配矢量(NAV)的值时( )? + +选项: +A. Frame Control +B. Duration +C. address 位 +D. 顺序控制位 + + +--- + +✅ 正确答案:B. Duration +📘 解析: +在 IEEE 802.11 无线局域网帧结构中,有一个字段叫 Duration/ID 字段,简称 Duration, +它的主要作用之一就是 携带网络分配向量(NAV, Network Allocation Vector)的值。 + +NAV 的作用: + +NAV 是一种 虚拟载波侦听机制(Virtual Carrier Sensing); + +它用来表示信道被占用的时间; + +通过 NAV,其他无线终端可以“知道”信道在一段时间内会被占用,从而避免冲突。 + + +Duration 字段的内容: + +在数据帧或控制帧中,Duration 字段记录了 当前帧和相应应答帧 之间通信所需的时间; + +其他接收该帧的站点会根据 Duration 值更新自己的 NAV; + +从而在该时间内不发送数据,防止碰撞。 + +📊 示例说明: + +字段名称 作用 + +Frame Control 定义帧类型、控制标志(如重传、加密等) +Duration/ID 携带 NAV 值(网络分配矢量) +Address 字段 存放源、目的、BSSID 等地址信息 +Sequence Control 控制帧序号,用于重组和避免重复帧 + + + +--- + +结论: + +> 在 802.11 帧结构中,用于记录网络分配矢量(NAV)值的是 Duration 字段。 +✅ 正确答案:B. Duration + + + +8.C. 54Mbps步骤 1:了解802.11g协议802.11g协议是IEEE 802.11标准的一个版本,它支持2.4GHz频段的无线通信,兼容802.11b协议,同时提供更高的数据传输速率。步骤 2:确定802.11g协议的最大速率802.11g协议的最大数据传输速率是54Mbps。这个速率是在理想条件下,即没有干扰和信号衰减的情况下,可以达到的最大速率。步骤 3:排除其他选项选项A(11Mbps)是802.11b协议的最大速率,选项B(22Mbps)不是802.11g协议支持的速率,选项D(108Mbps)也不是802.11g协议支持的速率。 + +9.D. 服务集标识 + +10.C. 6、11、1步骤 1:理解信道分配原则在无线网络中,为了减少干扰,相邻的AP(接入点)应使用不同的信道。在2.4GHz频段,常用的信道有1、6、11,它们之间没有重叠的频段,因此可以最大限度地减少干扰。步骤 2:确定1楼AP的信道题目中提到1楼的3个AP的信道分别是1、6、11,这符合上述原则,即相邻的AP使用不同的信道。步骤 3:确定2楼AP的信道为了减少干扰,2楼的AP应使用与1楼AP不同的信道。由于1楼的信道是1、6、11,2楼的AP应使用与之不同的信道,但仍然需要遵循相邻AP使用不同信道的原则。因此,2楼的AP可以使用6、11、1的信道,这样可以确保与1楼的AP没有重叠的信道,从而减少干扰。 + +11. +B本题考查无线网络中AP(接入点)的供电方式选择,核心在于理解不同供电方案的优缺点,特别是对管理和维护便利性的影响。关键点在于: + +POE(以太网供电)的优势:通过网线同时传输电力和数据,简化布线。 +POE交换机与POE适配器的区别:POE交换机将供电与数据交换集成,便于集中管理;而POE适配器需额外部署,管理相对分散。 + +选项分析 + + +A. 独立电源适配器 +每个AP单独供电,需额外布设电源线,管理分散,维护不便。 + + +B. POE交换机 +集成供电与数据传输,通过网线统一供电,减少布线复杂度,支持集中管理与监控,便于扩展。 + + +C. POE适配器 +需连接普通交换机与AP,虽支持POE功能,但适配器需单独部署,管理相对分散。 + + +D. 交流供电 +需独立电源线,与独立适配器类似,管理不便。 + + +关键结论 +POE交换机通过集中供电和管理,显著提升维护效率,因此是优先选择。 + + +12.D本题考查的是对华为eSight网管系统功能参数的掌握,特别是位置拓扑的最大层级限制。解题的关键在于熟悉eSight系统中位置拓扑的层级设计规范。位置拓扑通常以树形结构展示网络设备的层次关系,其最大层数由系统预设,需结合选项判断正确数值。 +核心概念解析 + +位置拓扑:在eSight中,位置拓扑用于以树形结构展示网络设备的物理或逻辑分层关系,每层代表一个管理层级。 +最大层数限制:系统为防止结构过于复杂,默认设置层级上限。本题需明确该上限值。 + +选项分析 + +选项D(10层):华为eSight的设计充分考虑大规模网络管理需求,支持较深的层级结构。根据官方文档,位置拓扑的最大层数为10层,因此正确答案为D。 + + +13.B + + +14.C. 管理帧 + + +15.💡解答 + +这道题选B(300Mbps)。 + +解释:802.11n标准里,“2*2 MIMO”表示有2条发射天线、2条接收天线,对应2条空间流。在40MHz信道带宽下,每条空间流的理论速率是150Mbps,两条空间流叠加,总理论速率就是 150Mbps \times 2 = 300Mbps 。 + + +16.C本题考查网络服务质量(QoS)中的优先级队列分类。关键在于理解各选项代表的流量类型及其默认优先级顺序: + +AC-VO(Voice over IP):语音流量,对延迟最敏感,默认优先级最高; +AC-VI(Video):视频流量,优先级次之; +AC-BK(Background):后台流量(如更新、备份),优先级较低; +AC-BE(Best Effort):尽力而为流量(如普通数据传输),默认优先级最低。 + +优先级队列分类 + +AC-VO(语音流量) +语音通信要求极低延迟,需分配最高优先级确保实时性。 +AC-VI(视频流量) +视频流对延迟较敏感,但容忍一定抖动,优先级次于语音。 +AC-BK(后台流量) +非实时任务(如文件传输)可承受较高延迟,优先级较低。 +AC-BE(尽力而为流量) +普通数据流量(如网页浏览)默认无特殊保障,优先级最低。 + +AC-VO默认优先级最高,因其承载对实时性要求最高的语音通信。 + + + +17.A. RTS步骤 1:理解802.11帧中的控制报文类型802.11标准定义了多种控制报文,用于管理无线网络中的通信。这些控制报文包括RTS(请求发送)、CTS(清除发送)、ACK(确认)和PS-Poll(省电轮询)等。步骤 2:分析各控制报文的功能- RTS(Request to Send):终端在发送数据之前,会先发送RTS报文,以请求无线媒介的访问权。- CTS(Clear to Send):接入点(AP)在接收到RTS报文后,会发送CTS报文,表示无线媒介已准备好接收数据。- ACK(Acknowledgment):接收方在成功接收到数据后,会发送ACK报文,以确认数据已成功接收。- PS-Poll(Power Save Poll):终端在省电模式下,会发送PS-Poll报文,以请求AP发送缓存的数据。步骤 3:确定获取无线媒介访问权的控制报文根据上述分析,终端要获取无线媒介的访问权,需要发送RTS报文,以请求无线媒介的访问权。 + +18. diff --git a/mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 02-上.md b/mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 02-上.md new file mode 100644 index 0000000..1818107 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 02-上.md @@ -0,0 +1,545 @@ + +1.💡解答 + +在双链路热备配置中,AP检测主链路超时进行主备切换的时间通常是心跳检测间隔时间的3倍。已知心跳检测间隔时间为20秒,那么主备切换时间为20×3 = 60秒。 + +答案:B + +2.💡解答 + +要解决这道题,需了解Windows 2003 DHCP Server上Option 43字段配置AC IP地址的格式规则: + +- Option 43字段格式为:长度(1字节) + AC数量(1字节) + AC IP地址的十六进制形式。 +- 这里AC的IP地址是10.23.100.1,转换为十六进制:10是0A,23是17,100是64,1是01,即十六进制为0A176401,共4个字节(0A、17、64、01)。 +- 长度部分,AC数量为1(1个AC),所以长度是1 + 4 = 5,十六进制为05?不对,再仔细看,正确的是:对于单个AC,Option 43的格式是03(表示后续有3个字节的AC地址相关) + 01(AC数量) + AC IP地址的十六进制。AC IP地址10.23.100.1的十六进制是0A176401,共4个字节,所以组合起来是03 01 0A 17 64 01,转换为题目中的形式,对应选项C(030B31302E323332E3130302E31,这里是将十六进制按每两位一组,且可能有字符转换的对应,核心是符合“03 + 相关字节 + AC IP十六进制”的结构)。 + +答案:C + +3.💡解答 + +要解决这道题,需逐一分析每个选项: + +- 选项A:不同地区可用的WLAN信道可能存在差异,规划前跟客户确认当地可用信道是合理且必要的,该说法正确。 +- 选项B:同一室分AP所连接的天线,为了减少同AP下不同天线间的干扰等问题,发出信号的信道通常是一样的,该说法正确。 +- 选项C:华为的室分AP6310是单频AP,只支持2.4G频段,不支持5G频段的信道规划,该说法错误。 +- 选项D:相邻的边缘天线若使用相同信道,容易产生干扰,所以通常不使用相同信道,该说法正确。 + +答案:C + +继续问→ + +4.💡解答 + +要解决这道题,需按照以下步骤计算: + +步骤一:计算总用户数 + +已知有8个办公区域,每个办公区域有10个人,那么总用户数为:8\times10 = 80(人)。 + +步骤二:计算并发用户数 + +因为所有用户上网并发率是80\%,所以并发用户数为:80\times80\% = 64(人)。 + +步骤三:计算总所需带宽 + +每用户要求下行带宽为2Mbps,则总所需带宽为:64\times2 = 128Mbps。 + +步骤四:计算所需AP数量 + +每个AP的实测速率大概为80Mbps,那么所需AP数量为:128\div80 = 1.6。由于AP数量必须为整数,且1个AP无法满足带宽需求,所以需要向上取整,即需要2个AP。 + +答案:B。 + +继续问→ + + +5.💡解答 + +要解决这道题,需逐一分析每个选项: + +- 选项A:单AP带的天线数有合理范围,4 - 8个最佳且通常不超过10个,该说法符合AP6310SN的应用特点,是正确的。 +- 选项B:AP到最远端室分天线的距离控制在50米以内、不超过60米,能保证信号传输质量,该说法正确。 +- 选项C:典型室分场景下,每个天线输出功率控制在12 - 18dBm,且与场强需求和墙体结构有关,这是合理的功率规划要求,该说法正确。 +- 选项D:虽然同一个AP的室分天线间存在干扰,但在合理规划(如信道规划、功率调整等)下,是可以根据需求进行一定密度布放的,并非“不可以根据需求密集布放”,该说法错误。 + +答案:D。 + +继续问→ + +6.💡解答 + +要解决这道题,需逐一分析每个选项: + +- 选项A:TKIP加密中使用的IV(初始化向量)长度为48bits,而不是24bits,该说法错误。 +- 选项B:TKIP加密采用的加密算法与WEP加密相同,都是RC4算法,该说法正确。 +- 选项C:开发TKIP加密的动机确实是为了升级旧式WEP硬件的安全性,该说法正确。 +- 选项D:TKIP加密中增加了Key的生成、管理以及传递的机制,增强了安全性,该说法正确。 + +答案:A。 + +继续问→ + +7.💡解答 + +要解决这道题,需理解Agile Controller中时间配置在认证及授权规则里的作用: + +Agile Controller在认证和授权规则中配置时间,目的是规定用户可以接入网络的时间范围,比如允许用户在工作日的某个时间段内接入,而不是规定接入的总时长、单一时间点或者离线截止时间。 + +答案:D。 + +继续问→ + +8.💡解答 + +要解决这道题,需明确天线增益差值的计算及单位: + +天线增益的单位如果是相同的(这里天线A和天线B的增益单位都是dBi),计算两者的增益差值时,直接用数值相减即可。天线A增益为11dBi,天线B增益为8dBi,差值为11 - 8 = 3dB(因为是同单位的增益比较,差值的单位用dB表示)。 + +答案:A。 + +继续问→ + +9.💡解答 + +要解决这道题,需明确802.11帧中不同帧间间隔(Inter - Frame Space,IFS)的作用: + +在802.11协议中,SIFS(Short Inter - Frame Space,短帧间间隔) 是最短的帧间间隔,用于需要快速响应的场景,比如RTS(Request To Send,请求发送)和CTS(Clear To Send,允许发送)之间的帧间间隔就是SIFS。而IFS是帧间间隔的统称;DIFS(Distributed Inter - Frame Space,分布式帧间间隔)用于普通数据帧等的竞争接入;PIFS(Point Coordination Function Inter - Frame Space,点协调功能帧间间隔)用于点协调功能下的帧发送。 + +答案:A。 + +继续问→ + +10.💡解答 + +要解决这道题,需分析Int - Serv模型的特点及未大规模商用的原因: + +Int - Serv(集成服务)模型需要为每个流(flow)预留资源,维护每个流的状态信息。随着网络中流的数量增多,对网络设备(如路由器)的存储、处理能力要求极高,难以在大规模网络中部署,也就是可扩展性不好。而带宽预留有限、转发效率较低、不利于流量监管并非其未大规模商用的主要原因。 + +答案:C。 + +继续问→ + +11.💡解答 + +由于没有提供图,无法准确判断调制方式。不过可以先介绍一下各选项对应的调制方式特点: + +- A. 调幅:通过改变载波信号的振幅来携带信息,振幅的变化反映了调制信号的变化。 +- B. 调频:通过改变载波信号的频率来携带信息,频率的变化与调制信号相关。 +- C. 调相:通过改变载波信号的相位来携带信息,相位的变化对应调制信号的变化。 +- D. 调波:不是常见的基本调制方式。 + +如果能提供图,可根据图中载波的振幅、频率、相位等变化情况,进一步准确判断属于哪种调制方式。 + +继续问→ + +12.💡解答 + +要解决这道题,需逐一分析关于AP6610DN的各选项描述: + +- 选项A:AP6610DN是增强型的室外AP,该描述符合其产品特性,是正确的。 +- 选项B:AP6610DN是双频AP,5GHz频段可用于无线桥接和用户接入,这也是其功能特点,是正确的。 +- 选项C:AP6610DN并非只拥有一个以太网接口,它有多个接口,所以该描述错误。 +- 选项D:AP6610DN同时支持以太网接口和光纤接口,符合产品实际情况,是正确的。 + +答案:C。 + +继续问→ + +13.💡解答 + +要解决这道题,需分析CCMP(Counter - Mode/CBC - MAC Protocol)和TKIP(Temporal Key Integrity Protocol)加密的特点: + +- 选项A:CCMP采用的IV(初始化向量)长度等因素并非是其比TKIP安全性高的主要原因。 +- 选项B:密钥分发机制等方面的差异不是CCMP安全性更高的核心因素。 +- 选项C:CCMP采用了更复杂的加密算法(基于AES加密算法),而TKIP是基于WEP的改进,加密算法相对简单,这是CCMP比TKIP安全性高的重要原因。 +- 选项D:消息完整性检验机制两者都有相关设计,不是CCMP安全性更高的关键原因。 + +答案:C。 + +继续问→ + +14.💡解答 + +要解决这道题,需分析每个命令的功能: + +- 选项A: display interface  命令主要用于查看接口的状态信息,不是查看AC(接入控制器)当前配置,所以该选项错误。 +- 选项B: display current - configuration  命令的功能就是查看设备当前的配置信息,对于AC来说,该命令可以查看其当前配置,所以该选项正确。 +- 选项C: display ap all  命令主要用于查看AP(无线接入点)的相关信息,不是查看AC当前配置,所以该选项错误。 +- 选项D: display version  命令主要用于查看设备的版本信息,不是查看AC当前配置,所以该选项错误。 + +答案:B。 + +继续问→ + +15.💡解答 + +要解决这道题,需分析每个选项对应的组织职能: + +- 选项A:WiFi联盟的主要工作就是为WLAN设备进行认证,以实现WLAN技术的互操作性,确保不同厂商的WLAN设备能够相互兼容、正常工作,该选项符合要求。 +- 选项B:IEEE(电气与电子工程师协会)主要负责制定包括WLAN在内的众多技术标准(如802.11系列标准),但不是专门针对WLAN设备认证以实现互操作性的组织,所以该选项错误。 +- 选项C:IETF(互联网工程任务组)主要致力于互联网相关的标准制定等工作,与WLAN设备认证及互操作性实现关联不大,所以该选项错误。 +- 选项D:FCC(美国联邦通信委员会)主要负责美国的通信管制等工作,并非为WLAN设备认证以实现互操作性的组织,所以该选项错误。 + +答案:A。 + +继续问→ + +16.💡解答 + +要解决这道题,需明确全向天线的水平方向图特点: + +全向天线在水平方向上能够向各个方向均匀辐射信号,所以其水平方向图表现为360度。 + +答案:C。 + +继续问→ + +17.💡解答 + +要解决这道题,需明确ETSI(European Telecommunications Standards Institute)的含义,即欧洲电信标准协会,它是欧洲的标准组织。 + +答案:D。 +美国的对应组织是 ANSI(美国国家标准学会) 或 ATIS(Alliance for Telecommunications Industry Solutions) + +继续问→ + +18.💡解答 + +要解决这道题,需明确WEP安全策略的配置相关知识: + +- 选项A:其中 authentication - method open 等配置不符合WEP安全策略的正确配置要求,所以该选项错误。 +- 选项B: security - policy wep policy wep share - key 等配置是符合在AC6605上配置WEP安全策略的操作,所以该选项正确。 +- 选项C:该选项涉及的是WPA相关配置,并非WEP的配置,所以该选项错误。 + +答案:B。 + +继续问→ + +19.💡解答 + +要解决这道题,需明确WDS(无线分布式系统)网络中AP(无线接入点)的常见模式: + +- 选项A:RootAP(根AP)是WDS网络中的重要组成部分,用于作为无线分布式系统的根节点,所以该选项属于WDS网络中的AP模式。 +- 选项B:MiddleAP(中间AP)可在WDS网络中起到中继等作用,属于WDS网络中的AP模式。 +- 选项C:BridgeAP(桥接AP)主要用于无线桥接,不属于WDS网络特有的AP模式分类,所以该选项符合题意。 +- 选项D:LeafAP(叶AP)是WDS网络中的终端类AP模式,属于WDS网络中的AP模式。 + +答案:C。 + +继续问→ + +20.💡解答 + +要解决这道题,需明确原始802.11协议的工作频段相关知识: + +原始的802.11协议使用的工作频段是2.4GHz。 + +答案:A。 + +继续问→ + +21.💡解答 + +要解决这道题,需回忆AC(接入控制器)中查看在线用户的相关命令知识。 + +- 选项A: displayusersall  不是AC上检查在线用户的正确命令。 +- 选项B: displayuser-interfaceconsole0  主要用于查看控制台接口相关信息,并非在线用户信息。 +- 选项C: displaylocal-user  用于查看本地用户配置信息,不是在线用户情况。 +- 选项D: displayaccess-user  是AC上检查在线用户的正确命令。 + +所以这道题的答案是 D。 + +继续问→ + +22.💡解答 + +要解决这道题,需用到 dBm 与 mW 的换算公式: P(dBm) = 10\log_{10}\frac{P(mW)}{1mW} 。 + +我们已知 P(dBm) = 20 ,将其代入公式: + + +20 = 10\log_{10}\frac{P(mW)}{1} + + +两边同时除以 10,得到: + + +2 = \log_{10}P(mW) + + +根据对数的定义,若 \log_{a}b = c ,则 b = a^c ,所以 P(mW) = 10^2 = 100 。 + +所以这道题的答案是 A。 + +继续问→ + +23.💡解答 + +要解决这道题,需回忆802.11帧结构中各参数的功能。 + +- 选项A: rameControl (推测应为 FrameControl ,帧控制字段),主要用于定义帧的类型、子类型等控制信息,不是检查帧完整性的参数。 +- 选项B: Duration (持续时间字段),用于网络分配矢量(NAV)机制,协调信道访问,与帧完整性检查无关。 +- 选项C: FCS (帧校验序列),是802.11帧中用来检查所收到的帧的完整性的参数,通过校验算法(如CRC)来检测帧在传输过程中是否出现错误。 +- 选项D:顺序控制位,主要用于帧的顺序控制,比如分片重组等,不用于帧完整性检查。 + +所以这道题的答案是 C。 + +继续问→ + +24.💡解答 + +要解决这道题,需明确PoE(以太网供电)术语中各缩写的含义: + +- PSE(Power Sourcing Equipment):供电设备,负责为受电设备提供电力。在一些场景中,AP(无线接入点)可作为PSE,为其他支持PoE的受电设备(如IP电话等)供电。 +- PD(Powered Device):受电设备,是从PSE获取电力的设备。 +- PI:并非PoE中用于描述AP角色的典型术语。 +- PSU(Power Supply Unit):电源单元,主要指提供电源的装置,不是AP在PoE中的角色分类。 + +根据题目所给正确答案,此处AP属于PSE(供电设备)。 + +所以这道题的答案是 A。 + +继续问→ + +25.根据无线通信原理,为了获取更好的覆盖效果,应尽量使AP信号以垂直角度穿过墙壁。这样可以减少信号的反射和折射,从而降低衰减,提高信号强度。因此,正确答案是A 垂直。 + +26.💡解答 + +要解决这道题,需回忆不同VLAN端口类型的特点: + +- 选项A(access端口):接入端口,主要用于连接终端设备(如计算机等),只能属于1个VLAN,从该端口发出的帧不带VLAN标签(除非配置了特殊的VLAN标签操作,但默认是属于一个VLAN)。 +- 选项B(hybrid端口):混合端口,既可以像access端口一样连接终端设备,也可以像trunk端口一样承载多个VLAN的流量,能属于多个VLAN。 +- 选项C(trunk端口): trunk端口,主要用于交换机之间的连接,可以允许多个VLAN的流量通过,属于多个VLAN(通过允许的VLAN列表来控制)。 +- 选项D(eth - trunk端口):以太网 trunk端口,是链路聚合端口,用于将多个物理端口聚合为一个逻辑端口,它本身不是基于VLAN成员数量来定义的,重点在链路聚合,且能承载多个VLAN的流量,不属于只能属于1个VLAN的端口类型。 + +所以这道题的答案是 A。 + +27.💡解答 + +要解决这道题,需明确各标准组织的职能及CAPWAP协议的提出方: + +- 选项A(FCC):美国联邦通信委员会,主要负责美国的通信管制等事务,不是CAPWAP协议的提出组织。 +- 选项B(IETF):互联网工程任务组,专注于互联网相关技术标准的制定,CAPWAP(无线接入点控制和配置协议)是由IETF提出的。 +- 选项C(CCC):中国强制性产品认证,是产品质量认证相关的,与CAPWAP协议无关。 +- 选项D(ETSI):欧洲电信标准协会,负责欧洲的电信标准制定,不是CAPWAP协议的提出组织。 + +所以这道题的答案是 B。 + +继续问→ + +28.💡解答 + +要解决这道题,需分析802.11报文转换为802.3报文时优先级映射的常见方式: + +- 选项A:“不进行优先级映射”是一种可能的处理方式,属于优先级映射相关的范畴(即明确不做映射)。 +- 选项B:“按照不同的VAP设置不同的优先级”,VAP(虚拟接入点)可作为区分不同业务或终端的依据,以此设置优先级映射是常见方式。 +- 选项C:“按照报文到达AP先后顺序”,这是对报文的排队调度方式(如先进先出),并非优先级映射方式。优先级映射是将802.11报文中的优先级(如UP等)对应到802.3报文的优先级,和到达顺序无关。 +- 选项D:“按照UP映射到优先级”,UP(用户优先级)是802.11报文中用于表示优先级的字段,将其映射到802.3报文的优先级是典型的优先级映射方式。 + +所以这道题的答案是 C。 + +继续问→ + +29.💡解答 + +要解决这道题,需明确IEEE 802.11各子标准的功能: + +- 选项A(IEEE 802.11c):主要涉及桥接相关的标准,与漫游无关。 +- 选项B(IEEE 802.11h):针对5GHz频段的无线局域网,主要解决频谱管理等问题,并非定义漫游。 +- 选项C(IEEE 802.11j):涉及日本的无线局域网标准,和漫游定义无关。 +- 选项D(IEEE 802.11r):快速基本服务集切换(Fast BSS Transition) 标准,用于定义无线局域网中的漫游,实现STA(站点)在不同AP(接入点)之间快速切换,保证漫游过程中的服务连续性。 + +所以这道题的答案是 D。 + +继续问→ + +30.💡解答 + +要解决这道题,需明确各命令的功能: + +- 选项A(display interface):用于查看接口的相关信息,如接口状态、配置等,不是查看版本信息。 +- 选项B(display current - configuration):用于查看设备当前的配置信息,并非版本信息。 +- 选项C(display ap all):主要用于查看接入点(AP)的相关信息,和版本信息无关。 +- 选项D(display version):专门用于查看设备的当前版本信息,包括软件版本、硬件版本等内容。 + +所以这道题的答案是 D。 + +继续问→ + +31.根据无线网络原理,AC(接入控制器)执行负载均衡过程时,需要实时了解STA(站点)与AP(接入点)的关联状态,以便合理分配STA到不同的AP,避免网络拥堵。选项B“STA周期性的上报当前关联的AP标识”是正确的,因为STA定期向AC报告其当前关联的AP标识,使AC能够获取每个AP的负载情况,并基于此进行负载均衡决策。 + +其他选项分析: + +· A:AP周期性地向AC发送与其关联的STA的信息,这提供了AP侧的关联数据,但AC可能无法直接获取STA的实时状态,不利于动态负载均衡。 +· C:AC定时查询AP关联的STA数目,这只能获得AP的STA数量,但缺乏STA的具体关联信息,可能无法有效执行负载均衡。 +· D:STA周期性搜索周边的AP信息并通过关联AP上报AP标识,这主要用于漫游或邻居发现,而非直接报告当前关联状态,因此不直接用于负载均衡。 + +因此,正确答案是B。 + +32.💡解答 + +要解决这道题,需明确2.4GHz频段美国非重叠信道的相关知识: + +在2.4GHz频段,非重叠信道是指信道之间不会相互干扰的信道。对于美国的2.4GHz频段,标准的非重叠信道是1、6、11。 + +所以这道题的答案是 C。 + +继续问→ + +33.💡解答 + +答案是A。 + +解释:波瓣宽度是定向天线的重要参数,它指的是天线辐射图中,信号强度低于峰值3dB处所形成夹角的宽度。 + +继续问→ + +34.💡解答 + +答案是C。 + +解释:在无线局域网中,“扩展服务集(ESS)”是由多个AP(接入点)以及连接它们的分布式系统组成的基础架构模式网络,能扩大无线网络覆盖范围;而“基本服务集(BSS)”是单个AP加关联站点的基本单元。所以符合题目描述的是扩展服务集。 + +继续问→ + +35.在TKIP(Temporal Key Integrity Protocol)加密方式中,IV(Initialization Vector)向量的长度为48位。TKIP是WPA(Wi-Fi Protected Access)中使用的加密协议,旨在改进WEP(Wired Equivalent Privacy)的安全性。WEP使用的IV长度为24位,而TKIP将IV长度增加到48位,以增强随机性和抵抗攻击。 + +因此,正确答案是C:48。 + +选项分析: + +· A:12 bit – 过短,不符合TKIP规范。 +· B:24 bit – 是WEP的IV长度,不是TKIP。 +· C:48 bit – 正确,TKIP使用48位IV。 +· D:64 bit – 不符合TKIP规范。 + +36.💡解答 + +答案是A。华为AC6605接入控制器未加载license时,默认支持4个AP(无线接入点)。 + +继续问→ + +37.💡解答 + +首先计算并发用户数:总用户300人,并发率70%,则并发用户为 300 \times 70\% = 210 人。 + +再计算所需AP数量:每台AP双频最大接入40人,所以需要 210 \div 40 = 5.25 台。 + +由于AP数量必须为整数且要满足容量需求,需向上取整,因此至少需要6台AP。 + +答案:B + +继续问→ + +38.💡解答 + +答案:A。 + +解释:当大量设备出现AP(无线接入点)与AC(接入控制器)版本不匹配时,最合理的处理方式是对AP或AC的版本进行升级,让它们的版本互相匹配,这样才能解决版本不兼容的问题。更换AP设备(B)成本高且没必要,更换交换机(C)和POE供电(D)与版本匹配问题无关。 + +继续问→ + +39.💡解答 + +答案:C。 + +解释:在802.11帧中,ToDS(是否发往分布式系统,AP属于分布式系统部分)为1表示帧要发送到AP;FromDS(是否来自分布式系统)为0表示帧不是从AP发来的。所以无线工作站向AP发信号时,ToDS=1,FromDS=0。 + +继续问→ + +40.💡解答 + +答案:B。 + +解释:CAPWAP协议是AC(接入控制器)和瘦AP之间的传输协议,用于管理瘦AP、转发数据等;瘦AP与无线客户端之间的通信,用的是802.11等无线局域网协议,不是CAPWAP。A、C、D的描述都是正确的。 + +继续问→ + +41.Mac地址为物理地址 选b + +42.根据CAPWAP(Control And Provisioning of Wireless Access Points)协议规范,CAPWAP隧道使用两个不同的端口: + +· 控制报文使用UDP端口 5247 +· 数据报文使用UDP端口 5246 + +因此,对于题目中问的"控制报文的端口号",正确答案是 D. 5247。 + +选项分析: + +· A. 1645:这是RADIUS认证协议的旧端口号,与CAPWAP无关 +· B. 1646:这是RADIUS计费协议的旧端口号,与CAPWAP无关 +· C. 5246:这是CAPWAP数据报文的端口号,不是控制报文 +· D. 5247:正确,这是CAPWAP控制报文的端口号 + +所以正确答案是D。 + +继续问→ + +43.💡解答 + +答案:C。 + +解释:当WLAN容量需求较高时,“室内放装”方式能更灵活地部署多个AP,每个AP覆盖范围小但可承载更多用户,从而更好地满足高容量需求;而室内/室外分布系统合路、室外型AP+定向天线的方式,在容量支持的灵活性和密度上不如室内放装。 + +继续问→ + +44.💡解答 + +中国无线局域网安全强制性标准是WAPI(选项B)。WAPI是我国自主研发的无线局域网安全技术标准,用于保障无线局域网的安全性。 + +继续问→ 选b + +45.💡解答 + +答案:B + +解释:室内分布型AP常可与运营商的3G网络合路部署,借助现有室内分布系统扩大覆盖;A选项中室内AP功率通常达不到800mW;C选项防水防尘多是室外AP的特点;D选项AP6310SN一般为单频(2.4G),不支持双频。 + +继续问→ + +46.💡解答 + +答案:A。 + +解释:在中国,2.4GHz频段规定的工作频率范围是2.4GHz - 2.4835GHz,对应选项A。 + +继续问→ + +47.💡解答 + +答案:B。 + +解释:AP域中AP的布放类型包括普通布放、离散布放、密集布放,不包括有序布放。 + +继续问→ + +48.💡解答 + +答案:B。 + +解释:CCMP(计数器模式密码块链消息完整码协议)加密采用的算法是AES(高级加密标准),它用于提供更安全的无线局域网数据加密,是WPA2等安全机制的重要组成部分。 + +继续问→ + +49.根据802.11无线网络协议,当一个数据帧发送完成并收到确认(ACK)之后,站点想要发送下一个数据帧时,需要等待的时间间隔是DIFS(DCF Interframe Space)。 + +解释: + +· DIFS 是分布式协调功能帧间间隔,用于普通数据帧传输前的等待时间 +· 在CSMA/CA机制中,站点在发送数据前必须检测信道是否空闲,如果空闲时间达到DIFS,才能开始竞争窗口进行传输 + +其他选项分析: + +· A. SIFS:最短帧间间隔,用于高优先级帧(如ACK、CTS等),不是数据帧间的间隔 +· B. IFS:帧间间隔的统称,不是具体的时间间隔类型 +· D. PIFS:PCF帧间间隔,用于点协调功能模式,优先级高于DIFS但低于SIFS + +因此,正确答案是C. DIFS。 + +50.💡解答 + +答案:C。 + +解释:BSSID(基本服务集标识符)是AP的MAC地址,每个AP的BSSID唯一。当多个AP的SSID相同时,无线客户端通过BSSID来确定连接的是哪个AP。 + +继续问→ diff --git a/public/mengyanote/华为ICT/无线-HCIA 02.md b/mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 02.md similarity index 100% rename from public/mengyanote/华为ICT/无线-HCIA 02.md rename to mengyanote-frontend/public/mengyanote/华为ICT/无线-HCIA 02.md diff --git a/public/mengyanote/华为ICT/虚拟局域网作用.md b/mengyanote-frontend/public/mengyanote/华为ICT/虚拟局域网作用.md similarity index 100% rename from public/mengyanote/华为ICT/虚拟局域网作用.md rename to mengyanote-frontend/public/mengyanote/华为ICT/虚拟局域网作用.md diff --git a/public/mengyanote/华为ICT/题库.md b/mengyanote-frontend/public/mengyanote/华为ICT/题库.md similarity index 100% rename from public/mengyanote/华为ICT/题库.md rename to mengyanote-frontend/public/mengyanote/华为ICT/题库.md diff --git a/public/mengyanote/图片文件夹/Screenshot_20250717_225309.jpg b/mengyanote-frontend/public/mengyanote/图片文件夹/Screenshot_20250717_225309.jpg similarity index 100% rename from public/mengyanote/图片文件夹/Screenshot_20250717_225309.jpg rename to mengyanote-frontend/public/mengyanote/图片文件夹/Screenshot_20250717_225309.jpg diff --git a/public/mengyanote/实习求职/术语科普-HC.md b/mengyanote-frontend/public/mengyanote/实习求职/术语科普-HC.md similarity index 100% rename from public/mengyanote/实习求职/术语科普-HC.md rename to mengyanote-frontend/public/mengyanote/实习求职/术语科普-HC.md diff --git a/public/mengyanote/实习求职/术语科普-PM.md b/mengyanote-frontend/public/mengyanote/实习求职/术语科普-PM.md similarity index 100% rename from public/mengyanote/实习求职/术语科普-PM.md rename to mengyanote-frontend/public/mengyanote/实习求职/术语科普-PM.md diff --git a/public/mengyanote/实习求职/面试八股/HTTP 与HTTPS/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md b/mengyanote-frontend/public/mengyanote/实习求职/面试八股/HTTP 与HTTPS/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md similarity index 100% rename from public/mengyanote/实习求职/面试八股/HTTP 与HTTPS/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md rename to mengyanote-frontend/public/mengyanote/实习求职/面试八股/HTTP 与HTTPS/从「敲下一个 URL」到「页面出现在屏幕」整条链路全景.md diff --git a/public/mengyanote/实习求职/面试八股/Nacos功能与应用场景详解.md b/mengyanote-frontend/public/mengyanote/实习求职/面试八股/Nacos功能与应用场景详解.md similarity index 100% rename from public/mengyanote/实习求职/面试八股/Nacos功能与应用场景详解.md rename to mengyanote-frontend/public/mengyanote/实习求职/面试八股/Nacos功能与应用场景详解.md diff --git a/mengyanote-frontend/public/mengyanote/实习求职/面试八股/网络模型/OSI 七层模型是什么?.md b/mengyanote-frontend/public/mengyanote/实习求职/面试八股/网络模型/OSI 七层模型是什么?.md new file mode 100644 index 0000000..ae824a1 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/实习求职/面试八股/网络模型/OSI 七层模型是什么?.md @@ -0,0 +1,168 @@ + +--- + +# 🧩 OSI 七层模型详解(国际快递类比版) + +## 📌 一句话总结 + +**OSI 七层模型**将网络通信拆分为: +**物理 → 数据链路 → 网络 → 传输 → 会话 → 表示 → 应用** +七个层次,各司其职,模块化设计。 +可类比为“国际快递”的打包、贴标签、路由、中转、翻译、下单等流程,使网络协议结构更清晰、互不干扰。 + +--- + +# 🚚 类比:寄送国际包裹与 OSI 七层对应关系 + +``` +┌──────────────────────────────────────────────┐ +│ 应用层 Application │ ← 用户下单、填写寄件信息 +├──────────────────────────────────────────────┤ +│ 表示层 Presentation │ ← 翻译成国际通用语言、加密/压缩 +├──────────────────────────────────────────────┤ +│ 会话层 Session │ ← 握手——确认对方愿不愿意收包裹 +├──────────────────────────────────────────────┤ +│ 传输层 Transport │ ← 分段——拆包裹、编号、可靠送达/重传 +├──────────────────────────────────────────────┤ +│ 网络层 Network │ ← 路由——规划路线与中转站 +├──────────────────────────────────────────────┤ +│ 数据链路层 Data Link │ ← 帧封装——贴“省市/楼号/房间号”标签 +├──────────────────────────────────────────────┤ +│ 物理层 Physical │ ← 传输媒介——卡车、飞机、邮差 +└──────────────────────────────────────────────┘ +``` + +--- + +# 🔍 各层详解 + +## 1️⃣ 物理层(Physical Layer) + +**功能:** +- 负责比特流的物理传输(电压、光信号、无线电波) + +**设备:** +- 网线、光纤、Hub、网卡物理接口 + +**类比:** +📦 **卡车、飞机等实际运输工具**——负责把集装箱从 A 运到 B。 + +--- + +## 2️⃣ 数据链路层(Data Link Layer) + +**功能:** +- 帧的封装/拆解 +- 差错检测(CRC) +- 流量控制 +- MAC 地址寻址 + + +**子层:** +- LLC +- MAC + + +**设备:** +- 交换机、网卡驱动 + + +**类比:** +🏷️ **包裹地址标签(省/市/街道/楼号/房间号)** +🖊️ 快递员核对签名,保证局域网内无误送达。 + +--- + +## 3️⃣ 网络层(Network Layer) + +**功能:** +- 跨网段通信 +- 路由选择 +- 逻辑地址(IP)转发 + + +**协议:** +- IP、ICMP、OSPF、BGP + +**设备:** +- 路由器 + + +**类比:** +🛫 **国际快递分拨中心**——做路径规划、选择中转站。 + +--- + +## 4️⃣ 传输层(Transport Layer) + +**功能:** +- 端到端可靠/不可靠传输 +- 数据分段与重组 +- 重传、确认机制 +- 流量控制、拥塞控制 + + +**协议:** +- TCP(可靠、有序、面向连接) +- UDP(无连接、不保证可靠) + + +**类比:** +📦 **拆箱分批编号、确认回执,不签收就重发**。 + +--- + +## 5️⃣ 会话层(Session Layer) + +**功能:** +- 建立/维护/终止会话 +- 会话恢复 +- 身份验证 + +**类比:** +📞 **客服系统:输入验证码→验证→建立会话→挂断结束** + +--- + +## 6️⃣ 表示层(Presentation Layer) + +**功能:** +- 数据格式转换 +- 加密与解密 +- 压缩与解压 + + +**协议/格式:** +- SSL/TLS、MIME、JPEG、ASCII、EBCDIC + +**类比:** +🌐 **中文信件翻译成英文,再压缩体积以便运输**。 + +--- + +## 7️⃣ 应用层(Application Layer) + +**功能:** +- 面向用户,提供网络服务接口 + +**常见协议:** +- HTTP、FTP、SMTP、DNS、Telnet、SSH + +**类比:** +📝 **用户填写快递单、选择寄件方式、输入寄件内容** + +--- + +# 🧾 小结(速记版) + +|层级|名称|核心作用|类比| +|---|---|---|---| +|7|应用层|用户接口|填写快递单| +|6|表示层|编码/加密/压缩|翻译与压缩| +|5|会话层|建立/管理/断开连接|客服通话| +|4|传输层|端到端传输、分段、重传|拆包编号、签收回执| +|3|网络层|路由/跨网段|分拨中心规划路线| +|2|数据链路层|帧封装与差错校验|地址标签| +|1|物理层|比特流传输|卡车、飞机| + +--- diff --git a/public/mengyanote/实习求职/面试八股/计算机面试经典八股.md b/mengyanote-frontend/public/mengyanote/实习求职/面试八股/计算机面试经典八股.md similarity index 100% rename from public/mengyanote/实习求职/面试八股/计算机面试经典八股.md rename to mengyanote-frontend/public/mengyanote/实习求职/面试八股/计算机面试经典八股.md diff --git a/mengyanote-frontend/public/mengyanote/实习求职/面试经历/27双非本一腾讯IEG游戏安全后台实习面经.md b/mengyanote-frontend/public/mengyanote/实习求职/面试经历/27双非本一腾讯IEG游戏安全后台实习面经.md new file mode 100644 index 0000000..2866519 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/实习求职/面试经历/27双非本一腾讯IEG游戏安全后台实习面经.md @@ -0,0 +1,61 @@ +timeline: +9.16 一面 +9.18 二面 +9.22 三面 +9.23 HR面 +9.24 录用评估 +9.26 Offer + +腾讯一面(1h) + +1. 介绍实习需求(K8S 和 Casbin RBAC 相关) +2. 为啥初创实习两个月离职 +3. Go 为什么支持高并发 +4. GMP模型原理 +5. Goroutine Work-Stealing 的目的 +6. P的角色的作用,如果在M上维护Goroutine队列有什么不好 +7. GMP对CPU密集型任务能提高并发么 +8. IO操作需要CPU么,什么时候需要,磁盘IO和网络IO的区别 +9. Channel的作用和底层实现 +10. Channel的缓冲区在用户态还是内核态 +11. Goroutine阻塞等待的时候由谁来唤醒,需要额外的goroutine来遍历所有的channel么 +12. M上的G0是干嘛的 +13. 介绍select/poll/epoll +14. 网络IO的流程 +15. 了解过Go Runtime么 + +算法:求两个数的最大公约数 + +腾讯二面(1h) + +1. 介绍实习需求,最有挑战的部分 +2. RocksDB了解么,说一下LsmTree +3. 详细介绍一下Raft协议 +4. Raft协议和Paxos协议的区别,有哪些优化 +5. 介绍一下React Agent +6. LangChain 和 LangGraph 的区别 +7. Agent 和 LLM 的区别 +8. Function Call 和 MCP 的区别 +9. RPC的全流程 +10. 负载均衡算法有哪些 +11. 介绍一致性Hash算法,服务扩缩容之后有什么影响 +12. 网络编程 +13. 介绍一下TCP和UDP +14. 介绍一下HTTP各个版本及实现 + +算法: + +1. 编辑距离 +2. 两两交换链表中的节点 + +腾讯三面(30min) + +1. 介绍实习,你做了什么 +2. 介绍项目 +3. 实习时长,到岗时间,推HR面 + +腾讯HR面(15min) + +1. 离职原因 +2. 实习时长,到岗时间 +3. 聊聊天 \ No newline at end of file diff --git a/public/mengyanote/嵌入式/USB拓展坞接口数量决定因素.md b/mengyanote-frontend/public/mengyanote/嵌入式/USB拓展坞接口数量决定因素.md similarity index 100% rename from public/mengyanote/嵌入式/USB拓展坞接口数量决定因素.md rename to mengyanote-frontend/public/mengyanote/嵌入式/USB拓展坞接口数量决定因素.md diff --git a/public/mengyanote/嵌入式/光纤和网线的特点和区别.md b/mengyanote-frontend/public/mengyanote/嵌入式/光纤和网线的特点和区别.md similarity index 100% rename from public/mengyanote/嵌入式/光纤和网线的特点和区别.md rename to mengyanote-frontend/public/mengyanote/嵌入式/光纤和网线的特点和区别.md diff --git a/mengyanote-frontend/public/mengyanote/数据库/Linux控制台登录Mysql8,MongoDB,PostgresDB教程.md b/mengyanote-frontend/public/mengyanote/数据库/Linux控制台登录Mysql8,MongoDB,PostgresDB教程.md new file mode 100644 index 0000000..c70fc94 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/数据库/Linux控制台登录Mysql8,MongoDB,PostgresDB教程.md @@ -0,0 +1,126 @@ + +--- + +## 1. MySQL + +### 登录命令 + +```bash +mysql -h <主机地址> -u <用户名> -p +``` + +例如: + +```bash +mysql -h localhost -u root -p +``` + +然后系统会提示你输入密码。 +你还可以指定数据库: + +```bash +mysql -h localhost -u user_name -p 数据库名 +``` + +(登录后直接使用该数据库) + +### 注意事项 + +- 常见选项: `-h`(主机)、`-u`(用户名)、`-p`(提示输入密码) +- **为了安全**,建议使用 `-p` 而不直接在命令行后面写密码,因为其他用户可能通过进程列表看到。 +- 登录后你就会进入 MySQL 的交互提示符,比如 `mysql>`,可以执行 SQL 语句。 + + +--- + +## 2. PostgreSQL + +### 登录命令 + +对于 PostgreSQL,一般使用 `psql` 客户端。常用方式如下: + +#### 本地切换为 postgres 系统用户然后登录 + +```bash +sudo -i -u postgres +psql +``` + +或者直接: + +```bash +sudo -u postgres psql +``` + +这样你以系统用户 `postgres`(PostgreSQL 默认超级用户)身份进入数据库。 + +#### 使用指定用户、数据库、主机登录 + +```bash +psql -U <用户名> -d <数据库名> -h <主机地址> -p <端口> +``` + +例如: + +```bash +psql -U myuser -d mydb -h localhost -p 5432 +``` + + +### 注意事项 + +- 默认端口通常为 5432,如果你使用了非标准端口,则需指定 `-p`。 +- 用户 `postgres` 的 UNIX 账户通常是锁定的(不能用密码登录系统)——重点是用它来启动 `psql`。 +- 登录后提示符通常是 `postgres=#`(如果以超级用户身份)。 + + +--- + +## 3. MongoDB + +### 登录命令 + +以本地默认部署为例,使用 MongoDB shell(比如 `mongosh`)登录: + +```bash +mongosh +``` + +这会连接到 `mongodb://localhost:27017` 默认端口。 + +如果你需要指定主机、端口或用户认证: + +```bash +mongosh --host <主机地址> --port <端口> --username <用户名> --password +``` + +或者使用连接字符串: + +```bash +mongosh "mongodb://<用户名>@<主机地址>:<端口>/<数据库>" --password +``` + + +### 在 shell 中认证用户 + +登录进入 shell 后,如果还未认证,可以使用: + +```javascript +use <数据库名>; +db.auth("<用户名>", "<密码>"); +``` + +或者只输入用户名让系统提示你输入密码: + +```javascript +db.auth("<用户名>"); +``` + + + +### 注意事项 + +- 默认端口为 27017。 +- 当启用了访问控制(authentication)时,需要提供用户名和密码。否则可能会连接但不能执行特定操作。 + +--- diff --git a/mengyanote-frontend/public/mengyanote/数据库/Linux控制台登录Redis教程.md b/mengyanote-frontend/public/mengyanote/数据库/Linux控制台登录Redis教程.md new file mode 100644 index 0000000..4abcade --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/数据库/Linux控制台登录Redis教程.md @@ -0,0 +1,96 @@ + +--- + +## 🔐 1. 在配置文件中设置密码 + +1. 打开 Redis 的主配置文件(假设你安装在 Debian 12 上,通常为 `/etc/redis/redis.conf`): + + ```bash + sudo nano /etc/redis/redis.conf + ``` + +2. 找到这一行(可能被注释 `#` 掉了): + + ``` + # requirepass foobared + ``` + + 根据官方文档,这个 `requirepass` 指令就是用于开启 “旧式”统一密码认证机制。([Redis](https://redis.io/docs/latest/operate/oss_and_stack/management/security/?utm_source=chatgpt.com "Redis security | Docs")) + +3. 去掉注释 `#`,并设置为你想要的强密码。例如: + + ``` + requirepass YourStr0ngPassword!123 + ``` + +4. 保存并退出编辑器。 + +5. 重启 Redis 服务使新配置生效: + + ```bash + sudo systemctl restart redis-server + ``` + + +> 注意:如果你用的是 Redis 6+ 且希望使用更先进的用户/ACL机制,也可以考虑使用 `acl setuser …` 等。但设置 `requirepass` 是最简单直接的方法。([Redis](https://redis.io/docs/latest/operate/oss_and_stack/management/security/?utm_source=chatgpt.com "Redis security | Docs")) + +--- + +## 🧑‍💻 2. 使用 redis-cli 登录并认证 + +1. 在终端运行 Redis 命令行工具: + + ```bash + redis-cli + ``` + + 此时你可能会看到提示符,比如 `127.0.0.1:6379>`。如果已经设置了密码但还未认证,执行任何写操作会出现类似 `NOAUTH Authentication required.` 的错误。([Stack Overflow](https://stackoverflow.com/questions/7537905/how-to-set-password-for-redis?utm_source=chatgpt.com "How to set password for Redis? - Stack Overflow")) + +2. 在提示符下输入认证命令: + + ``` + AUTH YourStr0ngPassword!123 + ``` + + 如果密码正确,会返回 `OK`。此后你就可以执行 `SET`, `GET` 等命令。([Redis](https://redis.io/docs/latest/commands/auth/?utm_source=chatgpt.com "AUTH | Docs - Redis")) + +3. 你也可以在连接时直接带上密码,这样就省一步认证: + + ```bash + redis-cli -a YourStr0ngPassword!123 + ``` + + 或者: + + ```bash + redis-cli -h 127.0.0.1 -p 6379 -a YourStr0ngPassword!123 + ``` + + ([Stack Overflow](https://stackoverflow.com/questions/35745481/redis-cli-with-password?utm_source=chatgpt.com "Redis-cli with password - Stack Overflow")) + + +--- + +## ✅ 快速示例 + +假设你的密码是 `MyRedisPass123!`,步骤如下: + +```bash +sudo nano /etc/redis/redis.conf +# 修改: +# requirepass MyRedisPass123! +requirepass MyRedisPass123! +sudo systemctl restart redis-server + +redis-cli +127.0.0.1:6379> AUTH MyRedisPass123! +OK +127.0.0.1:6379> PING +PONG +127.0.0.1:6379> SET foo bar +OK +127.0.0.1:6379> GET foo +"bar" +``` + +--- diff --git a/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB数据库优化方式一览.md b/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB数据库优化方式一览.md new file mode 100644 index 0000000..d154ebe --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB数据库优化方式一览.md @@ -0,0 +1,118 @@ +除了索引之外,MongoDB 在 CRUD 操作优化上还有多种有效策略,尤其在处理海量数据时更为关键。以下是综合各技术文档和实践总结的核心优化方法: + +--- + +### 🔄 一、批量操作优化 +1. **使用 `bulkWrite` 替代单条操作** + 通过批量写入减少网络开销和事务开销。基于 `ReplaceOneModel` 启用 `upsert`,实现存在更新、不存在插入的高效操作: + ```java + public void batchSave(List dataList) { + List> bulkOps = dataList.stream() + .map(item -> { + Document doc = convertToDocument(item); // 转换为Document + return new ReplaceOneModel<>( + Filters.eq("_id", doc.get("_id")), + doc, + new UpdateOptions().upsert(true) + ); + }).collect(Collectors.toList()); + collection.bulkWrite(bulkOps); // 批量执行 + } + ``` + 此方法将多条操作合并为一次请求,写入性能提升显著。 + +--- + +### 📖 二、分页查询优化 +1. **避免精确 `count`** + 当数据量超大时,`count` 可能极慢。采用阈值法:若跳过 `MAX_PAGE_COUNT`(如1万条)后仍有数据,则返回阈值提示“数据超过1万条”,避免全表扫描: + ```java + private long approxCount(MongoTemplate mongoTemplate, Query query) { + query = query.with(PageRequest.of(MAX_PAGE_COUNT, 1)); + return mongoTemplate.find(query, Entity.class).isEmpty() + ? mongoTemplate.count(query) + : MAX_PAGE_COUNT; + } + 。 + ``` + +2. **用条件替代 `skip`** + 深度分页时(如第100页),避免 `skip(9900)`。改为记录上一页末尾的排序字段值(如时间戳),作为下一页查询条件: + ```sql + -- 原查询:db.collection.find().sort({time:-1}).skip(9900).limit(100) + -- 优化后: + db.collection.find({ time: { $lt: lastPageEndTime } }) + .sort({ time: -1 }) + .limit(100); + ``` + 此方法将 **O(N)** 的跳过操作转为 **O(1)** 的条件过滤。 + +--- + +### 📤 三、全量导出优化 +1. **字段投影减少数据传输** + 仅查询必要字段,降低网络与内存开销: + ```java + Query query = new Query(); + query.fields().include("_id").include("name"); // 只返回_id和name。 + ``` + +2. **流式处理替代全量加载** + 使用 `stream()` 逐条处理数据,避免 `findAll` 导致内存溢出: + ```java + try (CloseableIterator iter = mongoTemplate.stream(query, Entity.class)) { + while (iter.hasNext()) { + process(iter.next()); // 单条处理 + } + } + ``` + 相比分页查询,流式处理无 `skip` 开销,且内存占用恒定。 + +--- + +### 🧩 四、文档设计优化 +1. **打破第三范式** + - **冗余字段**:将高频查询的关联字段(如部门名称)冗余到主文档,避免联表查询。 + - **内嵌设计**:一对多关系直接嵌套子文档(如订单内嵌商品列表),提升读取效率。但需注意文档大小限制(16MB)。 + - **引用设计**:多对多关系使用ID数组而非完整嵌套,避免文档膨胀: + ```json + // 学生文档 + { + "_id": "s001", + "name": "Alice", + "teachers": ["t01", "t02"] // 仅存储ID + } + ``` + +--- + +### ⚙️ 五、分片集群优化 +1. **碎片整理(MongoDB <7.0)** + 在早期版本中,分片集合可能因频繁写入产生碎片化小数据块,导致CRUD延迟。通过 `configureCollectionBalancing` 命令合并数据块,但需注意: + - 整理期间可能短暂阻塞元数据更新。 + - MongoDB 7.0+ 已支持自动合并,通常无需手动操作。 + +2. **负载均衡窗口设置** + 在业务低峰期触发负载均衡器迁移数据块,减少对CRUD的影响。 + +--- + +### 💎 六、其他关键技巧 +1. **合理控制事务范围**:短事务减少锁竞争。 +2. **写入确认级别调整**:对非关键数据使用 `w:0`(无确认),提升写入速度(牺牲一致性)。 +3. **TTL索引自动清理**:为临时数据(如日志)设置过期时间,减少存储压力。 + +--- + +### 💎 优化方法效果对比表 +| **优化方向** | **适用场景** | **性能提升效果** | **实现复杂度** | +|--------------------|--------------------------|----------------------|--------------| +| **批量写入** | 数据导入、批量更新 | ⭐⭐⭐⭐⭐ (极高) | ⭐⭐ (中等) | +| **流式导出** | 大数据量导出 | ⭐⭐⭐⭐ (避免OOM) | ⭐ (简单) | +| **条件分页** | 深度分页(>100页) | ⭐⭐⭐⭐ (O(1) 跳转) | ⭐⭐ (中等) | +| **冗余字段** | 高频关联查询 | ⭐⭐⭐ (减少联表) | ⭐⭐⭐ (较高) | +| **分片碎片整理** | MongoDB 6.0以下分片集群 | ⭐⭐ (减少延迟) | ⭐⭐⭐⭐ (复杂) | + +--- + +> 💡 **实践建议**:优先从**批量操作**和**分页策略**入手,这两类优化代码改动小且收益显著。海量数据场景下,**流式处理+字段投影**是导出标配方案。分片集群升级到 MongoDB 7.0+ 可减少运维负担。 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB添加管理员账号.md b/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB添加管理员账号.md new file mode 100644 index 0000000..502f6c4 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB添加管理员账号.md @@ -0,0 +1,123 @@ + +接下来我们来 **一步步给 MongoDB 添加用户账户(角色管理)**。 + +假设你希望创建一个: +- 用户名:`shumengya` +- 密码:`shumengya520` +- 权限:对整个数据库系统有管理权限(root 权限) + + +--- + +## 🧭 步骤 1:进入 MongoDB Shell + +MongoDB 7.x 之后使用的是新客户端 `mongosh`: + +```bash +mongosh +``` + +如果提示 `command not found`,可以执行: + +```bash +mongo +``` + +--- + +## 🧩 步骤 2:切换到 `admin` 数据库 + +(MongoDB 的用户管理都存在 `admin` 数据库里) + +```javascript +use admin +``` + +--- + +## 🧰 步骤 3:创建管理员用户 + +运行下面的命令创建一个超级管理员账号: + +```javascript +db.createUser({ + user: "shumengya", + pwd: "shumengya520", + roles: [ { role: "root", db: "admin" } ] +}) +``` + +✅ 成功后会输出: + +``` +Successfully added user: { + "user" : "shumengya", + "roles" : [ { "role" : "root", "db" : "admin" } ] +} +``` + +--- + +## 🔐 步骤 4:启用身份验证 + +编辑 MongoDB 的配置文件: + +```bash +sudo nano /etc/mongod.conf +``` + +找到或添加以下部分(注意缩进): + +```yaml +security: + authorization: enabled +``` + +保存退出后,重启 MongoDB: + +```bash +sudo systemctl restart mongod +``` + +--- + +## ✅ 步骤 5:验证登录是否成功 + +```bash +mongosh -u shumengya -p shumengya520 --authenticationDatabase admin +``` + +如果看到类似: + +``` +test> +``` + +说明登录成功 ✅ + +--- + +## 💡 可选:为特定数据库创建普通用户 + +比如你有个业务数据库叫 `farmgame`,可以创建普通读写用户: + +```javascript +use farmgame +db.createUser({ + user: "gameuser", + pwd: "gamepass123", + roles: [ { role: "readWrite", db: "farmgame" } ] +}) +``` + +--- + +## 🧱 总结 + +|操作|命令或说明| +|---|---| +|创建管理员|`db.createUser({user: "shumengya", pwd: "...", roles: [{role: "root", db: "admin"}]})`| +|开启认证|`/etc/mongod.conf` → `security.authorization: enabled`| +|登录验证|`mongosh -u shumengya -p shumengya520 --authenticationDatabase admin`| + +--- diff --git a/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB的索引一览.md b/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB的索引一览.md new file mode 100644 index 0000000..7c0e185 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/数据库/MongoDB/MongoDB的索引一览.md @@ -0,0 +1,85 @@ + +**索引的核心作用:** + +1. **大幅减少查询需要扫描的文档数量:** 没有索引时,MongoDB 必须执行集合扫描(`COLLSCAN`),即检查集合中的*每一个*文档。有了合适的索引,MongoDB 可以使用索引扫描(`IXSCAN`)快速定位到包含所需数据的文档位置。 +2. **加速排序:** 如果排序字段包含在索引中,MongoDB 可以直接利用索引中已经排好的顺序返回结果,避免昂贵的在内存中排序。 +3. **支持高效的数据去重:** `$group` 聚合阶段的分组操作可以利用索引。 +4. **实现覆盖查询:** 如果查询只需要返回索引中包含的字段,MongoDB 可以*完全*从索引中获取结果,无需去读取实际的文档数据,速度极快。 + +**MongoDB 支持的索引类型:** + +1. **单字段索引:** + * 最基本的索引类型,在单个字段上创建。 + * 示例:`db.collection.createIndex({ name: 1 })` (1 表示升序,-1 表示降序。对于纯等值查询,顺序通常不重要;对于排序查询,顺序很重要)。 + +2. **复合索引:** + * 在多个字段上创建的索引。 + * 字段的顺序**极其重要**。它决定了索引如何组织和哪些查询模式可以利用该索引(最左前缀原则)。 + * 示例:`db.collection.createIndex({ status: 1, order_date: -1 })`。这个索引可以高效支持: + * 只查询 `status` 的查询 + * 同时查询 `status` 和 `order_date` 的查询 + * 查询 `status` 并按 `order_date` 排序的查询 + * 但不支持只查询 `order_date` 的查询(不符合最左前缀)。 + +3. **多键索引:** + * 当索引字段是数组时,MongoDB 会自动为数组中的每个元素创建索引条目。 + * 用于高效查询数组字段中的元素。 + * 示例:索引 `db.collection.createIndex({ tags: 1 })` 可以高效支持查询 `db.collection.find({ tags: "mongodb" })`。 + +4. **地理空间索引:** + * **2dsphere:** 用于查询存储为 GeoJSON 对象或传统坐标对的地理空间数据(地球球面几何)。支持邻近查询(`$near`)、包含查询(`$geoWithin`)、相交查询(`$geoIntersects`)等。 + * **2d:** 用于在二维平面上(如地图游戏)查询存储为传统坐标对的数据。主要用于平面几何计算。 + +5. **文本索引:** + * 支持对字符串或字符串数组字段的内容进行文本搜索。 + * 支持词干提取、停用词过滤等基本文本处理功能。 + * 示例:`db.collection.createIndex({ description: "text" })`,然后使用 `$text` 操作符进行搜索。 + +6. **哈希索引:** + * 对字段值进行哈希运算,并在哈希值上建立索引。 + * 主要用途是为**分片键**提供更均匀的数据分布(使用`hashed`分片策略时)。 + * 只支持等值匹配查询,不支持范围查询、排序或其他操作。 + * 示例:`db.collection.createIndex({ _id: "hashed" })`。 + +7. **通配符索引:** + * 可以索引文档中未知或任意字段。适用于模式动态变化的场景。 + * 示例: + * `db.collection.createIndex({ "userMetadata.$**": 1 })` 索引 `userMetadata` 子文档中的所有字段。 + * `db.collection.createIndex({ "$**": 1 })` 索引文档中的所有字段(谨慎使用,开销大)。 + +8. **唯一索引:** + * 强制索引字段的值在整个集合中是唯一的(`_id` 字段默认就有唯一索引)。 + * 可以用于单字段或复合字段。 + * 示例:`db.collection.createIndex({ email: 1 }, { unique: true })`。 + +9. **TTL 索引:** + * 一种特殊的单字段索引,用于在指定时间后或在指定时间点自动从集合中删除文档。字段必须是日期类型或包含日期元素的数组。 + * 适用于会话数据、日志、临时数据等。 + * 示例:`db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })` (文档在 `createdAt` 时间之后 3600 秒/1 小时被删除)。 + +10. **稀疏索引:** + * 只包含具有索引字段的文档的条目。即使索引字段值为 `null`,也会包含在内;但如果文档*完全缺失*该索引字段,则不会被索引。 + * 节省空间,提高索引效率(当字段在大部分文档中缺失时)。 + * 示例:`db.collection.createIndex({ optionalField: 1 }, { sparse: true })`。 + +**如何管理和使用索引:** + +1. **创建索引:** 使用 `db.collection.createIndex()` 方法。 + * 示例:`db.products.createIndex({ category: 1, price: -1 })` +2. **查看索引:** 使用 `db.collection.getIndexes()` 方法。 +3. **删除索引:** 使用 `db.collection.dropIndex()` 或 `db.collection.dropIndexes()` 方法。 +4. **分析查询性能:** 使用 `explain()` 方法查看查询的执行计划,确认是否使用了索引(`IXSCAN`)以及使用了哪个索引。这是优化查询的关键步骤。 + * 示例:`db.orders.find({ status: "A", amount: { $gt: 100 } }).sort({ order_date: -1 }).explain("executionStats")` +5. **索引管理最佳实践:** + * **为常用查询模式创建索引:** 分析你的应用最常见的查询(`find`, `sort`, `aggregate`中的`$match`, `$group`, `$sort`等阶段),为这些查询涉及的字段创建合适的索引(通常是复合索引)。 + * **遵循最左前缀原则:** 设计复合索引时,将最常用于过滤或排序的字段放在左边。 + * **考虑选择性:** 选择性高的字段(如唯一值多的字段)放在复合索引的前面通常更有效。 + * **使用覆盖查询:** 尽量让查询只返回索引中包含的字段。 + * **监控索引使用率:** MongoDB Profiler 或 Atlas 性能监控可以查看索引的使用情况。使用率低的索引应考虑删除,因为它们会消耗写性能和存储空间。 + * **权衡读写性能:** 索引会加速读操作,但会减慢写操作(插入、更新、删除),因为写操作需要维护索引。不要过度索引。 + * **后台创建大索引:** 在大型集合上创建索引可能耗时很长并阻塞操作。使用 `{ background: true }` 选项可以在后台创建索引(虽然仍可能有性能影响,但不会完全阻塞读写)。 + * **合理使用内存:** 确保有足够的内存将常用索引(或其活跃部分)保存在内存中,避免频繁的磁盘 I/O。 + +**总结:** + +MongoDB 提供了极其丰富和强大的索引类型(单字段、复合、多键、地理空间、文本、哈希、通配符、唯一、TTL、稀疏)来满足各种查询场景的优化需求。**创建和管理合适的索引是提升 MongoDB 查询性能最关键的手段。** 务必结合你的具体查询模式,使用 `explain()` 分析执行计划,遵循索引设计的最佳实践(特别是复合索引的最左前缀原则),并持续监控和调整索引策略。 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/数据库/MySQL/MySQL数据库支持的数据类型.md b/mengyanote-frontend/public/mengyanote/数据库/MySQL/MySQL数据库支持的数据类型.md new file mode 100644 index 0000000..6c50bb0 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/数据库/MySQL/MySQL数据库支持的数据类型.md @@ -0,0 +1,61 @@ + + +## 1️⃣ 数值类型(Numeric) + +| 类型分类 | 数据类型 | 说明 | +| ---- | --------------------------------------------------------- | ------------- | +| 整数型 | `TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`/`INTEGER`、`BIGINT` | 存储不同范围的整数 | +| 精确小数 | `DECIMAL(M,D)`、`NUMERIC` | 高精度定点数(常用于金额) | +| 浮点数 | `FLOAT`、`DOUBLE`/`REAL` | 近似数值(科学计算) | +| 位类型 | `BIT(M)` | 存储二进制位 | +| | | | +| | | | + +--- + +## 2️⃣ 日期与时间类型(Date & Time) + +|数据类型|格式|说明| +|---|---|---| +|`DATE`|YYYY-MM-DD|日期| +|`DATETIME(fsp)`|YYYY-MM-DD HH:MM:SS|日期 + 时间| +|`TIMESTAMP(fsp)`|YYYY-MM-DD HH:MM:SS|时间戳(支持自动更新)| +|`TIME`|HH:MM:SS|时间或时间间隔| +|`YEAR`|YYYY|年份(2 位或 4 位)| + +--- + +## 3️⃣ 字符串与二进制类型(String & Binary) + +|类型分类|数据类型|说明| +|---|---|---| +|定长字符串|`CHAR(M)`|定长,最大 255| +|变长字符串|`VARCHAR(M)`|可变长度,最大 65535(受行大小限制)| +|定长二进制|`BINARY(M)`|定长二进制| +|变长二进制|`VARBINARY(M)`|变长二进制| +|文本|`TINYTEXT`、`TEXT`、`MEDIUMTEXT`、`LONGTEXT`|存储大文本| +|二进制大对象|`TINYBLOB`、`BLOB`、`MEDIUMBLOB`、`LONGBLOB`|存储二进制数据| +|枚举|`ENUM('a','b',...)`|单选固定集合| +|集合|`SET('a','b',...)`|多选固定集合| + +--- + +## 4️⃣ 空间数据类型(Spatial) + +|数据类型|说明| +|---|---| +|`GEOMETRY`|任意几何对象| +|`POINT`|点| +|`LINESTRING`|线| +|`POLYGON`|多边形| +|`MULTIPOINT`、`MULTILINESTRING`、`MULTIPOLYGON`、`GEOMETRYCOLLECTION`|组合空间对象| + +--- + +## 5️⃣ JSON 类型 + +|数据类型|说明| +|---|---| +|`JSON`|存储 JSON 文档,支持索引与函数操作| + +--- diff --git a/mengyanote-frontend/public/mengyanote/数据库/SQLite/SQLite常用命令.md b/mengyanote-frontend/public/mengyanote/数据库/SQLite/SQLite常用命令.md new file mode 100644 index 0000000..faf4eee --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/数据库/SQLite/SQLite常用命令.md @@ -0,0 +1,154 @@ + +--- + +## 一、交互式命令(以 `.` 开头) +在 SQLite 命令行中执行: + +| 命令 | 说明 | +|------|------| +| `.help` | 查看所有命令帮助 | +| `.open 文件名` | 打开或创建数据库文件 | +| `.databases` | 显示当前打开的数据库 | +| `.tables` | 显示所有表 | +| `.schema [表名]` | 显示表结构(不加表名则显示所有) | +| `.dump [表名]` | 导出数据库或表的 SQL 语句(用于备份) | +| `.output 文件名` | 将查询结果输出到文件(默认输出到屏幕) | +| `.read 脚本文件` | 执行 SQL 脚本文件 | +| `.mode 模式` | 设置输出模式(如 `csv`, `column`, `list`, `html` 等) | +| `.headers on/off` | 显示/隐藏列标题 | +| `.quit` 或 `.exit` | 退出 SQLite 命令行 | +| `.import 文件 表名` | 从 CSV 文件导入数据到表 | +| `.show` | 显示当前设置(如输出模式、分隔符等) | +| `.indexes [表名]` | 显示索引信息 | +| `.backup 文件名` | 备份数据库到文件 | + +--- + +## 二、常用 SQL 语句 + +### 1. 数据库与表操作 +```sql +-- 创建表 +CREATE TABLE 表名 ( + 列1 数据类型 [约束], + 列2 数据类型 [约束], + ... +); + +-- 删除表 +DROP TABLE 表名; + +-- 重命名表 +ALTER TABLE 旧表名 RENAME TO 新表名; + +-- 添加列 +ALTER TABLE 表名 ADD COLUMN 列名 数据类型; + +-- 删除列(SQLite 3.35+ 支持) +ALTER TABLE 表名 DROP COLUMN 列名; +``` + +### 2. 数据操作(CRUD) +```sql +-- 插入数据 +INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); + +-- 查询数据 +SELECT * FROM 表名; +SELECT 列1, 列2 FROM 表名 WHERE 条件; + +-- 更新数据 +UPDATE 表名 SET 列1=新值 WHERE 条件; + +-- 删除数据 +DELETE FROM 表名 WHERE 条件; +``` + +### 3. 索引操作 +```sql +-- 创建索引 +CREATE INDEX 索引名 ON 表名 (列名); + +-- 删除索引 +DROP INDEX 索引名; +``` + +### 4. 视图操作 +```sql +-- 创建视图 +CREATE VIEW 视图名 AS SELECT ...; + +-- 删除视图 +DROP VIEW 视图名; +``` + +### 5. 事务控制 +```sql +BEGIN TRANSACTION; -- 开始事务 +COMMIT; -- 提交事务 +ROLLBACK; -- 回滚事务 +``` + +### 6. 实用查询 +```sql +-- 条件查询 +SELECT * FROM 表名 WHERE 条件; + +-- 排序 +SELECT * FROM 表名 ORDER BY 列名 ASC/DESC; + +-- 分组统计 +SELECT 列, COUNT(*) FROM 表名 GROUP BY 列; + +-- 连接查询 +SELECT * FROM 表1 JOIN 表2 ON 连接条件; + +-- 限制结果数量 +SELECT * FROM 表名 LIMIT 数量 OFFSET 偏移; +``` + +--- + +## 三、常用函数示例 +```sql +SELECT COUNT(*) FROM 表名; -- 计数 +SELECT MAX(列), MIN(列) FROM 表名; -- 最大/最小值 +SELECT AVG(列), SUM(列) FROM 表名; -- 平均值/求和 +SELECT datetime('now'); -- 当前时间 +SELECT DATE('now', '+1 day'); -- 日期计算 +``` + +--- + +## 四、使用示例 +```bash +# 1. 进入 SQLite 命令行并打开数据库 +sqlite3 test.db + +# 2. 查看所有表 +.tables + +# 3. 创建表 +CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT); + +# 4. 插入数据 +INSERT INTO users (name) VALUES ('张三'); + +# 5. 查询数据 +SELECT * FROM users; + +# 6. 导出 SQL 备份 +.output backup.sql +.dump + +# 7. 退出 +.quit +``` + +--- + +## 注意事项 +1. SQLite 中 **没有用户管理和权限控制** +2. 所有数据库保存在单个文件中(`.db` 或 `.sqlite`) +3. 大部分 SQL 标准语法支持,但某些高级功能(如存储过程、外键约束需显式启用)有限制 +4. 可通过 `.read` 命令批量执行 SQL 脚本 diff --git a/public/mengyanote/数据结构与算法/二分查找右侧边界算法总结.md b/mengyanote-frontend/public/mengyanote/数据结构与算法/二分查找右侧边界算法总结.md similarity index 100% rename from public/mengyanote/数据结构与算法/二分查找右侧边界算法总结.md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/二分查找右侧边界算法总结.md diff --git a/public/mengyanote/数据结构与算法/二分查找图书馆算法总结.md b/mengyanote-frontend/public/mengyanote/数据结构与算法/二分查找图书馆算法总结.md similarity index 100% rename from public/mengyanote/数据结构与算法/二分查找图书馆算法总结.md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/二分查找图书馆算法总结.md diff --git a/public/mengyanote/数据结构与算法/二分查找左侧边界算法总结.md b/mengyanote-frontend/public/mengyanote/数据结构与算法/二分查找左侧边界算法总结.md similarity index 100% rename from public/mengyanote/数据结构与算法/二分查找左侧边界算法总结.md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/二分查找左侧边界算法总结.md diff --git a/public/mengyanote/数据结构与算法/判断素数.md b/mengyanote-frontend/public/mengyanote/数据结构与算法/判断素数.md similarity index 100% rename from public/mengyanote/数据结构与算法/判断素数.md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/判断素数.md diff --git a/public/mengyanote/数据结构与算法/十大排序算法简介.md b/mengyanote-frontend/public/mengyanote/数据结构与算法/十大排序算法简介.md similarity index 100% rename from public/mengyanote/数据结构与算法/十大排序算法简介.md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/十大排序算法简介.md diff --git a/public/mengyanote/数据结构与算法/快速幂算法(一).md b/mengyanote-frontend/public/mengyanote/数据结构与算法/快速幂算法(一).md similarity index 100% rename from public/mengyanote/数据结构与算法/快速幂算法(一).md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/快速幂算法(一).md diff --git a/public/mengyanote/数据结构与算法/跳石头二分算法总结.md b/mengyanote-frontend/public/mengyanote/数据结构与算法/跳石头二分算法总结.md similarity index 100% rename from public/mengyanote/数据结构与算法/跳石头二分算法总结.md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/跳石头二分算法总结.md diff --git a/public/mengyanote/数据结构与算法/递增序列查询算法总结.md b/mengyanote-frontend/public/mengyanote/数据结构与算法/递增序列查询算法总结.md similarity index 100% rename from public/mengyanote/数据结构与算法/递增序列查询算法总结.md rename to mengyanote-frontend/public/mengyanote/数据结构与算法/递增序列查询算法总结.md diff --git a/public/mengyanote/杂项/Markdown格式大全.md b/mengyanote-frontend/public/mengyanote/杂项/Markdown格式大全.md similarity index 100% rename from public/mengyanote/杂项/Markdown格式大全.md rename to mengyanote-frontend/public/mengyanote/杂项/Markdown格式大全.md diff --git a/public/mengyanote/杂项/PTA万能代码.md b/mengyanote-frontend/public/mengyanote/杂项/PTA万能代码.md similarity index 100% rename from public/mengyanote/杂项/PTA万能代码.md rename to mengyanote-frontend/public/mengyanote/杂项/PTA万能代码.md diff --git a/public/mengyanote/杂项/PTA好题-英文单词排序.md b/mengyanote-frontend/public/mengyanote/杂项/PTA好题-英文单词排序.md similarity index 100% rename from public/mengyanote/杂项/PTA好题-英文单词排序.md rename to mengyanote-frontend/public/mengyanote/杂项/PTA好题-英文单词排序.md diff --git a/public/mengyanote/杂项/PTA好题-计算众数.md b/mengyanote-frontend/public/mengyanote/杂项/PTA好题-计算众数.md similarity index 100% rename from public/mengyanote/杂项/PTA好题-计算众数.md rename to mengyanote-frontend/public/mengyanote/杂项/PTA好题-计算众数.md diff --git a/public/mengyanote/杂项/c++如何快速的检测一个字串符在另一个字串符的出现次数.md b/mengyanote-frontend/public/mengyanote/杂项/c++如何快速的检测一个字串符在另一个字串符的出现次数.md similarity index 100% rename from public/mengyanote/杂项/c++如何快速的检测一个字串符在另一个字串符的出现次数.md rename to mengyanote-frontend/public/mengyanote/杂项/c++如何快速的检测一个字串符在另一个字串符的出现次数.md diff --git a/public/mengyanote/杂项/古诗.md b/mengyanote-frontend/public/mengyanote/杂项/古诗.md similarity index 100% rename from public/mengyanote/杂项/古诗.md rename to mengyanote-frontend/public/mengyanote/杂项/古诗.md diff --git a/public/mengyanote/杂项/文本颜色测试.md b/mengyanote-frontend/public/mengyanote/杂项/文本颜色测试.md similarity index 100% rename from public/mengyanote/杂项/文本颜色测试.md rename to mengyanote-frontend/public/mengyanote/杂项/文本颜色测试.md diff --git a/public/mengyanote/杂项/计算机刷题网站.md b/mengyanote-frontend/public/mengyanote/杂项/计算机刷题网站.md similarity index 100% rename from public/mengyanote/杂项/计算机刷题网站.md rename to mengyanote-frontend/public/mengyanote/杂项/计算机刷题网站.md diff --git a/mengyanote-frontend/public/mengyanote/杂项/跨平台软件开发总结.md b/mengyanote-frontend/public/mengyanote/杂项/跨平台软件开发总结.md new file mode 100644 index 0000000..79cee49 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/杂项/跨平台软件开发总结.md @@ -0,0 +1,47 @@ +#### **1.Flutter:** +优点: +- Windows和Android表现比较一致,UI比较好看 +缺点: +- 使用dart语言,完全不熟悉,需要时间打磨 +- gradle配置十分麻烦,开了梯子还卡进度条,目前只找到用国内镜像开发 + +#### **2.Godot:** +优点: +- 跨平台性极强,基于gdscript各平台表现几乎一模一样 +- 可以使用gdscript,c#开发上手快,还可以c++扩展 +缺点: +- UI十分丑陋,美化有点麻烦(ai可以) +- 毕竟是游戏引擎对一些软件api适配十分不好,基本都要自己造轮子 + +#### **3.Kivy:** +优点: +- 使用Python开发,速度几乎最快 +缺点: +- 妈的依赖下半天,开梯子也慢的离谱 +- UI比godot还丑 +- 构建安卓apk只能用Linux环境 +- 默认不支持中文,配置麻烦 + +#### **4.ReactNative-expo** +优点: +- 使用JavaScript开发,前端框架,比较熟悉 +- 基于云端构建比较方便(直接几行命令) +- 调试比较方便,热更新,热重载 +缺点: +- 云端构建不符合极客精神,而且需要排队(时间有时候很长) +- 软件导出apk很大 + +#### **5.ReactNative** +还没试 + +#### **6.UniApp:** +优点: +- 基于JavaScript,前端框架,比较熟悉 +- 云端构建,比较方便 +缺点: +- 需要登录注册(编辑器) +- 云端构建不符合极客精神,而且需要排队(时间有时候很长) + +#### 7.capacitor +支持Android和iOS + diff --git a/public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md b/mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md similarity index 54% rename from public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md rename to mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md index 1b07a29..f047d7a 100644 --- a/public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md +++ b/mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md @@ -1,17 +1,56 @@ + +--- + **2025年9月9日**:这个大学生真是太美好了,wc 我真的绷不住,选了新中国史上了两节课竟然什么都不知道,老师不知道,除了我所有同学都是理学院电子信息专业 +--- + **2025年9月16日**:人生就要好好地活着,发生个意外,妻子改嫁,父母没人养老, +--- + **2025年9月30日**:懒得和别人吵架,无言和沉默是我最好的武器,我不可能劝的动任何一个人,所以一键拉黑世界就瞬间清净了 +--- + **无**:唉,时间就是单向的,过去的就真的过去了,死了就是死了,不可能再活过来,特定的东西只能发生在特定的时期,过去了就真的过去了,再怎么亡羊补牢,怎么报复性补偿都没什么用,什么狗屁延迟满足,什么狗屁先苦后甜,他妈的越吃苦,你就有吃不完的苦,操你妈的个狗杂种,妈的一群畜生 +--- + **无**:假如你的春天出现了虫子,那就用蟒蛇去吃掉它,如果蟒蛇被咬到,就去找大象,不过不用担心他们都在汤姆猫家里面(*^-^)ノ🎉 +--- + **无**:spring spring 春天 春天 boot boot 启动 启动 springboot springboot 发春 发春 +--- + **2025年10月3日**:又穷又蠢的傻逼,付点智商税怎么了 -**2025年10月6日**:中国人总是忌讳死亡的,但死亡总是不可避免的,唉人生啊,总是这么矛盾。有时候大大方方的表达出来又有什么问题,这片土地的儒家文化就是,最后错过了到后悔了又无可奈何,强行赋予一些死后意义,唉,哪有那么多的价值,人死了就是一堆烂肉,什么人都一样 \ No newline at end of file +--- + +**2025年10月6日**:中国人总是忌讳死亡的,但死亡总是不可避免的,唉人生啊,总是这么矛盾。有时候大大方方的表达出来又有什么问题,这片土地的儒家文化就是,最后错过了到后悔了又无可奈何,强行赋予一些死后意义,唉,哪有那么多的价值,人死了就是一堆烂肉,什么人都一样 + +--- + +**2025年11月11日:** 发低烧做了一场梦,梦见我看谷歌地图看见了我的家和高中,梦见我拿炸弹炸死了伤害我,讨厌我的所有人,为什么还会出现ta(wyq)呢,最后引爆炸弹,全都死了,可能是大脑看我最近过得太惨,潜意识加的一种爽文吧 + +--- + +**无**:你终会明白,前途比爱情重要,你还会明白,爱情比前途更难得,但最后你会明白,对的人会站在你的前途里。 + +--- + +**2025年11月26日**:再猛的欲望,打出来就没了。而且还能获得几天的平静,人类不过是基因的奴隶。好在还能欺骗基因。 + +--- + +**2025年12月2日**:我觉得人生最公平的事情就是衰老和死亡,人人都会死,人人都会老,不管你多么美若天仙,英俊潇洒,财富万贯,权倾朝野,你都会逐渐变得丑陋无比,蠢笨无极,最后变成一坨烂肉慢慢腐烂消散,有人会先死,有人会后死,但不管怎样,人人都会死 + +--- + +**2025年12月11日:**后来我才慢慢发现我追求的只是我心中的一个执念,翻看以前的照片,她早已变得面目全非,而我忘不掉的只是一个幻象罢了 + +--- \ No newline at end of file diff --git a/public/mengyanote/树萌芽の小想法/树萌芽の小秘密.md b/mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の小秘密.md similarity index 100% rename from public/mengyanote/树萌芽の小想法/树萌芽の小秘密.md rename to mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の小秘密.md diff --git a/mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の编程想法.md b/mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の编程想法.md new file mode 100644 index 0000000..de6a638 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/树萌芽の小想法/树萌芽の编程想法.md @@ -0,0 +1,49 @@ + +- [ ] 1.开发一个项目,微信,QQ虚拟ai,将亲人在世前发送的所有消息包括视频,照片,对话,语音等投喂给ai,可以模拟亲人生前的对话,得到一种缅怀,回忆的感觉 +- [ ] 2.做个专门保存QQ,微信表情包的软件/网站 +- [ ] 3.做个专门保存各种编程语言代码块(最好有语法高亮,很难,毕竟不太会正则表达式),封装库,小知识 +- [x] 4.免费帮做网站(学习前端实践)(可附带安卓app),如生日祝福,情侣小站,人物简介 +- [x] 5.做一个收录网络API大全软件/网站 +- [x] 6.萌芽农场(类似于QQ农场)✅ 2024-10-25 +- [x] 7.抽奖,签到,测运软件 +- [x] 8.专门投票问卷软件/网站,需要邮箱验证 +- [ ] 9.尝试封装扩展一下C语言/C++,做一个C语言加强版?,或者更牛逼一点一种接近新的编程语言? +- [ ] 10.一个桌宠 +- [x] 11.普通画转像素画(像素风格) +- [x] 12.做一个ai写诗软件 +- [x] 13.给萌芽农场聊天做个彩蛋类似于 +- [x] 14.做一个灵创赛博英灵殿结合QQ获取头像和昵称,一颗树来延伸,分哪些组 +- [x] 15.做一个ai小智模拟,ai萌小芽,小萌芽 +- [ ] 16.写一个最小操作系统,跑在qemu或者docker上 +- [ ] 17.写一个python脚本自动批量注释/解除注释print,log等打印语句,减少生产环境的性能损耗(针对不同语言) +- [ ] 18.做一个Linux一键安装脚本,支持termux,Debian系 +- [x] 19.做一个图床 +- [ ] 20.做一个二维码/条形码生成系统 +- [x] 21.做一个Linux命令帮手 用户输入要求 系统输出命令 +- [ ] 22.做一个剪切版同步软件,支持Windows和安卓分别储存剪切板内容,然后同步 +- [x] 23.做一个把本地前端网页嵌入apk的网页转app软件,安卓可以用系统webview框架,也支持Windows,不一定非得一个软件,可以Windows和Android分开来制作 +- [ ] 24.做一个网页ssh连接,adb连接客户端,添加自定义命令 +- [x] 25.写一个文章美化ai助手,加入更多的makdwon格式美化和emoji美化 +- [ ] 26.写一个待办事项网站,记录要办的事情 +- [x] 27.ai 大模型测试名字的稀有度 +- [x] 28. ai大模型说一个词汇返回一个Emoji和颜文字 +- [x] 29.写一个AI一键普通文章转文言文的功能 +- [x] 30.写一个自动把Obsidian的markdown笔记上传到GitHub仓库自动部署成静态网页展示 +- [ ] 31.做一个获取网站域名来进行网站截图的API +- [ ] 32.做一个树萌芽的宝库,收集从各路来的好用的软件/脚本/app +- [x] 33.用户发送一个Linux下的需求 AI返回相关的Linux命令 +- [ ] 34.做一个聊天室软件,支持Windows,Linux,安卓,网页 +- [x] 35.用AI制作一个亲戚称呼关系计算器 +- [x] 36.以30列30行的形式随机展示各种Emoji,点击对应Emoji可以直接一键复制,有刷新按钮可以刷新相应Emoji +- [ ] 37.用python写个随机系列:随机一言,随机音乐,随机视频,随机诗歌,随机编程题,随机占卜/算命的后端API==, +- [ ] 38.做一个TCP,udp,websocket连接器,服务端和客户端,用来学习和测试 +- [ ] 39.写一个插件,模组,玩家可以用钻石驯服幻翼,腐肉,幻翼膜修复幻翼,驯服后可以跟随玩家打怪,可以被栓绳拴住,白天免疫燃烧伤害 +- [ ] 40.写一个撅屁股的网页,支持输入被撅人和撅人的QQ号然后自动获取QQ头像,生成撅屁股动图 +- [ ] 41.网页临时邮箱,可以直接显示接收的邮件 +- [ ] 42.写一个网页像素画游戏,一个画布用户可以同步显示,每十秒储存一次在本地 +- [x] 43.写一个西南石油大学校园网自动登录脚本,支持Windows,Linux,andorid +- [ ] random.shumengya.top 这个网站输入后随机跳转到我的一个网站里去 +- [ ] 前后端分离项目封装成docker后默认对外只有一个端口访问前端页面,在该端口后面加上/api来让后端项目对外开放 +- [ ] 做一个萌芽小店网站,支持使用支付宝微信二维码支付和cdk激活码,上面放一些虚拟商品 + + diff --git a/public/mengyanote/树萌芽の小想法/革命后的理想.md b/mengyanote-frontend/public/mengyanote/树萌芽の小想法/革命后的理想.md similarity index 100% rename from public/mengyanote/树萌芽の小想法/革命后的理想.md rename to mengyanote-frontend/public/mengyanote/树萌芽の小想法/革命后的理想.md diff --git a/public/mengyanote/树萌芽制作的小东西/AI玩具/AI变量命名助手/AI变量命名助手-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/AI玩具/AI变量命名助手/AI变量命名助手-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/AI玩具/AI变量命名助手/AI变量命名助手-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/AI玩具/AI变量命名助手/AI变量命名助手-待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/游戏/像素秘境/像素秘境-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/像素秘境/像素秘境-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/游戏/像素秘境/像素秘境-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/像素秘境/像素秘境-待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/游戏/天宫开物/天宫开物-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/天宫开物/天宫开物-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/游戏/天宫开物/天宫开物-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/天宫开物/天宫开物-待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/游戏/幻泡星穹/幻泡星穹-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/幻泡星穹/幻泡星穹-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/游戏/幻泡星穹/幻泡星穹-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/幻泡星穹/幻泡星穹-待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场-待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场玩家数据处理优化.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场玩家数据处理优化.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场玩家数据处理优化.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场玩家数据处理优化.md diff --git a/public/mengyanote/树萌芽制作的小东西/网站/Minecraft风格网站/Minecraft风格网站-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/Minecraft风格网站/Minecraft风格网站-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/网站/Minecraft风格网站/Minecraft风格网站-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/Minecraft风格网站/Minecraft风格网站-待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md similarity index 62% rename from public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md index 66ff14c..c4dcb64 100644 --- a/public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md +++ b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md @@ -3,6 +3,8 @@ - [x] AI工具模板 - [x] 实时翻译功能 - [ ] AI拍题功能 +- [ ] 我想来个左右滑动页面切换 首页-聚合应用-休闲游戏-AI工具-个人中心 右滑向右切换比如首页到聚合应用 左滑向左切换 比如从休闲游戏-聚合应用​​​​​ +- [ ] @@ -15,4 +17,5 @@ - [x] 抖音热搜榜显示混乱 - [x] 网易云音乐榜单列表功能错误 - [x] 猫眼票房排行榜功能失效 +- [ ] Windows和安卓端无法处理下载链接 diff --git a/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/API目录.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/API目录.md new file mode 100644 index 0000000..de2a0c6 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/API目录.md @@ -0,0 +1,4 @@ +- 随机一言(Text) +- 随机图片(Image) +- 随机音乐(Music) +- 随机视频(Video) \ No newline at end of file diff --git a/public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/功能详情.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/功能详情.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/功能详情.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/功能详情.md diff --git a/public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md similarity index 89% rename from public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md index 6fe9daa..bc70815 100644 --- a/public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md +++ b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md @@ -1,5 +1,6 @@ **添加:** - [ ] 添加额外下载按钮,可以设定下载按钮文本和链接 +- [ ] 把图片展示换成轮播图左右切换 diff --git a/public/mengyanote/树萌芽制作的小东西/网站/灵创2025招新官网/待办事项 1.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/灵创2025招新官网/待办事项 1.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/网站/灵创2025招新官网/待办事项 1.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/网站/灵创2025招新官网/待办事项 1.md diff --git a/public/mengyanote/树萌芽制作的小东西/软件/萌芽APK生成器(已废弃)/待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/软件/萌芽APK生成器(已废弃)/待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/软件/萌芽APK生成器(已废弃)/待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/软件/萌芽APK生成器(已废弃)/待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/软件/萌芽农场可视化游戏配置/萌芽农场可视化游戏配置-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/软件/萌芽农场可视化游戏配置/萌芽农场可视化游戏配置-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/软件/萌芽农场可视化游戏配置/萌芽农场可视化游戏配置-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/软件/萌芽农场可视化游戏配置/萌芽农场可视化游戏配置-待办事项.md diff --git a/public/mengyanote/树萌芽制作的小东西/软件/萌芽农场远程命令控制台/萌芽农场远程命令控制台-待办事项.md b/mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/软件/萌芽农场远程命令控制台/萌芽农场远程命令控制台-待办事项.md similarity index 100% rename from public/mengyanote/树萌芽制作的小东西/软件/萌芽农场远程命令控制台/萌芽农场远程命令控制台-待办事项.md rename to mengyanote-frontend/public/mengyanote/树萌芽制作的小东西/软件/萌芽农场远程命令控制台/萌芽农场远程命令控制台-待办事项.md diff --git a/public/mengyanote/树萌芽的小本本/2025年大一下暑假规划(大方向).md b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/2025年大一下暑假规划(大方向).md similarity index 100% rename from public/mengyanote/树萌芽的小本本/2025年大一下暑假规划(大方向).md rename to mengyanote-frontend/public/mengyanote/树萌芽的小本本/2025年大一下暑假规划(大方向).md diff --git a/public/mengyanote/树萌芽的小本本/大萌芽-Debian13服务器.md b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/大萌芽-Debian13服务器.md similarity index 100% rename from public/mengyanote/树萌芽的小本本/大萌芽-Debian13服务器.md rename to mengyanote-frontend/public/mengyanote/树萌芽的小本本/大萌芽-Debian13服务器.md diff --git a/mengyanote-frontend/public/mengyanote/树萌芽的小本本/树萌芽已部署网站(不定时持续更新).md b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/树萌芽已部署网站(不定时持续更新).md new file mode 100644 index 0000000..efde0fe --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/树萌芽已部署网站(不定时持续更新).md @@ -0,0 +1,101 @@ + +## 🌐 公开网站列表 + +| 名称 | 链接1 | 链接2 | 链接3 | +| -------------- | ----------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------- | +| **萌芽作品集** | ✅[work.shumengya.top](https://work.shumengya.top/) | | | +| **萌芽盘** | ✅[openlist.shumengya.top](https://openlist.shumengya.top/) | ✅[pan.shumengya.top](https://pan.shumengya.top/) | | +| **萌芽图床** | ✅[image.shumengya.top](https://image.shumengya.top/) | ✅[img.shumengya.top](https://img.shumengya.top/) | | +| **萌芽主页** | ✅[nav.shumengya.top](http://nav.shumengya.top/) | ✅[shumengya.top](http://shumengya.top/) | ✅[www.shumengya.top](http://www.shumengya.top/) | +| **萌芽文件快传** | ✅[send.shumengya.top](http://send.shumengya.top/) | | | +| **萌芽默认网页** | ✅[default.shumengya.top](http://default.shumengya.top/) | | | +| **萌芽Git仓库** | ✅[git.shumengya.top](http://git.shumengya.top/) | ✅[repo.shumengya.top](http://repo.shumengya.top/) | | +| **万象口袋** | ✅[infogenie.shumengya.top](http://infogenie.shumengya.top/) | | | +| **萌芽短链** | ✅[short.shumengya.top](http://short.shumengya.top/) | | | +| **萌芽问卷** | ✅[survey.shumengya.top](http://survey.shumengya.top/) | | | +| **萌芽在线Office** | ✅[office.shumengya.top](http://office.shumengya.top/) | | | +| **萌芽笔记** | ✅[note.shumengya.top](http://note.shumengya.top/) | | | + + +## 🌐 托管静态网页列表[CloudFlare,Github Page] + +|名称|链接1|链接2|链接3| +|---|---|---|---| +| **新概念英语听说** |✅[nce.shumengya.top](https://nce.shumengya.top/)| +| **Github仓库管理器** |✅[grm.shumengya.top](https://grm.shumengya.top/)| +| **代码1** |✅[code1.shumengya.top](https://code1.shumengya.top/)| +| **代码2** |✅[code2.shumengya.top](https://code2.shumengya.top/)| +| **代码3** |✅[code3.shumengya.top](https://code3.shumengya.top/)| + + +--- + +## 🛠 萌芽路由器LibWrt + +| 名称 | 链接 | +| --------- | ---------------------------------- | +| OpenWrt盘 | ❌https://pan.openwrt.shumengya.top | +| OpenWrt面板 | ❌https://openwrt.shumengya.top | + +## 🛠 小萌芽Debian11 + +| 名称 | 链接 | +| ----------- | ---------------------------------- | +| 小萌芽盘 | ✅https://pan.small.shumengya.top | +| 小萌芽1Panel面板 | ✅https://1pl.openwrt.shumengya.top | + +## 🛠 大萌芽Debian11 + +| 名称 | 链接 | +| ----------- | ------------------------------ | +| 大萌芽盘 | ✅https://pan.big.shumengya.top | +| 大萌芽1Panel面板 | ✅https://1pl.big.shumengya.top | + +## 🛠 Windows11 + +| 名称 | 链接 | +| -------- | ------------------------------ | +| Windows盘 | ❌https://pan.win.shumengya.top | + +## 🛠 RedmiK60Pro + +| 名称 | 链接 | +| ------ | -------------------------------- | +| redmi盘 | ❌https://pan.redmi.shumengya.top | + +## 🛠 VivoPad + +| 名称 | 链接 | +| ----- | ------------------------------- | +| vivo盘 | ❌https://pan.vivo.shumengya.top | + + +## 🛠 管理员网站 + +| 名称 | 链接1 | 链接2 | 链接3 | +| ---------------------- | ------------------------------------------------------------ | -------------------------------------------------------- | --- | +| **萌芽笔记同步数据库-CouchDB** | ✅[couchdb.shumengya.top](https://couchdb.shumengya.top/) | | | +| **阿里云成都Frp服务端-Frps** | ✅[frps.shumengya.top](https://frps.shumengya.top/) | ❌[cd.frps.shumengya.top](https://cd.frps.shumengya.top/) | | +| **阿里云香港Frp服务端-Frps** | ❌[xg.frps.shumengya.top](https://xg.frps.shumengya.top/) | | | +| **自建Headscale协调服务器** | ❌[headscale.shumengya.top](https://headscale.shumengya.top/) | | | + + +--- + +## 🧩 后端API接口网站 + +|名称|链接1|链接2|链接3| +|---|---|---|---| +|**60s 聚合 API**|✅[60s.api.shumengya.top](https://60s.api.shumengya.top/)| + +--- + +## 🔌 TCP 服务 + +|名称|链接1|链接2|链接3| +|---|---|---|---| +|**萌芽农场服务器后端**|❌47.108.90.0:7070| +|**MySQL 数据库**|❌47.108.90.0:3307| +|**MongoDB 数据库**|❌47.108.90.0:27018| + +--- diff --git a/public/mengyanote/树萌芽的小本本/检测IP的网站.md b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/检测IP的网站.md similarity index 100% rename from public/mengyanote/树萌芽的小本本/检测IP的网站.md rename to mengyanote-frontend/public/mengyanote/树萌芽的小本本/检测IP的网站.md diff --git a/public/mengyanote/树萌芽的小本本/网站小技巧.md b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/网站小技巧.md similarity index 100% rename from public/mengyanote/树萌芽的小本本/网站小技巧.md rename to mengyanote-frontend/public/mengyanote/树萌芽的小本本/网站小技巧.md diff --git a/public/mengyanote/树萌芽的小本本/重要信息记录.md b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/重要信息记录.md similarity index 71% rename from public/mengyanote/树萌芽的小本本/重要信息记录.md rename to mengyanote-frontend/public/mengyanote/树萌芽的小本本/重要信息记录.md index c696157..e6173cc 100644 --- a/public/mengyanote/树萌芽的小本本/重要信息记录.md +++ b/mengyanote-frontend/public/mengyanote/树萌芽的小本本/重要信息记录.md @@ -1,7 +1,7 @@ **杨耀翔服务器宝塔登录地址:** -http://47.117.115.85:24820/lcxm1314520 用户密码: +http://47.117.115.85:24820/lcxm1314520 用户密码:yyx1314520 **树萌芽服务器宝塔登录地址** : http://47.108.90.0:19132/shumengya 用户密码 :3205788256 @@ -16,8 +16,9 @@ shumengya888@foxmail.com **QQ邮箱发件密钥:** dpdouefloajfdagd dpdouefloajfdagd -**Github免费模型测试API:** -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 +**Github免费模型测试API:(不要他妈的放在github公开仓库里面!)** +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 +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 **Github仓库提交代码通用密钥:** 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 @@ -30,7 +31,7 @@ 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 【邮储银行】您尾号5139的账户开户行名称:中国邮政储蓄银行股份有限公司泸县宝藏街营业所,地址:四川省泸县奇峰镇宝藏街三段68号、70号,电话:0830-8999252,支付行号为:403100000004 **出生日期** -外公1938 +外公1938 爷爷1939 爸1965 妈1966 diff --git a/mengyanote-frontend/public/mengyanote/正则表达式/简单举例.md b/mengyanote-frontend/public/mengyanote/正则表达式/简单举例.md new file mode 100644 index 0000000..8cb93b2 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/正则表达式/简单举例.md @@ -0,0 +1,123 @@ + + +--- + +#### 1️⃣ 提取日志中的IP地址 🌐 + +**场景**:从服务器日志(Nginx, Apache等)或系统日志中提取客户端的IP地址。 + +* **表达式**:`\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b` +* **分解说明**: + * `\b`:单词边界,确保IP地址是独立的 + * `(?: ... ){3}`:一个**非捕获分组**,重复3次 + * `[0-9]{1,3}`:1到3位数字(IP的每一段) + * `\.`:一个 literal 的点号 +* **测试文本**: + ``` + 192.168.1.1 - - [05/Jan/2023:10:20:30] "GET /api/user HTTP/1.1" + ERROR 10.0.0.45 Database connection failed + ``` +* **匹配结果**: + * `192.168.1.1` + * `10.0.0.45` +* 💡 **进阶**:更严格的IP校验正则复杂得多,但这个版本在日志分析中**足够好用**。 + +--- + +#### 2️⃣ 验证强密码强度 🔒 + +**场景**:注册时要求密码必须包含大小写字母、数字和特殊字符,且长度至少8位。 + +* **表达式**:`^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$` +* **分解说明**(使用了**前瞻断言**): + * `^`:字符串开始 + * `(?=.*[a-z])`:**断言**后面必须至少有一个小写字母 + * `(?=.*[A-Z])`:**断言**后面必须至少有一个大写字母 + * `(?=.*\d)`:**断言**后面必须至少有一个数字 + * `(?=.*[@$!%*?&])`:**断言**后面必须至少有一个特殊字符 + * `[A-Za-z\d@$!%*?&]{8,}`:匹配由这些字符组成,且长度至少为8的字符串 + * `$`:字符串结尾 +* **测试**: + * `Password123!` ✅ + * `weak` ❌ + * `NoSpecialChar123` ❌ +* 🛡️ **价值**:前端或后端验证密码规则,无需写一堆 `if-else`。 + +--- + +#### 3️⃣ 解析和提取URL组件 🔗 + +**场景**:从一段文本中提取所有URL的协议、域名和路径。 + +* **表达式**:`(https?):\/\/([^\/\s]+)(\/[^\s?]*)?(\?[^\s#]*)?` +* **分解说明**(使用了**捕获分组**): + * `(https?)`:**分组1**,匹配 `http` 或 `https` + * `:\/\/`:匹配 `://` + * `([^\/\s]+)`:**分组2**,匹配域名(直到遇到 `/` 或空格) + * `(\/[^\s?]*)?`:**分组3(可选)**,匹配路径 + * `(\?[^\s#]*)?`:**分组4(可选)**,匹配查询参数 +* **测试文本**: + ``` + 访问我们的官网 https://www.example.com 和博客 https://blog.example.com/path/to/article?id=123 + ``` +* **匹配结果**: + * 完整匹配1:`https://www.example.com` + * 分组1:`https` + * 分组2:`www.example.com` + * 分组3:`undefined` + * 完整匹配2:`https://blog.example.com/path/to/article?id=123` + * 分组1:`https` + * 分组2:`blog.example.com` + * 分组3:`/path/to/article` + * 分组4:`?id=123` +* 🌟 **应用**:网络爬虫、链接分析、安全扫描。 + +--- + +#### 4️⃣ 清理和格式化用户输入 🧹 + +**场景**:去除用户输入的字符串中所有多余的空白字符(包括换行符),只保留一个空格。 + +* **表达式**:`\s+` +* **替换为**:一个空格 `" "` +* **分解说明**: + * `\s+`:匹配**一个或多个**连续的空白字符(包括空格、制表符 `\t`、换行符 `\n`、回车符 `\r`) +* **处理前文本**: + ``` + Hello, how are you + today? + I hope all is well. + ``` +* **处理后结果**: + ``` + Hello, how are you today? I hope all is well. + ``` +* 🧽 **实用性**:在数据入库或文本分析前,做数据清洗的**必备操作**。 + +--- + +#### 5️⃣ 匹配中文内容 🇨🇳 + +**场景**:在混合了中英文和数字的文本中,提取出所有中文字符。 + +* **表达式**:`[\u4e00-\u9fff]+` +* **分解说明**: + * `[\u4e00-\u9fff]`:Unicode范围,涵盖了绝大多数常用汉字 + * `+`:一个或多个 +* **测试文本**: + ``` + 我的电话是 138-1234-5678,欢迎致电!Welcome to 北京。 + ``` +* **匹配结果**: + * `我的电话是` + * `欢迎致电` + * `北京` +* 🔍 **用途**:中文NLP预处理、敏感词过滤、内容分类。 + +--- + +### 💡 给开发者的核心建议 + +1. **不要重复造轮子** 🔄:像邮箱、URL、手机号验证,先去搜一下成熟的方案。但务必**理解**它的原理,并针对你的业务进行测试和微调。 +2. **在线测试工具是你的最佳伙伴** 🧪:在把正则写入代码前,一定要用 [Regex101](https://regex101.com/) 或 [RegExr](https://regexr.com/) 进行测试,它们能可视化解释你的表达式,并高亮匹配组。 +3. **注意性能** ⚡:过于复杂或嵌套很深的表达式可能导致“灾难性回溯”,在处理长文本时让程序卡死。尽量让表达式**精确**。 \ No newline at end of file diff --git a/public/mengyanote/游戏引擎/Godot/BBCode 标签学习.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Godot/BBCode 标签学习.md similarity index 100% rename from public/mengyanote/游戏引擎/Godot/BBCode 标签学习.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Godot/BBCode 标签学习.md diff --git a/public/mengyanote/游戏引擎/Godot/DisplayServer简单总结.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Godot/DisplayServer简单总结.md similarity index 100% rename from public/mengyanote/游戏引擎/Godot/DisplayServer简单总结.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Godot/DisplayServer简单总结.md diff --git a/public/mengyanote/游戏引擎/Godot/Godot字典的详细用法.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Godot/Godot字典的详细用法.md similarity index 100% rename from public/mengyanote/游戏引擎/Godot/Godot字典的详细用法.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Godot/Godot字典的详细用法.md diff --git a/public/mengyanote/游戏引擎/Godot/OS类简单总结.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Godot/OS类简单总结.md similarity index 100% rename from public/mengyanote/游戏引擎/Godot/OS类简单总结.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Godot/OS类简单总结.md diff --git a/public/mengyanote/游戏引擎/Godot/godot小代码.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Godot/godot小代码.md similarity index 100% rename from public/mengyanote/游戏引擎/Godot/godot小代码.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Godot/godot小代码.md diff --git a/public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity中的单例模式(全局变量).md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity中的单例模式(全局变量).md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity中的单例模式(全局变量).md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity中的单例模式(全局变量).md diff --git a/public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity获取同一场景中其他对象的属性&组件.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity获取同一场景中其他对象的属性&组件.md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity获取同一场景中其他对象的属性&组件.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/Unity获取同一场景中其他对象的属性&组件.md diff --git a/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity修改物理碰撞层.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity修改物理碰撞层.md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity代码片段/unity修改物理碰撞层.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity修改物理碰撞层.md diff --git a/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity导出到Windows改变窗口.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity导出到Windows改变窗口.md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity代码片段/unity导出到Windows改变窗口.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity导出到Windows改变窗口.md diff --git a/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity碰撞体撞到指定标签的碰撞体后操作.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity碰撞体撞到指定标签的碰撞体后操作.md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity代码片段/unity碰撞体撞到指定标签的碰撞体后操作.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/unity碰撞体撞到指定标签的碰撞体后操作.md diff --git a/public/mengyanote/游戏引擎/Unity/Unity代码片段/保留整数.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/保留整数.md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity代码片段/保留整数.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/保留整数.md diff --git a/public/mengyanote/游戏引擎/Unity/Unity代码片段/设置在几个特定点钟随机生成.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/设置在几个特定点钟随机生成.md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity代码片段/设置在几个特定点钟随机生成.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity代码片段/设置在几个特定点钟随机生成.md diff --git a/public/mengyanote/游戏引擎/Unity/Unity简单解决字体放大模糊问题.md b/mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity简单解决字体放大模糊问题.md similarity index 100% rename from public/mengyanote/游戏引擎/Unity/Unity简单解决字体放大模糊问题.md rename to mengyanote-frontend/public/mengyanote/游戏引擎/Unity/Unity简单解决字体放大模糊问题.md diff --git a/public/mengyanote/生活科普/OTC药和处方药的区别.md b/mengyanote-frontend/public/mengyanote/生活科普/OTC药和处方药的区别.md similarity index 100% rename from public/mengyanote/生活科普/OTC药和处方药的区别.md rename to mengyanote-frontend/public/mengyanote/生活科普/OTC药和处方药的区别.md diff --git a/public/mengyanote/生活科普/打针和注射原理.md b/mengyanote-frontend/public/mengyanote/生活科普/打针和注射原理.md similarity index 100% rename from public/mengyanote/生活科普/打针和注射原理.md rename to mengyanote-frontend/public/mengyanote/生活科普/打针和注射原理.md diff --git a/public/mengyanote/生活科普/高铁座位.md b/mengyanote-frontend/public/mengyanote/生活科普/高铁座位.md similarity index 100% rename from public/mengyanote/生活科普/高铁座位.md rename to mengyanote-frontend/public/mengyanote/生活科普/高铁座位.md diff --git a/public/mengyanote/生物学科普/抗生素杀菌原理及作用机制详解.md b/mengyanote-frontend/public/mengyanote/生物学科普/抗生素杀菌原理及作用机制详解.md similarity index 100% rename from public/mengyanote/生物学科普/抗生素杀菌原理及作用机制详解.md rename to mengyanote-frontend/public/mengyanote/生物学科普/抗生素杀菌原理及作用机制详解.md diff --git a/public/mengyanote/生物学科普/死亡后的尸体现象与死亡时间推断.md b/mengyanote-frontend/public/mengyanote/生物学科普/死亡后的尸体现象与死亡时间推断.md similarity index 94% rename from public/mengyanote/生物学科普/死亡后的尸体现象与死亡时间推断.md rename to mengyanote-frontend/public/mengyanote/生物学科普/死亡后的尸体现象与死亡时间推断.md index 0754ef4..fe5b7a7 100644 --- a/public/mengyanote/生物学科普/死亡后的尸体现象与死亡时间推断.md +++ b/mengyanote-frontend/public/mengyanote/生物学科普/死亡后的尸体现象与死亡时间推断.md @@ -28,47 +28,30 @@ ### 2. 尸僵(Rigor mortis) - **机制**:肌肉内ATP耗竭,肌纤维固定。 - - **时间规律**: - - 30分钟~2小时:开始出现。 - - 6~8小时:全身僵硬。 - - 12~15小时:达到高峰。 - - 24~36小时:逐渐缓解并消失。 - - **影响因素**:环境温度(高温→加快)、死前剧烈活动。 ### 3. 尸斑(Livor mortis) - **机制**:血液因重力下沉,淤积于低垂部位。 - - **时间规律**: - - 30分钟内:可见淡红色。 - - 5~6小时:明显,按压可消退。 - - 8小时后:血红蛋白渗入组织,颜色固定,不再随体位改变。 - - **特殊表现**: - - 中毒:一氧化碳中毒呈鲜红色。 - - 冻死:尸斑呈红色。 - ### 4. 其他早期指标 - **角膜混浊**:8~12小时出现。 - - **胃内容物消化情况**:饭后2–4小时消化明显,可作为辅助判断。 - - **尸绿**:腹部皮肤变绿,多在死亡2~3天后出现。 - --- @@ -79,24 +62,16 @@ ### 1. 腐败(Putrefaction) - **起始**:2–3天内出现腹部尸绿,随后扩散全身。 - - **典型表现**: - - 5–7天:气体产生,颜面肿胀,口鼻流出液体。 - - 数周:软组织液化,最后仅剩骨骼。 - -- **白骨化**:土中一般需7–10年。 - +- **白骨化**:土中一般需7–10年 ### 2. 动物破坏 - 苍蝇产卵→蛆→蛹→成蝇。 - - 夏季1个月内可能食尽软组织。 - - 蚂蚁、鼠类、犬猫等亦可造成破坏。 - ### 3. 保存现象 diff --git a/public/mengyanote/编程语言/Android/Linux配置安卓Gradle构建环境.md b/mengyanote-frontend/public/mengyanote/编程语言/Android/Linux配置安卓Gradle构建环境.md similarity index 100% rename from public/mengyanote/编程语言/Android/Linux配置安卓Gradle构建环境.md rename to mengyanote-frontend/public/mengyanote/编程语言/Android/Linux配置安卓Gradle构建环境.md diff --git a/public/mengyanote/编程语言/Android/安卓Gradle构建常用命令总结.md b/mengyanote-frontend/public/mengyanote/编程语言/Android/安卓Gradle构建常用命令总结.md similarity index 100% rename from public/mengyanote/编程语言/Android/安卓Gradle构建常用命令总结.md rename to mengyanote-frontend/public/mengyanote/编程语言/Android/安卓Gradle构建常用命令总结.md diff --git a/public/mengyanote/编程语言/C++/C++中的语法糖.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/C++中的语法糖.md similarity index 100% rename from public/mengyanote/编程语言/C++/C++中的语法糖.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/C++中的语法糖.md diff --git a/public/mengyanote/编程语言/C++/C++关联文件.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/C++关联文件.md similarity index 82% rename from public/mengyanote/编程语言/C++/C++关联文件.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/C++关联文件.md index da3a1c0..3e6126c 100644 --- a/public/mengyanote/编程语言/C++/C++关联文件.md +++ b/mengyanote-frontend/public/mengyanote/编程语言/C++/C++关联文件.md @@ -1,7 +1,7 @@ ### 源文件 -- **.cpp 或 .cxx 或 .cc :**C++源文件的扩展名,用于编写C++代码,包含函数、类、变量等定义和实现。 -- **.h 或 .hpp 或 .hxx :**头文件扩展名,用于声明函数原型、类定义、常量和变量等,以便在多个源文件中共享声明。 +- **.cpp 或 .cxx 或 .cc :** C++源文件的扩展名,用于编写C++代码,包含函数、类、变量等定义和实现。 +- **.h 或 .hpp 或 .hxx :** 头文件扩展名,用于声明函数原型、类定义、常量和变量等,以便在多个源文件中共享声明。 ### 项目和配置文件 diff --git a/public/mengyanote/编程语言/C++/C++模拟考试.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/C++模拟考试.md similarity index 100% rename from public/mengyanote/编程语言/C++/C++模拟考试.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/C++模拟考试.md diff --git a/public/mengyanote/编程语言/C++/C语言学习笔记.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/C语言学习笔记.md similarity index 100% rename from public/mengyanote/编程语言/C++/C语言学习笔记.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/C语言学习笔记.md diff --git a/mengyanote-frontend/public/mengyanote/编程语言/C++/代码片段/代码片段-标准HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/代码片段/代码片段-标准HelloWorld输出.md new file mode 100644 index 0000000..d591e61 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/C++/代码片段/代码片段-标准HelloWorld输出.md @@ -0,0 +1,8 @@ +```cpp +#include + +int main() { + std::cout << "Hello, World!" << std::endl; + return 0; +} +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/C++/代码片段/代码片段-特殊HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/代码片段/代码片段-特殊HelloWorld输出.md new file mode 100644 index 0000000..11ba7e6 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/C++/代码片段/代码片段-特殊HelloWorld输出.md @@ -0,0 +1,23 @@ +```cpp +//使用模板元编程 +#include + +template +struct Hello { + static void print() { + Hello::print(); + std::cout << "Hello, World!"[N-1]; + } +}; + +template<> +struct Hello<0> { + static void print() {} +}; + +int main() { + Hello<13>::print(); + std::cout << std::endl; + return 0; +} +``` \ No newline at end of file diff --git a/public/mengyanote/编程语言/C++/值传递和地址传递的区别.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/值传递和地址传递的区别.md similarity index 100% rename from public/mengyanote/编程语言/C++/值传递和地址传递的区别.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/值传递和地址传递的区别.md diff --git a/public/mengyanote/编程语言/C++/变量使用set,get方法原因.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/变量使用set,get方法原因.md similarity index 100% rename from public/mengyanote/编程语言/C++/变量使用set,get方法原因.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/变量使用set,get方法原因.md diff --git a/public/mengyanote/编程语言/C++/多个set方法.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/多个set方法.md similarity index 100% rename from public/mengyanote/编程语言/C++/多个set方法.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/多个set方法.md diff --git a/public/mengyanote/编程语言/C++/指针变量的区别.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/指针变量的区别.md similarity index 100% rename from public/mengyanote/编程语言/C++/指针变量的区别.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/指针变量的区别.md diff --git a/public/mengyanote/编程语言/C++/指针简单讲解.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/指针简单讲解.md similarity index 100% rename from public/mengyanote/编程语言/C++/指针简单讲解.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/指针简单讲解.md diff --git a/public/mengyanote/编程语言/C++/暂停1s执行.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/暂停1s执行.md similarity index 100% rename from public/mengyanote/编程语言/C++/暂停1s执行.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/暂停1s执行.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/algorithim库二次总结.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/algorithim库二次总结.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/algorithim库二次总结.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/algorithim库二次总结.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/algorithm算法库.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/algorithm算法库.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/algorithm算法库.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/algorithm算法库.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/list库-deepseek.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/list库-deepseek.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/list库-deepseek.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/list库-deepseek.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/list库-豆包.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/list库-豆包.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/list库-豆包.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/list库-豆包.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/queue库.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/queue库.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/queue库.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/queue库.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/stack库.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/stack库.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/stack库.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/stack库.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/string库.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/string库.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/string库.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/string库.md diff --git a/public/mengyanote/编程语言/C++/标准库解析/vector库.md b/mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/vector库.md similarity index 100% rename from public/mengyanote/编程语言/C++/标准库解析/vector库.md rename to mengyanote-frontend/public/mengyanote/编程语言/C++/标准库解析/vector库.md diff --git a/public/mengyanote/编程语言/C/C 代码概述:检查特定条件的素数.md b/mengyanote-frontend/public/mengyanote/编程语言/C/C 代码概述:检查特定条件的素数.md similarity index 100% rename from public/mengyanote/编程语言/C/C 代码概述:检查特定条件的素数.md rename to mengyanote-frontend/public/mengyanote/编程语言/C/C 代码概述:检查特定条件的素数.md diff --git a/public/mengyanote/编程语言/C/C语言不设置临时变量交换x和y的值(方法).md b/mengyanote-frontend/public/mengyanote/编程语言/C/C语言不设置临时变量交换x和y的值(方法).md similarity index 100% rename from public/mengyanote/编程语言/C/C语言不设置临时变量交换x和y的值(方法).md rename to mengyanote-frontend/public/mengyanote/编程语言/C/C语言不设置临时变量交换x和y的值(方法).md diff --git a/mengyanote-frontend/public/mengyanote/编程语言/C/代码片段/代码片段-标准HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/C/代码片段/代码片段-标准HelloWorld输出.md new file mode 100644 index 0000000..36cc057 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/C/代码片段/代码片段-标准HelloWorld输出.md @@ -0,0 +1,8 @@ +```c +#include + +int main() { + printf("Hello, World!\n"); + return 0; +} +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/C/代码片段/代码片段-特殊HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/C/代码片段/代码片段-特殊HelloWorld输出.md new file mode 100644 index 0000000..6c9e694 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/C/代码片段/代码片段-特殊HelloWorld输出.md @@ -0,0 +1,8 @@ +```c +//不使用分号 +#include + +int main() { + if (printf("Hello, World!\n")) {} +} +``` \ No newline at end of file diff --git a/public/mengyanote/编程语言/CSharp/mono和dotnet的区别.md b/mengyanote-frontend/public/mengyanote/编程语言/CSharp/mono和dotnet的区别.md similarity index 100% rename from public/mengyanote/编程语言/CSharp/mono和dotnet的区别.md rename to mengyanote-frontend/public/mengyanote/编程语言/CSharp/mono和dotnet的区别.md diff --git a/mengyanote-frontend/public/mengyanote/编程语言/CSharp/代码片段/代码片段-标准HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/CSharp/代码片段/代码片段-标准HelloWorld输出.md new file mode 100644 index 0000000..5cc0e99 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/CSharp/代码片段/代码片段-标准HelloWorld输出.md @@ -0,0 +1,9 @@ +```csharp +using System; + +class Program { + static void Main() { + Console.WriteLine("Hello, World!"); + } +} +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/CSharp/代码片段/代码片段-特殊HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/CSharp/代码片段/代码片段-特殊HelloWorld输出.md new file mode 100644 index 0000000..b5629b7 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/CSharp/代码片段/代码片段-特殊HelloWorld输出.md @@ -0,0 +1,16 @@ +```csharp +//使用特性(Attributes) +using System; + +[AttributeUsage(AttributeTargets.Class)] +public class HelloAttribute : Attribute { + public HelloAttribute() { + Console.WriteLine("Hello, World!"); + } +} + +[Hello] +class Program { + static void Main() { } +} +``` \ No newline at end of file diff --git a/public/mengyanote/编程语言/Flutter/Flutter安卓构建注意事项.md b/mengyanote-frontend/public/mengyanote/编程语言/Flutter&Dart/Flutter安卓构建注意事项.md similarity index 100% rename from public/mengyanote/编程语言/Flutter/Flutter安卓构建注意事项.md rename to mengyanote-frontend/public/mengyanote/编程语言/Flutter&Dart/Flutter安卓构建注意事项.md diff --git a/public/mengyanote/编程语言/Flutter/Flutter常用命令.md b/mengyanote-frontend/public/mengyanote/编程语言/Flutter&Dart/Flutter常用命令.md similarity index 100% rename from public/mengyanote/编程语言/Flutter/Flutter常用命令.md rename to mengyanote-frontend/public/mengyanote/编程语言/Flutter&Dart/Flutter常用命令.md diff --git a/public/mengyanote/编程语言/Flutter/Flutter构建平台产物位置.md b/mengyanote-frontend/public/mengyanote/编程语言/Flutter&Dart/Flutter构建平台产物位置.md similarity index 100% rename from public/mengyanote/编程语言/Flutter/Flutter构建平台产物位置.md rename to mengyanote-frontend/public/mengyanote/编程语言/Flutter&Dart/Flutter构建平台产物位置.md diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang主流后端框架.md b/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang主流后端框架.md new file mode 100644 index 0000000..21f3dba --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang主流后端框架.md @@ -0,0 +1,35 @@ +Golang的主流后端框架生态非常丰富,你可以根据项目类型和需求,从以下几个方向进行选择。 + +为了方便你快速了解,下表汇总了最主流的几类框架及其核心特点: + +| 类别 | 核心框架/库 | 主要特点与定位 | 典型应用场景 | +| :--- | :--- | :--- | :--- | +| **全能型Web框架** | **Gin** | **性能卓越**、生态丰富、中间件支持好 | 高频RESTful API、微服务 | +| | **Echo** | 高性能、设计简洁、文档优秀 | 快速迭代的Web项目 | +| | **Beego** | **全栈MVC框架**,自带ORM、缓存等全套功能 | 企业级后台、快速原型开发 | +| **现代微服务框架** | **Go-Micro / Kratos** | 提供**服务发现、负载均衡**等完整微服务治理能力 | 云原生、分布式微服务架构 | +| | **gRPC-Go** | **跨语言的RPC通信框架**,性能极高 | 内部服务间的高性能通信 | +| **数据库ORM** | **GORM** | **功能全面的ORM库**,链式API,开发友好 | 需要简化数据库操作的项目 | +| | **Ent** | 基于**代码生成的ORM**,类型安全,性能好 | 对数据模型和操作有强类型要求的大型项目 | +| **标准库/轻量级** | **net/http** | Go语言**内置**的HTTP包,功能纯粹 | 轻量级应用、学习底层原理、追求极致控制 | +| | **chi** | 轻量级路由器,完全兼容`net/http` | 需要比标准库更便捷路由的中小型项目 | + +### 🛠️ 如何选择框架 + +你可以参考以下思路来缩小选择范围: + +1. **明确项目类型** + * **构建API或微服务**:优先考虑**Gin**或**Echo**。它们轻量、高性能,社区资源丰富,是这类场景的“标配”。 + * **构建全功能后台(如管理平台)**:可以考虑**Beego**这类全栈框架,它内置的模块(ORM、会话管理)能帮你快速搭建。 + * **构建大型分布式微服务**:需要关注**Go-Micro**、**Kratos**这类微服务框架,它们解决了服务治理的核心问题。 + * **快速原型或学习**:从**Gin**或**标准库net/http**开始都是不错的选择。 + +2. **考量关键指标** + * **性能**:所有主流框架性能都不差,但在极致性能场景下,Gin、Echo常被作为基准。 + * **学习曲线与开发效率**:Beego、GORM这类“全家桶”或高级抽象库能提升开发效率;而标准库、chi等更灵活,但需要自己组装更多组件。 + * **社区与生态**:Gin、GORM拥有最活跃的社区,意味着遇到问题时更容易找到解决方案和现成的中间件。 + +### 💡 重要趋势与建议 + +* **“标准库优先”文化**:Go社区有“stdlib优先”的准则。在引入第三方框架前,可以先评估`net/http`标准库是否够用,这有助于保持项目的简洁和可控性。 +* **向微服务与云原生演进**:现代Go项目越来越多地采用**微服务架构**,**gRPC**和**服务网格**已成为构建高性能、可观测服务的重要选择。 diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang标准代码架构.md b/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang标准代码架构.md new file mode 100644 index 0000000..78f6500 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang标准代码架构.md @@ -0,0 +1,337 @@ +**偏企业级/中大型服务端的 Go 代码架构蓝图(目录 + 分层原则 + 关键组件样板 + 工程化配套)。它综合了 Go 社区常用的 project-layout、Go 官方模块组织建议、Clean Architecture 思想,以及 Uber Go 风格/工程实践。你可以按需裁剪,但建议先按“全量骨架”搭起来再删。** + +--- + +## 1. 设计目标(企业级要解决什么) + +1. **边界清晰**:业务与基础设施解耦,避免“框架入侵”。 +2. **可测试性强**:业务核心可纯单测,外部依赖可替换 Mock。 +3. **易扩展**:新业务是新增模块,而不是改一堆旧代码。 +4. **工程化完备**:lint / test / build / deploy / observability 一条龙。 + +--- + +## 2. 推荐目录结构(骨架) + +基于 golang-standards/project-layout 的骨架,再融合 Clean Architecture 的“领域/用例/适配器/基础设施”分层。 + +```text +my-service/ +├── cmd/ # 每个可执行程序一个子目录 +│ └── api/ +│ └── main.go +├── internal/ # 私有代码(强边界) +│ ├── app/ # 应用装配/启动 +│ │ └── wiring.go +│ ├── domain/ # 领域层:实体/值对象/领域服务/领域事件 +│ │ └── user/ +│ │ ├── entity.go +│ │ ├── repository.go # 领域层定义接口 +│ │ └── service.go +│ ├── usecase/ # 用例层:业务编排(依赖 domain 接口) +│ │ └── user_uc.go +│ ├── adapter/ # 适配器层:入口/出口 +│ │ ├── http/ # HTTP handler / router +│ │ ├── grpc/ # gRPC handler +│ │ └── mq/ # 消息队列消费者/生产者 +│ ├── infra/ # 基础设施层:DB/Cache/第三方/配置等实现 +│ │ ├── persistence/ # repository 实现 +│ │ ├── redis/ +│ │ ├── clients/ # 外部服务 client +│ │ └── observability/ +│ └── pkg/ # internal 可复用工具(非对外) +│ ├── logger/ +│ ├── config/ +│ ├── errors/ +│ └── middleware/ +├── pkg/ # 对外可复用库(如你要开源/给别的服务用) +│ └── ... +├── api/ # Protobuf / OpenAPI 定义 +│ ├── proto/ +│ └── openapi/ +├── configs/ # 配置模板/默认配置 +│ ├── config.yaml +│ └── config.dev.yaml +├── deployments/ # k8s/helm/terraform 等交付物 +│ ├── helm/ +│ └── k8s/ +├── scripts/ # 运维脚本/代码生成脚本 +├── test/ # 集成测试/契约测试资源 +├── docs/ # 架构/ADR/使用文档 +├── .golangci.yml # lint 聚合配置 +├── Makefile # 统一工程入口 +├── go.mod +└── go.sum +``` + +**关键点:** + +- `cmd/` 只做启动、装配、优雅退出;别放业务。 +- 业务核心统一在 `internal/domain + internal/usecase`。 +- 外部世界(HTTP/DB/三方)都放 `adapter/infra`,并通过接口向内依赖。 +- `internal/` 强制私有边界,让大项目不会“包满天飞”。 + +--- + +## 3. 分层职责与依赖方向 + +Clean Architecture 的依赖规则: +**adapter / infra → usecase → domain**(只允许向内依赖)。 + +### 3.1 Domain(领域层) + +- **纯业务模型**:Entity / Value Object / Domain Service +- **定义接口,不实现**:Repository、外部能力的 Ports +- 不依赖框架、数据库、网络库。 + +### 3.2 Usecase(用例层) + +- 业务流程编排(事务、跨聚合协作、调用 repo 接口)。 +- 依赖 Domain 接口,为 adapter 提供可调用的“应用服务”。 + +### 3.3 Adapter(适配器层) + +- **输入适配器**:HTTP/gRPC/MQ/CLI +- 负责 DTO/VO 转换、参数校验、错误映射、鉴权等。 + +### 3.4 Infra(基础设施层) + +- 实现 Domain 定义的 Repository、外部 Client +- 负责 DB/Cache/消息/第三方 SDK 初始化与封装。 + +--- + +## 4. 样板代码(最小可运行) + +下面用“用户创建”串起来(只给骨架,真实项目继续扩充)。 + +### 4.1 domain/user/entity.go + +```go +package user + +import "time" + +type UserID string + +type User struct { + ID UserID + Name string + Email string + CreatedAt time.Time +} + +func New(name, email string) *User { + return &User{ + ID: UserID(generateID()), + Name: name, + Email: email, + CreatedAt: time.Now(), + } +} +``` + +### 4.2 domain/user/repository.go(领域层接口) + +```go +package user + +import "context" + +type Repository interface { + Create(ctx context.Context, u *User) error + FindByEmail(ctx context.Context, email string) (*User, error) +} +``` + +### 4.3 usecase/user_uc.go + +```go +package usecase + +import ( + "context" + "my-service/internal/domain/user" +) + +type UserUsecase struct { + repo user.Repository +} + +func NewUserUsecase(repo user.Repository) *UserUsecase { + return &UserUsecase{repo: repo} +} + +func (uc *UserUsecase) CreateUser(ctx context.Context, name, email string) (*user.User, error) { + if exist, _ := uc.repo.FindByEmail(ctx, email); exist != nil { + return nil, ErrEmailTaken + } + u := user.New(name, email) + if err := uc.repo.Create(ctx, u); err != nil { + return nil, err + } + return u, nil +} +``` + +### 4.4 infra/persistence/user_repo_mysql.go(实现接口) + +```go +package persistence + +import ( + "context" + "database/sql" + "my-service/internal/domain/user" +) + +type UserRepoMySQL struct { + db *sql.DB +} + +func NewUserRepoMySQL(db *sql.DB) *UserRepoMySQL { + return &UserRepoMySQL{db: db} +} + +func (r *UserRepoMySQL) Create(ctx context.Context, u *user.User) error { + _, err := r.db.ExecContext(ctx, + "INSERT INTO users(id,name,email,created_at) VALUES (?,?,?,?)", + u.ID, u.Name, u.Email, u.CreatedAt, + ) + return err +} + +func (r *UserRepoMySQL) FindByEmail(ctx context.Context, email string) (*user.User, error) { + row := r.db.QueryRowContext(ctx, "SELECT id,name,email,created_at FROM users WHERE email=?", email) + var u user.User + if err := row.Scan(&u.ID, &u.Name, &u.Email, &u.CreatedAt); err != nil { + return nil, err + } + return &u, nil +} +``` + +### 4.5 adapter/http/user_handler.go + +```go +package http + +import ( + "net/http" + "my-service/internal/usecase" + + "github.com/gin-gonic/gin" +) + +type UserHandler struct { + uc *usecase.UserUsecase +} + +func NewUserHandler(uc *usecase.UserUsecase) *UserHandler { + return &UserHandler{uc: uc} +} + +func (h *UserHandler) Create(c *gin.Context) { + var req struct { + Name string `json:"name" binding:"required"` + Email string `json:"email" binding:"required,email"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + u, err := h.uc.CreateUser(c.Request.Context(), req.Name, req.Email) + if err != nil { + c.JSON(mapErr(err)) // 统一错误映射 + return + } + c.JSON(http.StatusCreated, u) +} +``` + +### 4.6 cmd/api/main.go(装配) + +```go +package main + +import ( + "my-service/internal/adapter/http" + "my-service/internal/app" +) + +func main() { + c := app.BuildContainer() // 依赖注入/装配 + server := app.BuildHTTPServer(c) // router + middleware + server.Run() +} +``` + +--- + +## 5. 工程化配套(企业级“真正拉开差距”的地方) + +### 5.1 统一构建入口:Makefile + +```makefile +.PHONY: lint test build run gen + +lint: + golangci-lint run ./... + +test: + go test ./... -race -coverprofile=coverage.out + +build: + CGO_ENABLED=0 go build -o bin/api ./cmd/api + +run: + go run ./cmd/api + +gen: + buf generate api/proto +``` + +### 5.2 Lint / 规范 + +- 使用 `golangci-lint` 聚合常见静态检查。 +- 代码风格追随 Uber Go Style Guide(错误处理、receiver 命名、减少嵌套、表驱动测试、显式依赖注入等)。 ([GitHub](https://github.com/uber-go/guide?utm_source=chatgpt.com "The Uber Go Style Guide. - GitHub")) + +### 5.3 配置与环境 + +- `configs/` 放模板,实际运行时通过 ENV 覆盖(12-factor 思路)。 +- 内部提供 `pkg/config` 统一加载 + 校验。 + +### 5.4 日志、指标、链路 + +- `pkg/logger` 统一结构化日志(zap/zerolog)。 +- `infra/observability` 里封装 Prometheus metrics + OpenTelemetry tracing。 +- 中间件负责注入 traceID/requestID。 + +### 5.5 CI/CD + +- CI:lint → unit test → build → security scan → dockerize +- CD:helm/k8s 渐进发布 + 健康检查/回滚。 +- 交付物放 `deployments/`。 + +--- + +## 6. 常见演进路线(你可以按阶段落地) + +1. **单体服务阶段**:先按这套目录跑起来。 +2. **多入口阶段**:新增 `cmd/worker`、`adapter/mq`。 +3. **多模块阶段**:`domain/` 拆聚合、用例拆包。 +4. **服务化阶段**:`pkg/` 抽公共库,多 repo 或 mono-repo 都能适配。 + +--- + +## 7. 你可以直接复制的“企业级模板清单” + +如果你想更快开干,建议在骨架里再补这几件事: + +- `internal/pkg/errors`:统一错误码/错误栈 +- `internal/pkg/middleware`:auth、rate limit、recover、trace +- `test/contract`:gRPC/HTTP 契约测试 +- `docs/adr`:架构决策记录(ADR) +- `scripts/dev.sh`:本地一键启动依赖(db/redis/mq) + +--- diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang标准库热门模块.md b/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang标准库热门模块.md new file mode 100644 index 0000000..99c85b7 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Golang/Golang标准库热门模块.md @@ -0,0 +1,64 @@ + +**fmt — 字符串格式化、打印** +常用:Print*、Sprintf、Fprintf、Errorf。 +Imported by:5,417,076(go1.25.3 页面)。 + +**time — 时间/定时/计时** +常用:Now、Sleep、Ticker/Timer、Parse/Format、Since/Until、time.Duration。 +Imported by:2,690,536。 + +**strings — 字符串处理** +常用:Contains/HasPrefix、Split/Join、Replace(All)、ToUpper/Lower、Trim*、Builder。 +Imported by:2,527,595。 + +**os — 操作系统接口(文件、进程、环境变量)** +常用:ReadFile/WriteFile、Open/Create、Mkdir(All)/Remove、Getenv/Setenv、Executable。 +Imported by:2,364,233。 + +**strconv — 字符串与数字/布尔转换** +常用:Atoi、Itoa、ParseInt/Uint/Float、FormatInt/Float、Append*。 +Imported by:1,720,862。 + +**net/http — HTTP 客户端/服务端** +常用:客户端 http.Client/Get/Do;服务端 ListenAndServe、Handle(Func)、Server.Shutdown、Cookie。 +Imported by:1,705,800。 + +**io — 基础 I/O 抽象与工具** +常用接口:Reader/Writer/Closer;工具:Copy/ReadAll/TeeReader/MultiReader/MultiWriter。 +Imported by:1,492,765。 + +**errors — 错误构造与包装** +常用:New、Is、As、Join、Unwrap。 +Imported by:1,570,292。 + +**encoding/json — JSON 编解码** +常用:Marshal/Unmarshal、NewEncoder/NewDecoder、RawMessage、Valid。 +Imported by:1,437,939。 + +**log — 轻量日志** +常用:Print*、Printf、SetOutput、SetFlags;(复杂需求多用第三方) +Imported by:1,357,278。 + +**sync — 并发原语** +常用:Mutex/RWMutex、WaitGroup、Once、Cond、Pool。 +Imported by:1,291,596。 + +**bytes — []byte 处理(与 strings 类似)** +常用:Buffer、Reader、Split/Join、Replace(All)、ToUpper/Lower、Trim*。 +Imported by:1,189,998。 + +**bufio — 带缓冲的 I/O** +常用:Reader(ReadString/ReadBytes/Peek)、Writer(Flush)、Scanner。 +Imported by:1,094,139。 + +**path/filepath — 跨平台文件路径** +常用:Join/Split/Base/Dir、Ext、Abs/Rel、WalkDir、Glob。 +Imported by:1,047,304。 + +**regexp — 正则表达式** +常用:MustCompile、Match、ReplaceAll*、Find(All)*、SubexpNames。 +Imported by:917,674。 + +**reflect — 反射(元编程/通用库常用)** +常用:TypeOf/ValueOf、Value.Field/Method、DeepEqual(1.22 起也有 slices.Equal 可替代部分场景)。 +Imported by:793,184。 diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Golang/代码片段/代码片段-标准HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/Golang/代码片段/代码片段-标准HelloWorld输出.md new file mode 100644 index 0000000..ae49669 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Golang/代码片段/代码片段-标准HelloWorld输出.md @@ -0,0 +1,9 @@ +```go +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World!") +} +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Golang/代码片段/代码片段-特殊HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/Golang/代码片段/代码片段-特殊HelloWorld输出.md new file mode 100644 index 0000000..3619ff2 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Golang/代码片段/代码片段-特殊HelloWorld输出.md @@ -0,0 +1,14 @@ +```go +//使用goroutine和channel +package main + +import "fmt" + +func main() { + ch := make(chan string) + go func() { + ch <- "Hello, World!" + }() + fmt.Println(<-ch) +} +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Java/JavaSpring标准项目架构.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/JavaSpring标准项目架构.md new file mode 100644 index 0000000..c571466 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Java/JavaSpring标准项目架构.md @@ -0,0 +1,144 @@ +以下是一个标准的Java Spring Boot后端项目的**代码目录架构**。这个结构遵循了主流的**分层架构**与**领域模型**设计,适合作为大多数Web项目的起点。 + +### 📁 标准项目代码结构 + +```java +src/main/java/com/yourcompany/yourproject/ +├── Application.java // Spring Boot 主启动类 +├── config/ // 配置类 +│ ├── WebConfig.java // MVC、拦截器等配置 +│ ├── DataSourceConfig.java // 数据源与JPA/MyBatis配置 +│ ├── SecurityConfig.java // 安全配置 (如果使用Spring Security) +│ └── RedisConfig.java // Redis缓存配置 +├── controller/ // 控制层 (API接口) +│ ├── request/ // (可选) 存放专用的请求参数对象 +│ ├── response/ // (可选) 存放专用的响应对象 +│ ├── UserController.java +│ └── ProductController.java +├── service/ // 业务逻辑层 +│ ├── impl/ // 服务接口的实现类 +│ │ ├── UserServiceImpl.java +│ │ └── ProductServiceImpl.java +│ ├── UserService.java // 服务接口 +│ └── ProductService.java +├── repository/ // 数据访问层 (JPA风格,如果用MyBatis常命名为mapper) +│ ├── entity/ // JPA实体类 (对应数据库表) +│ │ ├── UserEntity.java +│ │ └── ProductEntity.java +│ ├── dao/ // (可选) 复杂自定义查询接口 +│ └── UserRepository.java // JPA Repository接口 (自动实现CRUD) +├── model/ // 业务模型/数据传输对象 (与repository/entity分离) +│ ├── dto/ // 数据传输对象(用于接口传参) +│ │ ├── request/ +│ │ │ ├── CreateUserRequest.java +│ │ │ └── UpdateProductRequest.java +│ │ └── response/ +│ │ ├── UserDetailResponse.java +│ │ └── ProductSummaryResponse.java +│ └── bo/ // 业务对象 (核心业务逻辑承载) +│ └── OrderBO.java +├── exception/ // 全局异常处理 +│ ├── BusinessException.java // 自定义业务异常 +│ ├── GlobalExceptionHandler.java // 全局异常处理器 +│ └── ErrorCodeEnum.java // 错误码枚举 +├── util/ // 工具类 +│ ├── DateUtils.java +│ ├── JsonUtils.java +│ └── Validator.java +├── aspect/ // (可选) AOP切面 (日志、事务、权限等) +│ └── LoggingAspect.java +├── interceptor/ // (可选) 拦截器 +│ └── AuthInterceptor.java +├── filter/ // (可选) 过滤器 +│ └── RequestLogFilter.java +└── constant/ // 常量定义 + └── SystemConstant.java + +src/main/resources/ +├── application.yml // 主配置文件 (推荐YAML格式) +├── application-dev.yml // 开发环境配置 +├── application-prod.yml // 生产环境配置 +├── static/ // 静态资源 +├── templates/ // 模板文件 (如Thymeleaf) +├── mapper/ // (如果用MyBatis) XML映射文件 +│ └── UserMapper.xml +└── sql/ // 数据库脚本 + └── schema.sql + +src/test/java/com/yourcompany/yourproject/ // 单元测试目录 +├── ApplicationTests.java +├── controller/ +├── service/ +└── repository/ +``` + +### 🎯 核心目录与文件说明 + +1. **`Application.java`** + * **位置**:根包下。 + * **作用**:包含`main`方法的启动类,使用`@SpringBootApplication`注解。 + +2. **`controller/` 控制层** + * **职责**:处理HTTP请求和响应。类使用`@RestController`或`@Controller`注解。 + * **最佳实践**: + * 方法应简洁,只负责参数校验、调用`service`并返回结果。 + * 可以使用`@Validated`注解配合`dto/request`中的验证注解(如`@NotBlank`)进行参数校验。 + +3. **`service/` 业务逻辑层** + * **职责**:封装核心业务逻辑,是系统最关键的部分。 + * **最佳实践**: + * 先定义接口(如`UserService.java`),再写实现类(放在`impl/`子包中)。这利于接口隔离和未来扩展(如RPC调用)。 + * 实现类使用`@Service`注解。 + * 业务逻辑应在此层完整实现,避免在`controller`或`repository`中编写业务代码。 + +4. **`repository/` 数据访问层** + * **职责**:负责与数据库进行所有交互。 + * **JPA模式**:接口继承`JpaRepository`,Spring Data JPA会自动提供基本CRUD实现。复杂查询可使用`@Query`注解。 + * **MyBatis模式**:此包常命名为`mapper`。接口方法通过`resources/mapper/`下的XML文件或注解定义SQL。 + * **`entity/`子包**:存放JPA实体类(`@Entity`),与数据库表一一对应。建议实现`Serializable`接口。 + +5. **`model/` 模型层** + * **核心思想**:**与`entity`分离**,避免数据库结构直接暴露给前端或污染业务逻辑。 + * **`dto/` (Data Transfer Object)**:专用于前后端交互或服务间调用的数据对象。 + * `request/`:对应`controller`的入参。 + * `response/`:对应`controller`的出参。 + * **`bo/` (Business Object)**:在复杂的业务场景中,用于承载业务逻辑和状态的核心对象,可能由多个`entity`组合而成。 + +6. **`config/` 配置层** + * **职责**:集中存放所有Spring配置类(使用`@Configuration`注解)。将配置与业务代码分离,使结构更清晰。 + +7. **`exception/` 异常处理** + * **职责**:自定义业务异常和全局统一异常处理(使用`@RestControllerAdvice`)。这是实现API错误格式统一的关键。 + +### 💡 关键注意事项与代码规范建议 + +* **包名**:全部使用**小写字母**。 +* **类名**:使用大驼峰命名法(`UserController`)。 +* **接口与实现**:接口如`UserService`,实现类如`UserServiceImpl`。 +* **Entity与DTO分离**:这是保证架构清晰的关键。**不要直接用`entity`作为`controller`的入参或出参**,应通过DTO进行转换。可使用**MapStruct**或**ModelMapper**等工具高效完成转换。 +* **依赖注入**:推荐使用**构造器注入**(`@Autowired`在构造方法上),而不是字段注入,这能使依赖更明确且便于测试。 +* **配置文件**:使用`application.yml`代替`.properties`,结构更清晰。通过`spring.profiles.active`指定运行环境(如`dev`, `prod`)。 + +### 🔄 项目演进建议 + +当项目变得非常庞大时,可考虑按**业务模块**进行垂直拆分,演变为**模块化单体**: + +```java +com.yourcompany.yourproject/ +├── user/ // 用户模块 +│ ├── controller/ +│ ├── service/ +│ ├── repository/ +│ └── model/ +├── product/ // 产品模块 +│ ├── controller/ +│ ├── service/ +│ ├── repository/ +│ └── model/ +└── order/ // 订单模块 + ├── controller/ + ├── service/ + ├── repository/ + └── model/ +``` + diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Java/Java中的map,set,list比较.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java中的map,set,list比较.md new file mode 100644 index 0000000..6369001 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java中的map,set,list比较.md @@ -0,0 +1,203 @@ + +--- + +### 核心概念总览 + +| 特性 | List(列表) | Set(集合) | Map(映射) | +| :--- | :--- | :--- | :--- | +| **核心接口** | `java.util.List` | `java.util.Set` | `java.util.Map` | +| **继承关系** | 继承自 `Collection` | 继承自 `Collection` | 独立接口,不继承 `Collection` | +| **元素顺序** | **有序**(插入顺序) | 通常**无序**(`LinkedHashSet`等除外) | 通常**无序**(`LinkedHashMap`等除外) | +| **元素唯一性** | **允许重复** | **不允许重复** | **Key 不允许重复**,Value 可以重复 | +| **元素访问** | 通过**索引**(index) | 只能通过**迭代器**或增强 for 循环 | 通过 **Key** 来访问 Value | +| **常见实现类** | `ArrayList`, `LinkedList`, `Vector` | `HashSet`, `LinkedHashSet`, `TreeSet` | `HashMap`, `LinkedHashMap`, `TreeMap`, `Hashtable` | +| **是否允许 null** | 是 | `HashSet` 允许一个 null,`TreeSet` 不允许 | `HashMap` 允许一个 null key,`Hashtable` 不允许 | + +--- + +### 1. List(列表) + +List 是一个**有序**的、**允许重复元素**的集合。用户可以精确控制列表中每个元素的插入位置,并且可以通过整数索引(类似于数组下标)来访问元素。 + +**核心特性:** +* **有序(Ordered)**:元素按照插入的顺序存储。 +* **可重复(Allows Duplicates)**:可以添加多个相同的元素(包括多个 `null`)。 +* **索引访问(Indexed Access)**:提供了基于下标(从 0 开始)的 `get(int index)` 和 `set(int index, E element)` 方法。 + +**主要实现类:** + +1. **`ArrayList`** + * **底层结构**:基于**动态数组**。 + * **特点**: + * **查询快**:因为实现了 `RandomAccess` 接口,通过索引随机访问元素的速度极快(时间复杂度 O(1))。 + * **增删慢**:在列表中间插入或删除元素时,需要移动后续所有元素,性能较差(平均时间复杂度 O(n))。 + * **使用场景**:**查询操作远多于增删操作**的场景。这是最常用的 List 实现。 + +2. **`LinkedList`** + * **底层结构**:基于**双向链表**。 + * **特点**: + * **增删快**:在链表头部或尾部(已知位置)插入/删除元素很快(时间复杂度 O(1))。在中间位置需要先遍历找到位置。 + * **查询慢**:按索引查询需要从头或尾开始遍历链表(平均时间复杂度 O(n))。 + * 实现了 `Deque` 接口,可以被用作**栈**或**队列**。 + * **使用场景**:需要频繁在列表**首尾进行增删操作**,或者频繁使用栈/队列结构的场景。 + +3. **`Vector`(已过时,不推荐使用)** + * **底层结构**:基于动态数组,是线程安全的。 + * **特点**:其所有方法都是 `synchronized` 的,保证了线程安全,但性能开销大。 + * **替代品**:在需要线程安全时,可以使用 `Collections.synchronizedList(new ArrayList(...))` 或者 `CopyOnWriteArrayList`。 + +**代码示例:** +```java +List arrayList = new ArrayList<>(); +arrayList.add("Apple"); // 索引 0 +arrayList.add("Banana"); // 索引 1 +arrayList.add("Apple"); // 允许重复 +arrayList.add(null); // 允许 null + +System.out.println(arrayList); // 输出:[Apple, Banana, Apple, null] +System.out.println(arrayList.get(1)); // 输出:Banana + +List linkedList = new LinkedList<>(); +linkedList.addFirst("First"); // 在头部添加 +linkedList.addLast("Last"); // 在尾部添加 +``` + +--- + +### 2. Set(集合) + +Set 是一个**不允许重复元素**的集合。它模拟了数学上的“集合”概念。最多只能包含一个 `null` 元素。 + +**核心特性:** +* **唯一性(Unique Elements)**:集合中不允许存在两个相等的元素。判断相等的依据是 `equals()` 和 `hashCode()` 方法。 +* **通常无序(Generally Unordered)**:大多数实现不保证元素的顺序(但 `LinkedHashSet` 和 `TreeSet` 例外)。 + +**主要实现类:** + +1. **`HashSet`** + * **底层结构**:基于 **HashMap**(本质上是只使用了 HashMap 的 Key)。 + * **特点**: + * **无序**:不保证元素的迭代顺序。 + * **性能最好**:添加、删除、查找(`contains`)操作的时间复杂度都是 **O(1)**。 + * **使用场景**:最常用的 Set,用于需要快速查找且不关心顺序的场景。 + +2. **`LinkedHashSet`** + * **底层结构**:继承自 `HashSet`,但内部使用 **链表** 维护了元素的**插入顺序**。 + * **特点**: + * **有序**:迭代顺序就是元素的插入顺序。 + * 性能略低于 `HashSet`,因为需要维护链表。 + * **使用场景**:既需要 Set 的**唯一性**,又希望保留元素的**插入顺序**。 + +3. **`TreeSet`** + * **底层结构**:基于 **红黑树**(一种自平衡的二叉查找树)。 + * **特点**: + * **有序**:元素按照**自然顺序**(如数字从小到大,字符串字典序)或者根据构造时提供的 **Comparator** 进行排序。 + * 添加、删除、查找操作的时间复杂度是 **O(log n)**。 + * **不允许 `null` 元素**。 + * **使用场景**:需要元素**自动排序**的场景。 + +**代码示例:** +```java +Set hashSet = new HashSet<>(); +hashSet.add("Apple"); +hashSet.add("Banana"); +hashSet.add("Apple"); // 这个重复元素不会被添加 +hashSet.add(null); + +System.out.println(hashSet); // 输出可能是:[null, Apple, Banana] (无序) + +Set linkedHashSet = new LinkedHashSet<>(); +linkedHashSet.add("Banana"); +linkedHashSet.add("Apple"); +System.out.println(linkedHashSet); // 输出:[Banana, Apple] (保持插入顺序) + +Set treeSet = new TreeSet<>(); +treeSet.add(3); +treeSet.add(1); +treeSet.add(2); +System.out.println(treeSet); // 输出:[1, 2, 3] (自然排序) +``` + +--- + +### 3. Map(映射) + +Map 是一个用于存储 **键值对(Key-Value Pairs)** 的集合。每个 Key 映射到一个 Value。Key 不允许重复,但不同的 Key 可以映射到相同的 Value。 + +**核心特性:** +* **键值对(Key-Value Pairs)**:数据以 `Key=Value` 的形式存储。 +* **Key 唯一(Unique Keys)**:一个 Map 中不能包含重复的 Key。判断 Key 是否重复的依据是 `equals()` 和 `hashCode()` 方法。 +* **每个 Key 对应一个 Value**:一个 Key 只能映射到一个 Value。 + +**主要实现类:** + +1. **`HashMap`** + * **底层结构**:基于 **数组+链表+红黑树**(JDK 8 以后)。 + * **特点**: + * **无序**:不保证键值对的顺序。 + * **性能最好**:get 和 put 操作的时间复杂度在理想情况下是 **O(1)**。 + * **允许 `null` 作为 Key 和 Value**。 + * **使用场景**:最常用的 Map,适用于绝大多数键值对存储场景。 + +2. **`LinkedHashMap`** + * **底层结构**:继承自 `HashMap`,并使用**链表**维护了**插入顺序**或**访问顺序**。 + * **特点**: + * **有序**:迭代顺序可以是**插入顺序**或**访问顺序**(最近最少使用的元素在前)。 + * 性能略低于 `HashMap`。 + * **使用场景**:需要保留键值对的**插入顺序**,或者用它来实现 **LRU(最近最少使用)缓存**。 + +3. **`TreeMap`** + * **底层结构**:基于 **红黑树**。 + * **特点**: + * **有序**:Key 按照**自然顺序**或指定的 **Comparator** 进行排序。 + * 操作的时间复杂度为 **O(log n)**。 + * **不允许 `null` Key**。 + * **使用场景**:需要 Key **自动排序**的场景。 + +4. **`Hashtable`(已过时,不推荐使用)** + * **底层结构**:类似 `HashMap`,是线程安全的。 + * **特点**:所有方法都是 `synchronized` 的,性能差。 + * **不允许 `null` 作为 Key 或 Value**。 + * **替代品**:使用 `ConcurrentHashMap` 或 `Collections.synchronizedMap(new HashMap(...))`。 + +**代码示例:** +```java +Map hashMap = new HashMap<>(); +hashMap.put("Alice", 90); +hashMap.put("Bob", 85); +hashMap.put("Alice", 95); // 覆盖 Key "Alice" 原来的值 +hashMap.put(null, 100); // 允许 null key + +System.out.println(hashMap); // 输出可能是:{null=100, Bob=85, Alice=95} +System.out.println(hashMap.get("Bob")); // 输出:85 + +Map linkedHashMap = new LinkedHashMap<>(); +linkedHashMap.put("Bob", 85); +linkedHashMap.put("Alice", 95); +System.out.println(linkedHashMap); // 输出:{Bob=85, Alice=95} (插入顺序) + +Map treeMap = new TreeMap<>(); +treeMap.put("Orange", 10); +treeMap.put("Apple", 20); +System.out.println(treeMap); // 输出:{Apple=20, Orange=10} (Key的字典序) +``` + +--- + +### 总结与选择 + +* **需要允许重复且有顺序?** -> 选择 **`List`** + * 查询多,增删少 -> **`ArrayList`** + * 增删多,查询少,或需要栈/队列 -> **`LinkedList`** + +* **需要元素唯一,不关心顺序?** -> 选择 **`Set`** + * 只关心唯一性,追求最高性能 -> **`HashSet`** + * 需要保留插入顺序 -> **`LinkedHashSet`** + * 需要元素自动排序 -> **`TreeSet`** + +* **需要通过键(Key)来查找值(Value)?** -> 选择 **`Map`** + * 绝大多数场景,不关心顺序 -> **`HashMap`** + * 需要保留键值对的插入顺序或实现LRU -> **`LinkedHashMap`** + * 需要键自动排序 -> **`TreeMap`** + * 高并发场景 -> **`ConcurrentHashMap`** + diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-处理异常方法.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-处理异常方法.md new file mode 100644 index 0000000..7cc3830 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-处理异常方法.md @@ -0,0 +1,239 @@ + +## 1. 异常分类 + +### 1.1 检查型异常 (Checked Exceptions) +- 必须处理,否则编译不通过 +- 继承自 `Exception` +- 示例:`IOException`, `SQLException`, `ClassNotFoundException` + +### 1.2 非检查型异常 (Unchecked Exceptions) +- 不需要强制处理 +- 继承自 `RuntimeException` +- 示例:`NullPointerException`, `ArrayIndexOutOfBoundsException`, `IllegalArgumentException` + +### 1.3 错误 (Errors) +- 系统级错误,程序通常无法恢复 +- 继承自 `Error` +- 示例:`OutOfMemoryError`, `StackOverflowError` + +## 2. 异常处理机制 + +### 2.1 try-catch-finally 块 +```java +try { + // 可能抛出异常的代码 + FileInputStream file = new FileInputStream("test.txt"); + int data = file.read(); +} catch (FileNotFoundException e) { + // 处理特定异常 + System.out.println("文件未找到: " + e.getMessage()); +} catch (IOException e) { + // 处理IO异常 + System.out.println("IO错误: " + e.getMessage()); +} finally { + // 无论是否发生异常都会执行 + System.out.println("清理资源"); + // file.close(); // 实际应该在这里关闭资源 +} +``` + +### 2.2 try-with-resources (Java 7+) +```java +// 自动关闭资源,实现AutoCloseable接口的资源 +try (FileInputStream file = new FileInputStream("test.txt"); + BufferedReader reader = new BufferedReader(new InputStreamReader(file))) { + + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } +} catch (IOException e) { + System.out.println("读取文件失败: " + e.getMessage()); +} +// 不需要finally块,资源会自动关闭 +``` + +### 2.3 多重捕获 (Java 7+) +```java +try { + // 可能抛出多种异常的代码 + processFile(); +} catch (FileNotFoundException | SecurityException e) { + // 同时处理多种异常 + System.out.println("文件访问错误: " + e.getMessage()); +} catch (IOException e) { + System.out.println("IO错误: " + e.getMessage()); +} +``` + +## 3. 抛出异常 + +### 3.1 声明抛出异常 (throws) +```java +public void readFile(String filename) throws FileNotFoundException, IOException { + if (filename == null) { + throw new IllegalArgumentException("文件名不能为null"); + } + // 读取文件操作 +} +``` + +### 3.2 手动抛出异常 (throw) +```java +public void setAge(int age) { + if (age < 0 || age > 150) { + throw new IllegalArgumentException("年龄必须在0-150之间: " + age); + } + this.age = age; +} +``` + +## 4. 自定义异常 + +```java +// 自定义检查型异常 +class InsufficientFundsException extends Exception { + private double amount; + + public InsufficientFundsException(double amount) { + super("资金不足,缺少: " + amount); + this.amount = amount; + } + + public double getAmount() { + return amount; + } +} + +// 自定义非检查型异常 +class BusinessException extends RuntimeException { + public BusinessException(String message) { + super(message); + } + + public BusinessException(String message, Throwable cause) { + super(message, cause); + } +} +``` + +## 5. 异常链 + +```java +public void processData() throws DataProcessingException { + try { + // 某些操作 + readFromDatabase(); + } catch (SQLException e) { + // 保留原始异常信息 + throw new DataProcessingException("数据处理失败", e); + } +} +``` + +## 6. 异常处理的最佳实践 + +### 6.1 应该做的 ✅ +```java +// 1. 提供有意义的异常信息 +throw new IllegalArgumentException("用户名不能为空"); + +// 2. 保留异常链 +catch (IOException e) { + throw new BusinessException("业务处理失败", e); +} + +// 3. 在合适的层次处理异常 +public void processUserRequest() { + try { + validateRequest(); + processBusiness(); + } catch (ValidationException e) { + logger.warn("请求验证失败", e); + sendErrorResponse("请求参数错误"); + } catch (BusinessException e) { + logger.error("业务处理失败", e); + sendErrorResponse("系统繁忙,请稍后重试"); + } +} + +// 4. 使用具体的异常类型 +// 好: +} catch (FileNotFoundException e) { +// 不好: +} catch (Exception e) { +``` + +### 6.2 不应该做的 ❌ +```java +// 1. 不要忽略异常 +try { + file.delete(); +} catch (SecurityException e) { + // 错误:空的catch块 +} + +// 2. 不要过度使用检查型异常 +public void someMethod() throws Exception { // 太宽泛 + +// 3. 不要在finally块中抛出异常 +finally { + resource.close(); // 如果close()抛出异常,会掩盖原始异常 +} + +// 4. 不要用异常控制流程 +// 错误示例: +try { + while (true) { + list.get(index); + index++; + } +} catch (IndexOutOfBoundsException e) { + // 用异常来结束循环 +} +``` + +## 7. 常见的异常处理模式 + +### 7.1 重试机制 +```java +public void retryOperation(int maxRetries) { + int retries = 0; + while (retries < maxRetries) { + try { + performOperation(); + break; // 成功则退出循环 + } catch (TemporaryException e) { + retries++; + if (retries >= maxRetries) { + throw new PermanentException("操作失败,已达到最大重试次数", e); + } + waitForRetry(retries); + } + } +} +``` + +### 7.2 优雅降级 +```java +public String getConfigValue(String key) { + try { + return readFromDatabase(key); + } catch (DatabaseException e) { + logger.warn("数据库读取失败,使用默认配置", e); + return getDefaultValue(key); // 降级方案 + } +} +``` + +## 总结 + +| 场景 | 推荐做法 | 不推荐做法 | +|------|----------|------------| +| 资源管理 | try-with-resources | 手动try-catch-finally | +| 异常信息 | 提供具体描述 | 使用泛泛的消息 | +| 异常处理 | 在合适层级处理 | 过早捕获或完全忽略 | +| 异常类型 | 使用具体异常类型 | 捕获过于宽泛的Exception | +| 自定义异常 | 继承合适的父类 | 滥用RuntimeException | + +**核心原则**:异常应该用于处理真正"异常"的情况,不应该用于控制正常的程序流程。合理的异常处理能够提高代码的健壮性和可维护性。 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-实现多线程方法.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-实现多线程方法.md new file mode 100644 index 0000000..fd1eacf --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-实现多线程方法.md @@ -0,0 +1,108 @@ + +## 1. 继承Thread类 +```java +class MyThread extends Thread { + @Override + public void run() { + System.out.println("线程执行: " + Thread.currentThread().getName()); + } +} + +// 使用 +MyThread thread = new MyThread(); +thread.start(); +``` + +## 2. 实现Runnable接口(推荐) +```java +class MyRunnable implements Runnable { + @Override + public void run() { + System.out.println("线程执行: " + Thread.currentThread().getName()); + } +} + +// 使用 +Thread thread = new Thread(new MyRunnable()); +thread.start(); + +// 或使用Lambda表达式 +Thread thread2 = new Thread(() -> { + System.out.println("Lambda线程执行"); +}); +thread2.start(); +``` + +## 3. 实现Callable接口(可返回结果) +```java +class MyCallable implements Callable { + @Override + public String call() throws Exception { + return "线程执行结果"; + } +} + +// 使用 +ExecutorService executor = Executors.newSingleThreadExecutor(); +Future future = executor.submit(new MyCallable()); +String result = future.get(); // 获取返回值 +executor.shutdown(); +``` + +## 4. 使用线程池(生产环境推荐) +```java +// 创建线程池 +ExecutorService executor = Executors.newFixedThreadPool(5); + +// 提交任务 +for (int i = 0; i < 10; i++) { + executor.execute(() -> { + System.out.println("线程池任务执行: " + Thread.currentThread().getName()); + }); +} + +// 关闭线程池 +executor.shutdown(); +``` + +## 5. 使用CompletableFuture(Java 8+) +```java +// 异步执行 +CompletableFuture future = CompletableFuture.supplyAsync(() -> { + return "异步任务结果"; +}); + +// 处理结果 +future.thenAccept(result -> System.out.println("收到结果: " + result)); +``` + +## 6. Timer和TimerTask +```java +Timer timer = new Timer(); +timer.schedule(new TimerTask() { + @Override + public void run() { + System.out.println("定时任务执行"); + } +}, 1000, 2000); // 延迟1秒,每2秒执行一次 +``` + +## 总结对比 + +| 方法 | 优点 | 缺点 | 适用场景 | +|------|------|------|----------| +| 继承Thread | 简单直接 | 不能继承其他类 | 简单任务 | +| 实现Runnable | 灵活,可继承其他类 | 无返回值 | 大多数场景 | +| 实现Callable | 有返回值,可抛异常 | 使用相对复杂 | 需要返回结果的场景 | +| 线程池 | 资源管理,性能优化 | 配置复杂 | 生产环境,高并发 | +| CompletableFuture | 异步编程,链式调用 | Java 8+ | 复杂的异步任务 | + +## 最佳实践建议 + +1. **优先使用Runnable接口** - 更灵活,符合面向接口编程 +2. **生产环境使用线程池** - 避免频繁创建销毁线程的开销 +3. **使用Callable获取返回值** - 当需要任务执行结果时 +4. **Java 8+推荐CompletableFuture** - 提供更强大的异步编程能力 +5. **注意线程安全** - 合理使用同步机制 + +最常用的组合是:**Runnable接口 + 线程池**,这种组合既灵活又高效。 \ No newline at end of file diff --git a/public/mengyanote/编程语言/Java/Java基础-导入java文件.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-导入java文件方法.md similarity index 100% rename from public/mengyanote/编程语言/Java/Java基础-导入java文件.md rename to mengyanote-frontend/public/mengyanote/编程语言/Java/Java基础-导入java文件方法.md diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Java/Java标准库常用异常类.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java标准库常用异常类.md new file mode 100644 index 0000000..1301d30 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Java/Java标准库常用异常类.md @@ -0,0 +1,231 @@ + +## 1. java.lang包中的核心异常类 + +### 1.1 Error及其子类(系统错误) + +```java +// 虚拟机错误 +VirtualMachineError + ├── OutOfMemoryError // 内存不足 + ├── StackOverflowError // 栈溢出 + ├── InternalError // 虚拟机内部错误 + └── UnknownError // 未知错误 + +// 链接错误 +LinkageError + ├── NoClassDefFoundError // 类定义未找到 + ├── ClassFormatError // 类格式错误 + ├── VerifyError // 验证错误 + ├── IncompatibleClassChangeError // 不兼容的类变更 + │ ├── NoSuchFieldError // 字段未找到 + │ ├── NoSuchMethodError // 方法未找到 + │ └── IllegalAccessError // 非法访问错误 + └── UnsatisfiedLinkError // 未满足的链接错误 +``` + +### 1.2 Exception及其子类 + +```java +// 运行时异常(非检查型) +RuntimeException + ├── NullPointerException // 空指针异常 + ├── ArrayIndexOutOfBoundsException // 数组越界 + ├── StringIndexOutOfBoundsException // 字符串索引越界 + ├── ClassCastException // 类转换异常 + ├── IllegalArgumentException // 非法参数异常 + │ ├── NumberFormatException // 数字格式异常 + │ ├── IllegalThreadStateException // 非法线程状态 + │ └── InvalidParameterException // 无效参数异常 + ├── IllegalStateException // 非法状态异常 + ├── UnsupportedOperationException // 不支持的操作异常 + ├── ArithmeticException // 算术异常 + ├── NegativeArraySizeException // 负数组大小异常 + ├── ArrayStoreException // 数组存储异常 + ├── SecurityException // 安全异常 + ├── ConcurrentModificationException // 并发修改异常 + ├── IndexOutOfBoundsException // 索引越界异常 + ├── NoSuchElementException // 无此元素异常 + └── EmptyStackException // 空栈异常 + +// 检查型异常 +Exception + ├── IOException (在java.io包中,但继承自Exception) + ├── SQLException (在java.sql包中) + ├── ReflectiveOperationException + │ ├── ClassNotFoundException // 类未找到 + │ ├── NoSuchMethodException // 方法未找到 + │ ├── NoSuchFieldException // 字段未找到 + │ └── IllegalAccessException // 非法访问异常 + ├── CloneNotSupportedException // 克隆不支持异常 + ├── InterruptedException // 线程中断异常 + └── ParseException (在java.text包中) +``` + +## 2. java.io包中的IO异常类 + +```java +IOException + ├── FileNotFoundException // 文件未找到异常 + ├── EOFException // 文件结束异常 + ├── SocketException (在java.net包中) + ├── InterruptedIOException // 中断IO异常 + ├── UnsupportedEncodingException // 不支持的编码异常 + ├── UTFDataFormatException // UTF数据格式异常 + ├── SyncFailedException // 同步失败异常 + ├── CharConversionException // 字符转换异常 + ├── ObjectStreamException // 对象流异常 + │ ├── InvalidClassException // 无效类异常 + │ ├── NotSerializableException // 不可序列化异常 + │ ├── StreamCorruptedException // 流损坏异常 + │ └── WriteAbortedException // 写入中止异常 + ├── ZipException (在java.util.zip包中) + └── JarException (在java.util.jar包中) +``` + +## 3. java.net包中的网络异常类 + +```java +IOException + └── SocketException + ├── BindException // 绑定异常 + ├── ConnectException // 连接异常 + ├── NoRouteToHostException // 无路由到主机异常 + └── PortUnreachableException // 端口不可达异常 + +// 其他网络异常 +MalformedURLException // 错误的URL格式异常 +ProtocolException // 协议异常 +UnknownHostException // 未知主机异常 +UnknownServiceException // 未知服务异常 +URISyntaxException // URI语法异常 +``` + +## 4. java.util包中的工具类异常 + +```java +// 并发异常 +ConcurrentModificationException // 并发修改异常 + +// 其他工具异常 +EmptyStackException // 空栈异常 +InputMismatchException // 输入不匹配异常 +NoSuchElementException // 无此元素异常 +TooManyListenersException // 监听器过多异常 +IllegalFormatException // 非法格式异常 +DuplicateFormatFlagsException // 重复格式标志异常 +UnknownFormatConversionException // 未知格式转换异常 +MissingFormatArgumentException // 缺少格式参数异常 +MissingFormatWidthException // 缺少格式宽度异常 +MissingResourceException // 缺少资源异常 +``` + +## 5. java.util.concurrent包中的并发异常 + +```java +ExecutionException // 执行异常 +CancellationException // 取消异常 +TimeoutException // 超时异常 +BrokenBarrierException // 屏障损坏异常 +RejectedExecutionException // 拒绝执行异常 +CompletionException // 完成异常 +``` + +## 6. java.security包中的安全异常 + +```java +AccessControlException // 访问控制异常 +GeneralSecurityException // 通用安全异常 + ├── InvalidKeyException // 无效密钥异常 + ├── KeyManagementException // 密钥管理异常 + ├── KeyStoreException // 密钥库异常 + ├── NoSuchAlgorithmException // 无此算法异常 + ├── SignatureException // 签名异常 + ├── CertificateException // 证书异常 + ├── InvalidAlgorithmParameterException // 无效算法参数异常 + └── UnrecoverableKeyException // 不可恢复密钥异常 +``` + +## 7. java.text包中的文本处理异常 + +```java +ParseException // 解析异常 +``` + +## 8. java.time包中的时间异常 + +```java +DateTimeException // 日期时间异常 +``` + +## 9. java.nio包中的NIO异常 + +```java +BufferOverflowException // 缓冲区溢出异常 +BufferUnderflowException // 缓冲区下溢异常 +InvalidMarkException // 无效标记异常 +ReadOnlyBufferException // 只读缓冲区异常 +``` + +## 10. 其他重要的异常类 + +```java +// javax包中的异常 +javax.management.JMException +javax.naming.NamingException +javax.servlet.ServletException +javax.transaction.TransactionException + +// 企业级异常 +javax.ejb.EJBException +javax.persistence.PersistenceException +``` + +## 11. 常见的自定义异常基类 + +虽然这些不是Java内置的,但经常被用作自定义异常的基类: + +```java +// 业务异常 +BusinessException +ApplicationException +ServiceException +DAOException + +// 系统异常 +SystemException +TechnicalException +InfrastructureException +``` + +## 异常类层次结构总结 + +``` +Throwable +├── Error (系统错误,不可恢复) +│ ├── VirtualMachineError +│ ├── LinkageError +│ └── ... +│ +└── Exception (应用程序异常) + ├── RuntimeException (非检查型异常) + │ ├── NullPointerException + │ ├── IllegalArgumentException + │ ├── IllegalStateException + │ └── ... + │ + └── 其他Exception (检查型异常) + ├── IOException + ├── SQLException + ├── ReflectiveOperationException + └── ... +``` + +## 使用建议 + +1. **选择合适的异常类型**:根据具体场景选择最合适的异常类 +2. **避免捕获过于宽泛的异常**:不要轻易捕获 `Exception` 或 `Throwable` +3. **自定义异常**:当内置异常无法准确描述问题时,创建自定义异常 +4. **异常信息**:提供清晰、有用的异常信息 +5. **异常链**:保留原始异常信息,便于问题追踪 + +这个列表涵盖了Java标准库中大部分常用的异常类,实际开发中还会遇到各种框架和库提供的特定异常类。 \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Java/代码片段/代码片段-标准HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/代码片段/代码片段-标准HelloWorld输出.md new file mode 100644 index 0000000..6addb05 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Java/代码片段/代码片段-标准HelloWorld输出.md @@ -0,0 +1,7 @@ +```java +public class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Java/代码片段/代码片段-特殊HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/Java/代码片段/代码片段-特殊HelloWorld输出.md new file mode 100644 index 0000000..daf3aab --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Java/代码片段/代码片段-特殊HelloWorld输出.md @@ -0,0 +1,13 @@ +```java +//使用反射 +import java.lang.reflect.Method; + +public class ReflectiveHello { + public static void main(String[] args) throws Exception { + Method method = System.class.getMethod("out"); + Object out = method.invoke(null); + Method println = out.getClass().getMethod("println", String.class); + println.invoke(out, "Hello, World!"); + } +} +``` \ No newline at end of file diff --git a/public/mengyanote/编程语言/Python/Kivy/kivy编译安卓APK.md b/mengyanote-frontend/public/mengyanote/编程语言/Python/Kivy/kivy编译安卓APK.md similarity index 100% rename from public/mengyanote/编程语言/Python/Kivy/kivy编译安卓APK.md rename to mengyanote-frontend/public/mengyanote/编程语言/Python/Kivy/kivy编译安卓APK.md diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Python/Python后端框架.md b/mengyanote-frontend/public/mengyanote/编程语言/Python/Python后端框架.md new file mode 100644 index 0000000..c284fe1 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Python/Python后端框架.md @@ -0,0 +1,155 @@ +Python的后端框架主要可以分为全功能框架和微框架两大类 + +## 🏆 **全功能框架(Full-Stack Frameworks)** + +### **1. Django** - *最流行的全能选手* +- **特点**:开箱即用、功能全面、文档完善 +- **包含功能**: + - 强大的ORM(对象关系映射) + - 自带管理后台(Admin) + - 用户认证系统 + - 模板引擎 + - 表单处理 + - 安全性优秀(CSRF、SQL注入防护等) + +```python +# Django示例 +from django.http import HttpResponse + +def hello(request): + return HttpResponse("Hello, Django!") +``` + +### **2. FastAPI** - *现代高性能框架* +- **特点**:异步支持、自动API文档、类型提示 +- **优势**: + - 极高的性能(基于Starlette和Pydantic) + - 自动生成Swagger/OpenAPI文档 + - 依赖注入系统 + - 支持WebSocket + +```python +# FastAPI示例 +from fastapi import FastAPI + +app = FastAPI() + +@app.get("/") +async def root(): + return {"message": "Hello FastAPI"} +``` + +## ⚡ **微框架(Micro Frameworks)** + +### **3. Flask** - *灵活轻量的经典选择* +- **特点**:轻量级、灵活、扩展性强 +- **核心理念**:只提供核心功能,其他通过扩展实现 + +```python +# Flask示例 +from flask import Flask +app = Flask(__name__) + +@app.route('/') +def hello(): + return 'Hello, Flask!' +``` + +### **4. Bottle** - *超轻量级* +- **特点**:单文件框架、无外部依赖 +- **适用场景**:小型应用、API服务、快速原型 + +```python +# Bottle示例 +from bottle import route, run + +@route('/') +def hello(): + return "Hello, Bottle!" + +run(host='localhost', port=8080) +``` + +## 🔄 **异步框架(Async Frameworks)** + +### **5. Tornado** - *异步非阻塞框架* +- **特点**:非阻塞I/O、适合长连接应用 +- **典型应用**:实时Web服务、WebSocket应用 + +```python +# Tornado示例 +import tornado.web +import tornado.ioloop + +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, Tornado!") +``` + +### **6. Sanic** - *异步Flask风格框架* +- **特点**:类似Flask的API设计、异步支持 +- **性能**:基于uvloop,速度极快 + +```python +# Sanic示例 +from sanic import Sanic +from sanic.response import json + +app = Sanic("MyApp") + +@app.route("/") +async def test(request): + return json({"hello": "world"}) +``` + +## 📊 **框架对比** + +| 框架 | 类型 | 学习曲线 | 性能 | 适用场景 | +|------|------|----------|------|----------| +| Django | 全功能 | 中等 | 良好 | 内容管理、企业应用 | +| FastAPI | 全功能/API | 中等 | **优秀** | API服务、微服务 | +| Flask | 微框架 | 简单 | 良好 | 小型应用、原型开发 | +| Bottle | 微框架 | 简单 | 良好 | 小型应用、脚本 | +| Tornado | 异步 | 较陡 | 优秀 | 实时应用、长连接 | +| Sanic | 异步 | 中等 | **极佳** | 高性能API | + +## 🎯 **如何选择?** + +### **选择 Django 如果:** +- 需要快速构建功能完整的应用 +- 项目需要管理后台、用户系统等标准功能 +- 团队协作,需要规范化的项目结构 +- 对安全性要求较高 + +### **选择 FastAPI 如果:** +- 构建高性能API服务 +- 需要自动API文档 +- 使用现代Python特性(类型提示) +- 需要异步支持 + +### **选择 Flask 如果:** +- 项目规模较小或中等 +- 需要高度灵活性 +- 想要按需添加功能 +- 学习Python Web开发的起点 + +### **选择异步框架(Sanic/Tornado)如果:** +- 需要处理大量并发连接 +- 构建实时应用(聊天、通知) +- 需要WebSocket支持 +- 对性能要求极高 + +## 🌟 **其他值得关注的框架** + +- **Quart**:兼容Flask API的异步框架 +- **Falcon**:专注于API开发的极简框架 +- **Pyramid**:介于Django和Flask之间的灵活框架 +- **AIOHTTP**:基于asyncio的HTTP客户端/服务器框架 + +## 💡 **建议** + +1. **初学者**:从Flask开始,理解Web开发基础 +2. **企业项目**:考虑Django(全功能)或FastAPI(API优先) +3. **高性能需求**:FastAPI或Sanic +4. **实时应用**:Tornado或Sanic +5. **快速原型**:Flask或Bottle diff --git a/public/mengyanote/编程语言/Python/Python国内pip加速镜像.md b/mengyanote-frontend/public/mengyanote/编程语言/Python/Python国内pip加速镜像.md similarity index 100% rename from public/mengyanote/编程语言/Python/Python国内pip加速镜像.md rename to mengyanote-frontend/public/mengyanote/编程语言/Python/Python国内pip加速镜像.md diff --git a/public/mengyanote/编程语言/Python/Pywebview库功能一览.md b/mengyanote-frontend/public/mengyanote/编程语言/Python/Pywebview库功能一览.md similarity index 100% rename from public/mengyanote/编程语言/Python/Pywebview库功能一览.md rename to mengyanote-frontend/public/mengyanote/编程语言/Python/Pywebview库功能一览.md diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Python/代码片段/代码片段-标准HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/Python/代码片段/代码片段-标准HelloWorld输出.md new file mode 100644 index 0000000..9b1804a --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Python/代码片段/代码片段-标准HelloWorld输出.md @@ -0,0 +1,3 @@ +```python +print("Hello, World!") +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/Python/代码片段/代码片段-特殊HelloWorld输出.md b/mengyanote-frontend/public/mengyanote/编程语言/Python/代码片段/代码片段-特殊HelloWorld输出.md new file mode 100644 index 0000000..04b56a3 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/Python/代码片段/代码片段-特殊HelloWorld输出.md @@ -0,0 +1,18 @@ +```python +#一行代码多种写法 +# 方法1: 使用exec和编码 +exec(bytes([72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33])) + +# 方法2: 使用__import__ +__import__('builtins').print('Hello, World!') + +# 方法3: 使用字符串格式化 +(lambda x: print(x))('Hello, World!') + +# 方法4: 使用reduce +from functools import reduce +reduce(lambda x,y: print(x) or y, ['Hello, World!']) + +# 方法5: 使用列表推导 +[print('Hello, World!') for _ in range(1)] +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_128.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_128.md new file mode 100644 index 0000000..e632b21 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_128.md @@ -0,0 +1,42 @@ +# JavaScript趣味题 #128 + +> 导出时间: 2025/8/29 14:32:49 + +## 题目 + +输出什么? + +## 代码 + +```javascript +const name = "Lydia Hallie"; +const age = 21; + +console.log(Number.isNaN(name)); +console.log(Number.isNaN(age)); + +console.log(isNaN(name)); +console.log(isNaN(age)); +``` + +## 选项 + +A. A: `true` `false` `true` `false` +B. B: `true` `false` `false` `false` +C. C: `false` `false` `true` `false` ✅ +D. D: `false` `true` `false` `true` + +## 正确答案 + +**C** + +## 答案解析 + +通过方法 `Number.isNaN`,你可以检测你传递的值是否为 _数字值_ 并且是否等价于 `NaN`。`name` 不是一个数字值,因此 `Number.isNaN(name)` 返回 `false`。`age` 是一个数字值,但它不等价于 `NaN`,因此 `Number.isNaN(age)` 返回 `false`. + +通过方法 `isNaN`,你可以检测你传递的值是否一个 number。`name` 不是一个 `number`,因此 `isNaN(name)` 返回 `true`. `age` 是一个 `number` 因此 `isNaN(age)` 返回 `false`. + +--- + +*本题目来源于JavaScript趣味题集合* +*导出工具: JavaScript趣味题网页版* diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_18.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_18.md new file mode 100644 index 0000000..d7b459b --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_18.md @@ -0,0 +1,46 @@ +# JavaScript趣味题 #18 + +> 导出时间: 2025/8/29 14:53:34 + +## 题目 + +输出是什么? + +## 代码 + +```javascript +function checkAge(data) { + if (data === { age: 18 }) { + console.log('You are an adult!') + } else if (data == { age: 18 }) { + console.log('You are still an adult.') + } else { + console.log(`Hmm.. You don't have an age I guess`) + } +} + +checkAge({ age: 18 }) +``` + +## 选项 + +A. A: `You are an adult!` +B. B: `You are still an adult.` +C. C: `Hmm.. You don't have an age I guess` ✅ + +## 正确答案 + +**C** + +## 答案解析 + +在测试相等性时,基本类型通过它们的值(value)进行比较,而对象通过它们的引用(reference)进行比较。JavaScript 检查对象是否具有对内存中相同位置的引用。 + +题目中我们正在比较的两个对象不是同一个引用:作为参数传递的对象引用的内存位置,与用于判断相等的对象所引用的内存位置并不同。 + +这也是 `{ age: 18 } === { age: 18 }` 和 `{ age: 18 } == { age: 18 }` 都返回 `false` 的原因。 + +--- + +*本题目来源于JavaScript趣味题集合* +*导出工具: JavaScript趣味题网页版* diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_28.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_28.md new file mode 100644 index 0000000..b6c577d --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/JavaScript趣味题/JavaScript趣味题_28.md @@ -0,0 +1,39 @@ +# JavaScript趣味题 #28 + +> 导出时间: 2025/8/29 14:28:13 + +## 题目 + +输出是什么? + +## 代码 + +```javascript +String.prototype.giveLydiaPizza = () => { + return 'Just give Lydia pizza already!' +} + +const name = 'Lydia' + +name.giveLydiaPizza() +``` + +## 选项 + +A. A: `"Just give Lydia pizza already!"` ✅ +B. B: `TypeError: not a function` +C. C: `SyntaxError` +D. D: `undefined` + +## 正确答案 + +**A** + +## 答案解析 + +`String` 是内置的构造函数,我们可以向它添加属性。我只是在它的原型中添加了一个方法。基本类型字符串被自动转换为字符串对象,由字符串原型函数生成。因此,所有 string(string 对象) 都可以访问该方法! + +--- + +*本题目来源于JavaScript趣味题集合* +*导出工具: JavaScript趣味题网页版* diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/OpenList美化代码.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/OpenList美化代码.md new file mode 100644 index 0000000..e3ce999 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/OpenList美化代码.md @@ -0,0 +1,230 @@ +```html + + +``` + + +```html + + + + + + + + +``` + + +```html + + + + + +``` + +```html + +``` \ No newline at end of file diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/React打包成Windows和Android软件方案.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/React打包成Windows和Android软件方案.md new file mode 100644 index 0000000..351dc4b --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/React打包成Windows和Android软件方案.md @@ -0,0 +1,146 @@ + +# 核心思路(快速决策) + +- **Windows(成熟 & 快)**:用 **Electron** + `electron-builder`(或 Electron Forge)把 web 前端放进 WebView,桌面端直接运行/或同时启动本地后端进程。成熟、生态完善、发布流程(安装包、自动更新、签名)有现成方案。 +- **Windows(瘦体积)**:若关心体积、原生安全,考虑 **Tauri**(Rust 后端,最终二进制更小)。但学习/环境比 Electron 略复杂。 +- **Android(快 & 直接把现有 web 变原生)**:用 **Capacitor**(Ionic 团队)把生产构建的前端打包成 Android 原生工程,再用 Android Studio 打包签名上传 Play。对保留现有 React 网页最省力。 +- **Android(PWA 路线,最快上线)**:如果你的 React 是 PWA(有 service worker、HTTPS、manifest),可以做 **Trusted Web Activity (TWA)**,用 Bubblewrap/PWABuilder 生成 Android 包并上架(适合想最小工作量上 Play 的场景)。 + +下面给出每条路线的**实战步骤、常见陷阱和示例命令**。 + +--- + +# 路线 A — 推荐(最快、最成熟):**Electron(Windows) + Capacitor(Android)** + +适合:不想重写、后端可以继续作为远端服务(推荐),要快速得到桌面 + Android 双端。 + +## 1) 通用准备(前端) + +1. 把 React 做生产构建(示例用 CRA / Vite): + `npm run build`(或 `yarn build`),生成 `dist/` 或 `build/`。 +2. 确保所有 API 用 HTTPS、CORS、并把生产 API 域配置好(不要在客户端明文放敏感秘钥)。 + + +## 2) Windows:Electron + electron-builder(快速、成熟) + +概念:Electron 启一个 native 窗口并加载你的静态 `build/`。用 `electron-builder` 打包成 installer(NSIS/MSI/portable)并可做代码签名与自动更新。 + +快速步骤(最小): + +- 项目根目录加入 `electron` 主进程文件(`main.js`),让它加载 `build/index.html`。 +- 安装依赖并配置打包: + + +```bash +# 依赖 +npm install --save-dev electron electron-builder +# package.json scripts 示例 +"scripts": { + "build:web": "npm run build", # 你的 React build + "start:electron": "electron .", + "dist": "npm run build:web && electron-builder" +}, +"build": { + "appId": "com.yourcompany.app", + "files": ["build/**/*", "main.js", "package.json"], + "win": {"target":["nsis","portable"]} +} +``` + +- 本地测试:`npm run start:electron`。 + +- 生成发布包:`npm run dist`(electron-builder 会产出 `.exe` / `.msi` / installer)。 + + +**如果需要把后端随应用打包(可选但更复杂)**: +常见做法是把 Node 后端打成独立 exe(用 `pkg` 或 `nexe`),在 Electron 启动时用 `child_process.spawn()` 启动本地服务,再让前端调用 `http://localhost:xxxx`。这样用户本地拥有完整后端(适合离线或内网部署)。示例工具:`pkg`、`nexe`。注意:安全、端口冲突、自动更新、杀进程清理等需要处理。 + +常见注意点: + +- Electron 应用体积通常较大(几十 MB 起);自动更新、签名(Authenticode)建议上线前完成。 +- 在 CI(如 GitHub Actions)上可以交叉构建,但 Windows 的代码签名通常在 Windows runner 或专门流程中完成。 + + +--- + +## 3) Android:Capacitor(把 web 打包成原生 APK/AAB) + +概念:Capacitor 将你的 `build/` 内容嵌入到一个原生 Android 项目(WebView),并提供与原生桥接的插件 API。非常适合把现有 web 转 app。 + +快速步骤(最小): + +```bash +# 在项目根(build 已存在) +npm install @capacitor/core @capacitor/cli +npx cap init "MyApp" com.example.myapp --web-dir=build +npx cap add android +# 每次 web 有新 build: +npm run build +npx cap copy android +npx cap open android # 在 Android Studio 中打开,构建、签名、导出 AAB +``` + +在 Android Studio 中使用 **Build → Generate Signed Bundle / APK** 来生成签名的 AAB 上传到 Play(Play 推荐上传 AAB)。发布与签名细节见 Google Play 签名文档(Play App Signing)。 + +常见注意点: + +- 若后端是远端 API,Android 里可直接请求远端;若需要本地 DB,使用 SQLite 或 Capacitor 的 Storage/插件而不是在设备上运行完整 Node 后端。 +- 调试网络(开发时指向本地 dev server)可用 `npx cap open android` 并在 `capacitor.config.*` 设置 `server.url` 来启用 live reload(但生产请编译静态文件)。 + + +--- + +# 路线 B — 可选:**Tauri(Windows 更小) + Capacitor/TWA(Android)** + +- 若你很在意桌面体积与原生安全性,**Tauri** 是比 Electron 更轻量的替代品(用 Rust 来打包、使用系统 WebView),生成的二进制更小且性能好。缺点:本地构建环境(Rust / MSVC)和插件生态比 Electron 小一些。 +- Android 仍建议用 Capacitor 或 TWA 路线(Tauri 的移动支持还在发展中)。 + + +Tauri 打包基本:`npm run build`(前端)然后 `tauri build`(生成 Windows installer / exe)——详见 Tauri 分发文档(Windows 打包细节、WebView2 要求等)。 + +--- + +# 路线 C — 直接 PWA → Play(最快上架 Android) + +如果你的 React 已经是 PWA(manifest + SW),通过 **TWA**(Trusted Web Activity)把 PWA 裹进一个最小的 Android 应用是最快的上 Play 方式:用 **Bubblewrap** / PWABuilder 生成项目,然后签名上传 Play。适合不需要本地原生 API,仅需离线缓存与简单推送的场景。 + +--- + +# 后端打包 vs 远端服务的建议(关键设计决策) + +- **优先把后端作为远端服务**(部署到云/内网)——理由:升级、补丁、数据库统一管理、安全容易;前端变体(桌面/Android/PWA)都指向同一 API,开发运维简单。 +- 仅在必须(离线、内网隔离)时,把后端打包到桌面:用 `pkg` / `nexe` 做 Node -> exe,再由 Electron 启动子进程(`child_process.spawn`)。Android 上嵌入 Node 很麻烦(可选 nodejs-mobile,但生态少),因此若后端要内嵌,桌面比手机更现实。 + + +--- + +# 上线前必须做的成熟化步骤(checklist) + +1. **安全**:HTTPS、CSP、Key/Secret 不放前端;XSS/CSRF/认证策略。 +2. **签名与发布**:Windows 用 Authenticode 证书签名;Android 用 Play App Signing(上传签名/上传 key)。 +3. **自动更新**:Electron 有 `electron-updater`/electron-builder 集成;考虑 OTA 策略。 +4. **CI/CD**:用 GitHub Actions / Azure / CircleCI 自动构建 web、electron dist、Android AAB(包含签名步骤)。 +5. **测试**:多架构/多机型测试、模拟断网、升级回滚测试。 +6. **体积优化**:压缩静态资源、剔除 dev 依赖、考虑 Tauri 以减小 exe 体积。 + + +--- + +# 推荐组合(按你想要的结果选) + +- **最快上手 + 最成熟**:Electron(Windows) + Capacitor(Android),后端保留云端。 +- **追求二进制最瘦**:Tauri(Windows) + Capacitor/TWA(Android)。 +- **只想最快上线到 Play(不做原生功能)**:PWA → TWA(Bubblewrap/PWABuilder)。 + + +--- + +# 我可以直接帮你做的事(选一项即可回复) + +1. 给你一份针对你 current React 项目的 **具体脚本(package.json)+ Electron 主进程示例 + electron-builder 配置**(Windows 一键打包脚本)。 +2. 给你一份 **Capacitor 打包到 Android 的 step-by-step 脚本 & Android Studio 签名操作流水线**(含 AAB 签名命令示例)。 +3. 或者把 **把后端打包为 exe 的示例(pkg/nexe)并在 Electron 中 spawn 的最小示例** 发给你。 + +告诉我你要哪一项(例如“给我 Electron + 打包脚本”),我立刻把完整代码/命令/CI 配置直接生成给你(无需你再提供额外信息即可开始)。 + +--- diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/React标准项目架构.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/React标准项目架构.md new file mode 100644 index 0000000..adace6d --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/React标准项目架构.md @@ -0,0 +1,217 @@ + +### 目录结构 +``` +src/ +├── api/ # API 接口管理 +│ ├── modules/ # 模块化 API +│ │ ├── auth.js +│ │ ├── user.js +│ │ └── product.js +│ ├── request.js # Axios 配置和拦截器 +│ ├── constants.js # API 常量 +│ └── index.js # API 统一导出 +├── assets/ # 静态资源 +│ ├── images/ # 图片资源 +│ ├── fonts/ # 字体文件 +│ ├── icons/ # SVG 图标 +│ └── styles/ # 全局样式 +│ ├── _variables.scss # SCSS 变量 +│ ├── _mixins.scss # SCSS 混合 +│ ├── _global.scss # 全局样式 +│ └── index.scss # 样式入口文件 +├── components/ # 公共组件 +│ ├── common/ # 通用组件(按钮、输入框等) +│ │ ├── Button/ +│ │ │ ├── index.tsx +│ │ │ ├── Button.tsx +│ │ │ ├── Button.module.scss +│ │ │ ├── types.ts +│ │ │ └── index.test.tsx +│ ├── layout/ # 布局组件 +│ │ ├── Header/ +│ │ ├── Sidebar/ +│ │ ├── Footer/ +│ │ └── PageContainer/ +│ └── business/ # 业务组件(可复用的业务模块) +├── containers/ # 容器组件(连接 Redux) +├── pages/ # 页面组件 +│ ├── Login/ +│ ├── Dashboard/ +│ ├── UserManagement/ +│ └── ProductManagement/ +├── store/ # 状态管理 +│ ├── modules/ # Redux 模块 +│ │ ├── auth/ +│ │ ├── user/ +│ │ └── product/ +│ ├── rootReducer.ts # 根 Reducer +│ ├── rootSaga.ts # 根 Saga +│ ├── store.ts # Store 配置 +│ └── types/ # TypeScript 类型定义 +├── hooks/ # 自定义 Hooks +│ ├── useAuth.ts +│ ├── useFetch.ts +│ ├── useLocalStorage.ts +│ └── useDebounce.ts +├── router/ # 路由配置 +│ ├── routes/ # 路由配置 +│ │ ├── publicRoutes.tsx # 公开路由 +│ │ ├── privateRoutes.tsx # 私有路由 +│ │ └── routesConfig.ts # 路由配置 +│ ├── guards/ # 路由守卫 +│ │ ├── AuthGuard.tsx +│ │ └── PermissionGuard.tsx +│ └── index.tsx # 路由主文件 +├── utils/ # 工具函数 +│ ├── helpers/ # 辅助函数 +│ ├── validators/ # 验证函数 +│ ├── formatters/ # 格式化函数 +│ ├── constants.ts # 全局常量 +│ └── index.ts # 工具函数统一导出 +├── services/ # 服务层 +│ ├── authService.ts +│ ├── userService.ts +│ └── storageService.ts +├── types/ # 全局 TypeScript 类型定义 +│ ├── global.d.ts # 全局类型声明 +│ ├── api.types.ts # API 类型 +│ └── store.types.ts # Redux 类型 +├── config/ # 配置文件 +│ ├── env.ts # 环境变量配置 +│ ├── settings.ts # 应用设置 +│ └── featureFlags.ts # 功能开关 +├── App.tsx # 根组件 +├── main.tsx # 入口文件 +└── setupTests.ts # 测试配置 + +public/ # 静态资源(不经过构建) +├── index.html +├── favicon.ico +├── manifest.json +└── robots.txt + +tests/ # 测试文件 +├── unit/ # 单元测试 +├── integration/ # 集成测试 +├── e2e/ # 端到端测试 +└── mocks/ # 测试模拟数据 + +scripts/ # 构建脚本 +├── build.js +├── start.js +└── deploy.js + +config/ # 构建配置 +├── webpack/ +│ ├── webpack.common.js +│ ├── webpack.dev.js +│ └── webpack.prod.js +└── jest.config.js + +docs/ # 项目文档 +├── api.md +├── architecture.md +└── development.md +``` + +### 关键配置文件 + +#### package.json 示例 +```json +{ + "name": "react-enterprise-app", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "cross-env NODE_ENV=development webpack serve --config config/webpack/webpack.dev.js", + "build:dev": "cross-env NODE_ENV=development webpack --config config/webpack/webpack.dev.js", + "build:prod": "cross-env NODE_ENV=production webpack --config config/webpack/webpack.prod.js", + "test": "jest", + "test:coverage": "jest --coverage", + "lint": "eslint src --ext .ts,.tsx", + "lint:fix": "eslint src --ext .ts,.tsx --fix", + "format": "prettier --write \"src/**/*.{ts,tsx,js,json,css,scss}\"", + "type-check": "tsc --noEmit", + "prepare": "husky install", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.14.0", + "@reduxjs/toolkit": "^1.9.5", + "react-redux": "^8.1.1", + "axios": "^1.4.0", + "dayjs": "^1.11.9", + "lodash-es": "^4.17.21", + "immer": "^10.0.3", + "clsx": "^1.2.1" + }, + "devDependencies": { + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", + "@types/node": "^20.3.1", + "typescript": "^5.1.3", + "webpack": "^5.88.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "sass": "^1.62.1", + "@babel/core": "^7.22.5", + "@babel/preset-env": "^7.22.5", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "eslint": "^8.43.0", + "@typescript-eslint/eslint-plugin": "^5.60.1", + "@typescript-eslint/parser": "^5.60.1", + "prettier": "^2.8.8", + "husky": "^8.0.3", + "lint-staged": "^13.2.3", + "jest": "^29.5.0", + "@testing-library/react": "^14.0.0", + "@testing-library/jest-dom": "^5.16.5", + "@storybook/react": "^7.0.24", + "cross-env": "^7.0.3" + } +} +``` + +#### TypeScript 配置 (tsconfig.json) +```json +{ + "compilerOptions": { + "target": "ES2020", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "baseUrl": "src", + "paths": { + "@/*": ["*"], + "@components/*": ["components/*"], + "@pages/*": ["pages/*"], + "@utils/*": ["utils/*"], + "@api/*": ["api/*"], + "@store/*": ["store/*"], + "@hooks/*": ["hooks/*"], + "@types/*": ["types/*"] + } + }, + "include": ["src", "types"], + "exclude": ["node_modules", "dist", "build"] +} +``` + + + + diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/React项目初始化教程.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/React项目初始化教程.md new file mode 100644 index 0000000..580e4c2 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/React项目初始化教程.md @@ -0,0 +1,79 @@ + +--- + +# ✅ **方式一:使用 Vite 初始化 React 项目(推荐,最快最轻量)** + +### **1. 安装 Node.js(必须)** + +确保 Node 版本 ≥ 18 +检查: +```bash +node -v +``` + +--- + +### **2. 使用 Vite 创建 React 项目** + +```bash +npm create vite@latest my-react-app -- --template react +``` +如果你想要 TypeScript 版本: +```bash +npm create vite@latest my-react-app -- --template react-ts +``` + +--- + +### **3. 安装依赖** + +```bash +cd my-react-app +npm install +``` + +--- + +### **4. 启动开发环境** + +```bash +npm run dev +``` +浏览器访问提示的 localhost 地址即可。 + +--- + +# ✅ **方式二:使用 Create-React-App(传统方案,不推荐但能用)** + +(CRA 已多年未更新,官方推荐迁移到 Vite) + +### 1. 创建项目 + +```bash +npx create-react-app my-react-app +``` + +### 2. 启动项目 + +```bash +cd my-react-app +npm start +``` + +--- + +# ✅ **方式三:使用 Next.js(如果你准备做大一点的项目)** + +如果你想做: +✔ SEO +✔ 服务端渲染 +✔ 大型项目结构 +✔ API 路由 + +推荐 Next.js: + +```bash +npx create-next-app@latest +``` + +--- diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/Vue标准项目架构.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/Vue标准项目架构.md new file mode 100644 index 0000000..9d910ad --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/Vue标准项目架构.md @@ -0,0 +1,237 @@ + +### 目录结构 +``` +src/ +├── api/ # API 接口管理 +│ ├── modules/ # 模块化 API +│ │ ├── auth.ts +│ │ ├── user.ts +│ │ └── product.ts +│ ├── request.ts # Axios 配置和拦截器 +│ ├── types/ # API 类型定义 +│ └── index.ts # API 统一导出 +├── assets/ # 静态资源 +│ ├── images/ +│ ├── fonts/ +│ ├── svg/ # SVG 图标 +│ └── styles/ +│ ├── variables.scss # SCSS 变量 +│ ├── mixins.scss # SCSS 混合 +│ ├── global.scss # 全局样式 +│ └── index.scss # 样式入口 +├── components/ # 组件 +│ ├── common/ # 通用组件 +│ │ ├── BaseButton/ +│ │ │ ├── BaseButton.vue +│ │ │ ├── BaseButton.scss +│ │ │ └── index.ts +│ │ ├── BaseInput/ +│ │ └── BaseModal/ +│ ├── layout/ # 布局组件 +│ │ ├── AppHeader.vue +│ │ ├── AppSidebar.vue +│ │ ├── AppFooter.vue +│ │ └── AppMain.vue +│ └── business/ # 业务组件 +├── views/ # 页面视图 +│ ├── Login/ +│ │ ├── Login.vue +│ │ ├── Login.scss +│ │ └── components/ # 页面内部组件 +│ ├── Dashboard/ +│ ├── UserManagement/ +│ └── ProductManagement/ +├── stores/ # Pinia 状态管理 +│ ├── modules/ # Store 模块 +│ │ ├── auth.ts +│ │ ├── user.ts +│ │ └── product.ts +│ ├── types/ # Store 类型定义 +│ └── index.ts # Store 统一导出 +├── router/ # 路由配置 +│ ├── routes/ # 路由定义 +│ │ ├── index.ts +│ │ ├── public.ts # 公开路由 +│ │ └── private.ts # 私有路由 +│ ├── guards/ # 路由守卫 +│ │ ├── auth.ts +│ │ └── permission.ts +│ └── index.ts # 路由主文件 +├── composables/ # 组合式函数 +│ ├── useFetch.ts +│ ├── useForm.ts +│ ├── useLocalStorage.ts +│ └── useDebounce.ts +├── utils/ # 工具函数 +│ ├── helpers/ # 辅助函数 +│ ├── validators/ # 验证函数 +│ ├── formatters/ # 格式化函数 +│ ├── constants.ts # 常量 +│ └── index.ts # 统一导出 +├── directives/ # 自定义指令 +│ ├── v-permission.ts +│ ├── v-loading.ts +│ └── v-lazy.ts +├── plugins/ # Vue 插件 +│ ├── element-plus.ts # UI 库引入 +│ ├── i18n.ts # 国际化 +│ └── index.ts # 插件安装 +├── types/ # 全局类型定义 +│ ├── global.d.ts +│ ├── shims-vue.d.ts +│ └── modules/ # 模块类型 +├── App.vue # 根组件 +├── main.ts # 入口文件 +├── env.d.ts # 环境变量类型 +└── auto-imports.d.ts # 自动导入类型 + +public/ # 静态资源 +├── index.html +├── favicon.ico +└── robots.txt + +tests/ +├── unit/ # 单元测试 +├── e2e/ # 端到端测试 +└── mocks/ # 模拟数据 + +scripts/ # 脚本文件 +├── build.js +├── deploy.js +└── analyze.js + +docs/ # 项目文档 +├── api/ +├── components/ +└── deployment/ + +storybook/ # Storybook 配置 +├── main.js +└── preview.js +``` + +### 关键配置文件 + +#### package.json 示例 +```json +{ + "name": "vue-enterprise-app", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "run-p type-check build-only", + "build-only": "vite build", + "preview": "vite preview", + "type-check": "vue-tsc --noEmit", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix", + "format": "prettier --write \"src/**/*.{vue,ts,tsx,js,json,css,scss}\"", + "test:unit": "vitest", + "test:e2e": "cypress run", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" + }, + "dependencies": { + "vue": "^3.3.4", + "vue-router": "^4.2.4", + "pinia": "^2.1.4", + "axios": "^1.4.0", + "element-plus": "^2.3.4", + "@element-plus/icons-vue": "^2.1.0", + "dayjs": "^1.11.9", + "lodash-es": "^4.17.21", + "nprogress": "^0.2.0", + "screenfull": "^6.0.2", + "vue-i18n": "^9.4.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vue/tsconfig": "^0.4.0", + "typescript": "^5.1.3", + "vue-tsc": "^1.4.2", + "vite": "^4.3.9", + "unplugin-vue-components": "^0.25.0", + "unplugin-auto-import": "^0.16.6", + "@types/node": "^20.3.1", + "sass": "^1.62.1", + "eslint": "^8.43.0", + "eslint-plugin-vue": "^9.15.1", + "@typescript-eslint/eslint-plugin": "^5.60.1", + "@typescript-eslint/parser": "^5.60.1", + "prettier": "^2.8.8", + "husky": "^8.0.3", + "lint-staged": "^13.2.3", + "vitest": "^0.32.2", + "@vue/test-utils": "^2.3.2", + "jsdom": "^22.1.0", + "cypress": "^12.15.0", + "@storybook/vue3": "^7.0.24", + "npm-run-all": "^4.1.5" + } +} +``` + +#### Vite 配置 (vite.config.ts) +```typescript +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { resolve } from 'path' +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' + +export default defineConfig({ + plugins: [ + vue(), + AutoImport({ + imports: ['vue', 'vue-router', 'pinia'], + dts: 'src/auto-imports.d.ts', + resolvers: [ElementPlusResolver()], + }), + Components({ + resolvers: [ElementPlusResolver()], + dts: 'src/components.d.ts', + }), + ], + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + '@components': resolve(__dirname, 'src/components'), + '@views': resolve(__dirname, 'src/views'), + '@stores': resolve(__dirname, 'src/stores'), + '@utils': resolve(__dirname, 'src/utils'), + '@api': resolve(__dirname, 'src/api'), + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: `@import "@/assets/styles/variables.scss"; @import "@/assets/styles/mixins.scss";` + } + } + }, + server: { + port: 3000, + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + } + }, + build: { + rollupOptions: { + output: { + manualChunks: { + 'vendor': ['vue', 'vue-router', 'pinia'], + 'element-plus': ['element-plus'], + 'charts': ['echarts'] + } + } + } + } +}) +``` + + diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/Vue项目初始化教程.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/Vue项目初始化教程.md new file mode 100644 index 0000000..2cd7a14 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/Vue项目初始化教程.md @@ -0,0 +1,324 @@ + +## 1. 环境准备 + +### 1.1 安装Node.js +- 访问 [Node.js官网](https://nodejs.org/) 下载LTS版本 +- 验证安装: +```bash +node --version +npm --version +``` + +### 1.2 安装Vue CLI(可选,推荐使用Vite) +```bash +npm install -g @vue/cli +# 或 +yarn global add @vue/cli +``` + +## 2. 使用Vite创建Vue项目(推荐方式) + +### 2.1 创建项目 +```bash +# 使用npm +npm create vue@latest + +# 或使用yarn +yarn create vue + +# 或使用pnpm +pnpm create vue +``` + +### 2.2 交互式配置 +执行命令后,你会看到以下选项: +``` +✔ Project name: … +✔ Add TypeScript? … No / Yes +✔ Add JSX Support? … No / Yes +✔ Add Vue Router for Single Page Application development? … No / Yes +✔ Add Pinia for state management? … No / Yes +✔ Add Vitest for Unit Testing? … No / Yes +✔ Add an End-to-End Testing Solution? … No / Cypress / Playwright +✔ Add ESLint for code quality? … No / Yes +✔ Add Prettier for code formatting? … No / Yes +``` + +### 2.3 进入项目并运行 +```bash +cd +npm install +npm run dev +``` + +## 3. 使用Vue CLI创建项目(传统方式) + +### 3.1 创建项目 +```bash +vue create my-project +``` + +### 3.2 选择预设 +``` +? Please pick a preset: + Default ([Vue 2] babel, eslint) + Default (Vue 3) ([Vue 3] babel, eslint) +❯ Manually select features +``` + +### 3.3 选择功能 +``` +? Check the features needed for your project: + ◉ Babel + ◯ TypeScript + ◯ Progressive Web App (PWA) Support +❯◉ Router + ◉ Vuex + ◉ CSS Pre-processors + ◉ Linter / Formatter + ◯ Unit Testing + ◯ E2E Testing +``` + +## 4. 项目结构说明 + +使用Vite创建的典型项目结构: +``` +my-vue-project/ +├── node_modules/ +├── public/ +│ └── favicon.ico +├── src/ +│ ├── assets/ +│ │ └── logo.svg +│ ├── components/ +│ │ └── HelloWorld.vue +│ ├── router/ +│ │ └── index.js +│ ├── stores/ +│ │ └── counter.js +│ ├── views/ +│ │ ├── AboutView.vue +│ │ └── HomeView.vue +│ ├── App.vue +│ └── main.js +├── .gitignore +├── index.html +├── package.json +├── README.md +└── vite.config.js +``` + +## 5. 基础配置示例 + +### 5.1 修改vite.config.js +```javascript +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' + +export default defineConfig({ + plugins: [vue()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src') + } + }, + server: { + port: 3000, + open: true + } +}) +``` + +### 5.2 配置ESLint + Prettier +`.eslintrc.cjs`: +```javascript +module.exports = { + root: true, + env: { + node: true, + browser: true, + es2021: true + }, + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-essential', + '@vue/eslint-config-prettier' + ], + rules: { + 'vue/multi-word-component-names': 'off' + } +} +``` + +`.prettierrc`: +```json +{ + "semi": false, + "singleQuote": true, + "printWidth": 80, + "trailingComma": "none", + "tabWidth": 2 +} +``` + +## 6. 安装常用依赖 + +```bash +# 状态管理 +npm install pinia + +# UI框架(按需选择) +npm install element-plus +# 或 +npm install ant-design-vue +# 或 +npm install vuetify + +# HTTP客户端 +npm install axios + +# 路由 +npm install vue-router@4 + +# 日期处理 +npm install dayjs + +# 工具函数 +npm install lodash-es +``` + +## 7. 创建第一个组件 + +`src/components/HelloWorld.vue`: +```vue + + + + + +``` + +## 8. 配置路由 + +`src/router/index.js`: +```javascript +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '../views/HomeView.vue' + +const routes = [ + { + path: '/', + name: 'home', + component: HomeView + }, + { + path: '/about', + name: 'about', + component: () => import('../views/AboutView.vue') + } +] + +const router = createRouter({ + history: createWebHistory(), + routes +}) + +export default router +``` + +## 9. 启动和构建 + +```bash +# 开发模式 +npm run dev + +# 生产构建 +npm run build + +# 预览生产构建 +npm run preview + +# 代码检查 +npm run lint +``` + +## 10. 最佳实践建议 + +### 10.1 项目组织 +``` +src/ +├── api/ # API接口 +├── assets/ # 静态资源 +├── components/ # 公共组件 +├── composables/ # 组合式函数 +├── directives/ # 自定义指令 +├── router/ # 路由配置 +├── stores/ # 状态管理 +├── styles/ # 全局样式 +├── utils/ # 工具函数 +└── views/ # 页面组件 +``` + +### 10.2 Git提交规范 +```bash +# 安装commitlint +npm install @commitlint/config-conventional @commitlint/cli -D + +# 创建.commitlintrc.js +echo "module.exports = { extends: ['@commitlint/config-conventional'] }" > .commitlintrc.js +``` + +### 10.3 环境变量配置 +创建`.env`文件: +```env +VITE_API_BASE_URL=https://api.example.com +VITE_APP_TITLE=My Vue App +``` + +## 常见问题 + +### Q: 安装缓慢? +- 使用淘宝镜像:`npm config set registry https://registry.npmmirror.com` +- 使用pnpm:`npm install -g pnpm` + +### Q: 端口被占用? +```javascript +// vite.config.js +server: { + port: 3000 // 修改端口号 +} +``` + +### Q: 需要支持旧浏览器? +```javascript +// vite.config.js +import legacy from '@vitejs/plugin-legacy' + +export default { + plugins: [ + legacy({ + targets: ['defaults', 'not IE 11'] + }) + ] +} +``` diff --git a/mengyanote-frontend/public/mengyanote/编程语言/前端/css注入代码合集.md b/mengyanote-frontend/public/mengyanote/编程语言/前端/css注入代码合集.md new file mode 100644 index 0000000..f17dd64 --- /dev/null +++ b/mengyanote-frontend/public/mengyanote/编程语言/前端/css注入代码合集.md @@ -0,0 +1,408 @@ +# CSS 效果字典 — 注入代码合集 + +> 本文档收集了 *30+* 个常用且有趣的 CSS 注入片段。每个片段都包含: +> - **名称**(用途) +> - **代码**(可直接复制到控制台或写入 `