diff --git a/docs/.vitepress/content-list.json b/docs/.vitepress/content-list.json index 0637a08..c113525 100644 --- a/docs/.vitepress/content-list.json +++ b/docs/.vitepress/content-list.json @@ -1 +1,562 @@ -[] \ No newline at end of file +[ + { + "created-at": "2023-02-21 00:00", + "is-hide": "", + "slug": "vscode-minecraft-nbt-editor", + "title": "使用 VSCode 查看和编辑 Minecraft 存档的 NBT", + "updated-at": "2025-03-15 22:22" + }, + { + "created-at": "2023-01-15 00:00", + "is-hide": "", + "slug": "windows-10-unable-to-login", + "title": "解决 Windows 10 提示“无法登录到你的账户”问题", + "updated-at": "2025-03-15 22:26" + }, + { + "created-at": "2022-09-20 00:00", + "is-hide": "", + "slug": "vue-jsx-syntax", + "title": "「Web 前端」在 Vue 中使用 JSX 的语法", + "updated-at": "2025-10-07 16:10" + }, + { + "created-at": "2022-05-25 00:00", + "is-hide": "", + "slug": "canvas-library-fabric-js", + "title": "Fabric.js 简单介绍和使用", + "updated-at": "2025-03-15 22:55" + }, + { + "created-at": "2022-05-25 00:00", + "is-hide": "", + "slug": "html-form-submit-no-redirect", + "title": "「Web 前端」通过 iframe 实现 form 表单提交不跳转页面", + "updated-at": "2025-03-15 22:50" + }, + { + "created-at": "2022-05-25 00:00", + "is-hide": "", + "slug": "javascript-modify-input-file-object", + "title": "「JavaScript」修改 input type=\"file\" 元素的文件对象", + "updated-at": "2025-03-15 22:43" + }, + { + "created-at": "2022-05-24 00:00", + "is-hide": "", + "slug": "nginx-config-snippet", + "title": "Nginx 常用配置文件片段", + "updated-at": "2025-03-15 22:59" + }, + { + "created-at": "2021-12-29 00:00", + "is-hide": "", + "slug": "vue-scrollbar-plugin", + "title": "「Web 前端」Vue 使用滚动条插件", + "updated-at": "2025-03-15 23:15" + }, + { + "created-at": "2021-12-11 00:00", + "is-hide": "", + "slug": "termux-jdk", + "title": "「教程」在 Termux 中安装任意版本的 JDK", + "updated-at": "2025-03-16 15:45" + }, + { + "created-at": "2021-11-28 00:00", + "is-hide": "", + "slug": "collection-windows-commands", + "title": "「合集」Windows BAT CMD 常用命令", + "updated-at": "2025-03-16 15:47" + }, + { + "created-at": "2021-11-10 00:00", + "is-hide": "", + "slug": "android-rdc-custom-resolution", + "title": "「教程」Android 微软远程桌面客户端使用自定义分辨率", + "updated-at": "2025-03-16 15:50" + }, + { + "created-at": "2021-10-09 00:00", + "is-hide": "", + "slug": "chromium-dev-tools", + "title": "浏览器 DevTools(开发人员工具)部分实用功能介绍", + "updated-at": "2025-03-16 15:58" + }, + { + "created-at": "2021-07-09 00:00", + "is-hide": "", + "slug": "vue-cli-less-global-variables", + "title": "「Web 前端」Vue CLI 配置 Less 全局变量", + "updated-at": "2025-03-15 23:19" + }, + { + "created-at": "2021-05-03 00:00", + "is-hide": "", + "slug": "javascript-export-ncm-playlist-song-info", + "title": "「JavaScript」提取(导出)网易云音乐歌单歌曲列表信息为文件", + "updated-at": "2025-03-16 16:12" + }, + { + "created-at": "2021-02-20 00:00", + "is-hide": "", + "slug": "temporarily-set-java-path", + "title": "临时设置 Java 环境变量(PATH)", + "updated-at": "2025-03-16 16:10" + }, + { + "created-at": "2021-02-12 00:00", + "is-hide": "", + "slug": "windows-command-mklink", + "title": "Windows mklink 命令", + "updated-at": "2025-03-15 22:30" + }, + { + "created-at": "2021-02-10 00:00", + "is-hide": "", + "slug": "windows-command-forfiles", + "title": "Windows forfiles 命令", + "updated-at": "2025-03-16 16:08" + }, + { + "created-at": "2021-01-09 00:00", + "is-hide": "", + "slug": "ubuntu-20-04-netplan", + "title": "记一次 Ubuntu 20.04 双网卡配置过程", + "updated-at": "2025-03-16 15:59" + }, + { + "created-at": "2020-11-10 00:00", + "is-hide": "", + "slug": "windows-useful-tools", + "title": "Windows 实用小工具推荐", + "updated-at": "2025-03-16 16:19" + }, + { + "created-at": "2020-10-25 00:00", + "is-hide": "", + "slug": "linux-ssh-allow-or-deny-user", + "title": "Linux 允许或禁止指定用户进行 SSH 登录", + "updated-at": "2025-03-16 16:06" + }, + { + "created-at": "2020-06-28 00:00", + "is-hide": "", + "slug": "javascript-merge-dynmap-images", + "title": "「JavaScript」将 Dynmap 网页上的地图图片合成为一张图", + "updated-at": "2025-03-16 16:26" + }, + { + "created-at": "2020-05-24 00:00", + "is-hide": "", + "slug": "elementary-os-5-1-hera-setup-uefi", + "title": "安装 elementary OS 后没有自动写入 EFI 引导", + "updated-at": "2025-03-16 16:29" + }, + { + "created-at": "2020-05-15 00:00", + "is-hide": "", + "slug": "query-domain-srv-records", + "title": "在 Linux Windows 查询域名的 SRV 记录", + "updated-at": "2025-03-16 16:03" + }, + { + "created-at": "2020-05-06 00:00", + "is-hide": "", + "slug": "minecraft-custom-sounds-resourcepack", + "title": "「Minecraft」自定义声音资源包", + "updated-at": "2025-03-16 17:46" + }, + { + "created-at": "2020-03-02 00:00", + "is-hide": "", + "slug": "windows-run-minecraft-with-discrete-graphics-card", + "title": "Windows 10 设置独立显卡运行 Minecraft", + "updated-at": "2025-03-16 16:02" + }, + { + "created-at": "2020-02-05 00:00", + "is-hide": "", + "slug": "obs-fullscreen-capture-failed", + "title": "解决 OBS 显示器捕获黑屏的三个方法", + "updated-at": "2025-03-16 16:23" + }, + { + "created-at": "2019-12-04 00:00", + "is-hide": "", + "slug": "html5-filereader-load-file", + "title": "HTML5 使用 FileReader 读取并预览文件内容", + "updated-at": "2025-03-16 18:27" + }, + { + "created-at": "2019-11-05 00:00", + "is-hide": "", + "slug": "windows-10-explorer-ogg-file-lag", + "title": "解决 Windows 10 资源管理器操作 OGG 文件时未响应的问题", + "updated-at": "2025-03-16 16:28" + }, + { + "created-at": "2019-11-03 00:00", + "is-hide": "", + "slug": "plotsquared-minecraft-default-generator", + "title": "PlotSquared 创建 Minecraft 默认地形的地皮世界", + "updated-at": "2025-03-16 18:30" + }, + { + "created-at": "2019-10-29 00:00", + "is-hide": "", + "slug": "javascript-snack-game", + "title": "「Web 前端」原生 JavaScript 实现贪吃蛇游戏", + "updated-at": "2025-03-16 16:21" + }, + { + "created-at": "2019-10-25 00:00", + "is-hide": "", + "slug": "windows-command-prompt-file-checksum", + "title": "Windows 通过命令提示符校验文件(MD5、SHA1等)", + "updated-at": "2025-03-16 18:33" + }, + { + "created-at": "2019-09-10 00:00", + "is-hide": "", + "slug": "jsdoc-learning", + "title": "「JavaScript」JSDoc 学习记录", + "updated-at": "2025-03-15 23:25" + }, + { + "created-at": "2019-09-07 00:00", + "is-hide": "", + "slug": "frost-navigation", + "title": "「工具」Frost 网址导航 V2", + "updated-at": "2025-03-16 18:36" + }, + { + "created-at": "2019-08-29 00:00", + "is-hide": "", + "slug": "minecraft-in-game-info-xml", + "title": "「Minecraft」In-Game Info XML 样式", + "updated-at": "2025-03-16 18:39" + }, + { + "created-at": "2019-07-09 00:00", + "is-hide": "", + "slug": "minecraft-mod-funny-items", + "title": "「Minecraft」Funny Items Mod", + "updated-at": "2025-03-16 18:44" + }, + { + "created-at": "2019-06-12 00:00", + "is-hide": "", + "slug": "npm-yarn-vuecli-common-problems-and-solutions", + "title": "NPM、Yarn、Vue CLI 的常见问题以及解决方法", + "updated-at": "2025-03-15 23:02" + }, + { + "created-at": "2019-05-27 00:00", + "is-hide": "", + "slug": "minecraft-10th-article", + "title": "Minecraft 十周年,感谢有你", + "updated-at": "2025-03-17 00:18" + }, + { + "created-at": "2019-05-12 00:00", + "is-hide": "", + "slug": "dynmapforge-warsftbdynmap-compatible", + "title": "「Minecraft」修改 Dynmap 让 WarsFtbDynmap 能正常使用", + "updated-at": "2025-03-16 19:02" + }, + { + "created-at": "2019-04-27 00:00", + "is-hide": "", + "slug": "tutorial-minecraft-server-on-android", + "title": "「教程」在 Android 手机上开 Minecraft 服务器", + "updated-at": "2025-03-16 19:05" + }, + { + "created-at": "2019-03-15 00:00", + "is-hide": "", + "slug": "translation-universe-guard-2", + "title": "「Minecraft」UniverseGuard 2 插件部分提示文本汉化", + "updated-at": "2025-03-16 19:07" + }, + { + "created-at": "2019-02-20 00:00", + "is-hide": "", + "slug": "minecraft-java-edition-commands", + "title": "Minecraft Java Edition 命令合集", + "updated-at": "2025-03-16 22:26" + }, + { + "created-at": "2019-02-16 00:00", + "is-hide": "", + "slug": "interesting-chinese-sentences", + "title": "一些有趣的中文句子(中文博大精深)", + "updated-at": "2025-03-16 19:19" + }, + { + "created-at": "2018-12-24 00:00", + "is-hide": "", + "slug": "video-av38895913", + "title": "「生活」中国人到底有多拼?", + "updated-at": "2025-03-16 16:56" + }, + { + "created-at": "2018-12-20 00:00", + "is-hide": "", + "slug": "collection-linux-commands", + "title": "「合集」Linux 常用命令", + "updated-at": "2025-03-16 19:28" + }, + { + "created-at": "2018-12-17 00:00", + "is-hide": "", + "slug": "tutorial-custom-block-in-minecart", + "title": "「Minecraft」矿车内显示自定义方块", + "updated-at": "2025-03-16 19:38" + }, + { + "created-at": "2018-11-16 00:00", + "is-hide": "", + "slug": "recommend-usefulwebsites", + "title": "「推荐」实用网站", + "updated-at": "2025-03-19 11:43" + }, + { + "created-at": "2018-11-15 00:00", + "is-hide": "", + "slug": "windows-rdp-custom-port-and-60fps", + "title": "修改 Windows 远程桌面端口以及开启 60FPS", + "updated-at": "2025-03-16 19:12" + }, + { + "created-at": "2018-11-11 00:00", + "is-hide": "", + "slug": "test", + "title": "内容格式测试", + "updated-at": "2025-10-07 18:32" + }, + { + "created-at": "2018-11-11 00:00", + "is-hide": "", + "slug": "warning-network-error", + "title": "「提示」网络连接不可用", + "updated-at": "2025-03-16 21:36" + }, + { + "created-at": "2018-11-08 00:00", + "is-hide": "", + "slug": "video-honor-your-father-and-your-mother", + "title": "「公益」当孝敬父母", + "updated-at": "2025-03-17 00:50" + }, + { + "created-at": "2018-11-05 00:00", + "is-hide": "", + "slug": "video-shanghai-a-city-on-the-rise", + "title": "「生活」上海,不夜的精彩", + "updated-at": "2025-03-16 21:44" + }, + { + "created-at": "2018-11-04 00:00", + "is-hide": "", + "slug": "collection-javascript-code", + "title": "「合集」常用的 JavaScript 代码", + "updated-at": "2025-03-16 22:02" + }, + { + "created-at": "2018-11-02 00:00", + "is-hide": "", + "slug": "useful-css-javascript-libraries", + "title": "「合集」实用的 CSS、JavaScript 库", + "updated-at": "2025-03-15 23:13" + }, + { + "created-at": "2018-10-31 00:00", + "is-hide": "", + "slug": "mobile-qq-page-links", + "title": "移动端 QQ & 微信页面链接", + "updated-at": "2025-03-16 22:14" + }, + { + "created-at": "2018-10-24 00:00", + "is-hide": "", + "slug": "classical-quotations", + "title": "经典句子、经典语录", + "updated-at": "2025-03-19 11:46" + }, + { + "created-at": "2018-10-22 00:00", + "is-hide": "", + "slug": "windows-vbs-code", + "title": "「合集」VBS 代码", + "updated-at": "2025-03-16 22:06" + }, + { + "created-at": "2018-10-14 00:00", + "is-hide": "", + "slug": "software-chrome-urls", + "title": "Chrome URLs 列表(List of Chrome URLs)", + "updated-at": "2025-03-16 22:17" + }, + { + "created-at": "2018-10-05 00:00", + "is-hide": "", + "slug": "video-ppt-gzl9-lcd", + "title": "「还原」使用 PPT 还原广州地铁 9 号线 LCD(单站)", + "updated-at": "2025-03-17 11:49" + }, + { + "created-at": "2018-09-30 00:00", + "is-hide": "", + "slug": "minecraft-links", + "title": "「Minecraft」相关链接", + "updated-at": "2025-03-16 22:23" + }, + { + "created-at": "2018-09-30 00:00", + "is-hide": "", + "slug": "qqpet-html5", + "title": "QQ 宠物 HTML5 版", + "updated-at": "2025-03-16 22:21" + }, + { + "created-at": "2018-09-20 00:00", + "is-hide": "", + "slug": "description-cors-preflight-request", + "title": "CORS 预检请求(preflight request)", + "updated-at": "2025-03-15 23:08" + }, + { + "created-at": "2018-08-16 00:00", + "is-hide": "", + "slug": "baidu-mobile-links", + "title": "百度触屏版首页不同样式的页面", + "updated-at": "2025-03-16 22:32" + }, + { + "created-at": "2018-08-09 00:00", + "is-hide": "", + "slug": "description-date-time-string-format", + "title": "包含 T 和 Z 的日期时间字符串格式", + "updated-at": "2025-03-15 23:11" + }, + { + "created-at": "2018-07-22 00:00", + "is-hide": "", + "slug": "tutorial-signpicture", + "title": "「Minecraft」SignPicture(告示牌图片)教程", + "updated-at": "2025-03-16 22:19" + }, + { + "created-at": "2018-07-10 00:00", + "is-hide": "", + "slug": "minecraft-java-server-options", + "title": "Minecraft Java 版服务端启动参数选项", + "updated-at": "2025-03-16 15:42" + }, + { + "created-at": "2018-07-02 00:00", + "is-hide": "", + "slug": "minecraft-op-permission-level", + "title": "「Minecraft」OP 权限等级", + "updated-at": "2025-03-19 12:35" + }, + { + "created-at": "2018-07-02 00:00", + "is-hide": "", + "slug": "windows-antivirus-ability-test", + "title": "杀毒软件能力测试", + "updated-at": "2025-03-19 11:49" + }, + { + "created-at": "2018-07-01 00:00", + "is-hide": "", + "slug": "wtp-video-show-201802-201807", + "title": "「MC」麦子茶会展示(201802 - 201807)", + "updated-at": "2025-03-22 22:14" + }, + { + "created-at": "2018-05-29 00:00", + "is-hide": "", + "slug": "wtp-video-wr-l1-preview-201805", + "title": "「MC」麦子轨道交通 1 号线工程预览(2018-05)", + "updated-at": "2025-03-22 22:15" + }, + { + "created-at": "2018-05-15 00:00", + "is-hide": "", + "slug": "text-english-sentences", + "title": "英语句子", + "updated-at": "2025-03-16 19:58" + }, + { + "created-at": "2018-05-02 00:00", + "is-hide": "", + "slug": "forge-auto-remove-erroring-entities", + "title": "「Minecraft」自动修复部分由异常实体或异常方块实体导致的崩溃", + "updated-at": "2025-03-16 19:22" + }, + { + "created-at": "2018-02-20 00:00", + "is-hide": "", + "slug": "minecraft-official-website-login-problem", + "title": "使用 gooreplacer 插件解决国内在 Minecraft 官网不能登录的问题", + "updated-at": "2025-03-16 18:53" + }, + { + "created-at": "2018-02-20 00:00", + "is-hide": "", + "slug": "windows-bat-anti-autorun-virus", + "title": "「BAT工具」防止病毒在打开U盘时自动运行", + "updated-at": "2025-03-16 21:41" + }, + { + "created-at": "2017-11-06 00:00", + "is-hide": "", + "slug": "video-2017-guangzhou-international-light-festival-1", + "title": "「摄影」2017 广州国际灯光节(固定机位夜景)", + "updated-at": "2025-03-16 19:46" + }, + { + "created-at": "2017-08-01 00:00", + "is-hide": "", + "slug": "wtp-video-wr-l1-2", + "title": "「MC」麦子轨道交通 1 号线 2 期展示", + "updated-at": "2025-03-22 22:15" + }, + { + "created-at": "2017-05-02 00:00", + "is-hide": "", + "slug": "chromium-startup-arguments", + "title": "Chromium 内核浏览器命令行启动参数", + "updated-at": "2025-03-19 11:40" + }, + { + "created-at": "2017-03-16 00:00", + "is-hide": "", + "slug": "wtp-video-wr-l1-1", + "title": "「MC」麦子轨道交通 1 号线 1 期展示", + "updated-at": "2025-03-22 22:15" + }, + { + "created-at": "2016-08-30 00:00", + "is-hide": "", + "slug": "minecraft-optimize-fps", + "title": "「优化」使你的 Minecraft 玩起来更流畅", + "updated-at": "2025-02-20 23:04" + }, + { + "created-at": "2015-04-18 00:00", + "is-hide": "", + "slug": "record-gamecomplete", + "title": "「记录」游戏通关记录", + "updated-at": "2025-03-19 12:32" + }, + { + "created-at": "2013-03-22 00:00", + "is-hide": "", + "slug": "video-minecraft-played-together", + "title": "「游戏」那些年,我们一起玩过的 MC", + "updated-at": "2025-03-17 00:10" + } +] \ No newline at end of file diff --git a/docs/content/android-rdc-custom-resolution.md b/docs/content/android-rdc-custom-resolution.md new file mode 100644 index 0000000..0a8f0b4 --- /dev/null +++ b/docs/content/android-rdc-custom-resolution.md @@ -0,0 +1,124 @@ +--- +title: 「教程」Android 微软远程桌面客户端使用自定义分辨率 +date: 2025-03-16T15:48:43Z +lastmod: 2025-03-16T15:50:59Z +tags: [Windows,教程,Android,远程桌面] +--- + +# 「教程」Android 微软远程桌面客户端使用自定义分辨率 + +## 简介 + +通过远程桌面连接 Windows 时,不能在系统中修改分辨率,只能在连接远程桌面的工具中设置。 + +对于 Windows 上的“远程桌面连接”工具,可在它的 `显示 - 显示配置` 中修改(只能选择给出的分辨率),也可以在远程桌面配置文件(`.rdp`)中修改(可以设置为任意合适的分辨率)。 + +而对于 Android 系统上的“RD Client”,只能选择它给出的分辨率(目前还不支持手动输入分辨率数值),且由于给出的分辨率与手机的分辨率相关,在全面屏手机上使用的时候会比较奇怪(例如不能设置为 16:9 的分辨率)。 + +因此,如果要在 Android 系统的远程桌面使用自定义的分辨率,需要借助外部的工具进行实现。 + +## 版本信息 + +系统版本:Android 11 + +应用程序:Microsoft Remote Desktop 10.0.9.1122 + +## 实现方式 + +### 方式一、修改软件数据文件 + +> 注意:使用此方式需要手机系统有 ROOT 权限。 + +1. 安装“MiXplorer”应用程序(其他支持修改 SQLite 数据库文件的应用程序也可以)。 +2. 在远程桌面客户端“RD Client”的“Display”页面中保存几个任意的分辨率,然后关闭。 + + > 注意:需要完全关闭 RD Client(不在后台运行)。 + > + + ![截图](assets/network-asset-1_01_rdc_add-20250316154915-1rwvoe6.png "截图") +3. 打开安装的 MiXplorer,授予 ROOT 权限。 +4. 进入路径 `/data/data/com.microsoft.rdc.androidx/databases`。 + ​![截图](assets/network-asset-1_02_file_path-20250316154915-w3z5ov1.png "截图") +5. 使用 MiXplorer 的“SQLite Editor”工具打开文件夹中的 `RDPConnection.db` 文件。 + + > 建议修改前备份 RD Client 的数据,或者备份该文件,以便在修改错误导致 RD Client 无法启动或数据丢失时还原。 + > + + ![截图](assets/network-asset-1_03_open-20250316154916-m1ql94t.png "截图") +6. 点击左上方的下拉菜单,切换到 `resolution_table` 项。 + 此时可以看到刚刚在 RD Client 中添加的几个分辨率项。 + ​![截图](assets/network-asset-1_04_table-20250316154916-4boacd2.png "截图") +7. 长按需要修改的项进行编辑,点击“UPDATE”保存。 + ​![截图](assets/network-asset-1_05_edit-20250316154916-mi3bpb0.png "截图") +8. 修改完毕后,点击右上方的保存按钮提交修改。 + ​![截图](assets/network-asset-1_06_table-20250316154916-oumzuck.png "截图") + ​![截图](assets/network-asset-1_07_save-20250316154916-erjngl0.png "截图") +9. 重新打开 RD Client,如果修改成功,分辨率列表会有相应的变化。 + ​![截图](assets/network-asset-1_08_rdc-20250316154916-rq1ymj0.png "截图") + +### 方式二、修改手机分辨率 + +> 注意: +> 使用此方式需要 ADB 工具。 +> 执行的命令不能有错误,否则可能对系统造成破坏。 + +1. 在 Windows 上下载 ADB 工具包。 + + > 可在 [Download - ADB Shell](https://adbshell.com/downloads) 下载(ADB Kits)。 + > +2. 解压下载的 ADB 工具包(文件路径最好不包含中文)。 +3. 启动“命令提示符”(CMD),执行 `CD /D 文件夹路径` 命令,将工作目录切换到 ADB 工具所在的文件夹。 + + > 例如 `CD /D D:\Development\adb`​ + > +4. 使用 USB 数据线将手机与电脑连接。 +5. 在手机系统的“开发者选项”中开启“USB 调试”。 + ​![截图](assets/network-asset-2_01_usb_debug-20250316154917-fs17zfl.jpg "截图") + 部分系统需要同时开启“USB 调试”下方的“USB 调试(安全设置)”,否则无法通过 ADB 设置分辨率。 + ​![截图](assets/network-asset-2_02_security-20250316154917-q49buyt.png "截图") +6. 执行 `adb devices` 命令,列出设备。 + 若连接成功,会显示类似这样的提示: + + ```text + List of devices attached + 2ab5d50e device + ``` +7. 执行 `adb shell` 命令,进入 Shell 环境。 + ​![截图](assets/network-asset-2_03_adb_shell-20250316154917-0wv5gpl.png "截图") +8. 执行 `wm size` 命令,查看和记下设备的**默认分辨率**,还原的时候会用到。 + ​![截图](assets/network-asset-2_04_original_size-20250316154917-xxth547.png "截图") +9. 执行 `wm size 宽x高` 命令,设置想要在远程桌面中使用的分辨率。 + + > “宽”和“高”对应手机竖屏状态下的数值(请参考默认分辨率),例如 `wm size 1080x1920`。 + > 不建议设置过大或过小的分辨率,以免导致系统出错。 + > 执行命令前,请务必**检查确认无误**。 + > 执行命令后,**手机的分辨率会变为指定的值**。 + > 如果不小心设置错了,可以尝试执行 `wm size reset` 或 `wm size 默认分辨率` 命令进行还原。 + > + + ![截图](assets/network-asset-2_05_1_wm_size-20250316154917-ilz94fw.png "截图") +10. 打开客户端的分辨率设置,可以发现给出的分辨率值变了,但是比指定的小了一些(可能是减去了通知栏或导航栏的高度)。 + ​![截图](assets/network-asset-2_05_2_app-20250316154917-exmw091.jpg "截图") +11. 加上相差的值,再执行一次命令。 + ​![截图](assets/network-asset-2_06_1_wm_size-20250316154917-v7fhuau.png "截图") +12. 再次打开客户端的分辨率设置,分辨率正确了。 + + > 这时候就可以点击“SAVE”把当前的分辨率保存下来了。 + > + + ![截图](assets/network-asset-2_06_2_app-20250316154917-depr27t.jpg "截图") +13. 以相同的方式,设置其他不同的分辨率。 + ​![截图](assets/network-asset-2_07_1_wm_size-20250316154917-os3tftw.png "截图") + ​![截图](assets/network-asset-2_07_2_app-20250316154918-oseljk6.jpg "截图") + ​![截图](assets/network-asset-2_08_1_wm_size-20250316154918-s58a8az.png "截图") + ​![截图](assets/network-asset-2_08_2_app-20250316154918-28ql07i.jpg "截图") +14. 保存完所有需要的分辨率后,执行 `wm size reset` 或 `wm size 默认分辨率` 命令,把手机的分辨率还原为默认值。 +15. 重新打开客户端,保存的分辨率都在,且有效果。 + ​![截图](assets/network-asset-2_09_app-20250316154918-8s0r8ec.jpg "截图") +16. 执行 `exit` 命令,退出 Shell 环境。 + ​![截图](assets/network-asset-2_10_exit-20250316154918-nu3c97e.png "截图") +17. 执行 `adb kill-server` 命令,结束 ADB 服务。 + ​![截图](assets/network-asset-2_11_kill_server-20250316154918-o1l309g.png "截图") +18. 现在可以关闭 USB 调试,然后断开手机与电脑的连接了。 + +‍ diff --git a/docs/content/assets/network-asset-01-20250316155958-gldjlz4.png b/docs/content/assets/network-asset-01-20250316155958-gldjlz4.png new file mode 100644 index 0000000..9a169f9 Binary files /dev/null and b/docs/content/assets/network-asset-01-20250316155958-gldjlz4.png differ diff --git a/docs/content/assets/network-asset-01-20250316162100-ky9dne8.gif b/docs/content/assets/network-asset-01-20250316162100-ky9dne8.gif new file mode 100644 index 0000000..5c9070c Binary files /dev/null and b/docs/content/assets/network-asset-01-20250316162100-ky9dne8.gif differ diff --git a/docs/content/assets/network-asset-01-20250316162312-8e508cs.png b/docs/content/assets/network-asset-01-20250316162312-8e508cs.png new file mode 100644 index 0000000..a68fd14 Binary files /dev/null and b/docs/content/assets/network-asset-01-20250316162312-8e508cs.png differ diff --git a/docs/content/assets/network-asset-01-20250316162508-3w1fppe.png b/docs/content/assets/network-asset-01-20250316162508-3w1fppe.png new file mode 100644 index 0000000..c668e74 Binary files /dev/null and b/docs/content/assets/network-asset-01-20250316162508-3w1fppe.png differ diff --git a/docs/content/assets/network-asset-01-20250316163935-rkvoa6y.png b/docs/content/assets/network-asset-01-20250316163935-rkvoa6y.png new file mode 100644 index 0000000..80e10b9 Binary files /dev/null and b/docs/content/assets/network-asset-01-20250316163935-rkvoa6y.png differ diff --git a/docs/content/assets/network-asset-01-20250316183929-q7ddndl.jpg b/docs/content/assets/network-asset-01-20250316183929-q7ddndl.jpg new file mode 100644 index 0000000..73b3041 Binary files /dev/null and b/docs/content/assets/network-asset-01-20250316183929-q7ddndl.jpg differ diff --git a/docs/content/assets/network-asset-01_1-20250316162751-0zm4eys.png b/docs/content/assets/network-asset-01_1-20250316162751-0zm4eys.png new file mode 100644 index 0000000..3576f56 Binary files /dev/null and b/docs/content/assets/network-asset-01_1-20250316162751-0zm4eys.png differ diff --git a/docs/content/assets/network-asset-01_2-20250316162752-9dv7tm2.png b/docs/content/assets/network-asset-01_2-20250316162752-9dv7tm2.png new file mode 100644 index 0000000..dc4fede Binary files /dev/null and b/docs/content/assets/network-asset-01_2-20250316162752-9dv7tm2.png differ diff --git a/docs/content/assets/network-asset-01_3-20250316162752-tj2hi4r.png b/docs/content/assets/network-asset-01_3-20250316162752-tj2hi4r.png new file mode 100644 index 0000000..43c4186 Binary files /dev/null and b/docs/content/assets/network-asset-01_3-20250316162752-tj2hi4r.png differ diff --git a/docs/content/assets/network-asset-02-20250316162100-5jq3zns.gif b/docs/content/assets/network-asset-02-20250316162100-5jq3zns.gif new file mode 100644 index 0000000..d81dfcf Binary files /dev/null and b/docs/content/assets/network-asset-02-20250316162100-5jq3zns.gif differ diff --git a/docs/content/assets/network-asset-02-20250316162313-xsidsmg.png b/docs/content/assets/network-asset-02-20250316162313-xsidsmg.png new file mode 100644 index 0000000..4b0d9c6 Binary files /dev/null and b/docs/content/assets/network-asset-02-20250316162313-xsidsmg.png differ diff --git a/docs/content/assets/network-asset-02-20250316162508-nz6ede0.png b/docs/content/assets/network-asset-02-20250316162508-nz6ede0.png new file mode 100644 index 0000000..255de90 Binary files /dev/null and b/docs/content/assets/network-asset-02-20250316162508-nz6ede0.png differ diff --git a/docs/content/assets/network-asset-02-20250316162752-ng03hvu.png b/docs/content/assets/network-asset-02-20250316162752-ng03hvu.png new file mode 100644 index 0000000..550199d Binary files /dev/null and b/docs/content/assets/network-asset-02-20250316162752-ng03hvu.png differ diff --git a/docs/content/assets/network-asset-02-20250316163935-pjkkzbs.png b/docs/content/assets/network-asset-02-20250316163935-pjkkzbs.png new file mode 100644 index 0000000..bf0d593 Binary files /dev/null and b/docs/content/assets/network-asset-02-20250316163935-pjkkzbs.png differ diff --git a/docs/content/assets/network-asset-02-20250316183929-0ve3jsl.jpg b/docs/content/assets/network-asset-02-20250316183929-0ve3jsl.jpg new file mode 100644 index 0000000..ea12051 Binary files /dev/null and b/docs/content/assets/network-asset-02-20250316183929-0ve3jsl.jpg differ diff --git a/docs/content/assets/network-asset-03-20250316162100-pb9zjnj.gif b/docs/content/assets/network-asset-03-20250316162100-pb9zjnj.gif new file mode 100644 index 0000000..085a38c Binary files /dev/null and b/docs/content/assets/network-asset-03-20250316162100-pb9zjnj.gif differ diff --git a/docs/content/assets/network-asset-03-20250316163935-pc8y963.png b/docs/content/assets/network-asset-03-20250316163935-pc8y963.png new file mode 100644 index 0000000..952bbba Binary files /dev/null and b/docs/content/assets/network-asset-03-20250316163935-pc8y963.png differ diff --git a/docs/content/assets/network-asset-03-20250316183930-36t5qzg.jpg b/docs/content/assets/network-asset-03-20250316183930-36t5qzg.jpg new file mode 100644 index 0000000..366380f Binary files /dev/null and b/docs/content/assets/network-asset-03-20250316183930-36t5qzg.jpg differ diff --git a/docs/content/assets/network-asset-03_1-20250316162313-tichlxy.png b/docs/content/assets/network-asset-03_1-20250316162313-tichlxy.png new file mode 100644 index 0000000..36dad27 Binary files /dev/null and b/docs/content/assets/network-asset-03_1-20250316162313-tichlxy.png differ diff --git a/docs/content/assets/network-asset-03_2-20250316162313-utdnbnw.png b/docs/content/assets/network-asset-03_2-20250316162313-utdnbnw.png new file mode 100644 index 0000000..d6412fe Binary files /dev/null and b/docs/content/assets/network-asset-03_2-20250316162313-utdnbnw.png differ diff --git a/docs/content/assets/network-asset-03_3-20250316162313-jcjvisk.png b/docs/content/assets/network-asset-03_3-20250316162313-jcjvisk.png new file mode 100644 index 0000000..5f94eb5 Binary files /dev/null and b/docs/content/assets/network-asset-03_3-20250316162313-jcjvisk.png differ diff --git a/docs/content/assets/network-asset-04-20250316162101-w3j26zp.gif b/docs/content/assets/network-asset-04-20250316162101-w3j26zp.gif new file mode 100644 index 0000000..5fade8c Binary files /dev/null and b/docs/content/assets/network-asset-04-20250316162101-w3j26zp.gif differ diff --git a/docs/content/assets/network-asset-04-20250316163936-tfcpoky.png b/docs/content/assets/network-asset-04-20250316163936-tfcpoky.png new file mode 100644 index 0000000..10bb0ae Binary files /dev/null and b/docs/content/assets/network-asset-04-20250316163936-tfcpoky.png differ diff --git a/docs/content/assets/network-asset-04-20250316183930-29rtu13.jpg b/docs/content/assets/network-asset-04-20250316183930-29rtu13.jpg new file mode 100644 index 0000000..4a90c3d Binary files /dev/null and b/docs/content/assets/network-asset-04-20250316183930-29rtu13.jpg differ diff --git a/docs/content/assets/network-asset-05-20250316162101-mezysip.gif b/docs/content/assets/network-asset-05-20250316162101-mezysip.gif new file mode 100644 index 0000000..331a13a Binary files /dev/null and b/docs/content/assets/network-asset-05-20250316162101-mezysip.gif differ diff --git a/docs/content/assets/network-asset-05-20250316163936-c1g0etk.png b/docs/content/assets/network-asset-05-20250316163936-c1g0etk.png new file mode 100644 index 0000000..16d7483 Binary files /dev/null and b/docs/content/assets/network-asset-05-20250316163936-c1g0etk.png differ diff --git a/docs/content/assets/network-asset-05-20250316183930-wyhwc0x.jpg b/docs/content/assets/network-asset-05-20250316183930-wyhwc0x.jpg new file mode 100644 index 0000000..49a13f0 Binary files /dev/null and b/docs/content/assets/network-asset-05-20250316183930-wyhwc0x.jpg differ diff --git a/docs/content/assets/network-asset-06-20250316183930-ul5fv7k.jpg b/docs/content/assets/network-asset-06-20250316183930-ul5fv7k.jpg new file mode 100644 index 0000000..28f6007 Binary files /dev/null and b/docs/content/assets/network-asset-06-20250316183930-ul5fv7k.jpg differ diff --git a/docs/content/assets/network-asset-1_01_rdc_add-20250316154915-1rwvoe6.png b/docs/content/assets/network-asset-1_01_rdc_add-20250316154915-1rwvoe6.png new file mode 100644 index 0000000..4b70112 Binary files /dev/null and b/docs/content/assets/network-asset-1_01_rdc_add-20250316154915-1rwvoe6.png differ diff --git a/docs/content/assets/network-asset-1_02_file_path-20250316154915-w3z5ov1.png b/docs/content/assets/network-asset-1_02_file_path-20250316154915-w3z5ov1.png new file mode 100644 index 0000000..476ba4c Binary files /dev/null and b/docs/content/assets/network-asset-1_02_file_path-20250316154915-w3z5ov1.png differ diff --git a/docs/content/assets/network-asset-1_03_open-20250316154916-m1ql94t.png b/docs/content/assets/network-asset-1_03_open-20250316154916-m1ql94t.png new file mode 100644 index 0000000..ebc60f1 Binary files /dev/null and b/docs/content/assets/network-asset-1_03_open-20250316154916-m1ql94t.png differ diff --git a/docs/content/assets/network-asset-1_04_table-20250316154916-4boacd2.png b/docs/content/assets/network-asset-1_04_table-20250316154916-4boacd2.png new file mode 100644 index 0000000..342652b Binary files /dev/null and b/docs/content/assets/network-asset-1_04_table-20250316154916-4boacd2.png differ diff --git a/docs/content/assets/network-asset-1_05_edit-20250316154916-mi3bpb0.png b/docs/content/assets/network-asset-1_05_edit-20250316154916-mi3bpb0.png new file mode 100644 index 0000000..2ac36ce Binary files /dev/null and b/docs/content/assets/network-asset-1_05_edit-20250316154916-mi3bpb0.png differ diff --git a/docs/content/assets/network-asset-1_06_table-20250316154916-oumzuck.png b/docs/content/assets/network-asset-1_06_table-20250316154916-oumzuck.png new file mode 100644 index 0000000..85c7298 Binary files /dev/null and b/docs/content/assets/network-asset-1_06_table-20250316154916-oumzuck.png differ diff --git a/docs/content/assets/network-asset-1_07_save-20250316154916-erjngl0.png b/docs/content/assets/network-asset-1_07_save-20250316154916-erjngl0.png new file mode 100644 index 0000000..ada224d Binary files /dev/null and b/docs/content/assets/network-asset-1_07_save-20250316154916-erjngl0.png differ diff --git a/docs/content/assets/network-asset-1_08_rdc-20250316154916-rq1ymj0.png b/docs/content/assets/network-asset-1_08_rdc-20250316154916-rq1ymj0.png new file mode 100644 index 0000000..852d6ba Binary files /dev/null and b/docs/content/assets/network-asset-1_08_rdc-20250316154916-rq1ymj0.png differ diff --git a/docs/content/assets/network-asset-2_01_usb_debug-20250316154917-fs17zfl.jpg b/docs/content/assets/network-asset-2_01_usb_debug-20250316154917-fs17zfl.jpg new file mode 100644 index 0000000..79401a5 Binary files /dev/null and b/docs/content/assets/network-asset-2_01_usb_debug-20250316154917-fs17zfl.jpg differ diff --git a/docs/content/assets/network-asset-2_02_security-20250316154917-q49buyt.png b/docs/content/assets/network-asset-2_02_security-20250316154917-q49buyt.png new file mode 100644 index 0000000..77453c1 Binary files /dev/null and b/docs/content/assets/network-asset-2_02_security-20250316154917-q49buyt.png differ diff --git a/docs/content/assets/network-asset-2_03_adb_shell-20250316154917-0wv5gpl.png b/docs/content/assets/network-asset-2_03_adb_shell-20250316154917-0wv5gpl.png new file mode 100644 index 0000000..d11d6ec Binary files /dev/null and b/docs/content/assets/network-asset-2_03_adb_shell-20250316154917-0wv5gpl.png differ diff --git a/docs/content/assets/network-asset-2_04_original_size-20250316154917-xxth547.png b/docs/content/assets/network-asset-2_04_original_size-20250316154917-xxth547.png new file mode 100644 index 0000000..ab02110 Binary files /dev/null and b/docs/content/assets/network-asset-2_04_original_size-20250316154917-xxth547.png differ diff --git a/docs/content/assets/network-asset-2_05_1_wm_size-20250316154917-ilz94fw.png b/docs/content/assets/network-asset-2_05_1_wm_size-20250316154917-ilz94fw.png new file mode 100644 index 0000000..f81dd0e Binary files /dev/null and b/docs/content/assets/network-asset-2_05_1_wm_size-20250316154917-ilz94fw.png differ diff --git a/docs/content/assets/network-asset-2_05_2_app-20250316154917-exmw091.jpg b/docs/content/assets/network-asset-2_05_2_app-20250316154917-exmw091.jpg new file mode 100644 index 0000000..ed51bcc Binary files /dev/null and b/docs/content/assets/network-asset-2_05_2_app-20250316154917-exmw091.jpg differ diff --git a/docs/content/assets/network-asset-2_06_1_wm_size-20250316154917-v7fhuau.png b/docs/content/assets/network-asset-2_06_1_wm_size-20250316154917-v7fhuau.png new file mode 100644 index 0000000..867f35c Binary files /dev/null and b/docs/content/assets/network-asset-2_06_1_wm_size-20250316154917-v7fhuau.png differ diff --git a/docs/content/assets/network-asset-2_06_2_app-20250316154917-depr27t.jpg b/docs/content/assets/network-asset-2_06_2_app-20250316154917-depr27t.jpg new file mode 100644 index 0000000..1ea738c Binary files /dev/null and b/docs/content/assets/network-asset-2_06_2_app-20250316154917-depr27t.jpg differ diff --git a/docs/content/assets/network-asset-2_07_1_wm_size-20250316154917-os3tftw.png b/docs/content/assets/network-asset-2_07_1_wm_size-20250316154917-os3tftw.png new file mode 100644 index 0000000..7a483ae Binary files /dev/null and b/docs/content/assets/network-asset-2_07_1_wm_size-20250316154917-os3tftw.png differ diff --git a/docs/content/assets/network-asset-2_07_2_app-20250316154918-oseljk6.jpg b/docs/content/assets/network-asset-2_07_2_app-20250316154918-oseljk6.jpg new file mode 100644 index 0000000..cd6be4e Binary files /dev/null and b/docs/content/assets/network-asset-2_07_2_app-20250316154918-oseljk6.jpg differ diff --git a/docs/content/assets/network-asset-2_08_1_wm_size-20250316154918-s58a8az.png b/docs/content/assets/network-asset-2_08_1_wm_size-20250316154918-s58a8az.png new file mode 100644 index 0000000..e735b6b Binary files /dev/null and b/docs/content/assets/network-asset-2_08_1_wm_size-20250316154918-s58a8az.png differ diff --git a/docs/content/assets/network-asset-2_08_2_app-20250316154918-28ql07i.jpg b/docs/content/assets/network-asset-2_08_2_app-20250316154918-28ql07i.jpg new file mode 100644 index 0000000..ab9816a Binary files /dev/null and b/docs/content/assets/network-asset-2_08_2_app-20250316154918-28ql07i.jpg differ diff --git a/docs/content/assets/network-asset-2_09_app-20250316154918-8s0r8ec.jpg b/docs/content/assets/network-asset-2_09_app-20250316154918-8s0r8ec.jpg new file mode 100644 index 0000000..eb70032 Binary files /dev/null and b/docs/content/assets/network-asset-2_09_app-20250316154918-8s0r8ec.jpg differ diff --git a/docs/content/assets/network-asset-2_10_exit-20250316154918-nu3c97e.png b/docs/content/assets/network-asset-2_10_exit-20250316154918-nu3c97e.png new file mode 100644 index 0000000..75fc3e9 Binary files /dev/null and b/docs/content/assets/network-asset-2_10_exit-20250316154918-nu3c97e.png differ diff --git a/docs/content/assets/network-asset-2_11_kill_server-20250316154918-o1l309g.png b/docs/content/assets/network-asset-2_11_kill_server-20250316154918-o1l309g.png new file mode 100644 index 0000000..63594ae Binary files /dev/null and b/docs/content/assets/network-asset-2_11_kill_server-20250316154918-o1l309g.png differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6gb146rj208y01qjr9-20250215192026-v5h81f5.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6gb146rj208y01qjr9-20250215192026-v5h81f5.jpg new file mode 100644 index 0000000..8466de8 Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6gb146rj208y01qjr9-20250215192026-v5h81f5.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6gigwd8j208y01qwed-20250215192027-tlsnvyt.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6gigwd8j208y01qwed-20250215192027-tlsnvyt.jpg new file mode 100644 index 0000000..8c37b8d Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6gigwd8j208y01qwed-20250215192027-tlsnvyt.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6gkkiauj208y01q3ye-20250215192029-e2sfd15.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6gkkiauj208y01q3ye-20250215192029-e2sfd15.jpg new file mode 100644 index 0000000..9c26367 Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6gkkiauj208y01q3ye-20250215192029-e2sfd15.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6gln7k5j208y01qjr9-20250215192030-qabmmgz.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6gln7k5j208y01qjr9-20250215192030-qabmmgz.jpg new file mode 100644 index 0000000..04c99b6 Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6gln7k5j208y01qjr9-20250215192030-qabmmgz.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6gmpkhcj20i70dpq4q-20250215192031-8it9q0g.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6gmpkhcj20i70dpq4q-20250215192031-8it9q0g.jpg new file mode 100644 index 0000000..97b7e7d Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6gmpkhcj20i70dpq4q-20250215192031-8it9q0g.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6go5g3tj20ii06paao-20250215192031-3mie9xu.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6go5g3tj20ii06paao-20250215192031-3mie9xu.jpg new file mode 100644 index 0000000..da71d28 Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6go5g3tj20ii06paao-20250215192031-3mie9xu.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6gpkf2uj206t02eq2q-20250215192022-mhqzu1n.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6gpkf2uj206t02eq2q-20250215192022-mhqzu1n.jpg new file mode 100644 index 0000000..38dea89 Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6gpkf2uj206t02eq2q-20250215192022-mhqzu1n.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6gr96zaj20ep04idfw-20250215192021-imfknl3.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6gr96zaj20ep04idfw-20250215192021-imfknl3.jpg new file mode 100644 index 0000000..6fd12bb Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6gr96zaj20ep04idfw-20250215192021-imfknl3.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6grxp6ej20jf02pt8t-20250215192023-q393aq2.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6grxp6ej20jf02pt8t-20250215192023-q393aq2.jpg new file mode 100644 index 0000000..355113e Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6grxp6ej20jf02pt8t-20250215192023-q393aq2.jpg differ diff --git a/docs/content/assets/network-asset-728d23a7gw1f7c6guubkij207401m742-20250215192025-ikuc9bb.jpg b/docs/content/assets/network-asset-728d23a7gw1f7c6guubkij207401m742-20250215192025-ikuc9bb.jpg new file mode 100644 index 0000000..f9dd224 Binary files /dev/null and b/docs/content/assets/network-asset-728d23a7gw1f7c6guubkij207401m742-20250215192025-ikuc9bb.jpg differ diff --git a/docs/content/assets/network-asset-A01_AnLinux_Panel-20250316154503-5qp14m5.jpg b/docs/content/assets/network-asset-A01_AnLinux_Panel-20250316154503-5qp14m5.jpg new file mode 100644 index 0000000..69c5a4c Binary files /dev/null and b/docs/content/assets/network-asset-A01_AnLinux_Panel-20250316154503-5qp14m5.jpg differ diff --git a/docs/content/assets/network-asset-A02_AnLinux_Ubuntu-20250316154503-pqddget.jpg b/docs/content/assets/network-asset-A02_AnLinux_Ubuntu-20250316154503-pqddget.jpg new file mode 100644 index 0000000..1a959ba Binary files /dev/null and b/docs/content/assets/network-asset-A02_AnLinux_Ubuntu-20250316154503-pqddget.jpg differ diff --git a/docs/content/assets/network-asset-A03_1_fail-20250316154503-31kfbli.jpg b/docs/content/assets/network-asset-A03_1_fail-20250316154503-31kfbli.jpg new file mode 100644 index 0000000..71980a2 Binary files /dev/null and b/docs/content/assets/network-asset-A03_1_fail-20250316154503-31kfbli.jpg differ diff --git a/docs/content/assets/network-asset-A03_2_fail-20250316154503-jiwqkc3.jpg b/docs/content/assets/network-asset-A03_2_fail-20250316154503-jiwqkc3.jpg new file mode 100644 index 0000000..0558734 Binary files /dev/null and b/docs/content/assets/network-asset-A03_2_fail-20250316154503-jiwqkc3.jpg differ diff --git a/docs/content/assets/network-asset-A03_3_fail-20250316154504-pfofs04.jpg b/docs/content/assets/network-asset-A03_3_fail-20250316154504-pfofs04.jpg new file mode 100644 index 0000000..2feb203 Binary files /dev/null and b/docs/content/assets/network-asset-A03_3_fail-20250316154504-pfofs04.jpg differ diff --git a/docs/content/assets/network-asset-A04_success-20250316154504-ae5ey2o.jpg b/docs/content/assets/network-asset-A04_success-20250316154504-ae5ey2o.jpg new file mode 100644 index 0000000..1626cb4 Binary files /dev/null and b/docs/content/assets/network-asset-A04_success-20250316154504-ae5ey2o.jpg differ diff --git a/docs/content/assets/network-asset-B01_Adoptium_Other-20250316154506-635xr67.jpg b/docs/content/assets/network-asset-B01_Adoptium_Other-20250316154506-635xr67.jpg new file mode 100644 index 0000000..c6c37e6 Binary files /dev/null and b/docs/content/assets/network-asset-B01_Adoptium_Other-20250316154506-635xr67.jpg differ diff --git a/docs/content/assets/network-asset-B01_AnLinux_Offline-20250316154504-45yc5x7.jpg b/docs/content/assets/network-asset-B01_AnLinux_Offline-20250316154504-45yc5x7.jpg new file mode 100644 index 0000000..3675ef6 Binary files /dev/null and b/docs/content/assets/network-asset-B01_AnLinux_Offline-20250316154504-45yc5x7.jpg differ diff --git a/docs/content/assets/network-asset-B02_Adoptium_Version-20250316154507-a71ovzm.jpg b/docs/content/assets/network-asset-B02_Adoptium_Version-20250316154507-a71ovzm.jpg new file mode 100644 index 0000000..89412c6 Binary files /dev/null and b/docs/content/assets/network-asset-B02_Adoptium_Version-20250316154507-a71ovzm.jpg differ diff --git a/docs/content/assets/network-asset-B02_AnLinux_GitHub_Rootfs-20250316154504-hhpgaap.jpg b/docs/content/assets/network-asset-B02_AnLinux_GitHub_Rootfs-20250316154504-hhpgaap.jpg new file mode 100644 index 0000000..9c12109 Binary files /dev/null and b/docs/content/assets/network-asset-B02_AnLinux_GitHub_Rootfs-20250316154504-hhpgaap.jpg differ diff --git a/docs/content/assets/network-asset-B03_Adoptium_OS-20250316154507-us44v02.jpg b/docs/content/assets/network-asset-B03_Adoptium_OS-20250316154507-us44v02.jpg new file mode 100644 index 0000000..77506cc Binary files /dev/null and b/docs/content/assets/network-asset-B03_Adoptium_OS-20250316154507-us44v02.jpg differ diff --git a/docs/content/assets/network-asset-B03_AnLinux_GitHub_Ubuntu-20250316154504-msh2i8i.jpg b/docs/content/assets/network-asset-B03_AnLinux_GitHub_Ubuntu-20250316154504-msh2i8i.jpg new file mode 100644 index 0000000..0df0ea6 Binary files /dev/null and b/docs/content/assets/network-asset-B03_AnLinux_GitHub_Ubuntu-20250316154504-msh2i8i.jpg differ diff --git a/docs/content/assets/network-asset-B04_Adoptium_Download-20250316154507-midlp40.jpg b/docs/content/assets/network-asset-B04_Adoptium_Download-20250316154507-midlp40.jpg new file mode 100644 index 0000000..a67e0fc Binary files /dev/null and b/docs/content/assets/network-asset-B04_Adoptium_Download-20250316154507-midlp40.jpg differ diff --git a/docs/content/assets/network-asset-B04_AnLinux_GitHub_Script-20250316154504-g092bkz.jpg b/docs/content/assets/network-asset-B04_AnLinux_GitHub_Script-20250316154504-g092bkz.jpg new file mode 100644 index 0000000..8745d41 Binary files /dev/null and b/docs/content/assets/network-asset-B04_AnLinux_GitHub_Script-20250316154504-g092bkz.jpg differ diff --git a/docs/content/assets/network-asset-B05_move_file-20250316154507-umldi6l.png b/docs/content/assets/network-asset-B05_move_file-20250316154507-umldi6l.png new file mode 100644 index 0000000..0eb9fd0 Binary files /dev/null and b/docs/content/assets/network-asset-B05_move_file-20250316154507-umldi6l.png differ diff --git a/docs/content/assets/network-asset-B05_move_files-20250316154505-w5dix74.png b/docs/content/assets/network-asset-B05_move_files-20250316154505-w5dix74.png new file mode 100644 index 0000000..bf0a2fc Binary files /dev/null and b/docs/content/assets/network-asset-B05_move_files-20250316154505-w5dix74.png differ diff --git a/docs/content/assets/network-asset-B06_1_edit_script-20250316154505-losgqch.png b/docs/content/assets/network-asset-B06_1_edit_script-20250316154505-losgqch.png new file mode 100644 index 0000000..9a4d463 Binary files /dev/null and b/docs/content/assets/network-asset-B06_1_edit_script-20250316154505-losgqch.png differ diff --git a/docs/content/assets/network-asset-B06_2_edit_script-20250316154505-mrxg556.png b/docs/content/assets/network-asset-B06_2_edit_script-20250316154505-mrxg556.png new file mode 100644 index 0000000..d8cd002 Binary files /dev/null and b/docs/content/assets/network-asset-B06_2_edit_script-20250316154505-mrxg556.png differ diff --git a/docs/content/assets/network-asset-B06_copy_file-20250316154507-3i571xi.png b/docs/content/assets/network-asset-B06_copy_file-20250316154507-3i571xi.png new file mode 100644 index 0000000..192e89f Binary files /dev/null and b/docs/content/assets/network-asset-B06_copy_file-20250316154507-3i571xi.png differ diff --git a/docs/content/assets/network-asset-B07_extract_file-20250316154507-xowa0v8.png b/docs/content/assets/network-asset-B07_extract_file-20250316154507-xowa0v8.png new file mode 100644 index 0000000..1d0a69d Binary files /dev/null and b/docs/content/assets/network-asset-B07_extract_file-20250316154507-xowa0v8.png differ diff --git a/docs/content/assets/network-asset-B07_rename_rootfs-20250316154505-67z62qt.png b/docs/content/assets/network-asset-B07_rename_rootfs-20250316154505-67z62qt.png new file mode 100644 index 0000000..207cdb1 Binary files /dev/null and b/docs/content/assets/network-asset-B07_rename_rootfs-20250316154505-67z62qt.png differ diff --git a/docs/content/assets/network-asset-B08_rename_folder-20250316154508-nck7bmp.jpg b/docs/content/assets/network-asset-B08_rename_folder-20250316154508-nck7bmp.jpg new file mode 100644 index 0000000..4488f97 Binary files /dev/null and b/docs/content/assets/network-asset-B08_rename_folder-20250316154508-nck7bmp.jpg differ diff --git a/docs/content/assets/network-asset-B09_check_permission-20250316154508-5znmk6q.png b/docs/content/assets/network-asset-B09_check_permission-20250316154508-5znmk6q.png new file mode 100644 index 0000000..61b172a Binary files /dev/null and b/docs/content/assets/network-asset-B09_check_permission-20250316154508-5znmk6q.png differ diff --git a/docs/content/assets/network-asset-B09_copy_files-20250316154505-ewfiral.png b/docs/content/assets/network-asset-B09_copy_files-20250316154505-ewfiral.png new file mode 100644 index 0000000..fb3eed8 Binary files /dev/null and b/docs/content/assets/network-asset-B09_copy_files-20250316154505-ewfiral.png differ diff --git a/docs/content/assets/network-asset-B10_run_script-20250316154505-6sp5xib.jpg b/docs/content/assets/network-asset-B10_run_script-20250316154505-6sp5xib.jpg new file mode 100644 index 0000000..4827f4f Binary files /dev/null and b/docs/content/assets/network-asset-B10_run_script-20250316154505-6sp5xib.jpg differ diff --git a/docs/content/assets/network-asset-B10_test_command-20250316154508-luxyd8x.jpg b/docs/content/assets/network-asset-B10_test_command-20250316154508-luxyd8x.jpg new file mode 100644 index 0000000..d901f82 Binary files /dev/null and b/docs/content/assets/network-asset-B10_test_command-20250316154508-luxyd8x.jpg differ diff --git a/docs/content/assets/network-asset-B11_1_modify_script-20250316154506-vr52sud.jpg b/docs/content/assets/network-asset-B11_1_modify_script-20250316154506-vr52sud.jpg new file mode 100644 index 0000000..192df5f Binary files /dev/null and b/docs/content/assets/network-asset-B11_1_modify_script-20250316154506-vr52sud.jpg differ diff --git a/docs/content/assets/network-asset-B11_1_set_variables-20250316154508-15g0q87.jpg b/docs/content/assets/network-asset-B11_1_set_variables-20250316154508-15g0q87.jpg new file mode 100644 index 0000000..1ed7bb5 Binary files /dev/null and b/docs/content/assets/network-asset-B11_1_set_variables-20250316154508-15g0q87.jpg differ diff --git a/docs/content/assets/network-asset-B11_2_modify_script-20250316154506-hzyxqre.jpg b/docs/content/assets/network-asset-B11_2_modify_script-20250316154506-hzyxqre.jpg new file mode 100644 index 0000000..09d8535 Binary files /dev/null and b/docs/content/assets/network-asset-B11_2_modify_script-20250316154506-hzyxqre.jpg differ diff --git a/docs/content/assets/network-asset-B11_2_set_variables-20250316154508-h1fh5sm.jpg b/docs/content/assets/network-asset-B11_2_set_variables-20250316154508-h1fh5sm.jpg new file mode 100644 index 0000000..7933dd9 Binary files /dev/null and b/docs/content/assets/network-asset-B11_2_set_variables-20250316154508-h1fh5sm.jpg differ diff --git a/docs/content/assets/network-asset-B11_3_modify_script-20250316154506-jhkwc9m.jpg b/docs/content/assets/network-asset-B11_3_modify_script-20250316154506-jhkwc9m.jpg new file mode 100644 index 0000000..e61d4f6 Binary files /dev/null and b/docs/content/assets/network-asset-B11_3_modify_script-20250316154506-jhkwc9m.jpg differ diff --git a/docs/content/assets/network-asset-B12_restart_ubuntu-20250316154508-2czuiy6.jpg b/docs/content/assets/network-asset-B12_restart_ubuntu-20250316154508-2czuiy6.jpg new file mode 100644 index 0000000..9ea8098 Binary files /dev/null and b/docs/content/assets/network-asset-B12_restart_ubuntu-20250316154508-2czuiy6.jpg differ diff --git a/docs/content/assets/network-asset-B12_start_ubuntu-20250316154506-gnltn4h.jpg b/docs/content/assets/network-asset-B12_start_ubuntu-20250316154506-gnltn4h.jpg new file mode 100644 index 0000000..a73eb3d Binary files /dev/null and b/docs/content/assets/network-asset-B12_start_ubuntu-20250316154506-gnltn4h.jpg differ diff --git a/docs/content/assets/network-asset-B13_jdk_version-20250316154509-szxns7p.jpg b/docs/content/assets/network-asset-B13_jdk_version-20250316154509-szxns7p.jpg new file mode 100644 index 0000000..4faa946 Binary files /dev/null and b/docs/content/assets/network-asset-B13_jdk_version-20250316154509-szxns7p.jpg differ diff --git a/docs/content/assets/network-asset-a-01-20250316155449-4tjrocx.png b/docs/content/assets/network-asset-a-01-20250316155449-4tjrocx.png new file mode 100644 index 0000000..7252514 Binary files /dev/null and b/docs/content/assets/network-asset-a-01-20250316155449-4tjrocx.png differ diff --git a/docs/content/assets/network-asset-a-02-20250316155449-hw7c6fi.png b/docs/content/assets/network-asset-a-02-20250316155449-hw7c6fi.png new file mode 100644 index 0000000..4cbb1a9 Binary files /dev/null and b/docs/content/assets/network-asset-a-02-20250316155449-hw7c6fi.png differ diff --git a/docs/content/assets/network-asset-a-03-20250316155449-palqw6t.png b/docs/content/assets/network-asset-a-03-20250316155449-palqw6t.png new file mode 100644 index 0000000..07839d9 Binary files /dev/null and b/docs/content/assets/network-asset-a-03-20250316155449-palqw6t.png differ diff --git a/docs/content/assets/network-asset-b-01-20250316155449-5nq152l.png b/docs/content/assets/network-asset-b-01-20250316155449-5nq152l.png new file mode 100644 index 0000000..804aaa4 Binary files /dev/null and b/docs/content/assets/network-asset-b-01-20250316155449-5nq152l.png differ diff --git a/docs/content/assets/network-asset-b-02-20250316155449-3tj1vnd.png b/docs/content/assets/network-asset-b-02-20250316155449-3tj1vnd.png new file mode 100644 index 0000000..42998bb Binary files /dev/null and b/docs/content/assets/network-asset-b-02-20250316155449-3tj1vnd.png differ diff --git a/docs/content/assets/network-asset-b-03-20250316155449-7pxwsk4.png b/docs/content/assets/network-asset-b-03-20250316155449-7pxwsk4.png new file mode 100644 index 0000000..5bce78f Binary files /dev/null and b/docs/content/assets/network-asset-b-03-20250316155449-7pxwsk4.png differ diff --git a/docs/content/assets/network-asset-c-01-20250316155450-j4emwtp.png b/docs/content/assets/network-asset-c-01-20250316155450-j4emwtp.png new file mode 100644 index 0000000..f60cfa0 Binary files /dev/null and b/docs/content/assets/network-asset-c-01-20250316155450-j4emwtp.png differ diff --git a/docs/content/assets/network-asset-c-02-20250316155450-imayn8e.png b/docs/content/assets/network-asset-c-02-20250316155450-imayn8e.png new file mode 100644 index 0000000..a5a0c20 Binary files /dev/null and b/docs/content/assets/network-asset-c-02-20250316155450-imayn8e.png differ diff --git a/docs/content/assets/network-asset-c-03-20250316155450-w9czvqh.png b/docs/content/assets/network-asset-c-03-20250316155450-w9czvqh.png new file mode 100644 index 0000000..4be2ca2 Binary files /dev/null and b/docs/content/assets/network-asset-c-03-20250316155450-w9czvqh.png differ diff --git a/docs/content/assets/network-asset-c-04-20250316155450-ge91fnx.png b/docs/content/assets/network-asset-c-04-20250316155450-ge91fnx.png new file mode 100644 index 0000000..564d575 Binary files /dev/null and b/docs/content/assets/network-asset-c-04-20250316155450-ge91fnx.png differ diff --git a/docs/content/assets/network-asset-c-05-20250316155450-vxqip71.png b/docs/content/assets/network-asset-c-05-20250316155450-vxqip71.png new file mode 100644 index 0000000..0c63575 Binary files /dev/null and b/docs/content/assets/network-asset-c-05-20250316155450-vxqip71.png differ diff --git a/docs/content/assets/network-asset-checksum-01-20250316183328-2ijfqbg.png b/docs/content/assets/network-asset-checksum-01-20250316183328-2ijfqbg.png new file mode 100644 index 0000000..16c76a8 Binary files /dev/null and b/docs/content/assets/network-asset-checksum-01-20250316183328-2ijfqbg.png differ diff --git a/docs/content/assets/network-asset-checksum-02-20250316183328-mewlvcs.png b/docs/content/assets/network-asset-checksum-02-20250316183328-mewlvcs.png new file mode 100644 index 0000000..baf7955 Binary files /dev/null and b/docs/content/assets/network-asset-checksum-02-20250316183328-mewlvcs.png differ diff --git a/docs/content/assets/network-asset-d-01-20250316155452-dtqtm8g.png b/docs/content/assets/network-asset-d-01-20250316155452-dtqtm8g.png new file mode 100644 index 0000000..ed82a61 Binary files /dev/null and b/docs/content/assets/network-asset-d-01-20250316155452-dtqtm8g.png differ diff --git a/docs/content/assets/network-asset-d-02-20250316155452-gdsmr1f.png b/docs/content/assets/network-asset-d-02-20250316155452-gdsmr1f.png new file mode 100644 index 0000000..617e7c1 Binary files /dev/null and b/docs/content/assets/network-asset-d-02-20250316155452-gdsmr1f.png differ diff --git a/docs/content/assets/network-asset-download-crx-20250316184540-c6u4bof.png b/docs/content/assets/network-asset-download-crx-20250316184540-c6u4bof.png new file mode 100644 index 0000000..35bb1b8 Binary files /dev/null and b/docs/content/assets/network-asset-download-crx-20250316184540-c6u4bof.png differ diff --git a/docs/content/assets/network-asset-e-01-20250316155452-he2vjdq.png b/docs/content/assets/network-asset-e-01-20250316155452-he2vjdq.png new file mode 100644 index 0000000..6aa9798 Binary files /dev/null and b/docs/content/assets/network-asset-e-01-20250316155452-he2vjdq.png differ diff --git a/docs/content/assets/network-asset-e-02-20250316155452-j2i65lz.png b/docs/content/assets/network-asset-e-02-20250316155452-j2i65lz.png new file mode 100644 index 0000000..121a2b1 Binary files /dev/null and b/docs/content/assets/network-asset-e-02-20250316155452-j2i65lz.png differ diff --git a/docs/content/assets/network-asset-e-03-20250316155452-osyb47i.png b/docs/content/assets/network-asset-e-03-20250316155452-osyb47i.png new file mode 100644 index 0000000..a0a177c Binary files /dev/null and b/docs/content/assets/network-asset-e-03-20250316155452-osyb47i.png differ diff --git a/docs/content/assets/network-asset-empty-folder-20250315222639-8gpgu8t.png b/docs/content/assets/network-asset-empty-folder-20250315222639-8gpgu8t.png new file mode 100644 index 0000000..8e90af1 Binary files /dev/null and b/docs/content/assets/network-asset-empty-folder-20250315222639-8gpgu8t.png differ diff --git a/docs/content/assets/network-asset-explorer-show-hidden-items-20250315222638-qo64e3c.png b/docs/content/assets/network-asset-explorer-show-hidden-items-20250315222638-qo64e3c.png new file mode 100644 index 0000000..11f75f8 Binary files /dev/null and b/docs/content/assets/network-asset-explorer-show-hidden-items-20250315222638-qo64e3c.png differ diff --git a/docs/content/assets/network-asset-extension-settings-20250316184541-g5c2jtc.gif b/docs/content/assets/network-asset-extension-settings-20250316184541-g5c2jtc.gif new file mode 100644 index 0000000..12d697c Binary files /dev/null and b/docs/content/assets/network-asset-extension-settings-20250316184541-g5c2jtc.gif differ diff --git a/docs/content/assets/network-asset-f-01-20250316155450-b1jpm86.png b/docs/content/assets/network-asset-f-01-20250316155450-b1jpm86.png new file mode 100644 index 0000000..bb81c5a Binary files /dev/null and b/docs/content/assets/network-asset-f-01-20250316155450-b1jpm86.png differ diff --git a/docs/content/assets/network-asset-f-02-20250316155451-8rr4ha3.png b/docs/content/assets/network-asset-f-02-20250316155451-8rr4ha3.png new file mode 100644 index 0000000..2c4b914 Binary files /dev/null and b/docs/content/assets/network-asset-f-02-20250316155451-8rr4ha3.png differ diff --git a/docs/content/assets/network-asset-f-03-20250316155451-jbsfcm8.png b/docs/content/assets/network-asset-f-03-20250316155451-jbsfcm8.png new file mode 100644 index 0000000..5da4dab Binary files /dev/null and b/docs/content/assets/network-asset-f-03-20250316155451-jbsfcm8.png differ diff --git a/docs/content/assets/network-asset-f-04-20250316155451-32iica5.png b/docs/content/assets/network-asset-f-04-20250316155451-32iica5.png new file mode 100644 index 0000000..fb6b285 Binary files /dev/null and b/docs/content/assets/network-asset-f-04-20250316155451-32iica5.png differ diff --git a/docs/content/assets/network-asset-fab82a145ddc0d2bad0be84a73556a5756283b18-20250317001907-1mf9fwp.gif b/docs/content/assets/network-asset-fab82a145ddc0d2bad0be84a73556a5756283b18-20250317001907-1mf9fwp.gif new file mode 100644 index 0000000..f522084 Binary files /dev/null and b/docs/content/assets/network-asset-fab82a145ddc0d2bad0be84a73556a5756283b18-20250317001907-1mf9fwp.gif differ diff --git a/docs/content/assets/network-asset-faq-installer-download-slow-1-20250315221737-ihrkqkr.png b/docs/content/assets/network-asset-faq-installer-download-slow-1-20250315221737-ihrkqkr.png new file mode 100644 index 0000000..bf3e5c4 Binary files /dev/null and b/docs/content/assets/network-asset-faq-installer-download-slow-1-20250315221737-ihrkqkr.png differ diff --git a/docs/content/assets/network-asset-faq-installer-download-slow-2-20250315221737-qb1gq9i.png b/docs/content/assets/network-asset-faq-installer-download-slow-2-20250315221737-qb1gq9i.png new file mode 100644 index 0000000..2e12d93 Binary files /dev/null and b/docs/content/assets/network-asset-faq-installer-download-slow-2-20250315221737-qb1gq9i.png differ diff --git a/docs/content/assets/network-asset-faq-installer-download-slow-3-20250315221737-zgc931w.png b/docs/content/assets/network-asset-faq-installer-download-slow-3-20250315221737-zgc931w.png new file mode 100644 index 0000000..42103ea Binary files /dev/null and b/docs/content/assets/network-asset-faq-installer-download-slow-3-20250315221737-zgc931w.png differ diff --git a/docs/content/assets/network-asset-faq-installer-download-slow-4-20250315221737-y875dvj.png b/docs/content/assets/network-asset-faq-installer-download-slow-4-20250315221737-y875dvj.png new file mode 100644 index 0000000..b8129e3 Binary files /dev/null and b/docs/content/assets/network-asset-faq-installer-download-slow-4-20250315221737-y875dvj.png differ diff --git a/docs/content/assets/network-asset-faq-installer-download-slow-5-20250315221737-ngc984s.png b/docs/content/assets/network-asset-faq-installer-download-slow-5-20250315221737-ngc984s.png new file mode 100644 index 0000000..8313648 Binary files /dev/null and b/docs/content/assets/network-asset-faq-installer-download-slow-5-20250315221737-ngc984s.png differ diff --git a/docs/content/assets/network-asset-folder-permission-20250315222638-q4sv7jn.png b/docs/content/assets/network-asset-folder-permission-20250315222638-q4sv7jn.png new file mode 100644 index 0000000..3234621 Binary files /dev/null and b/docs/content/assets/network-asset-folder-permission-20250315222638-q4sv7jn.png differ diff --git a/docs/content/assets/network-asset-g-01-20250316155451-9qmblow.png b/docs/content/assets/network-asset-g-01-20250316155451-9qmblow.png new file mode 100644 index 0000000..3565698 Binary files /dev/null and b/docs/content/assets/network-asset-g-01-20250316155451-9qmblow.png differ diff --git a/docs/content/assets/network-asset-g-02-20250316155451-12aszap.png b/docs/content/assets/network-asset-g-02-20250316155451-12aszap.png new file mode 100644 index 0000000..49aa622 Binary files /dev/null and b/docs/content/assets/network-asset-g-02-20250316155451-12aszap.png differ diff --git a/docs/content/assets/network-asset-g-03-20250316155451-bylefel.png b/docs/content/assets/network-asset-g-03-20250316155451-bylefel.png new file mode 100644 index 0000000..3e9eb90 Binary files /dev/null and b/docs/content/assets/network-asset-g-03-20250316155451-bylefel.png differ diff --git a/docs/content/assets/network-asset-g-04-20250316155452-qh7mf3g.png b/docs/content/assets/network-asset-g-04-20250316155452-qh7mf3g.png new file mode 100644 index 0000000..6a73830 Binary files /dev/null and b/docs/content/assets/network-asset-g-04-20250316155452-qh7mf3g.png differ diff --git a/docs/content/assets/network-asset-linked-folders-20250315222639-ejwvemn.png b/docs/content/assets/network-asset-linked-folders-20250315222639-ejwvemn.png new file mode 100644 index 0000000..85f527c Binary files /dev/null and b/docs/content/assets/network-asset-linked-folders-20250315222639-ejwvemn.png differ diff --git a/docs/content/assets/network-asset-logo_48-20250316184541-5cfzwt1.png b/docs/content/assets/network-asset-logo_48-20250316184541-5cfzwt1.png new file mode 100644 index 0000000..65f4e01 Binary files /dev/null and b/docs/content/assets/network-asset-logo_48-20250316184541-5cfzwt1.png differ diff --git a/docs/content/assets/network-asset-menu-logout-20250315222638-6h7d5hd.png b/docs/content/assets/network-asset-menu-logout-20250315222638-6h7d5hd.png new file mode 100644 index 0000000..6ad5287 Binary files /dev/null and b/docs/content/assets/network-asset-menu-logout-20250315222638-6h7d5hd.png differ diff --git a/docs/content/assets/network-asset-menu-logout-20250315222639-b8pu7z0.png b/docs/content/assets/network-asset-menu-logout-20250315222639-b8pu7z0.png new file mode 100644 index 0000000..6ad5287 Binary files /dev/null and b/docs/content/assets/network-asset-menu-logout-20250315222639-b8pu7z0.png differ diff --git a/docs/content/assets/network-asset-mob-steve-explode-20250316184209-wzb2afi.jpg b/docs/content/assets/network-asset-mob-steve-explode-20250316184209-wzb2afi.jpg new file mode 100644 index 0000000..1c6478f Binary files /dev/null and b/docs/content/assets/network-asset-mob-steve-explode-20250316184209-wzb2afi.jpg differ diff --git a/docs/content/assets/network-asset-nbt-downloading-outputs-20250315221736-3yeszbs.png b/docs/content/assets/network-asset-nbt-downloading-outputs-20250315221736-3yeszbs.png new file mode 100644 index 0000000..f079492 Binary files /dev/null and b/docs/content/assets/network-asset-nbt-downloading-outputs-20250315221736-3yeszbs.png differ diff --git a/docs/content/assets/network-asset-nbt-open-level-dat-20250315221735-5pv885l.png b/docs/content/assets/network-asset-nbt-open-level-dat-20250315221735-5pv885l.png new file mode 100644 index 0000000..a0a9af6 Binary files /dev/null and b/docs/content/assets/network-asset-nbt-open-level-dat-20250315221735-5pv885l.png differ diff --git a/docs/content/assets/network-asset-nbt-support-file-1-20250315221736-p5rcfo9.png b/docs/content/assets/network-asset-nbt-support-file-1-20250315221736-p5rcfo9.png new file mode 100644 index 0000000..5421583 Binary files /dev/null and b/docs/content/assets/network-asset-nbt-support-file-1-20250315221736-p5rcfo9.png differ diff --git a/docs/content/assets/network-asset-nbt-support-file-2-1-20250315221736-ned6gpf.png b/docs/content/assets/network-asset-nbt-support-file-2-1-20250315221736-ned6gpf.png new file mode 100644 index 0000000..fe760c1 Binary files /dev/null and b/docs/content/assets/network-asset-nbt-support-file-2-1-20250315221736-ned6gpf.png differ diff --git a/docs/content/assets/network-asset-nbt-support-file-2-2-20250315221736-khkl54l.png b/docs/content/assets/network-asset-nbt-support-file-2-2-20250315221736-khkl54l.png new file mode 100644 index 0000000..fdac47d Binary files /dev/null and b/docs/content/assets/network-asset-nbt-support-file-2-2-20250315221736-khkl54l.png differ diff --git a/docs/content/assets/network-asset-nbt-support-file-2-3-20250315221737-j62zsid.png b/docs/content/assets/network-asset-nbt-support-file-2-3-20250315221737-j62zsid.png new file mode 100644 index 0000000..a71dd8b Binary files /dev/null and b/docs/content/assets/network-asset-nbt-support-file-2-3-20250315221737-j62zsid.png differ diff --git a/docs/content/assets/network-asset-nbt-support-file-3-20250315221737-q7lu500.png b/docs/content/assets/network-asset-nbt-support-file-3-20250315221737-q7lu500.png new file mode 100644 index 0000000..827fd37 Binary files /dev/null and b/docs/content/assets/network-asset-nbt-support-file-3-20250315221737-q7lu500.png differ diff --git a/docs/content/assets/network-asset-ntuser-files-20250315222639-1xlzxem.png b/docs/content/assets/network-asset-ntuser-files-20250315222639-1xlzxem.png new file mode 100644 index 0000000..a00c50a Binary files /dev/null and b/docs/content/assets/network-asset-ntuser-files-20250315222639-1xlzxem.png differ diff --git a/docs/content/assets/network-asset-pkg_update-20250316154503-v6p17lv.jpg b/docs/content/assets/network-asset-pkg_update-20250316154503-v6p17lv.jpg new file mode 100644 index 0000000..0e8c44a Binary files /dev/null and b/docs/content/assets/network-asset-pkg_update-20250316154503-v6p17lv.jpg differ diff --git a/docs/content/assets/network-asset-prompt-20250315222636-lpnjg76.png b/docs/content/assets/network-asset-prompt-20250315222636-lpnjg76.png new file mode 100644 index 0000000..1c2d17e Binary files /dev/null and b/docs/content/assets/network-asset-prompt-20250315222636-lpnjg76.png differ diff --git a/docs/content/assets/network-asset-recipe-apple-hungry-20250316184209-caab7si.png b/docs/content/assets/network-asset-recipe-apple-hungry-20250316184209-caab7si.png new file mode 100644 index 0000000..d63e0ec Binary files /dev/null and b/docs/content/assets/network-asset-recipe-apple-hungry-20250316184209-caab7si.png differ diff --git a/docs/content/assets/network-asset-recipe-bread-hungry-20250316184209-c4hukxb.png b/docs/content/assets/network-asset-recipe-bread-hungry-20250316184209-c4hukxb.png new file mode 100644 index 0000000..31fc96f Binary files /dev/null and b/docs/content/assets/network-asset-recipe-bread-hungry-20250316184209-c4hukxb.png differ diff --git a/docs/content/assets/network-asset-recipe-diamond-explode-20250316184209-jln0vzy.png b/docs/content/assets/network-asset-recipe-diamond-explode-20250316184209-jln0vzy.png new file mode 100644 index 0000000..9956bfc Binary files /dev/null and b/docs/content/assets/network-asset-recipe-diamond-explode-20250316184209-jln0vzy.png differ diff --git a/docs/content/assets/network-asset-recipe-hand-grenade-20250316184209-t0om6f6.png b/docs/content/assets/network-asset-recipe-hand-grenade-20250316184209-t0om6f6.png new file mode 100644 index 0000000..cd874ca Binary files /dev/null and b/docs/content/assets/network-asset-recipe-hand-grenade-20250316184209-t0om6f6.png differ diff --git a/docs/content/assets/network-asset-recipe-rightclick-to-fly-20250316184209-08yqxu4.png b/docs/content/assets/network-asset-recipe-rightclick-to-fly-20250316184209-08yqxu4.png new file mode 100644 index 0000000..c55b25b Binary files /dev/null and b/docs/content/assets/network-asset-recipe-rightclick-to-fly-20250316184209-08yqxu4.png differ diff --git a/docs/content/assets/network-asset-recipe-sword-diamond-error-20250316184209-dzg3i4f.png b/docs/content/assets/network-asset-recipe-sword-diamond-error-20250316184209-dzg3i4f.png new file mode 100644 index 0000000..e6911d0 Binary files /dev/null and b/docs/content/assets/network-asset-recipe-sword-diamond-error-20250316184209-dzg3i4f.png differ diff --git a/docs/content/assets/network-asset-recipe-sword-iron-error-20250316184209-n2eqoyg.png b/docs/content/assets/network-asset-recipe-sword-iron-error-20250316184209-n2eqoyg.png new file mode 100644 index 0000000..5db0082 Binary files /dev/null and b/docs/content/assets/network-asset-recipe-sword-iron-error-20250316184209-n2eqoyg.png differ diff --git a/docs/content/assets/network-asset-recipe-tnt-20250316184208-9fsba8n.png b/docs/content/assets/network-asset-recipe-tnt-20250316184208-9fsba8n.png new file mode 100644 index 0000000..a23d9af Binary files /dev/null and b/docs/content/assets/network-asset-recipe-tnt-20250316184208-9fsba8n.png differ diff --git a/docs/content/assets/network-asset-regedit-defaultusername-20250315222637-sr47gip.png b/docs/content/assets/network-asset-regedit-defaultusername-20250315222637-sr47gip.png new file mode 100644 index 0000000..4305bfe Binary files /dev/null and b/docs/content/assets/network-asset-regedit-defaultusername-20250315222637-sr47gip.png differ diff --git a/docs/content/assets/network-asset-settings-add-user-1-20250315222636-uutpf1a.png b/docs/content/assets/network-asset-settings-add-user-1-20250315222636-uutpf1a.png new file mode 100644 index 0000000..4cfa5ad Binary files /dev/null and b/docs/content/assets/network-asset-settings-add-user-1-20250315222636-uutpf1a.png differ diff --git a/docs/content/assets/network-asset-settings-add-user-2-20250315222637-3vehn3q.png b/docs/content/assets/network-asset-settings-add-user-2-20250315222637-3vehn3q.png new file mode 100644 index 0000000..832cda9 Binary files /dev/null and b/docs/content/assets/network-asset-settings-add-user-2-20250315222637-3vehn3q.png differ diff --git a/docs/content/assets/network-asset-settings-add-user-3-20250315222637-wet8f7c.png b/docs/content/assets/network-asset-settings-add-user-3-20250315222637-wet8f7c.png new file mode 100644 index 0000000..f896579 Binary files /dev/null and b/docs/content/assets/network-asset-settings-add-user-3-20250315222637-wet8f7c.png differ diff --git a/docs/content/assets/network-asset-settings-change-user-type-20250315222637-1s97ium.png b/docs/content/assets/network-asset-settings-change-user-type-20250315222637-1s97ium.png new file mode 100644 index 0000000..2fe2ba4 Binary files /dev/null and b/docs/content/assets/network-asset-settings-change-user-type-20250315222637-1s97ium.png differ diff --git a/docs/content/assets/network-asset-settings-sys-properties-20250315222638-7x0ubnb.png b/docs/content/assets/network-asset-settings-sys-properties-20250315222638-7x0ubnb.png new file mode 100644 index 0000000..7bd6eeb Binary files /dev/null and b/docs/content/assets/network-asset-settings-sys-properties-20250315222638-7x0ubnb.png differ diff --git a/docs/content/assets/network-asset-settings-user-actions-20250315222637-6clegcb.png b/docs/content/assets/network-asset-settings-user-actions-20250315222637-6clegcb.png new file mode 100644 index 0000000..266458a Binary files /dev/null and b/docs/content/assets/network-asset-settings-user-actions-20250315222637-6clegcb.png differ diff --git a/docs/content/assets/network-asset-settings-user-actions-20250315222639-lqpmk9y.png b/docs/content/assets/network-asset-settings-user-actions-20250315222639-lqpmk9y.png new file mode 100644 index 0000000..266458a Binary files /dev/null and b/docs/content/assets/network-asset-settings-user-actions-20250315222639-lqpmk9y.png differ diff --git a/docs/content/assets/network-asset-sys-properties-user-profiles-20250315222638-s5osk9p.png b/docs/content/assets/network-asset-sys-properties-user-profiles-20250315222638-s5osk9p.png new file mode 100644 index 0000000..48aca71 Binary files /dev/null and b/docs/content/assets/network-asset-sys-properties-user-profiles-20250315222638-s5osk9p.png differ diff --git a/docs/content/assets/network-asset-this-computer-right-menu-20250315222638-v2gvwnh.png b/docs/content/assets/network-asset-this-computer-right-menu-20250315222638-v2gvwnh.png new file mode 100644 index 0000000..86638a2 Binary files /dev/null and b/docs/content/assets/network-asset-this-computer-right-menu-20250315222638-v2gvwnh.png differ diff --git a/docs/content/assets/network-asset-user-data-cut-20250315222637-f2o5a0x.png b/docs/content/assets/network-asset-user-data-cut-20250315222637-f2o5a0x.png new file mode 100644 index 0000000..feeef43 Binary files /dev/null and b/docs/content/assets/network-asset-user-data-cut-20250315222637-f2o5a0x.png differ diff --git a/docs/content/assets/network-asset-user-data-paste-20250315222637-8x3flj0.png b/docs/content/assets/network-asset-user-data-paste-20250315222637-8x3flj0.png new file mode 100644 index 0000000..babd68b Binary files /dev/null and b/docs/content/assets/network-asset-user-data-paste-20250315222637-8x3flj0.png differ diff --git a/docs/content/assets/network-asset-user-data-permission-20250315222638-cu41iou.png b/docs/content/assets/network-asset-user-data-permission-20250315222638-cu41iou.png new file mode 100644 index 0000000..542513b Binary files /dev/null and b/docs/content/assets/network-asset-user-data-permission-20250315222638-cu41iou.png differ diff --git a/docs/content/assets/network-asset-user-profile-list-20250315222638-6idg29j.png b/docs/content/assets/network-asset-user-profile-list-20250315222638-6idg29j.png new file mode 100644 index 0000000..9e2bbb0 Binary files /dev/null and b/docs/content/assets/network-asset-user-profile-list-20250315222638-6idg29j.png differ diff --git a/docs/content/assets/network-asset-vscode-add-folder-20250315221735-gpztq20.png b/docs/content/assets/network-asset-vscode-add-folder-20250315221735-gpztq20.png new file mode 100644 index 0000000..d22488a Binary files /dev/null and b/docs/content/assets/network-asset-vscode-add-folder-20250315221735-gpztq20.png differ diff --git a/docs/content/assets/network-asset-vscode-change-default-settings-20250315221734-8d97hmy.png b/docs/content/assets/network-asset-vscode-change-default-settings-20250315221734-8d97hmy.png new file mode 100644 index 0000000..6ea2a68 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-change-default-settings-20250315221734-8d97hmy.png differ diff --git a/docs/content/assets/network-asset-vscode-change-default-theme-20250315221734-9qceson.png b/docs/content/assets/network-asset-vscode-change-default-theme-20250315221734-9qceson.png new file mode 100644 index 0000000..13be53d Binary files /dev/null and b/docs/content/assets/network-asset-vscode-change-default-theme-20250315221734-9qceson.png differ diff --git a/docs/content/assets/network-asset-vscode-configure-display-language-20250315221734-iudmfwz.png b/docs/content/assets/network-asset-vscode-configure-display-language-20250315221734-iudmfwz.png new file mode 100644 index 0000000..a6dd9b7 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-configure-display-language-20250315221734-iudmfwz.png differ diff --git a/docs/content/assets/network-asset-vscode-download-1-20250315221732-pbbk9r2.png b/docs/content/assets/network-asset-vscode-download-1-20250315221732-pbbk9r2.png new file mode 100644 index 0000000..f9da518 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-download-1-20250315221732-pbbk9r2.png differ diff --git a/docs/content/assets/network-asset-vscode-download-2-20250315221732-ydvbqhq.png b/docs/content/assets/network-asset-vscode-download-2-20250315221732-ydvbqhq.png new file mode 100644 index 0000000..4c61eb8 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-download-2-20250315221732-ydvbqhq.png differ diff --git a/docs/content/assets/network-asset-vscode-exe-20250315221732-z39ucpa.png b/docs/content/assets/network-asset-vscode-exe-20250315221732-z39ucpa.png new file mode 100644 index 0000000..cfefd1b Binary files /dev/null and b/docs/content/assets/network-asset-vscode-exe-20250315221732-z39ucpa.png differ diff --git a/docs/content/assets/network-asset-vscode-first-launch-20250315221733-6jgjbd0.png b/docs/content/assets/network-asset-vscode-first-launch-20250315221733-6jgjbd0.png new file mode 100644 index 0000000..645582e Binary files /dev/null and b/docs/content/assets/network-asset-vscode-first-launch-20250315221733-6jgjbd0.png differ diff --git a/docs/content/assets/network-asset-vscode-install-nbt-viewer-20250315221734-6wylbjd.png b/docs/content/assets/network-asset-vscode-install-nbt-viewer-20250315221734-6wylbjd.png new file mode 100644 index 0000000..21f5d6d Binary files /dev/null and b/docs/content/assets/network-asset-vscode-install-nbt-viewer-20250315221734-6wylbjd.png differ diff --git a/docs/content/assets/network-asset-vscode-keep-open-20250315221736-scacdfz.png b/docs/content/assets/network-asset-vscode-keep-open-20250315221736-scacdfz.png new file mode 100644 index 0000000..32c4ff3 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-keep-open-20250315221736-scacdfz.png differ diff --git a/docs/content/assets/network-asset-vscode-language-pack-restart-20250315221734-bhzvs3f.png b/docs/content/assets/network-asset-vscode-language-pack-restart-20250315221734-bhzvs3f.png new file mode 100644 index 0000000..b02c4b3 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-language-pack-restart-20250315221734-bhzvs3f.png differ diff --git a/docs/content/assets/network-asset-vscode-manage-workspace-trust-1-20250315221735-kinmnr6.png b/docs/content/assets/network-asset-vscode-manage-workspace-trust-1-20250315221735-kinmnr6.png new file mode 100644 index 0000000..9c23a4a Binary files /dev/null and b/docs/content/assets/network-asset-vscode-manage-workspace-trust-1-20250315221735-kinmnr6.png differ diff --git a/docs/content/assets/network-asset-vscode-manage-workspace-trust-2-20250315221735-jdc14gu.png b/docs/content/assets/network-asset-vscode-manage-workspace-trust-2-20250315221735-jdc14gu.png new file mode 100644 index 0000000..f9ad3d2 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-manage-workspace-trust-2-20250315221735-jdc14gu.png differ diff --git a/docs/content/assets/network-asset-vscode-open-folder-20250315221735-hawxfl5.png b/docs/content/assets/network-asset-vscode-open-folder-20250315221735-hawxfl5.png new file mode 100644 index 0000000..337cf6c Binary files /dev/null and b/docs/content/assets/network-asset-vscode-open-folder-20250315221735-hawxfl5.png differ diff --git a/docs/content/assets/network-asset-vscode-resource-manager-20250315221735-amxkeq2.png b/docs/content/assets/network-asset-vscode-resource-manager-20250315221735-amxkeq2.png new file mode 100644 index 0000000..2ff4290 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-resource-manager-20250315221735-amxkeq2.png differ diff --git a/docs/content/assets/network-asset-vscode-search-nbt-viewer-20250315221734-oq5endx.png b/docs/content/assets/network-asset-vscode-search-nbt-viewer-20250315221734-oq5endx.png new file mode 100644 index 0000000..c70ff9c Binary files /dev/null and b/docs/content/assets/network-asset-vscode-search-nbt-viewer-20250315221734-oq5endx.png differ diff --git a/docs/content/assets/network-asset-vscode-select-language-pack-20250315221734-h6w04w1.png b/docs/content/assets/network-asset-vscode-select-language-pack-20250315221734-h6w04w1.png new file mode 100644 index 0000000..d4fcebe Binary files /dev/null and b/docs/content/assets/network-asset-vscode-select-language-pack-20250315221734-h6w04w1.png differ diff --git a/docs/content/assets/network-asset-vscode-setup-1-20250315221733-72b0edr.png b/docs/content/assets/network-asset-vscode-setup-1-20250315221733-72b0edr.png new file mode 100644 index 0000000..47fc08f Binary files /dev/null and b/docs/content/assets/network-asset-vscode-setup-1-20250315221733-72b0edr.png differ diff --git a/docs/content/assets/network-asset-vscode-setup-2-20250315221733-mo1zslf.png b/docs/content/assets/network-asset-vscode-setup-2-20250315221733-mo1zslf.png new file mode 100644 index 0000000..f7ee296 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-setup-2-20250315221733-mo1zslf.png differ diff --git a/docs/content/assets/network-asset-vscode-setup-3-20250315221733-tn3mz90.png b/docs/content/assets/network-asset-vscode-setup-3-20250315221733-tn3mz90.png new file mode 100644 index 0000000..907a0ac Binary files /dev/null and b/docs/content/assets/network-asset-vscode-setup-3-20250315221733-tn3mz90.png differ diff --git a/docs/content/assets/network-asset-vscode-setup-4-20250315221733-lncj84v.png b/docs/content/assets/network-asset-vscode-setup-4-20250315221733-lncj84v.png new file mode 100644 index 0000000..f5c51a7 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-setup-4-20250315221733-lncj84v.png differ diff --git a/docs/content/assets/network-asset-vscode-setup-5-20250315221733-yvrwxxi.png b/docs/content/assets/network-asset-vscode-setup-5-20250315221733-yvrwxxi.png new file mode 100644 index 0000000..4bf3b41 Binary files /dev/null and b/docs/content/assets/network-asset-vscode-setup-5-20250315221733-yvrwxxi.png differ diff --git a/docs/content/assets/network-asset-vscode-setup-doc-20250315221732-5nop15f.png b/docs/content/assets/network-asset-vscode-setup-doc-20250315221732-5nop15f.png new file mode 100644 index 0000000..28d1d6f Binary files /dev/null and b/docs/content/assets/network-asset-vscode-setup-doc-20250315221732-5nop15f.png differ diff --git a/docs/content/assets/network-asset-vscode-trust-folder-20250315221735-44tp8j0.png b/docs/content/assets/network-asset-vscode-trust-folder-20250315221735-44tp8j0.png new file mode 100644 index 0000000..2eb0a3b Binary files /dev/null and b/docs/content/assets/network-asset-vscode-trust-folder-20250315221735-44tp8j0.png differ diff --git a/docs/content/assets/network-asset-vscode-view-output-20250315221736-z53qis5.png b/docs/content/assets/network-asset-vscode-view-output-20250315221736-z53qis5.png new file mode 100644 index 0000000..addf70a Binary files /dev/null and b/docs/content/assets/network-asset-vscode-view-output-20250315221736-z53qis5.png differ diff --git a/docs/content/assets/network-asset-wakelock-20250316154509-alafbmi.jpg b/docs/content/assets/network-asset-wakelock-20250316154509-alafbmi.jpg new file mode 100644 index 0000000..e365dfd Binary files /dev/null and b/docs/content/assets/network-asset-wakelock-20250316154509-alafbmi.jpg differ diff --git a/docs/content/baidu-mobile-links.md b/docs/content/baidu-mobile-links.md new file mode 100644 index 0000000..06600a9 --- /dev/null +++ b/docs/content/baidu-mobile-links.md @@ -0,0 +1,14 @@ +--- +title: 百度触屏版首页不同样式的页面 +date: 2025-03-16T22:31:54Z +lastmod: 2025-03-16T22:32:26Z +tags: [链接,网站] +--- + +# 百度触屏版首页不同样式的页面 + +- 普通版:`https://m.baidu.com`​ +- 简版一:`https://m.baidu.com/?wpo=btmfast&pu=sz%401321_000`​ +- 简版二:`https://m.baidu.com/?wpo=btmfast&pu=sz%401325_000`​ + +‍ diff --git a/docs/content/canvas-library-fabric-js.md b/docs/content/canvas-library-fabric-js.md new file mode 100644 index 0000000..be6359f --- /dev/null +++ b/docs/content/canvas-library-fabric-js.md @@ -0,0 +1,675 @@ +--- +title: Fabric.js 简单介绍和使用 +date: 2025-03-15T22:51:22Z +lastmod: 2025-03-15T22:55:55Z +tags: [Web 前端,JavaScript,Canvas,Fabric.js] +--- + +# Fabric.js 简单介绍和使用 + +## 参考资料 + +- [Fabric.js JSDoc](http://fabricjs.com/docs/) +- [Fabric.js Demos - Event inspector](http://fabricjs.com/events) +- [Fabric.js 从入门到________](https://juejin.cn/post/7026941253845516324) +- [Fabric.js 实用指南](https://blackstarxing.github.io/2019-08-17-fabric-doc.html) + +## 简介 + +Fabric.js 是一个功能强大的 Canvas 库,它在原生 Canvas 之上提供了交互式对象模型、多种易用的 API 和 SVG 解析器等,通过简洁的 API 就可以在画布上进行丰富的操作,并且支持多种的事件方法。 + +注:本文中使用的 Fabric.js 版本为 v5。 + +## 常用的对象、属性和方法 + +### 常用对象 + +|名称|描述| +| ------| ------------------------------| +|​`ActiveSelection`​|选区| +|​`Group`​|分组| +|​`Image`​|图像| +|​`Line`​|线段| +|​`Rect`​|矩形| +|​`Text`​|文本(不可编辑,不换行)| +|​`IText`​|可编辑文本(可编辑,不换行)| +|​`Textbox`​|文本框(可编辑,自动换行)| + +### 常用属性 + +|属性|描述| +| ------| ---------------------------------------------| +|​`type`​|对象类型| +|​`data`​|用于添加自定义的数据| +|​`originX`​|对象转换的水平原点(left / center / right)| +|​`originY`​|对象转换的垂直原点(top / center / bottom)| +|​`left`​|水平坐标| +|​`top`​|垂直坐标| +|​`width`​|宽度| +|​`height`​|高度| +|​`angle`​|旋转角度| +|​`scaleX`​|水平方向缩放倍数| +|​`scaleY`​|垂直方向缩放倍数| +|​`stroke`​|线段颜色| +|​`strokeWidth`​|线段宽度| +|​`fill`​|填充颜色| +|​`fontFamily`​|文本字体名称| +|​`fontSize`​|文本字体大小| +|​`opacity`​|对象的不透明度| +|​`borderColor`​|选区边框颜色| +|​`borderDashArray`​|选区边框虚线样式| +|​`borderOpacityWhenMoving`​|选区拖拽时的边框透明度| +|​`cornerColor`​|选区 “操作点” 填充颜色| +|​`cornerSize`​|选区 “操作点” 大小| +|​`cornerStrokeColor`​|选区 “操作点” 描边颜色| +|​`cornerStyle`​|选区 “操作点” 样式(circle / rect)| +|​`transparentCorners`​|选区 “操作点” 中心是否透明(只有描边)| +|​`hasControls`​|是否有 “操作点”| +|​`lockRotation`​|是否禁止旋转对象| +|​`lockMovementX`​|是否禁止水平移动对象| +|​`lockMovementY`​|是否禁止垂直移动对象| +|​`lockScaleX`​|是否禁止水平缩放对象| +|​`lockScaleY`​|是否禁止垂直缩放对象| +|​`selectable`​|是否可以被选中| +|​`hoverCursor`​|光标在对象上方时的样式(子对象优先)| +|​`moveCursor`​|光标在可移动对象上方时的样式(子对象优先)| + +### 常用方法 + +#### 画布(Canvas) + +|方法|描述| +| ------| ------------------------------------| +|​`add(...object)`​|添加对象到画布| +|​`insertAt(object, index, nonSplicing)`​|添加对象到画布指定层级| +|​`moveTo(object, index)`​|更改对象所在的层级| +|​`remove(...object)`​|移除画布上的对象| +|​`discardActiveObject()`​|取消选中对象| +|​`getActiveObject()`​|获取选中的对象| +|​`setActiveObject()`​|更改选中的对象| +|​`getPointer()`​|传递事件对象,获取相对于画布的坐标| +|​`fire()`​|触发画布事件| +|​`forEachObject()`​|遍历画布上的对象| +|​`getZoom()`​|获取画布缩放比例| +|​`setZoom()`​|设置画布缩放比例| +|​`on()`​|监听画布事件| +|​`requestRenderAll()`​|刷新画布| +|​`set()`​|设置画布属性| + +#### 对象(Object) + +|方法|描述| +| ------| ------------------------------| +|​`bringToFront()`​|改变对象层级,置顶| +|​`bringForward()`​|改变对象层级,上移| +|​`sendBackwards()`​|改变对象层级,下移| +|​`sendToBack()`​|改变对象层级,置底| +|​`intersectsWithObject()`​|检测两个对象是否相交(重叠)| +|​`isContainedWithinObject()`​|检测对象是在另外一个对象内| +|​`on()`​|监听对象事件| +|​`set()`​|设置对象属性| +|​`toDataURL()`​|转换为 Base64| + +## 创建对象 + +### 画布 + +```javascript +let canvas = new fabric.Canvas({ + // 画布宽度 + width: 800, + // 画布高度 + height: 480, + // 背景颜色 + backgroundColor: '#FFFFFF', + // 激活对象时不将对象置顶 + preserveObjectStacking: true, + // 选区框样式 + selectionBorderColor: '#4CAF50', + selectionColor: '#4CAF5040', + selectionFullyContained: true, + selectionLineWidth: 1, + // 关闭按比例缩放 + uniformScaling: false, + // 其他配置选项 + ... +}); +``` + +### 矩形 + +```javascript +// 创建对象 +let el = new fabric.Rect({ + left: 100, // 相对于画布左侧的距离 + top: 100, // 相对于画布顶部的距离 + width: 200, // 对象宽度 100px + height: 100, // 对象高度 100px + fill: '#FFFFFF', // 填充颜色 + stroke: '#1E88E5', // 边框颜色 + strokeWidth: 2, // 边框粗细 +}); +// 添加对象 +canvas.add(el); +``` + +### 线段 + +```javascript +// 创建对象 +let el = new fabric.Line([ + 100, 100, // 起始点坐标 + 200, 100, // 结束点坐标 +], { + stroke: '#1E88E5', // 线段颜色 + strokeWidth: 2, // 线段粗细 +}); +// 添加对象 +canvas.add(el); +``` + +```javascript +// 创建对象 +let el = new fabric.Line([], { + stroke: '#1E88E5', + strokeWidth: 2, +}); +// 设置位置和长度 +el.set({ + left: 100, + top: 100, + width: 100, + // 注:因为是线段,高度为 0 + height: 0, +}); +// 添加对象 +canvas.add(el); +``` + +### 图片 + +```javascript +let img = new Image(); + +// 监听图片加载,加载完成后再添加对象 +img.onload = function() { + // 创建对象 + let el = new fabric.Image(img, { + top: 100, + left: 100, + width: 200, + height: 150, + }); + // 添加对象 + canvas.add(el); +}; +// 设置 crossorigin 属性,开启 CORS 校验 +// 若不设置,无法将画布或画布上的对象导出为图片。 +// 值设置为 anonymous,表示对此元素的 CORS 请求将不设置凭据标志。 +img.setAttribute('crossorigin', 'anonymous'); +// 设置图片地址 +img.setAttribute('src', 'http://fabricjs.com/assets/69.svg'); +``` + +### 文本框 + +```javascript +// 创建对象 +let el = new fabric.Textbox('文本内容', { + top: 100, + left: 100, + // 设置宽度后,文本内容超出宽度后会自动换行。 + // 注意:文本只会在空格处自动换行。 + // 高度为自适应,不需要设置。 + width: 200, +}); +// 添加对象 +canvas.add(el); +``` + +## 场景和实现方法 + +### 画布内容撤销、恢复 + +主要通过 Fabric.js 画布对象的 `toObject()` 和 `loadFromJSON()` 方法实现。 + +为了提高性能,默认情况下 `toObject()` 只会导出对象上**常用**的属性,其他属性(例如 `data`、`selectable`)不会被导出,需要手动在其 `propertiesToInclude` 参数中指定(例如 `canvas.toObject(['data', 'selectable'])`)。 + +### 画布内容导出为图片 + +将画布(显示区域)或对象导出为图片: + +```javascript +toDataURL(options) +``` + +参数:options(可选) + +|属性名|数据类型|默认值|简介| +| ---------------------| ----------| --------| -----------------------------------------| +|format|String|png|导出图片的格式,可选值:jpeg、png| +|quality|Number|1|图片质量(0 \~ 1),仅 jpeg 格式可用| +|multiplier|Number|1|缩放比例| +|left|Number||裁剪左偏移量(1.2.14+)| +|top|Number||裁剪上偏移量(1.2.14+)| +|width|Number||裁剪宽度(1.2.14+)| +|height|Number||裁剪高度(1.2.14+)| +|enableRetinaScaling|Boolean||为克隆图像启用 Retina 缩放(2.0.0+)| + +用法示例: + +```javascript +let dataURL = canvas.toDataURL({ + format: 'jpeg', + quality: 0.8, +}); +``` + +```javascript +let dataURL = rect.toDataURL({ + format: 'png', +}); +``` + +注意: + +若导出的对象中包含使用 URL(非 DataURL)加载的图片对象,需要使用 `crossOrigin` 属性解决资源跨域问题,否则会出现以下错误提示: + +```plaintext +The canvas has been tainted by cross-origin data. +``` + +其中一种解决方式是先使用 `new Image()` 设置 `crossorigin` 属性,加载图片,再创建 `fabric.Image` 对象(参考 “创建对象 - 图片”)。 + +### 画布自适应父 DOM 元素宽高 + +#### 方案一:监听浏览器窗口大小变化事件 + +```javascript +// 父元素(DOM) +let el = vm.$el; +// 画布对象 +let canvas = vm.canvasInstance; +// 防抖定时器 +let debounce = null; + +// 事件处理函数 +const handler = function () { + clearTimeout(debounce); + debounce = setTimeout(() => { + if (canvas) { + // 设置宽高 + canvas.setWidth(el.clientWidth); + canvas.setHeight(el.clientHeight); + // 刷新画布(正常情况下设置宽高后会自动刷新) + // canvas.requestRenderAll(); + } else { + console.error('处理失败,画布对象不存在!'); + } + }, 500); +}; + +// 添加事件监听 +window.addEventListener('resize', handler); + +// 移除事件监听 +window.removeEventListener('resize', handler); +clearTimeout(debounce); +``` + +#### 方案二:使用 ResizeObserver 监听 DOM 元素大小更改 + +参考资料:[ResizeObserver - Web API 接口参考 | MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserver) + +方案优点:在窗口大小不变化的情况下也能实现自适应 + +```javascript +// 父元素(DOM) +let el = vm.$el; +// 画布对象 +let canvas = vm.canvasInstance; +// 防抖定时器 +let debounce = null; + +/** + * @desc 观察器回调函数 + * @type {ResizeObserverCallback} + */ +const handler = function (entries) { + clearTimeout(debounce); + debounce = setTimeout(() => { + const entry = entries[0]; + + if (canvas && entry) { + const { width, height } = entry.contentRect; + // 设置宽高 + canvas.setWidth(width); + canvas.setHeight(height); + // 刷新画布(正常情况下设置宽高后会自动刷新) + // canvas.requestRenderAll(); + } else { + console.error('处理失败,Canvas 或 ResizeObserverEntry 不存在!'); + } + }, 500); +}; + +/** + * @desc 观察器配置选项 + * @type {ResizeObserverOptions} + */ +const options = { + // 设置观察器以哪种盒子模型来观察变化 + // 可选值:content-box(默认)、border-box、device-pixel-content-box + box: 'border-box', +}; + +// 创建观察器,并传递回调函数 +const observer = new ResizeObserver(handler); + +// 传递配置选项 +observer.observe(el, options); + +// 停止观察器 +observer.disconnect(); +clearTimeout(debounce); +``` + +### 解决画布缩放后,对象显示模糊 + +把对象的 `objectCaching` 属性设置为 `false`,关闭缓存即可。 + +例如: + +```javascript +const rect = new fabric.Rect({ + left: 100, + top: 100, + width: 200, + height: 200, + fill: '#FFFFFF', + stroke: '#66CCFF', + strokeWidth: 2, + objectCaching: false, +}); + +canvas.add(rect); +``` + +注意:不建议大量使用,以免影响性能。 + +### 实现对象溢出隐藏(裁剪)效果 + +主要用到了 `clipPath` 功能,设置对象的裁剪路径。 + +```javascript +// 创建用于作为“容器”的对象 +const container = new fabric.Rect({ + left: 0, + top: 0, + width: 800, + height: 480, + fill: '#FFFFFF', + stroke: '#000000', + strokeWidth: 2, + // 将该属性设置为 true 后,裁剪的区域会动态更新 + absolutePositioned: true, +}); + +// 创建子对象 +const item = new fabric.Rect({ + left: 100, + top: 100, + width: 200, + height: 100, + fill: '#FFFFFF', + stroke: '#66CCFF', + strokeWidth: 2, + // 将 container 对象设为该对象的 clipPath + clipPath: container, +}); +``` + +**关于** **​`absolutePositioned`​** **属性:** + +仅当对象作为 `clipPath` 使用时才有意义。如果为 `true`,`clipPath` 的位置将会相对于画布,且不受对象变换影响。([JSDoc: Class: Object#absolutePositioned](http://fabricjs.com/docs/fabric.Object.html#absolutePositioned)) + +**注意:** + +后续通过 `.set()` 更新对象的 `clipPath` 属性时,建议同时将其 `dirty` 属性设置为 `true`,以便清除缓存,防止裁剪区域没有更新。([JSDoc: Class: Object#dirty](http://fabricjs.com/docs/fabric.Object.html#dirty)) + +```javascript +item.set({ clipPath: null, dirty: true }); +``` + +### 鼠标滚轮缩放画布 + +主要用到了画布的鼠标事件(`mouse:wheel`)以及调用画布的 `zoomToPoint()` 方法改变视图缩放。 + +```javascript +// 监听事件:鼠标滚轮 +canvas.on('mouse:wheel', function (ev) { + + const evt = ev.e; + const cursorX = evt.offsetX; + const cursorY = evt.offsetY; + + // 若按下 Ctrl 键,则为缩放 + if (evt.ctrlKey) { + evt.preventDefault(); + } else { + return; + } + + // 若按下 Alt 键,则为重置缩放 + if (evt.altKey) { + canvas.zoomToPoint({ + x: cursorX, + y: cursorY, + }, 1); + return; + } + + // 正数:向下滚动 + // 负数:向上滚动 + const delta = evt.deltaY; + + // 画布当前缩放值 + let zoom = canvas.getZoom(); + let min = 0.1; + let max = 10; + + zoom += zoom * (delta > 0 ? -0.2 : 0.2); + + // 限制缩放范围 + (zoom < min) && (zoom = min); + (zoom > max) && (zoom = max); + + // 设置画布缩放比例 + // 参数1:将画布的缩放点设置为鼠标当前位置 + // 参数2:传入缩放值 + canvas.zoomToPoint({ + x: cursorX, + y: cursorY, + }, zoom); + +}); +``` + +### 鼠标拖拽移动画布 + +主要用到了画布的鼠标事件(`mouse:down`、`mouse:move` 和 `mouse:up`)以及调用画布的 `setViewportTransform()` 方法改变视图偏移量。 + +注意:在拖拽前,若鼠标选中了对象,需要将对象的 `lockMovementX` 和 `lockMovementY` 属性设置为 `true`,锁定对象的移动,否则拖拽后对象的位置会变化。 + +```javascript +// 监听事件:鼠标按下 +canvas.on('mouse:down', function ({ e: evt, target }) { + + // 仅在按下了 Ctrl 键时为拖拽画布 + if (!evt.ctrlKey) { + return; + } + + if (target) { + if (target.lockMovementX || target.lockMovementY) { + // 记录原始锁定状态 + target.isLock = true; + } else { + // 记录原始锁定状态 + target.isLock = false; + // 锁定对象的移动 + target.set({ + lockMovementX: true, + lockMovementY: true, + }); + } + } + + canvas.set({ + // 关闭选区框 + selection: false, + // 自定义属性,标记拖拽状态 + isDragCanvas: true, + // 自定义属性,记录起始位置 + startPosX: evt.clientX, + startPosY: evt.clientY, + startVpt: [...canvas.viewportTransform], + }); + +}); + +// 监听事件:鼠标移动 +canvas.on('mouse:move', function (ev) { + // 检测是否为拖拽画布模式 + if (canvas.isDragCanvas) { + const evt = ev.e; + const vptOld = canvas.startVpt; + const vptNew = [...vptOld]; + + // 计算新的偏移量 + vptNew[4] += (evt.clientX - canvas.startPosX); + vptNew[5] += (evt.clientY - canvas.startPosY); + + // 更新视图偏移量 + canvas.setViewportTransform(vptNew); + } +}); + +// 监听事件:鼠标松开 +canvas.on('mouse:up', function ({ target }) { + // 解锁对象的移动(如果可以) + if (target && !target.isLock) { + target.set({ + lockMovementX: false, + lockMovementY: false, + }); + } + // 更新画布属性 + canvas.set({ + // 开启选区框 + selection: true, + // 自定义属性,标记拖拽状态 + isDragCanvas: false, + }); +}); +``` + +### 鼠标事件中获取分组(Group)内的目标对象 + +默认情况下,对于分组,`ev.target` 只能获取到整个分组,并不能具体到其中的对象。 + +在创建分组时,将 `subTargetCheck` 属性设置为 `true`,即可通过 `ev.subTargets` 获取触发事件时的子对象。 + +对于支持该功能的事件(`mouse:down`、`mouse:up`、`mouse:move` 等),该属性为 `fabric.Object` 数组; + +对于不支持该功能的事件,该属性为 `undefined`。 + +例如: + +```javascript +const group = new fabric.Group([obj1, obj2], { + subTargetCheck: true, + ... +}); + +canvas.add(group); + +canvas.on('mouse:down', function (ev) { + console.log(ev.subTargets); +}); +``` + +### 文本框强制自动换行 + +Fabeic.js 的文本框对象(Textbox)默认支持文本自动换行,但只能在**空格**处换行,对于类似中文句子这种不带空格的字符串并不会换行,且文本框的宽度会自动被撑开。 + +在 Fabric.js 2.6.0 版本中,新增了一个 `splitByGrapheme` 属性,将其设置为 `true` 即可启用在任意字符之间自动换行(参考:[JSDoc: Global](http://fabricjs.com/docs/global.html#splitByGrapheme)),例如: + +```javascript +const textbox = new fabric.Textbox('文本框', { + left: 100, + top: 100, + width: 200, + splitByGrapheme: true, +}); + +canvas.add(textbox); +``` + +### 选中并聚焦对象(将对象置于视图的中心) + +```javascript +// 获取对象的中心点坐标 +// 坐标值相对于画布左上角起始点 +// 坐标值不受缩放比例影响 +const { + x: elCenterX, + y: elCenterY, +} = el.getCenterPoint(); + +// 获取画布当前的缩放比例 +const zoom = canvas.getZoom(); + +// 计算新的视图坐标 +// 中心点坐标值需要与画布缩放比例相乘,与视图统一 +// 画布坐标的起始点在左上角,坐标值需要减去画布宽高的一半 +const point = { + x: elCenterX * zoom - canvas.width / 2, + y: elCenterY * zoom - canvas.height / 2, +}; + +// 移动视图 +canvas.absolutePan(point); +// 选中对象 +canvas.setActiveObject(el); +``` + +### 选中多个对象,创建选区 + +主要用到了 Fabric.js 的 `ActiveSelection` 对象,手动创建选区: + +```javascript +// 画布对象 +const canvas = this.canvasInstance; + +// 选区中包含的对象 +const items = [a, b, c, ...]; + +// 新建一个选区对象 +const sel = new fabric.ActiveSelection(items, { + // 选区所属的画布 + // 必须包含该参数,否则会出现奇怪的问题(不会报错) + canvas, + // 其他配置选项,例如: + // borderColor, + // borderDashArray, + // opacity, + // hasControls, + ... +}); + +// 使选区生效 +canvas.setActiveObject(sel); +``` + +‍ diff --git a/docs/content/chromium-dev-tools.md b/docs/content/chromium-dev-tools.md new file mode 100644 index 0000000..e82b32b --- /dev/null +++ b/docs/content/chromium-dev-tools.md @@ -0,0 +1,154 @@ +--- +title: 浏览器 DevTools(开发人员工具)部分实用功能介绍 +date: 2025-03-16T15:54:20Z +lastmod: 2025-03-16T15:58:30Z +tags: [Chromium,Chrome,浏览器,工具,Web 前端,DevTools] +--- + +# 浏览器 DevTools(开发人员工具)部分实用功能介绍 + +> 浏览器的 DevTools(开发人员工具)是在前端开发中常用到的工具,其中的 Elements(元素)、Console(控制台)、Sources(源代码)以及 Network(网络)是最常用的四个模块。这里主要介绍最常见的修改网页文本功能以及一些比较实用的功能。 + +## 修改网页内容 + +这是最基础和最简单的用法,只需要点击左上角的“选择元素”按钮,然后在页面上点击需要修改的元素,即可在 DevTools 的 Elements(元素)页面对其进行修改。 + +![](assets/network-asset-a-01-20250316155449-4tjrocx.png) +​![](assets/network-asset-a-02-20250316155449-hw7c6fi.png) +​![](assets/network-asset-a-03-20250316155449-palqw6t.png) + +## 设备模拟 + +在开发响应式页面或为页面适配移动端时常用的一个功能,点击左上角的“Toggle device emulation”按钮即可启用。 + +![](assets/network-asset-b-01-20250316155449-5nq152l.png) + +可以在右侧的“More options”下拉菜单中打开默认隐藏的功能: + +media queries(媒体查询)、rules(标尺)、device pixel ratio(DPR)、device type(设备类型) + +![](assets/network-asset-b-02-20250316155449-3tj1vnd.png) + +在左侧的“Dimensions”下拉菜单中可以快速切换到一些预置的设备分辨率: + +![](assets/network-asset-b-03-20250316155449-7pxwsk4.png) + +## Console(控制台) + +DevTools 的 Console 是在开发过程中常用的功能之一,在其中可以进行计算(小数有浮点精度问题)、执行 JavaScript 代码等操作。 + +### \$0 + +在 DevTools 的 Elements 面板中选中 DOM 节点后,可以看到它的后方显示 `== $0`: + +![](assets/network-asset-c-01-20250316155450-j4emwtp.png) + +实际上,`$0` 是对当前选中的 DOM 节点的引用。 + +除此之外,`$1` 是对上一次选择的 DOM 节点的引用,一直到 `$4`。 + +![](assets/network-asset-c-02-20250316155450-imayn8e.png) + +### \$ 和 \$\$ + +在默认情况下(没有定义过 `$` 变量),它在 Console 中是 `document.querySelector` 的别名。 + +![](assets/network-asset-c-03-20250316155450-w9czvqh.png) + +而 `$$` 则类似 `document.QuerySelectorAll`,但它返回的是包含 DOM 节点的数组,而不是 NodeList。 + +![](assets/network-asset-c-04-20250316155450-ge91fnx.png) + +### \$\_ + +在 Console 中,可以通过 `$_` 快速引用最后一次的执行结果: + +![](assets/network-asset-c-05-20250316155450-vxqip71.png) + +## Elements(元素) + +### Toggle Element State(切换元素状态) + +通过该功能,可以切换元素的不同状态(focus、hover 等),在为元素的不同状态设置样式时比较方便。 + +![](assets/network-asset-f-01-20250316155450-b1jpm86.png) + +### Element Classes(元素类名) + +可以快速地对元素进行添加类名、开启类名、关闭类名操作,预览效果。 + +![](assets/network-asset-f-02-20250316155451-8rr4ha3.png) + +### New Style Rule(添加样式规则) + +可用于临时添加样式规则,点击后会自动添加对于选中的元素的选择器。 + +![](assets/network-asset-f-03-20250316155451-jbsfcm8.png) + +### Copy + +右键点击一个元素,可在右键菜单的“Copy”项中复制对于该元素的 CSS 选择器(Copy selector)或 JavaScript 路径(Copy JS path)。 + +![](assets/network-asset-f-04-20250316155451-32iica5.png) + +Copy selector:`#head_wrapper > div > div` +Copy JS path:`document.querySelector("#head_wrapper > div > div")`​ + +## Sources(源代码) + +### Filesystem(文件系统) + +在“Filesystem”中添加本地文件夹: + +![](assets/network-asset-g-01-20250316155451-9qmblow.png) + +之后就可以在 DevTools 中修改本地文件并保存(需要手动保存)。 + +![](assets/network-asset-g-02-20250316155451-12aszap.png) + +不过,只支持实时预览样式文件的修改。 + +![](assets/network-asset-g-03-20250316155451-bylefel.png) + +### Snippets(代码片段) + +可以在这里添加常用的代码片段,用于复制或执行(在右键菜单中点击“Run”)。 + +![](assets/network-asset-g-04-20250316155452-qh7mf3g.png) + +DevTools 代码片段合集:[DevTools Snippets](http://bgrins.github.io/devtools-snippets/) + +## 保持页面聚焦 + +点击 DevTools 标签栏中的加号(More Tools),选择其中的“Rendering”。 + +![](assets/network-asset-d-01-20250316155452-dtqtm8g.png) + +勾选页面中的“Emulate a focused page”。 + +![](assets/network-asset-d-02-20250316155452-gdsmr1f.png) + +之后网页会被模拟为聚焦状态,即使它不在前台。此时执行 `document.hasFocus()` 会返回 `true`。通过该功能,可以阻止大部分网站检测用户是否离开页面。 + +## 截屏 + +点击 DevTools 右上角的下拉菜单按钮,点击其中的“Run command”(也可以直接使用快捷键),打开命令面板。 + +![](assets/network-asset-e-01-20250316155452-he2vjdq.png) + +然后输入“shot”或“screenshot”,之后可以看到以下几个选项: + +![](assets/network-asset-e-02-20250316155452-j2i65lz.png) + +依次分别为: + +- 截取指定区域 +- 截取完整页面 +- 截取选中的 DOM 节点 +- 截取当前页面 + +可以通过“箭头”键和“Enter”键或鼠标点击进行操作,截屏完成后会在“下载”中显示。 + +![](assets/network-asset-e-03-20250316155452-osyb47i.png) + +‍ diff --git a/docs/content/chromium-startup-arguments.md b/docs/content/chromium-startup-arguments.md new file mode 100644 index 0000000..473923d --- /dev/null +++ b/docs/content/chromium-startup-arguments.md @@ -0,0 +1,384 @@ +--- +title: Chromium 内核浏览器命令行启动参数 +date: 2025-03-19T11:37:29Z +lastmod: 2025-03-19T11:40:14Z +tags: [Chrome,Chromium,Windows] +--- + +# Chromium 内核浏览器命令行启动参数 + +允许加载过期的插件 + +``` +--allow-outdated-plugins +``` + +--- + +允许 HTTPS 网站加载从 HTTP 链接引用的 CSS、JavaScript 等资源 + +``` +--allow-running-insecure-content +``` + +--- + +允许拓展脚本在官方应用中心生效 + +``` +--allow-scripting-gallery +``` + +备注:默认情况下,这些脚本被阻止 + +--- + +停用 GPU 加速视频 + +``` +--disable-accelerated-video +``` + +--- + +停用 Dart + +``` +--disable-dart +``` + +--- + +禁用桌面通知 + +``` +--disable-desktop-notifications +``` + +备注:在 Windows 中,默认启用桌面通知 + +--- + +禁用拓展 + +``` +--disable-extensions +``` + +--- + +停用 FileSystem API + +``` +--disable-file-system +``` + +--- + +禁止显示图像 + +``` +–disable-images +``` + +--- + +禁用 Java + +``` +--disable-java +``` + +--- + +禁用 JavaScript + +``` +--disable-javascript +``` + +--- + +禁用插件 + +``` +--disable-plugins +``` + +--- + +禁用弹出拦截 + +``` +--disable-popup-blocking +``` + +--- + +停用 TCP/IP 预连接 + +``` +--disable-preconnect +``` + +--- + +关闭远程字体支持 + +``` +--disable-remote-fonts +``` + +备注:SVG 中的字体不受此参数影响 + +--- + +停用语音输入 + +``` +--disable-speech-input +``` + +--- + +不遵守同源策略 + +``` +--disable-web-security +``` + +--- + +将缓存文件放置在设定的文件夹中 + +``` +--disk-cache-dir +``` + +--- + +设置缓存大小上限 + +``` +--disk-cache-size +``` + +备注:以字节为单位 + +--- + +停用 DNS 预读 + +``` +--dns-prefetch-disable +``` + +--- + +启用打印预览 + +``` +--enable-print-preview +``` + +--- + +调整标签存放在左边,非顶部 + +``` +--enable-vertical-tabs +``` + +--- + +设定拓展自动更新频率 + +``` +--extensions-update-frequency +``` + +备注:以秒为单位 + +--- + +插件不启用单独进程 + +``` +--in-process-plugins +``` + +--- + +让浏览器直接以隐身模式启动 + +``` +--incognito +``` + +--- + +最后一个标签关闭后仍保持浏览器进程 + +``` +--keep-alive-for-test +``` + +备注:某种意义上可以提高热启动速度,不过系统最好得有充足的内存 + +--- + +启用 kiosk 模式 + +``` +--kiosk +``` + +备注:一种类似于全屏的浏览模式 + +--- + +使用指定的语言 + +``` +--lang +``` + +--- + +阻止 HTTPS 页面加载通过 HTTP 链接引用的图片/字体/框架 + +``` +--no-displaying-insecure-content +``` + +--- + +跳过 Chromium 首次运行检查 + +``` +--no-first-run +``` + +--- + +不发送 HTTP-Referer 头 + +``` +--no-referrers +``` + +--- + +彻底停用沙箱 + +``` +--no-sandbox +``` + +--- + +启动时不建立窗口 + +``` +--no-startup-window +``` + +--- + +将网址列弹出的提示选单数量改为 number 个 + +``` +--omnibox-popup-count=”number” +``` + +--- + +每个标签页使用单独进程 + +``` +--process-per-tab +``` + +--- + +每个站点使用单独进程 + +``` +--process-per-site +``` + +--- + +使用给定 URL 的 PAC 代理脚本 + +``` +--proxy-pac-url +``` + +备注:可以使用本地文件,例如 --proxy-pac-url="file:///C:/proxy.pac" + +--- + +使用给定的代理服务器,这个参数只对 HTTP 和 HTTPS 有效 + +``` +--proxy-server +``` + +备注:例如 --proxy-server=127.0.0.1:8082 + +--- + +在 Chrome 的任务管理器中增加内存清理功能 + +``` +--purge-memory-button +``` + +--- + +设置远程调试端口 + +``` +--remote-debugging-port +``` + +备注:例如 --remote-debugging-port=9222 + +--- + +以单进程模式运行浏览器 + +``` +--single-process +``` + +备注:启动时浏览器会给出不安全警告 + +--- + +启动时最大化 + +``` +--start-maximized +``` + +--- + +自定义 User-Agent + +``` +--user-agent +``` + +--- + +自定义用户资料夹 + +``` +--user-data-dir=UserDataDir +``` + +备注:例如 –user-data-dir="D:\Temp\Chrome\UserData" + +‍ diff --git a/docs/content/classical-quotations.md b/docs/content/classical-quotations.md new file mode 100644 index 0000000..6491d3e --- /dev/null +++ b/docs/content/classical-quotations.md @@ -0,0 +1,70 @@ +--- +title: 经典句子、经典语录 +date: 2025-03-19T11:45:59Z +lastmod: 2025-03-19T11:46:31Z +tags: [文字,经典] +--- + +# 经典句子、经典语录 + +本文内容收集自网络。 + +--- + +## B + +- 不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更接近幸福。 +- 不怕走在黑夜里,就怕心中没有光。 +- 不要亏待每一份热情,不要讨好任何冷漠。 + +## C + +- 撑不住的时候,可以对自己说声“我好累”,但永远不要在心里承认说“我不行”。 + +## D + +- 当初的温暖,当初的坚强,当初的承诺,当初的心灵,当初的共同渡过,当初的花好月圆,当初的风花雪月,当初的寄托钟情,当初的太多,就算回得了过去,也回不到当初了。 + +## N + +- 你以为你想要的是千山万水,最后发现最好的陪伴是柴米油盐。 +- 你住的城市下雨了,很想问你有没有带伞。可是我忍住了,因为我怕你说没带,而我又无能为力,就像是我爱你,却给不到你想要的陪伴。 + +## R + +- 人们总说时间会改变一切,但事实上一切都需要你自己努力去改变。 +- 人生苦短,不要计较太多,与其在纷扰中度日如年,不如在舒适中快乐生活。 +- 人生永远没有太晚的开始,最好的时机就是现在。 +- 人生最重要的不是向上或向下,而是持续向前。 +- 人要是行,干一行行一行,一行行行行行;要是不行,干一行不行一行,一行不行行行不行。 +- 人真正的魅力:不是你给对方留下了美好的第一印象;而是对方认识你多年后,仍喜欢和你在一起。也不是你瞬间吸引了对方的目光;而是对方熟悉你以后,依然欣赏你。更不是初次见面后,就有相见恨晚的感觉;而是历尽沧桑后,能由衷地说,能认识你真好。 + +## S + +- 所有的告别,最后都会变成对自己的告别。告别自己的顽念,告别自己的狭隘,告别自己的不甘心和放不下。这世上的一切林林总总算下来,对自己至关重要的也不过寥寥几许。所谓走时无人送别,归时无人接风,都是再平常不过的事情。然后在些许的遗憾和失落中学会了释怀,懂得了自爱以及如何去爱。 +- 生活得最有意义的人,并不就是年岁活得最大的人,而是对生活最有感受的人。 + +## W + +- 我的世界,没有你,很久了。偶尔想起你,忆起往事,那些不再清晰的,那些渐行渐远的往事,我没有大喜大悲。我也不奢望有轰轰烈烈的爱情,也害怕信誓旦旦。人,越长大越孤单。爱,越成长越懦弱。这个世界现实的可怕,见证了无数的聚散离合后,我们消散了年少时的勇敢。谁还能如当初般不顾一切? + +## Y + +- 要努力,但是不要着急,凡事都应该有过程。 +- 因为你,我愿意成为一个更好的人,不想成为你的包袱,因此发奋努力,只是为了想要证明我足以与你相配。 +- 永远不要因为新鲜感, 扔掉一直陪伴你的人。 +- 有时候,最好的安慰,就是无言的陪伴。 +- 有些事,等失去了,才知道珍惜。但有些事,只有失去了,才知道不值得珍惜。 +- 雨,是最寻常的,它是天空的眼泪,是天空释放心情的表现。 + +## Z + +- 最难过的,莫过于当你遇上一个特别的人,却明白永远不可能在一起,或迟或早,你不得不放弃。 +- 做过的每场梦,爱过的每个人,都像极了风,等得来,却握不住。 +- 这个世界上并没有所谓的巧合,有的只是必然。(出自:CLAMP 作品) +- 这个世界虽然不完美,但我们仍然可以疗愈自己。 +- 这是不是你一直想要的生活,只闻花香,不谈悲喜,喝茶读书,不争朝夕。 +- 只要朝着一个方向努力,一切都会变得得心应手。 +- 重要的不是什么都拥有,而是你想要的恰好在身边。 + +‍ diff --git a/docs/content/collection-javascript-code.md b/docs/content/collection-javascript-code.md new file mode 100644 index 0000000..94012f7 --- /dev/null +++ b/docs/content/collection-javascript-code.md @@ -0,0 +1,681 @@ +--- +title: 「合集」常用的 JavaScript 代码 +date: 2025-03-16T22:02:06Z +lastmod: 2025-03-16T22:02:51Z +tags: [合集,代码片段,Web 前端,JavaScript] +--- + +# 「合集」常用的 JavaScript 代码 + +## document + +#### 焦点不在当前窗口时改变标题 + +```javascript +document.addEventListener('visibilitychange', function () { + if (document.hidden) { + document.title = '焦点不在当前窗口'; + } else { + document.title = '焦点在当前窗口'; + } +}); +``` + +#### 解除离开页面检测 + +```javascript +document.hasFocus = function () { + return true; +}; +``` + +#### 使网页内容(body)可编辑 + +**开启** + +```javascript +document.body.contentEditable = 'true'; +document.designMode = 'on'; +``` + +```javascript +(function () { + let items = document.querySelectorAll('iframe'); + for (let i = 0; i < items.length; i++) { + try { + items[i].contentDocument.body.contentEditable = 'true'; + items[i].contentDocument.designMode = 'on'; + } catch (err) { + console.log(err); + } + } +})(); +``` + +**关闭** + +```javascript +document.body.contentEditable = 'false'; +document.designMode = 'off'; +``` + +```javascript +(function () { + let items = document.querySelectorAll('iframe'); + for (let i = 0; i < items.length; i++) { + try { + items[i].contentDocument.body.contentEditable = 'false'; + items[i].contentDocument.designMode = 'off'; + } catch (err) { + console.log(err); + } + } +})(); +``` + +--- + +## function + +#### 查找元素的 Vue 对象 + +```javascript +/** + * @typedef {object} FunctionResult + * @property {boolean} state 是否查找成功 + * @property {HTMLElement} element Vue 对象所在的元素 + * @property {object} data 找到的 Vue 对象 + * @property {object[]} parents 父 Vue 对象 + */ + +/** + * @description 查找元素的 Vue 对象 + * @param {HTMLElement} el 需要查找的元素 + * @returns {FunctionResult} 返回查找结果信息 + */ +function findElementVue(el) { + + /** @type {FunctionResult} */ + const result = { + state: false, + element: null, + data: null, + parents: [], + }; + + const attrName = '__vue__'; + + // 查找属性 + while (el) { + const data = el[attrName]; + if (data) { + result.state = true; + result.element = el; + result.data = data; + break; + } else { + el = el.parentElement; + } + } + + // 查找父对象 + if (result.state) { + let attrName = '$parent'; + let parent = result.data[attrName]; + + while (parent) { + result.parents.push(parent); + parent = parent[attrName]; + } + } + + return result; + +} +``` + +#### 查找字符 `char` 在 `str` 中第 `num` 次出现的位置 + +```javascript +function findChar(str = '', char = '', num = 1) { + var index = str.indexOf(char); + num = num - 1; + if (num > 0) { + for (var i = 0; i < num; i++) { + index = str.indexOf(char, index + 1); + } + } + return index; +} +``` + +#### 格式化时间 + +```javascript +/** + * @description 格式化时间 + * @param {(number|string|Date)} [time] 要格式化的时间(默认当前) + * @param {string} [format] 需要的格式(默认 yyyy-mm-dd hh:ii:ss) + * @returns {string} 格式化后的时间 + */ +function formatTime(time = new Date(), format = 'yyyy-mm-dd hh:ii:ss') { + + let timeType = typeof time; + + /** @type {Date} */ + let dateObj = null; + + if (timeType == 'number' || timeType == 'string') { + dateObj = new Date(time); + } else if (timeType == 'object') { + dateObj = time; + } + + // 时间信息 + let timeInfo = { + // 年月日 + y: dateObj.getFullYear(), + m: dateObj.getMonth() + 1, + d: dateObj.getDate(), + // 时分秒 + h: dateObj.getHours(), + i: dateObj.getMinutes(), + s: dateObj.getSeconds(), + }; + + // 格式占位符正则 + let formatReg = { + y: /y+/g, + m: /m+/g, + d: /d+/g, + h: /h+/g, + i: /i+/g, + s: /s+/g, + }; + + for (let key in formatReg) { + + // 正则匹配 + let matched = format.match(formatReg[key]); + + // 获取对应的时间 + let timeValue = String(timeInfo[key]); + + // 无匹配结果 + if (!matched) { + continue; + } + + // 根据匹配结果(位数)进行替换 + matched.forEach(function (v) { + let tLength = timeValue.length; + let vLength = v.length; + // 长度不足,补零 + if (tLength < vLength) { + timeValue = timeValue.padStart(v.length, '0'); + } + // 长度超出,截取 + // if (tLength > vLength) { + // timeValue = timeValue.substring(tLength - vLength); + // } + // 替换对应的值 + format = format.replace(v, timeValue); + }); + + } + + return format; + +} +``` + +#### 获取随机的十六进制色 + +```javascript +/** 获取随机的十六进制色 */ +function getHEXColor() { + var codes = [ + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', + ]; + var colors = ['#']; + for (let i = 0; i < 6; i++) { + let index = Math.floor(Math.random() * 16); + colors.push(codes[index]); + } + return colors.join(''); +} +``` + +#### 获取元素的边界信息 + +```javascript +/** + * @description 获取元素的边界信息(当前元素必须在父元素内) + * @param {Element} curr 当前 DOM 元素 + * @param {Element} parent 父 DOM 元素 + */ +function getBoundaryInfo(curr, parent) { + + if (!curr || !parent) { + console.error('获取失败,缺少参数!'); + return null; + } + + var result = {}; + var currRect = curr.getBoundingClientRect(); + var parentRect = parent.getBoundingClientRect(); + + // 当前元素四角坐标和宽高 + result.curr = { + x0: currRect.left, + x1: currRect.right, + y0: currRect.top, + y1: currRect.bottom, + w: currRect.width, + h: currRect.height, + }; + + // 父元素四角坐标 + result.parent = { + x0: parentRect.left, + x1: parentRect.right, + y0: parentRect.top, + y1: parentRect.bottom, + w: parentRect.width, + h: parentRect.height, + }; + + // 距离 + result.distance = { + top: result.curr.y0 - result.parent.y0, + bottom: result.parent.y1 - result.curr.y1, + left: result.curr.x0 - result.parent.x0, + right: result.parent.x1 - result.curr.x1, + }; + + return result; + +} +``` + +#### 获取元素的坐标信息 + +```javascript +/** + * @description 获取元素的坐标信息(四个角以及宽高) + * @param {Element} element DOM 元素 + */ +function getElemPosInfo(element) { + if (!element) { + console.error('获取失败,缺少参数!'); + return null; + } + let rect = element.getBoundingClientRect(); + let data = { + x0: rect.left, + x1: rect.right, + y0: rect.top, + y1: rect.bottom, + w: rect.width, + h: rect.height, + }; + return data; +} +``` + +#### 获取月份第一天和最后一天的时间戳 + +```javascript +/** + * @description 获取月份第一天和最后一天的时间戳 + * @param {number} year 年份 + * @param {number} month 月份 + * @returns `{ start: 第一天, end: 最后一天 }` + */ +function getTimestampOfMonth(year, month) { + var start = new Date(year, month - 1, 1) + var end = new Date(year, month, 0); + var time = { + start: start.getTime(), + end: end.getTime() + }; + return time; +} +``` + +#### 获取坐标下方的元素 + +```javascript +/** + * @description 获取坐标下方的元素(从子元素到父元素) + * @param {number} x 横坐标 + * @param {number} y 纵坐标 + */ +function elemsFromPoint(x, y) { + + if (x === undefined || y === undefined) { + return []; + } + + x = Math.floor(x); + y = Math.floor(y); + + let item = document.elementFromPoint(x, y); + let items = []; + + if (item) { + items.push(item); + } else { + return []; + } + + while (item.parentElement) { + item = item.parentElement; + items.push(item); + } + + return items; + +}; +``` + +#### 计算字符串的字符数 + +```javascript +/** + * @description 计算字符串的字符数(数字英文字母 +1,其他 +3) + * @param {string} str 被检测的字符串 + * @returns {number} 字符数 + */ +function calcChars(str) { + var reg = /[0-9a-zA-Z]/; + var sum = 0; + for (let i in str) { + if (reg.test(str.charAt(i))) { + sum += 1; + } else { + sum += 3; + } + } + return sum; +} +``` + +#### 加减法精度 + +```javascript +/** + * @description 加减法精度 + * @param {string} type 类型(plus、sub) + * @param {number} [num1] 数值1,默认为 0 + * @param {number} [num2] 数值2,默认为 0 + * @returns {(number|null)} 返回两个数值相加或相减后的结果 + */ +function accPlusAndSub(type, num1 = 0, num2 = 0) { + + var decimalsNum1 = (String(num1).split('.')[1] || '').length; + var decimalsNum2 = (String(num2).split('.')[1] || '').length; + var decimalsMax = Math.max(decimalsNum1, decimalsNum2); + var multiplies = Math.pow(10, decimalsMax); + + if (type === 'plus') { + return ((num1 * multiplies + num2 * multiplies) / multiplies); + } else if (type === 'sub') { + return ((num1 * multiplies - num2 * multiplies) / multiplies); + } else { + return null; + } + +} +``` + +#### 检测用户是否离开页面 + +```javascript +/** + * @description 检测用户是否离开页面(一秒检测一次) + * @param {object} [options] 配置选项 + * @param {function} [options.onblur] 用户离开页面时的回调函数 + * @param {function} [options.onfocus] 用户返回页面时的回调函数 + * @param {string} [options.blurDelay] 设定用户离开页面多久后才调用 onblur + * - 单位为秒 + * - 默认 0 + * @param {string} [options.timerName] 定时器名称 + * - 用于 setInterval() + * - 默认 tCheckPageBlur + */ +function checkPageBlur(options) { + + var config = { + onblur: null, + onfocus: null, + blurDelay: 0, + timerName: 'tCheckPageBlur', + }; + + Object.assign(config, options); + + var timerName = config.timerName; // 定时器名称 + var checkDelay = 0; // 延时 + var blurTriggered = false; // 标记状态 + + clearInterval(window[timerName]); + window[timerName] = setInterval(function () { + var isFocus = document.hasFocus(); + + if (isFocus && blurTriggered) { + // 在页面且触发过 blur + blurTriggered = false; + checkDelay = 0; + try { + config.onfocus && (config.onfocus()); + } catch (err) { + console.error('[检测] 回调函数 onfocus 出错\n', err); + } + } else if (!isFocus && !blurTriggered) { + // 不在页面且未触发 blur + if (checkDelay >= config.blurDelay) { + blurTriggered = true; + checkDelay = 0; + try { + config.onblur && (config.onblur()); + } catch (err) { + console.error('[检测] 回调函数 onblur 出错\n', err); + } + } else { + checkDelay += 1; + } + } + }, 1000); + +} + +// 调用 +checkPageBlur({ + onblur: function () { + console.log('[检测] 用户离开页面'); + }, + onfocus: function () { + console.log('[检测] 用户返回页面'); + }, +}); +``` + +#### 解析 URL 地址的参数(?=...)为一个对象 + +```javascript +function queriesToObj(url = '') { + var split = url.split('?')[1]; + var arr = split.split('&'); + var obj = {}; + + arr.forEach(function (item) { + var kv = item.split('='); + obj[kv[0]] = kv[1]; + }); + + return obj; +} +``` + +#### 矩形碰撞检测 + +```javascript +/** + * @description 矩形碰撞检测 + * @param {Element} elemA 当前元素 + * @param {Element} elemB 目标元素 + * @param {boolean} [checkAside] 是否包含边缘碰撞,默认包含 + * @returns {object} `{ error: 是否检测失败, hit: 是否碰撞 }` + */ +function rectColisionCheck(elemA, elemB, checkAside = true) { + const result = { + error: false, + hit: false, + }; + + if (!(elemA && elemB)) { + console.error('缺少参数'); + result.error = true; + return result; + } + + const rectA = elemA.getBoundingClientRect(); + const rectB = elemB.getBoundingClientRect(); + + if (checkAside) { + result.hit = !( + rectA.bottom < rectB.top || + rectA.left > rectB.right || + rectA.top > rectB.bottom || + rectA.right < rectB.left + ); + } else { + result.hit = !( + rectA.bottom <= rectB.top || + rectA.left >= rectB.right || + rectA.top >= rectB.bottom || + rectA.right <= rectB.left + ); + } + + return result; +} +``` + +#### 设置事件对象属性 + +```javascript +/** + * @description 设置事件对象属性 + * @param {Eveny} ev 事件对象 + * @param {object} props 要设置的属性 + */ +function setEvProps(ev, props = {}) { + if (ev) { + for (let key in props) { + Object.defineProperty(ev, key, { + configurable: true, + enumerable: true, + get: function () { + return props[key]; + }, + }); + } + } +} +``` + +#### 通过点路径访问对象属性 + +```javascript +/** + * @description 通过点路径访问对象属性 + * @param {object} obj + * @param {string} path + */ +function getObjValue(obj, path = '') { + + if (typeof obj !== 'object') { + console.error('访问失败,参数 obj 错误!'); + return; + } + + if (typeof path !== 'string') { + console.error('访问失败,参数 path 错误!'); + return; + } + + if (path === '') { + return obj; + } + + return path.split('.').reduce((a, b) => { + return (a === undefined ? a : a[b]); + }, obj); + +} +``` + +#### 暂停执行代码一段时间 + +```javascript +/** + * @description 暂停执行代码一段时间 + * @param {number} [time] 时长(毫秒),默认 1000 + * @returns {Promise} Promise + */ +function sleep(time = 1000) { + return new Promise(function (resolve) { + setTimeout(() => { + resolve(); + }, time); + }); +} + +await sleep(1000); +``` + +#### 字符串转文件 + +```javascript +/** + * @description 字符串转文件 + * @param {string} data 字符串数据 + * @param {string} filename 文件名 + * @param {string} filetype 文件类型(MIME) + */ +function strToFile(data = '', filename = 'export.txt', filetype = 'text/plain') { + + // 转为 Blob + var strToBlob = new Blob([data], { type: filetype }); + // URL 对象兼容性处理 + var urlObject = window.URL || window.webkitURL || window; + // 创建对象 URL + var blobURL = urlObject.createObjectURL(strToBlob); + // 创建 a 元素 + var aElem = document.createElement('a'); + + // 设置属性 + aElem.classList.add('hidden'); + aElem.download = filename; + aElem.href = blobURL; + aElem.target = '_blank'; + + // 添加元素 + document.body.appendChild(aElem); + + // 模拟点击 + aElem.click(); + + // 移除元素 + aElem.remove(); + + // 释放对象 + urlObject.revokeObjectURL(blobURL); + +} +``` + +‍ diff --git a/docs/content/collection-linux-commands.md b/docs/content/collection-linux-commands.md new file mode 100644 index 0000000..0dd7c48 --- /dev/null +++ b/docs/content/collection-linux-commands.md @@ -0,0 +1,173 @@ +--- +title: 「合集」Linux 常用命令 +date: 2025-03-16T19:25:02Z +lastmod: 2025-03-16T19:28:22Z +tags: [合集,Linux,命令] +--- + +# 「合集」Linux 常用命令 + +收集整理,自用。 + +--- + +# I + +## init + +重启:`init 6`​ + +--- + +# J + +## journalctl + +配置自动维护日志文件大小 + +只保留近两周的日志:`journalctl --vacuum-time=2w`​ + +只保留 256MB 的日志:`journalctl --vacuum-size=256M`​ + +参考:[Linux 系统 /var/log/journal/ 垃圾日志清理](https://cloud.tencent.com/developer/article/1446278) + +--- + +# P + +## pkill(强制踢掉登录的用户) + +### 查看用户 + +Linux 系统 root 用户可强制踢制其它登录用户,非 root 用户只能踢掉当前用户名的用户。用 `w` 命令可以查看登录的用户的信息。 + +### 踢掉用户 + +命令格式: + +```bash +pkill -kill -t +``` + +说明: + +​`` 为要踢的用户的 tty,例如 `pkill -kill -t pts/1`。 + +--- + +# S + +## screen + +### 命令 + +#### 列出当前所有的 session + +```bash +screen -ls +``` + +#### 创建名称为 `name` 的 session + +```bash +screen -S name +``` + +#### 回到名称为 `name` 的 session + +```bash +screen -r name +``` + +#### detach 名称为 `name` 的 session + +```bash +screen -d name +``` + +#### 结束当前 session 并回到名称为 `name` 的 session + +```bash +screen -r -d name +``` + +### 按键 + +在每个 screen session 下,所有命令都以 `Ctrl + A`(C-A)开始 + +|按键|作用| +| :------| :------------------------------------------------------| +|C-A ?|显示所有键绑定信息| +|C-A X|锁定当前的 screen session,需用用户密码解锁| +|C-A D|detach,暂时断开当前的 screen session,用 `screen` 命令回去| +|C-A Z|把当前的 screen session 放到后台执行,用 `fg` 命令回去| + +--- + +# T + +## tar + +### 参数 + +注意:-c / -t / -u / -x 不可同时出现 + +|参数(缩写)|参数(完整)|说明| +| :-------------| :------------------| :--------------------------------------------------| +|-c|--create|创建新的压缩文件| +|-d|--diff, --compare|比较压缩文件与当前压缩文件的不同之处| +|-f|--file|指定压缩文件或设备| +|-t|--list|显示压缩文件的文件目录| +|-u|--update|仅将较新的文件附加到存档中| +|-v|--verbose|详细显示处理的文件| +|-x|--extract|解压压缩文件| +|-z|--gzip|通过 gzip 对文件进行压缩或解压(.tar.gz 或 .tgz)| + +### 命令 + +#### 压缩当前路径下的 `test/content/` 文件夹为 `file.tgz`​ + +```bash +tar -zcvf file.tgz test/content/ +``` + +#### 压缩当前路径下的 `test/content/` 文件夹和 `test/text.txt` 文件为 `file.tgz`​ + +```bash +tar -zcvf file.tgz test/content/ test/text.txt +``` + +#### 压缩 `当前路径` 的文件夹为 `file.tgz`​ + +```bash +tar -zcvf file.tgz ./ +``` + +#### 压缩当前路径下的 `test/content/` 文件夹为 `file.tgz`, + +```bash +# 其中不包含 `test/content/text_a.txt` 文件和 `test/content/test/text_b.txt` 文件 +tar --exclude=text_a.txt --exclude=test/text_b.txt -zcvf file.tgz test/content/ +``` + +#### 解压 `当前路径` 下的 `file.tar`​ + +```bash +tar -xvf file.tar +``` + +#### 解压 `当前路径` 下的 `file.tgz`​ + +```bash +tar -zxvf file.tgz +``` + +## taskset + +指定 CPU `0~3` 执行当前路径下的 `start.sh`: + +```bash +taskset -c 0-3 ./start.sh +``` + +‍ diff --git a/docs/content/collection-windows-commands.md b/docs/content/collection-windows-commands.md new file mode 100644 index 0000000..e3f23f4 --- /dev/null +++ b/docs/content/collection-windows-commands.md @@ -0,0 +1,172 @@ +--- +title: 「合集」Windows BAT CMD 常用命令 +date: 2025-03-16T15:47:13Z +lastmod: 2025-03-16T15:47:31Z +tags: [合集,Windows,命令提示符,命令,BAT,脚本] +--- + +# 「合集」Windows BAT CMD 常用命令 + +收集整理,自用。 + +--- + +## @ + +### @ECHO + +#### 打开命令输出 + +```bat +@ECHO ON +``` + +#### 关闭命令输出 + +```bat +@ECHO ON +``` + +### @REM + +#### 注释 + +```bat +@REM 注释内容 +``` + +## I + +### IF + +```bat +IF 条件 ( + 执行命令 +) ^ +ELSE IF 条件 ( + 执行命令 +) ^ +ELSE ( + 执行命令 +) +``` + +```bat +IF NOT 条件 ( + 执行命令 +) +``` + +```bat +@REM 建议判断变量时添加引号,防止出现未知问题。 +@REM 下列判断结果均为真 + +SET EXAMPLE_VAR=1 + +IF "%EXAMPLE_VAR%" == "1" ( + SET EXAMPLE_VAR=2 +) + +IF NOT "%EXAMPLE_VAR%" == "1" ( + SET EXAMPLE_VAR=1 +) +``` + +## P + +### ping + +#### Ping 指定的主机指定次数 + +```bat +ping -n 次数 主机名 +``` + +#### Ping 指定的主机,直到停止 + +> 按下 `Ctrl + Break` 查看统计信息并继续操作; +> 按下 `Ctrl + C` 以停止。 + +```bat +ping -t 主机名 +``` + +#### Ping 指定的主机 10 次,并指定等待每次回复的超时时间(毫秒) + +```bat +ping -n 10 -w 超时时间 主机名 +``` + +## S + +### SET + +#### 设置环境变量 + +> 注:等号之间不能添加空格 + +```bat +SET 环境变量名=环境变量值 +``` + +```bat +@REM 把用户输入的内容作为变量值 +SET /P 环境变量名="提示内容" +``` + +### START + +#### 启动 cmd.exe 并执行命令 + +```bat +@REM 命令执行完毕后自动关闭 +START "窗口标题" /C 起始目录 cmd.exe /C "命令内容" + +@REM 命令执行完毕后不自动关闭 +START "窗口标题" /D 起始目录 cmd.exe /C "命令内容" +``` + +## T + +### TASKKILL + +#### 结束指定窗口标题的程序及其子进程 + +```bat +TASKKILL /FI "WINDOWTITLE eq 窗口标题" /F /T +``` + +### TIMEOUT + +#### 等待指定秒数(可通过任意按键中断) + +```bat +TIMEOUT /T 秒数 +``` + +#### 等待指定秒数(不可通过按键中断) + +```bat +TIMEOUT /T 秒数 /NOBREAK +``` + +#### 无限期等待按键 + +```bat +TIMEOUT /T -1 +``` + +### tracert + +- 不将地址解析为主机名(-d) +- 搜索目标的最大跃点数 20(-h) +- 等待每个回复的超时时间 5000 毫秒(-w) +- 强制使用 IPv4(-4) +- 强制使用 IPv6(-6) + +```bat +tracert -d -h 20 -w 5000 -4 目标 +tracert -d -h 20 -w 5000 -6 目标 +``` + +‍ diff --git a/docs/content/description-cors-preflight-request.md b/docs/content/description-cors-preflight-request.md new file mode 100644 index 0000000..ade3a99 --- /dev/null +++ b/docs/content/description-cors-preflight-request.md @@ -0,0 +1,45 @@ +--- +title: CORS 预检请求(preflight request) +date: 2025-03-15T23:08:14Z +lastmod: 2025-03-15T23:08:41Z +tags: [Web 前端,JavaScript,HTTP] +--- + +# CORS 预检请求(preflight request) + +## 内容来源 + +- [Preflight request - 术语表 | MDN](https://developer.mozilla.org/zh-CN/docs/Glossary/Preflight_request) +- [跨源资源共享(CORS) - HTTP | MDN](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS) + +## 简介 + +CORS 预检请求主要用于检测服务器是否支持 CORS(跨域资源共享)。 + +当有必要的时候,浏览器会自动发出一个预检请求;因此在正常情况下,前端开发者不需要自己去发这样的请求。 + +## 触发条件 + +某些请求(以下称其为 “简单请求”)不会触发 CORS 预检请求。 +若请求满足所有下述条件,则该请求可视为 “简单请求”: + +- 使用下列请求方式之一 + + - GET + - HEAD + - POST +- 除了被用户代理自动设置的 Header(例如 Connection、User-Agent)和其他不在 Fetch 规范中定义的 [禁用的 Header 名称](https://fetch.spec.whatwg.org/#forbidden-header-name) ,允许人为设置下列 [对 CORS 安全的 Header 字段](https://fetch.spec.whatwg.org/#cors-safelisted-request-header) + + - Accept + - Accept-Language + - Content-Language + - Content-Type(需要注意额外的限制) +- 在 Header 中,`Content-Type` 的值为下列之一 + + - text/plain + - multipart/form-data + - application/x-www-form-urlencoded +- 请求中的任意 `XMLHttpRequest` 对象均没有注册任何事件监听器;可以通过 `XMLHttpRequest.upload` 属性访问 `XMLHttpRequest` 对象。 +- 请求中没有使用 `ReadableStream` 对象。 + +‍ diff --git a/docs/content/description-date-time-string-format.md b/docs/content/description-date-time-string-format.md new file mode 100644 index 0000000..5794af7 --- /dev/null +++ b/docs/content/description-date-time-string-format.md @@ -0,0 +1,64 @@ +--- +title: 包含 T 和 Z 的日期时间字符串格式 +date: 2025-03-15T23:11:02Z +lastmod: 2025-03-15T23:11:27Z +tags: [格式,时间,日期] +--- + +# 包含 T 和 Z 的日期时间字符串格式 + +ECMAScript 基于 ISO 8601 扩展格式的简化定义了日期时间的字符串交换格式。 + +格式为:`YYYY-MM-DDTHH:mm:ss.sssZ`​ + +|内容|描述| +| :-----| :-------------------------------------------------------------------| +|YYYY|公历中 0000 到 9999 年的十进制数字。| +|-|“-”(连字符)在字符串中出现两次,分隔年、月、日。| +|MM|一年中的月份,从 01(一月)到 12(十二月)。| +|DD|月份中的天数,从 01(第一天)到 31(最后一天)。| +|T|表示字符串中的时间部分的开始。| +|HH|自午夜以来经过的完整小时数,从 00 到 24 的两位十进制数字。| +|:|“:”(冒号)在字符串中出现两次,分隔时、分、秒。| +|mm|当前小时经过的完整分钟数,从 00 到 59 的两位十进制数字。| +|ss|当前分钟经过的完整秒数,从 00 到 59 的两位十进制数字。| +|.|“.”(点)在字符串中出现一次,分隔秒、毫秒。| +|sss|当前秒经过的完整毫秒数,从 000 到 999 的三位十进制数字。| +|Z|时区,使用 “Z” 表示 UTC,或使用 “+”、“-”,并在后方跟随 HH:mm| +||格式的时间表达式表示偏移量(例如 `+0800` 表示 +8 小时)。| + +所有数字必须为**十进制**形式。 + +如果 `MM` 或 `DD` 字段不存在,则使用默认值 “01”。 + +如果 `HH`、`mm` 或 `ss` 字段不存在,则使用默认值 “00”。 + +若 `sss` 字段不存在,则使用默认值 “000”。 + +如果没有指定时区,则把字符串作为**本地时间**进行解析。 + +由于每天都以午夜开始和结束,所以可以在时间表达式中使用 `00:00` 和 `24:00` 来区分相同时间点的两个午夜。 +也就是说,字符串 `1995-02-04T24:00` 和 `1995-02-05T00:00` 可以表示完全相同的时间点。 + +字符串中可以只包含日期: + +``` +YYYY +YYYY-MM +YYYY-MM-DD +``` + +字符串中可以只包含时间: + +``` +THH:mm +THH:mm:ss +THH:mm:ss.sss +``` + +参考资料: + +- [ECMAScript 2015 Language Specification – Date Time String Format](https://262.ecma-international.org/6.0/#sec-date-time-string-format) +- [rfc2822 - Date and Time Specification](https://datatracker.ietf.org/doc/html/rfc2822#section-3.3) + +‍ diff --git a/docs/content/dynmapforge-warsftbdynmap-compatible.md b/docs/content/dynmapforge-warsftbdynmap-compatible.md new file mode 100644 index 0000000..8c8b89a --- /dev/null +++ b/docs/content/dynmapforge-warsftbdynmap-compatible.md @@ -0,0 +1,104 @@ +--- +title: 「Minecraft」修改 Dynmap 让 WarsFtbDynmap 能正常使用 +date: 2025-03-16T18:58:37Z +lastmod: 2025-03-16T19:02:34Z +tags: [Minecraft,模组,代码片段,Dynmap] +--- + +# 「Minecraft」修改 Dynmap 让 WarsFtbDynmap 能正常使用 + +修改 Dynmap Forge 的 `index.html` 和 `markers.js` 让 WarsFtbDynmap 能正常使用。记录下来,方便下次使用。 + +版本信息: + +- Minecraft Java Edition 正式版 1.12.2 Forge +- [DynmapForge](https://minecraft.curseforge.com/projects/dynmapforge) V3.0 beta 3 +- [WarsFtbDynmap](https://minecraft.curseforge.com/projects/warsftbdynmap) V1.0.4 + +--- + +## 前言 + +可能是因为服务端的多世界功能是使用模组 [Just Enough Dimensions](https://minecraft.curseforge.com/projects/just-enough-dimensions) 实现的,然后 `WarsFtbDynmap` 不能正确识别世界,导致其生成的`marker.json`文件的文件名为 `marker_.json` ,而不是 `marker_世界名称.json`(或者直接把`标记点`的数据写入到原有的 `marker_世界名.json` 中)。 + +因为`DynmapForge`只能加载对应世界名称的 `marker.json` 文件,所以 `WarsFtbDynmap` 不能正常使用(不显示 [FTB Utilities](https://minecraft.curseforge.com/projects/ftb-utilities) 设定的领地)。 + +这只是临时解决方案,且本方案可能有可以改进的地方。 + +目前`网页地图`只显示世界 `world` 和世界 `DIM0`(这两个世界名称是 `Just Enough Dimensions` 给的;`world` 是默认的主世界,`DIM0` 是自己加的世界)。 + +## 进行的修改 + +#### dynmap/web/js/markers.js + +删除了第 28 行中的`world`,使在`网页地图`中切换世界时不能自动传入要加载的`marker.json`的文件名中的`world`参数。 + +```diff +- function loadmarkers(world) { ++ function loadmarkers() { +``` + +#### dynmap/web/index.html + +> 因为去掉了“传入参数”,加载 `marker.json` 时会出错,所以要写一个用于手动传入参数的东西。 + +在第 38 行的后面插入 1 行,写入以下内容(用于设定初始加载的 `marker.json` 的世界名称为 `DIM0`): + +```html + +``` + +在第 46 行的后面插入 11 行,写入以下内容(切换世界用的 function): + +```html + +``` + +#### dynmap/configuration.txt + +> 修改 `DynmapForge` 的配置文件,添加用于切换要加载的 `marker.json` 的按钮。 + +在第 178 行左右(内容是 `# Note: more than one logo component can be defined`)的后面插入 18 行,写入以下内容: + +```yaml +- class: org.dynmap.ClientComponent + type: logo + text: "加载标记 - FTB" + logourl: "images/block_biome.png" + linkurl: "javascript:loadMarkersFTB();" + position: bottom-left +- class: org.dynmap.ClientComponent + type: logo + text: "加载标记 - 主世界" + logourl: "images/block_biome.png" + linkurl: "javascript:loadMarkersDIM0();" + position: bottom-left +- class: org.dynmap.ClientComponent + type: logo + text: "加载标记 - 默认" + logourl: "images/block_biome.png" + linkurl: "javascript:loadMarkersDefault();" + position: bottom-left +``` + +## 结果 + +网页地图的左下角多了 3 个图标,依次是: + +- 加载标记 - 默认 +- 加载标记 - 主世界 +- 加载标记 - FTB + +点一下图标,然后再在右侧的侧边栏切换一下世界,就可以切换显示相应的标记了。(本来想点一下图标就能完成切换,但是暂时没有找到方法)。 + +‍ diff --git a/docs/content/elementary-os-5-1-hera-setup-uefi.md b/docs/content/elementary-os-5-1-hera-setup-uefi.md new file mode 100644 index 0000000..f79da19 --- /dev/null +++ b/docs/content/elementary-os-5-1-hera-setup-uefi.md @@ -0,0 +1,34 @@ +--- +title: 安装 elementary OS 后没有自动写入 EFI 引导 +date: 2025-03-16T16:29:02Z +lastmod: 2025-03-16T16:29:48Z +tags: [记录,Linux,安装系统] +--- + +# 安装 elementary OS 后没有自动写入 EFI 引导 + +elementary OS 官网:[https://elementary.io/](https://elementary.io/) + +安装版本:elementary OS 5.1 + +--- + +在很久之前用过 elementary OS,但是那时候感觉不太好用,后来删除了。 + +现在看更新了,而且正好有空的硬盘,然后就安装来试试。 + +但是,安装之后发现它没有向选择的 EFI 分区写入引导文件。 + +那时候以为是因为安装的时候没设置对,就再安装了一次,然而还是没有。 + +后来尝试使用 `boot-repair` 修复引导,但是没成功。 + +> 不知道是不是双硬盘安装导致的 BUG,后来发现引导文件写入到了第一块硬盘的 EFI 分区里。 + +最后看了深度科技论坛的一个帖子《[纯UEFI下安装15.7,结果没有写入efi](https://bbs.deepin.org/forum.php?mod=viewthread&tid=170729)》,按照 10 楼 @redchenjs 说的: + +> 把原 `EFI` 文件夹里的 `ubuntu` 文件夹复制到空的 `EFI` 分区的 `efi` 文件夹内,然后在 `efi` 文件夹内创建 `boot` 文件夹,复制 `ubuntu` 文件夹里的 `shimx64.efi` 和 `grubx64.efi` 到创建的 `boot` 文件夹,最后把 `shimx64.efi` 重命名为 `bootx64.efi`。 + +这样就可以在 BIOS 启动菜单选第二块硬盘启动 elementary OS 了。 + +‍ diff --git a/docs/content/forge-auto-remove-erroring-entities.md b/docs/content/forge-auto-remove-erroring-entities.md new file mode 100644 index 0000000..5ebe182 --- /dev/null +++ b/docs/content/forge-auto-remove-erroring-entities.md @@ -0,0 +1,80 @@ +--- +title: 「Minecraft」自动修复部分由异常实体或异常方块实体导致的崩溃 +date: 2025-03-16T19:20:29Z +lastmod: 2025-03-16T19:22:00Z +tags: [Minecraft,Forge,教程] +--- + +# 「Minecraft」自动修复部分由异常实体或异常方块实体导致的崩溃 + +需要安装 `Forge API`;可在 `客户端` 和 `服务端` 中使用;对于部分崩溃有效,例如 `Ticking block entity`。 + +已测试游戏版本: + +Minecraft Java Edition 正式版 1.7.X 1.8.X 1.9.X 1.10.X 1.11.X 1.12.X + +--- + +## 主要用到的文件 + +### 客户端 + +```plaintext +客户端/.minecraft/config/forge.cfg +``` + +### 服务端 + +```plaintext +服务端/config/forge.cfg +``` + +## 方法 + +修改 + +```plaintext +B:removeErroringEntities=false +``` + +变为 + +```plaintext +B:removeErroringEntities=true +``` + +修改 + +```plaintext +B:removeErroringTileEntities=false +``` + +变为 + +```plaintext +B:removeErroringTileEntities=true +``` + +## 解释 + +#### removeErroringEntities + +**把此项设置为** **​`true`​**​ **,可以自动移除发生异常的实体,而不是崩溃。** + +Set this to true to remove any Entity that throws an error in its update method instead of closing the server and reporting a crash log. + +**注意,把此项设置为** **​`true`​** **前,请备份存档,以免丢失数据。** + +BE WARNED THIS COULD SCREW UP EVERYTHING USE SPARINGLY WE ARE NOT RESPONSIBLE FOR DAMAGES. + +#### removeErroringTileEntities + +**把此项设置为** **​`true`​** **,可以自动移除发生异常的方块实体,而不是崩溃。** + +Set this to true to remove any TileEntity that throws an error in its update method instead of closing the server and reporting a crash log. + +**注意,把此项设置为** **​`true`​** **前,请备份存档,以免丢失数据。** + +BE WARNED THIS COULD SCREW UP EVERYTHING USE SPARINGLY WE ARE NOT RESPONSIBLE FOR DAMAGES. + +‍ diff --git a/docs/content/frost-navigation.md b/docs/content/frost-navigation.md new file mode 100644 index 0000000..7f593cf --- /dev/null +++ b/docs/content/frost-navigation.md @@ -0,0 +1,71 @@ +--- +title: 「工具」Frost 网址导航 V2 +date: 2025-03-16T18:34:16Z +lastmod: 2025-03-16T18:36:28Z +tags: [网站,工具,导航,HTML5] +--- + +# 「工具」Frost 网址导航 V2 + +## 简介 + +一个多功能的网址导航,绿色无广告。 + +## 使用方法 + +### 在线 + +- [GitHub Pages](https://frost-zx.github.io/frost-navigation/) +- [Vercel](https://frost-navigation.vercel.app/) + +### 离线(需要手动更新) + +1. [点击此处下载](https://github.com/Frost-ZX/frost-navigation/archive/gh-pages.zip) +2. 解压,放置于任意合适的喜欢的位置(可重命名) +3. 在浏览器中打开 `index.html`(也可以将其加入浏览器的书签栏或在浏览器设置中将其设置为主页) + +### 自定义 + +- 设置 + + - 在“设置”页面中,可根据需要对字体大小、页面结构等进行调整。 +- 导航链接列表 + + - 修改 `static/js/frostNavLinks.js`。 + +## 注意 + +- 部分链接由于不能及时更新,可能已过期(不存在、指向了错误的网站等),访问时请注意。若您在使用时发现相关情况,欢迎进行反馈。 + +## 项目中主要使用的组件库和插件 + +- [Vue](https://vuejs.org/) + + - [Vue CLI](https://cli.vuejs.org/) + - [Vue Router](https://router.vuejs.org/) + - [Vuex](https://vuex.vuejs.org/) +- [Element UI - 桌面端组件库](https://element.eleme.cn/) +- [Font Awesome](https://github.com/FortAwesome/Font-Awesome) +- [lodash](https://github.com/lodash/lodash) +- [ress - Modern CSS reset](https://github.com/filipelinhares/ress) + +## 鸣谢 + +- [GitHub Pages - Websites for you and your projects](https://pages.github.com/) +- [Vercel - Develop. Preview. Ship. For the best frontend teams](https://vercel.com/) + +## 项目地址 + +- [Frost-ZX/frost-navigation](https://github.com/Frost-ZX/frost-navigation) + +## 反馈 + +### 提交链接 + +请到 [Issues](https://github.com/Frost-ZX/frost-navigation/issues) ,根据相关提示进行提交。 + +### 修正链接 + +请到 [Issues](https://github.com/Frost-ZX/frost-navigation/issues) ,根据相关提示进行提交。 + +‍ diff --git a/docs/content/html-form-submit-no-redirect.md b/docs/content/html-form-submit-no-redirect.md new file mode 100644 index 0000000..fa73abf --- /dev/null +++ b/docs/content/html-form-submit-no-redirect.md @@ -0,0 +1,32 @@ +--- +title: 「Web 前端」通过 iframe 实现 form 表单提交不跳转页面 +date: 2025-03-15T22:49:42Z +lastmod: 2025-03-15T22:50:25Z +tags: [Web 前端,HTML5,代码片段] +--- + +# 「Web 前端」通过 iframe 实现 form 表单提交不跳转页面 + +## 参考信息 + +- [https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/form](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/form) + +## 示例代码 + +可以通过 `form` 的 `target` 属性指定在提交表单之后,在哪里显示响应信息: + +```html +
+ + +
+ + +``` + +## 注意事项 + +- ​`form` 元素中的 `target` 属性值需要对应目标 `iframe` 元素的 `name` 属性值。 +- ​`iframe` 元素可以放到 `body` 中的任意位置。 + +‍ diff --git a/docs/content/html5-filereader-load-file.md b/docs/content/html5-filereader-load-file.md new file mode 100644 index 0000000..f966b1d --- /dev/null +++ b/docs/content/html5-filereader-load-file.md @@ -0,0 +1,75 @@ +--- +title: HTML5 使用 FileReader 读取并预览文件内容 +date: 2025-03-16T18:26:17Z +lastmod: 2025-03-16T18:27:48Z +tags: [代码片段,HTML5,JavaScript,Web 前端] +--- + +# HTML5 使用 FileReader 读取并预览文件内容 + +## 参考 + +- https://blog.csdn.net/liguodong456/article/details/83038619 + +## HTML + +```html +
+

文本:

+ +
+
+

二进制:

+ +
+
+

图像:

+ +
+
+``` + +## JavaScript + +```javascript +/* 选择文件 */ +var fileText = document.querySelector("#file-text"); +var fileBinary = document.querySelector("#file-bin"); +var fileImage = document.querySelector("#file-image"); + +/* 结果 */ +var fileResult = document.querySelector("#file-result"); + +/* 检测是否支持 FileReader */ +if (typeof (FileReader) === "undefined") { + fileResult.innerHTML = "您的浏览器不支持 FileReader"; +} else { + var reader = new FileReader(); + + fileText.onchange = function () { + var file = fileText.files[0]; + reader.readAsText(file, "utf-8"); // 将文件以 UTF-8 编码读取为文本 + reader.onload = function () { + fileResult.innerHTML = reader.result; + }; + } + + fileBinary.onchange = function () { + var file = fileBinary.files[0]; + reader.readAsBinaryString(file); + reader.onload = function () { + fileResult.innerHTML = reader.result; + }; + } + + fileImage.onchange = function () { + var file = fileImage.files[0]; + reader.readAsDataURL(file); + reader.onload = function () { + fileResult.innerHTML = '' + }; + } +} +``` + +‍ diff --git a/docs/content/interesting-chinese-sentences.md b/docs/content/interesting-chinese-sentences.md new file mode 100644 index 0000000..0b04aa1 --- /dev/null +++ b/docs/content/interesting-chinese-sentences.md @@ -0,0 +1,118 @@ +--- +title: 一些有趣的中文句子(中文博大精深) +date: 2025-03-16T19:14:21Z +lastmod: 2025-03-16T19:19:09Z +tags: [文字,句子] +--- + +# 一些有趣的中文句子(中文博大精深) + +部分摘录自:[酷安](https://www.coolapk.com/feed/10205888) + +--- + +校长说:“校服上除了校徽别别别的。” + +--- + +冬天,能穿多少穿多少。 + +夏天,能穿多少穿多少。 + +--- + +人要是行,干一行行一行,一行行,行行行; + +人要是不行,干一行不行一行,一行不行,行行不行。 + +--- + +苯环的碳碳键键能能否否定定论一? + +--- + +路人: 大妈这豆腐怎么卖? + +大妈: 一块两块,两块一块。 + +--- + +在东北被偷了东西,去派出所报案,说:“这个贼贼贼!” + +--- + +用刺猬刺刺刺猬刺猬会不会被刺猬刺给刺死? + +--- + +阿呆给领导送红包时,两人的对话颇有意思。 + +领导:“你这是什么意思?” + +阿呆:“没什么意思,意思意思。” + +领导:“你这就不够意思了。” + +阿呆:“小意思,小意思。” + +领导:“你这人真有意思。” + +阿呆:“其实也没有别的意思。” + +领导:“那我就不好意思了。” + +阿呆:“是我不好意思。” + +领导:“你肯定有什么意思。” + +阿呆:“真的没有什么意思。” + +领导:“既然没有什么意思,那你是什么意思?” + +阿呆:“其实,我的意思就是想意思意思。” + +领导:“你既然是想意思意思,那就是有什么意思。” + +阿呆哭了:“我就是想意思意思。但是,真的没有什么别的意思。这么个小红包能有什么意思?也就是意思意思而已。” + +领导笑了:“呵呵,我对你有点意思了。” + +阿呆心想:“嘻嘻,我就是这个意思。” + +--- + +你以为你以为的就是你以为的吗? + +--- + +这几天天天天气不好。 + +--- + +用毒毒毒蛇毒蛇会不会被毒毒死? + +--- + +你去班上数数数数数不好的有多少。 + +--- + +多亏跑了两步,差点没上上上上海的车。 + +--- + +明明明明明白白白喜欢他,可她就是不说。 + +--- + +今天下雨,我骑车差点摔倒,好在我一把把把把住了! + +--- + +来到杨过曾经生活的地方,小龙女动情地说:“我也想过过过儿过过的生活”。 + +--- + +早上吃老板画的饼,中午吃同事摸的鱼,晚上喝网上的心灵鸡汤。 + +‍ diff --git a/docs/content/javascript-export-ncm-playlist-song-info.md b/docs/content/javascript-export-ncm-playlist-song-info.md new file mode 100644 index 0000000..c199829 --- /dev/null +++ b/docs/content/javascript-export-ncm-playlist-song-info.md @@ -0,0 +1,116 @@ +--- +title: 「JavaScript」提取(导出)网易云音乐歌单歌曲列表信息为文件 +date: 2025-03-16T16:11:23Z +lastmod: 2025-03-16T16:12:07Z +tags: [代码片段,JavaScript,Web 前端,网易云音乐,信息,导出] +--- + +# 「JavaScript」提取(导出)网易云音乐歌单歌曲列表信息为文件 + +提取网易云音乐歌单页面中的歌曲列表信息,导出为 JSON 文件。 + +在浏览器的“开发人员工具”的 Console(控制台)中使用。 + +使用前需要登录,否则页面中最多显示 10 首歌曲(登录后最多显示 1000 首歌曲)。 + +用处不大(毕竟有接口可以用,而且获取到的信息更多),只是突然想到就记录下来了。 + +--- + +## 代码 + +#### 提取 + +```javascript +/** + * 提取网易云音乐 [歌单页面](https://music.163.com/#/playlist?id=歌单ID) 中的歌曲列表信息 + * 更新:2021-05-03 + * + * @returns {object[]} 对象数组,对象中包含歌曲 album、artists、duration、id、title 信息 + */ +function getPlaylistSongInfo() { + + // 全部歌曲数据 + var songs = []; + + // iframe + var frameDoc = document.querySelector("#g_iframe").contentDocument; + + // 表格行 tr + var songListTRs = frameDoc.querySelectorAll("#m-playlist .m-table tbody tr"); + + // 遍历 + songListTRs.forEach(function (row) { + // 表格列 td + var rowCols = row.querySelectorAll("td"); + // 当前行歌曲信息 + var info = { + album: rowCols[4].querySelector('.text > a').title, + artists: rowCols[3].querySelector('.text').title.split('/'), + duration: rowCols[2].querySelector('span').textContent, + id: rowCols[0].querySelector('.ply').dataset.resId, + title: rowCols[1].querySelector('.txt > a b').title + }; + + songs.push(info); + }); + + return songs; + +} +``` + +#### 转文件 + +```javascript +/** + * 字符串转文件 + * + * @param {string} data 字符串数据 + * @param {string} filename 文件名 + * @param {string} filetype 文件类型(MIME) + */ +function strToFile(data = '', filename = 'export.txt', filetype = 'text/plain') { + + // 转为 Blob + var strToBlob = new Blob([data], { type: filetype }); + // URL 对象兼容性处理 + var urlObject = window.URL || window.webkitURL || window; + // 创建对象 URL + var blobURL = urlObject.createObjectURL(strToBlob); + // 创建 a 元素 + var aElem = document.createElement('a'); + + // 设置属性 + aElem.classList.add('hidden'); + aElem.download = filename; + aElem.href = blobURL; + aElem.target = '_blank'; + + // 添加元素 + document.body.appendChild(aElem); + + // 模拟点击 + aElem.click(); + + // 移除元素 + aElem.remove(); + + // 释放对象 + urlObject.revokeObjectURL(blobURL); + +} +``` + +#### 调用 + +```javascript +var objData = { + data: getPlaylistSongInfo() +}; +var objStr = JSON.stringify(objData); + +strToFile(objStr, 'export.json', 'application/json'); +``` + +‍ diff --git a/docs/content/javascript-merge-dynmap-images.md b/docs/content/javascript-merge-dynmap-images.md new file mode 100644 index 0000000..c750b6a --- /dev/null +++ b/docs/content/javascript-merge-dynmap-images.md @@ -0,0 +1,187 @@ +--- +title: 「JavaScript」将 Dynmap 网页上的地图图片合成为一张图 +date: 2025-03-16T16:24:15Z +lastmod: 2025-03-16T16:26:41Z +tags: [Minecraft,JavaScript,Dynmap,Web 前端,代码片段] +--- + +# 「JavaScript」将 Dynmap 网页上的地图图片合成为一张图 + +游戏版本:Minecraft Java Edition 1.12.2 + +已测试 Dynmap 版本:3.0 + +--- + +## 简介 + +根据我的 Minecraft 服务器的一位玩家的需求写的 JavaScript,可自动将 Dynmap 网页上分块的地图图片合成为一张图。建议使用 `Chrome` 浏览器或 `Chromium` 内核的浏览器进行操作。 + +因为是在 `前端` 进行合成,需要在操作前浏览一次要导出的地图区域。不建议合成过大的区域,否则可能会导致浏览器崩溃。 + +结果会在新窗口中显示(若不能弹出新窗口,请将 `弹出新窗口` 设置为 `允许`)。 + +本代码可能并不是最优的方案,欢迎各位在评论区提出建议。 + +若您是服务器的管理人员,可尝试使用下列插件: + +- [Leaflet.print](https://github.com/aratcliffe/Leaflet.print) +- [Leaflet-image](https://github.com/mapbox/leaflet-image) +- [Leaflet-easyPrint](https://github.com/rowanwins/leaflet-easyPrint) +- [leaflet.browser.print](https://github.com/Igor-Vladyka/leaflet.browser.print) +- [Leaflet.BigImage](https://github.com/pasichnykvasyl/Leaflet.BigImage) + +## 代码 + +> 更新:2020-12-23 + +```javascript +function dataURLtoBlob(dataURL) { + var arr = dataURL.split(','); + var mime = arr[0].match(/(:)(.*?)(;)/)[2]; // MIME + var bStr = atob(arr[1]); // 解码 + var bLength = bStr.length; + var u8Arr = new Uint8Array(bLength); + + while (bLength--) { + u8Arr[bLength] = bStr.charCodeAt(bLength); + } + + return new Blob([u8Arr], { type: mime }); +} + +function exportMap() { + var base64Data = ''; + var images = document.querySelectorAll('#mcmap .map .leaflet-map-pane .leaflet-tile-pane .leaflet-layer img'); + var imagesCount = images.length; // 图片数量 + var resultWindow = window.open('', '', 'width=800, height=480'); // 新窗口:显示结果 + + // 提取 translate3d X Y Z 的值(文本)并转换为数字 + function getTransInfo(elem) { + var reg = new RegExp(/(translate3d\(|px|\))/, 'g'); + var transInfo = elem.style.transform.replace(reg, '').split(', ').map(Number); + + // X, Y + return [transInfo[0], transInfo[1]]; + } + + // 获取 Transform 最值信息 + function getTransMax() { + console.log('获取 Transform 最值信息'); + + var image_trans; + var min_x = 0, min_y = 0, max_x = 0, max_y = 0; + + for (let i = 0; i < imagesCount; i++) { + image_trans = getTransInfo(images[i]); + if (image_trans[0] < min_x) { + min_x = image_trans[0]; + // console.log("min_x 元素:" + i); + } + if (image_trans[1] < min_y) { + min_y = image_trans[1]; + // console.log("min_y 元素:" + i); + } + if (image_trans[0] > max_x) { + max_x = image_trans[0]; + // console.log("max_x 元素:" + i); + } + if (image_trans[1] > max_y) { + max_y = image_trans[1]; + // console.log("max_y 元素:" + i); + } + } + + // max 加上图片大小 + max_x += images[0].width; + max_y += images[0].height; + + return [min_x, min_y, max_x, max_y]; + } + + // 绘制 + function draw(fn) { + // fn:绘制结束时的回调函数 + + console.log("开始绘制"); + + var trans_info = getTransMax(); + var canvasElem = document.createElement('canvas'); + var ctx = canvasElem.getContext('2d'); + + canvasElem.width = trans_info[2] - trans_info[0]; // 画布元素宽度 + canvasElem.height = trans_info[3] - trans_info[1]; // 画布元素高度 + + // 填充画布 + // ctx.rect(0, 0, canvasElem.width, canvasElem.height); + // ctx.fillStyle = '#FFF'; + // ctx.fill(); + + function drawing(n) { + // n:绘制次数 + + if (n < imagesCount) { + // 自动计算坐标 + var image_trans = getTransInfo(images[n]); + var pos_x = image_trans[0] + Math.abs(trans_info[0]); + var pos_y = image_trans[1] + Math.abs(trans_info[1]); + + // console.log('绘制中:' + n + ' / ' + imagesCount); + // console.log('坐标:' + pos_x + ', ' + pos_y); + ctx.drawImage(images[n], pos_x, pos_y); + + // 递归 + arguments.callee(n + 1); + } else { + console.log('已合成,等待显示图片'); + + // base64Data = canvasElem.toDataURL('image/jpeg', 0.8); // JPEG + base64Data = canvasElem.toDataURL('image/png'); // PNG + + fn(); + } + } + + drawing(0); + } + + // 开始 + (function () { + console.log('开始合成图片'); + + draw(function () { + // 回调函数:显示图片 + console.log('显示图片'); + var blobData = dataURLtoBlob(base64Data); + var url = URL.createObjectURL(blobData); + resultWindow.document.write(''); + resultWindow.focus(); + console.log('结束'); + }); + })(); +} + +exportMap(); +``` + +## 使用方式(二选一) + +#### 常规方式 + +1. 在浏览器打开 Dynmap 的页面。 +2. 根据需要调整地图的缩放比例(不建议太大)。 +3. 打开浏览器的 `开发人员工具`(可使用快捷键 `Ctrl + Shift + I`)。 + ​![](assets/network-asset-01-20250316162508-3w1fppe.png) + **建议将** **​`开发人员工具`​** **设置为独立窗口显示模式,以让网页有更大的显示区域:** + + 右上角的三个点 -\> Dock side -\> Unlock info separate window +4. 拖动地图,直至需要导出的地图范围都完成加载。 +5. 切换到 `Console`(控制台)标签页,并将上方的 `代码` 粘贴至输入区。 + ​![](assets/network-asset-02-20250316162508-nz6ede0.png) +6. 按下 `Enter`(回车),等待即可。 + +#### 对于管理员 + +- 若您是服务器的管理人员,且对 HTML、CSS、JavaScript 有了解,可将本代码写入到 Dynmap 的网页中(例如:作为点击事件绑定到特定的按钮上)。 + +‍ diff --git a/docs/content/javascript-modify-input-file-object.md b/docs/content/javascript-modify-input-file-object.md new file mode 100644 index 0000000..53a1b66 --- /dev/null +++ b/docs/content/javascript-modify-input-file-object.md @@ -0,0 +1,59 @@ +--- +title: 「JavaScript」修改 input type="file" 元素的文件对象 +date: 2025-03-15T22:42:40Z +lastmod: 2025-03-15T22:43:04Z +tags: [Web 前端,HTML5,JavaScript,代码片段] +--- + +# 「JavaScript」修改 input type="file" 元素的文件对象 + +## 参考信息 + +- [Stack Overflow - Is it possible to replace a file input with a Blob](https://stackoverflow.com/questions/21892890/is-it-possible-to-replace-a-file-input-with-a-blob) + +## 示例代码 + +```javascript +let fileItem = new File([blob], "example.txt", { + type: "txet/plain", + lastModified: Date.now(), +}); +let container = new DataTransfer(); + +container.items.add(fileItem); +fileInputElement.files = container.files; +``` + +## 应用场景 + +通过 `form` 提交自定义的文件: + +```javascript +let container = new DataTransfer(); +let file = new File([blob], 'tp_tmp.zip'); + +let frame = document.createElement('iframe'); +let form = document.createElement('form'); +let input = document.createElement('input'); + +container.items.add(file); + +frame.setAttribute('name', 'form-result'); + +form.setAttribute('action', `http://${localDeviceIP}:10808/ProcessServer/FileOperate/fileUpServlet`); +form.setAttribute('enctype', 'multipart/form-data'); +form.setAttribute('method', 'post'); +form.setAttribute('target', 'form-result'); +form.appendChild(input); + +input.setAttribute('name', 'file'); +input.setAttribute('type', 'file'); +input.files = container.files; + +document.body.appendChild(frame); +document.body.appendChild(form); + +form.submit(); +``` + +‍ diff --git a/docs/content/javascript-snack-game.md b/docs/content/javascript-snack-game.md new file mode 100644 index 0000000..034d1ed --- /dev/null +++ b/docs/content/javascript-snack-game.md @@ -0,0 +1,566 @@ +--- +title: 「Web 前端」原生 JavaScript 实现贪吃蛇游戏 +date: 2025-03-16T16:20:32Z +lastmod: 2025-03-16T16:21:06Z +tags: [代码片段,JavaScript,HTML5,Web 前端] +--- + +# 「Web 前端」原生 JavaScript 实现贪吃蛇游戏 + +使用 `WASD` 或 `上下左右` 键控制移动; + +按下 `空格` 可 `暂停` 或 `开始` 游戏; + +可穿墙到另外一边;每获得 `5` 分,速度 `+0.5`。 + +仅分享交流,代码不一定是最好的。 + +--- + +## 预览图 + +#### 打开 + +![预览图](assets/network-asset-01-20250316162100-ky9dne8.gif "预览图") + +#### 暂停 + +![预览图](assets/network-asset-02-20250316162100-5jq3zns.gif "预览图") + +#### 穿墙 + +![预览图](assets/network-asset-03-20250316162100-pb9zjnj.gif "预览图") + +#### 加速 + +![预览图](assets/network-asset-04-20250316162101-w3j26zp.gif "预览图") + +#### 游戏结束 + +![预览图](assets/network-asset-05-20250316162101-mezysip.gif "预览图") + +## 代码 + +#### index.html + +```html + + + + + + 贪吃蛇 + + + +
+
+ 分数:-1 + 速度:-1 +
+
+
+ + +
+
+

使用 WASD上下左右 键控制移动

+

按下空格可 暂停 / 开始 游戏

+

可穿墙到另外一边;每获得 5 分,速度 +0.5

+
+
+
+ + + +``` + +#### style.css + +```css +@charset "UTF-8"; + +body, .snack-game * { + margin: 0; + padding: 0; +} + +.snack-game { + position: fixed; + top: 50px; + left: 50%; + box-shadow: 0 5px 15px rgb(0 0 0 / 0.25); + background-color: #FFF; + transform: translateX(-50%); + user-select: none; +} + +.snack-game .info { + padding: 15px; + background-color: #222; + text-align: left; + font-size: 18px; + color: #FFF; +} + +.snack-game .info span { + display: inline-block; +} +.snack-game .info span:not(:last-child) { + margin-right: 10px; +} + +.snack-game .map { + position: relative; + width: 500px; + height: 400px; + background-color: #FFF; +} + +.snack-game .map > div { + position: absolute; +} + +.snack-game .ctrl { + padding: 4px; + background-color: #222; + text-align: center; + font-size: 0; +} + +.snack-game .ctrl button { + margin: 0 2px; + padding: 8px 16px; + outline: none; + border: none; + border-radius: 0; + background-color: #FFF; + font-size: 16px; + cursor: pointer; + transition: all 0.25s; +} +.snack-game .ctrl button:hover { + background-color: #444; + color: #FFF; +} +.snack-game .ctrl button:disabled { + opacity: 0.5; +} + +.snack-game .help { + padding: 1em 1.5em; + background-color: #4CAF50; + font-size: 16px; + color: #FFF; +} + +.snack-game .alert-box { + display: block; + position: absolute; + top: 40%; + left: 50%; + padding: 1em 1.5em; + box-shadow: 0 0.2em 0.8em rgb(0 0 0 / 0.25); + background-color: #222; + text-align: center; + font-size: 18px; + color: #FFF; + opacity: 0; + transform: translate(-50%, -50%); + transition: opacity 0.25s; + pointer-events: none; + user-select: none; +} +``` + +#### script.js + +```javascript +function SnackGame(options) { + this.gameElem = options.gameElem; + this.mapElem = this.gameElem.querySelector('.map'); + + // 地图大小 + this.mapWidth = options.mapWidth || 400; + this.mapHeight = options.mapHeight || 400; + + // 食物大小(蛇身大小以此为参考) + this.foodSize = options.foodSize || 20; + + // 速度增加量 + this.speedUpRate = options.speedUpRate || 0.5; + + // 可穿墙到另一边 + this.canCross = options.canCross || false; + + // 转向标记 + this.directionChanged = false; + + // 无敌模式 + this.godMode = false; + + // Game Over 标记 + this.over = false; + + // 定时器 + this.timer = null; + + this.init(); +} + +// 提示框 +SnackGame.prototype.alert = function (content, time) { + // content:提示内容 + // time:时长(秒) + + var alertBox = this.gameElem.querySelector('.alert-box'); + + time = time === undefined ? 5 : time; + + alertBox.innerHTML = content; + alertBox.style.opacity = '1'; + + setTimeout(function () { + alertBox.style.opacity = '0'; + }, time * 1000); +}; + +// 初始化地图 +SnackGame.prototype.initMap = function () { + this.mapElem.style.height = this.mapHeight + 'px'; + this.mapElem.style.width = this.mapWidth + 'px'; + + // 游戏已经结束,重置地图 + if (this.over) { + this.removeSnack(); + this.removeFood(); + this.over = false; + } + + // 蛇的信息 + this.snackInfo = { height: this.foodSize, width: this.foodSize }; + this.snackBody = [ + { x: 2, y: 0 }, // 蛇头 第一个点 + { x: 1, y: 0 }, // 蛇脖子 第二个点 + { x: 0, y: 0 } // 蛇尾 第三个点 + ]; + this.snackDirection = 'right'; + + // 食物信息 + this.foodInfo = { x: 0, y: 0 }; + + // 分数、速度 + this.score = 0; + this.speed = 1; + + this.updateScore(); + this.createSnack(); + this.createFood(); +}; + +// 创建蛇 +SnackGame.prototype.createSnack = function () { + // 蛇的信息 + var width = this.snackInfo.width; + var height = this.snackInfo.height; + var color = '#8BC34A'; + var colorHead = '#FFC107'; + + // 创建 + for (var i = 0; i < this.snackBody.length; i++) { + // 吃到食物时,x == null,不创建(防止在 0, 0 处新建) + if (this.snackBody[i].x != null) { + + // 创建元素 + var snackElem = document.createElement('div'); + + snackElem.style.left = this.snackBody[i].x * width + 'px'; + snackElem.style.top = this.snackBody[i].y * height + 'px'; + + snackElem.style.width = width + 'px'; + snackElem.style.height = height + 'px'; + snackElem.style.backgroundColor = i === 0 ? colorHead : color; + + // 保存节点,便于删除 + this.snackBody[i].elem = snackElem; + + // 插入 + this.mapElem.appendChild(snackElem); + } + } +}; + +// 删除蛇 +SnackGame.prototype.removeSnack = function () { + for (var i = 0; i < this.snackBody.length; i++) { + // 当吃到食物时,elem == null,且不能删除 + if (this.snackBody[i].elem != null) { + this.mapElem.removeChild(this.snackBody[i].elem); + } + } +}; + +// 创建食物 +SnackGame.prototype.createFood = function () { + // 食物要在网格中生成 + // 需要根据地图大小和食物大小计算网格 + + // 食物信息 + var width = this.foodSize; + var height = this.foodSize; + var color = '#F44336'; + + this.foodInfo.x = Math.floor(Math.random() * (this.mapWidth / width)); + this.foodInfo.y = Math.floor(Math.random() * (this.mapHeight / height)); + + // 创建元素 + var foodElem = document.createElement('div'); + + // X(生成在网格中) + foodElem.style.left = this.foodInfo.x * width + 'px'; + // Y(生成在网格中) + foodElem.style.top = this.foodInfo.y * height + 'px'; + + foodElem.style.width = width + 'px'; + foodElem.style.height = height + 'px'; + foodElem.style.backgroundColor = color; + + // 保存节点,便于删除 + this.foodInfo.elem = foodElem; + + // 插入 + this.mapElem.appendChild(foodElem); +}; + +// 删除食物 +SnackGame.prototype.removeFood = function () { + this.mapElem.removeChild(this.foodInfo.elem); +}; + +// 蛇移动 +SnackGame.prototype.snackMove = function () { + // 移动 + + // 后一个元素到前一个元素的位置 + // 蛇头独立处理,i 不能等于 0 + for (var i = this.snackBody.length - 1; i > 0; i--) { + this.snackBody[i].x = this.snackBody[i - 1].x; + this.snackBody[i].y = this.snackBody[i - 1].y; + } + + // 根据方向处理蛇头 + switch (this.snackDirection) { + case 'left': + this.snackBody[0].x -= 1; + break; + case 'right': + this.snackBody[0].x += 1; + break; + case 'up': + this.snackBody[0].y -= 1; + break; + case 'down': + this.snackBody[0].y += 1; + break; + } + + // 更新转向标记 + this.directionChanged = false; + + // 蛇头是否吃到食物(坐标重合) + if (this.snackBody[0].x == this.foodInfo.x && this.snackBody[0].y == this.foodInfo.y) { + // 加分 + this.score += 1; + this.updateScore(); + + // 蛇加一节 + // 蛇移动时会自动计算坐标,有坐标后,创建蛇时记录 elem + this.snackBody.push({ x: null, y: null, elem: null }); + + // 重新创建食物 + + this.removeFood(); + this.createFood(); + } + + // 吃到自己 + // 从第 5 个开始判断(前 4 个永远撞不到) + + if (!this.godMode) { + for (var i = 4; i < this.snackBody.length; i++) { + if (this.snackBody[0].x == this.snackBody[i].x && this.snackBody[0].y == this.snackBody[i].y) { + this.stopGame(true); + return false; + } + } + } + + // 蛇头是否出界 + + // 网格 + var mapMaxX = this.mapWidth / this.snackInfo.width - 1; + var mapMaxY = this.mapHeight / this.snackInfo.height - 1; + + // 判断 + var snackHead = this.snackBody[0]; + if (this.godMode || this.canCross) { + // 无敌 / 穿墙 + snackHead.x = snackHead.x < 0 ? mapMaxX : (snackHead.x > mapMaxX ? 0 : snackHead.x); + snackHead.y = snackHead.y < 0 ? mapMaxY : (snackHead.y > mapMaxY ? 0 : snackHead.y); + } else if (snackHead.x < 0 || snackHead.x > mapMaxX || snackHead.y < 0 || snackHead.y > mapMaxY) { + // 普通 + this.stopGame(true); + return false; + } + + // 重新创建蛇 + + this.removeSnack() + this.createSnack(); +}; + +// 更新分数和速度 +SnackGame.prototype.updateScore = function () { + var scoreElem = this.gameElem.querySelector('.info .score'); + var speedElem = this.gameElem.querySelector('.info .speed'); + + if (this.score != 0 && this.score % 5 === 0) { + this.speed += this.speedUpRate; + this.stopGame(false); + this.startGame(); + } + + scoreElem.textContent = this.score; + speedElem.textContent = this.speed; +}; + +// 游戏开始 +SnackGame.prototype.startGame = function () { + var self = this; + + // 游戏已结束,重置地图 + if (self.over) { + self.alert('游戏重新开始', 1); + self.initMap(); + } + + self.timer = setInterval(function () { + self.snackMove(); + }, 400 / this.speed); +}; + +// 游戏结束 +SnackGame.prototype.stopGame = function (isOver) { + clearInterval(this.timer); + this.timer = null; + + if (isOver) { + this.over = true; + this.alert(`[游戏结束]
您的分数为 ${this.score}`, 5); + } +}; + +// 初始化事件 +SnackGame.prototype.initEvents = function () { + var self = this; + + // 按键 + document.body.onkeydown = function (e) { + var ev = e || window.event; + + // 禁止二次转向 + if (self.directionChanged) { + return true; + } + + // 按下的键 + var kc = ev.keyCode; + // 上 下 左 右 W A S D + var kcs = [ + 37, 38, 39, 40, + 65, 87, 68, 83 + ]; + // 方向 + var directions = [ + 'left', 'up', 'right', 'down', + 'left', 'up', 'right', 'down' + ]; + var directionsFlip = [ + 'right', 'down', 'left', 'up', + 'right', 'down', 'left', 'up' + ]; + + var kcIndex = kcs.indexOf(kc); + + // 1. Key Code 符合条件且游戏已开始 + // 2. 蛇头当前方向不是目标方向的反方向 + // 3. 蛇头当前方向与目标方向不相同 + if (kcIndex != -1 && self.timer != null) { + if (self.snackDirection != directionsFlip[kcIndex] && self.snackDirection != directions[kcIndex]) { + self.snackDirection = directions[kcIndex]; + self.directionChanged = true; + } + } + + // 空格 暂停 / 开始 游戏 + if (kc === 32) { + if (self.timer === null) { + // 暂停时 - 开始游戏 + self.startGame(); + } else { + // 运行时 - 停止游戏 + self.stopGame(false); + } + // 阻止默认按键事件 + return false; + } + }; + + // 按钮:开始游戏 + var btnStart = self.gameElem.querySelector('.ctrl .btn-start'); + btnStart.onclick = function () { + // 游戏已开始 + if (self.timer != null) { + self.alert('游戏已经开始', 1); + return false; + } + // 开始游戏 + self.startGame(); + }; + + // 按钮:暂停游戏 + var btnPause = self.gameElem.querySelector('.ctrl .btn-pause'); + btnPause.onclick = function () { + // 游戏已开始 + if (self.timer != null) { + self.stopGame(false); + } else { + self.alert('游戏未在运行', 1); + } + }; +}; + +// 游戏初始化 +SnackGame.prototype.init = function () { + if (this.mapWidth % this.foodSize != 0 || this.mapHeight % this.foodSize != 0) { + this.alert('[初始化失败]
地图大小与食物大小
不成比例', 10); + return false; + } + + this.initMap(); + this.initEvents(); + + this.alert('贪吃蛇
Snake', 2); +}; + +var game = new SnackGame({ + gameElem: document.querySelector('#snack-game'), + mapWidth: 500, + mapHeight: 400, + foodSize: 20, + speedUpRate: 0.5, + canCross: true +}); +``` + +‍ diff --git a/docs/content/jsdoc-learning.md b/docs/content/jsdoc-learning.md new file mode 100644 index 0000000..6b57207 --- /dev/null +++ b/docs/content/jsdoc-learning.md @@ -0,0 +1,222 @@ +--- +title: 「JavaScript」JSDoc 学习记录 +date: 2025-03-15T23:19:54Z +lastmod: 2025-03-15T23:25:49Z +tags: [JavaScript,Web 前端,学习,记录] +--- + +# 「JavaScript」JSDoc 学习记录 + +## 信息 + +### @deprecated + +#### 简介 + +用于将函数、属性等内容标记为不推荐使用。 + +#### 参考 + +- [Use JSDoc: @deprecated](https://jsdoc.app/tags-deprecated.html) +- [TypeScript: Documentation](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#deprecated) + +### @description + +#### 简介 + +用于给变量、函数等内容添加说明信息。 + +#### 语法 + +```plaintext +@description <说明内容> +@desc <说明内容> +``` + +#### 参考 + +- [Use JSDoc: @description](https://jsdoc.app/tags-description.html) + +## 类型 + +### @callback + +#### 简介 + +与 `@typedef` 类似,但它主要用于描述函数。 + +#### 语法 + +```javascript +/** + * @callback ExampleFunction + * @param {string} data + * @param {number} [index] + * @returns {boolean} + */ +``` + +#### 参考 + +- [Use JSDoc: @callback](https://jsdoc.app/tags-callback.html) +- [TypeScript: Documentation](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#typedef-callback-and-param) + +### @param + +#### 简介 + +与 `@type` 类似,但它用于描述函数的参数类型。 + +#### 语法 + +```javascript +/** + * @param {Object} options + * @param {string} options.prop1 + * @param {number} options.prop2 + * @param {number} [options.prop3] + */ +function example(options) { + return options; +} +``` + +#### 参考 + +- [Use JSDoc: @param](https://jsdoc.app/tags-param.html) +- [TypeScript: Documentation](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#typedef-callback-and-param) + +### @template + +#### 示例 + +```javascript +/** + * @interface + * @template TData + * @typedef {object} ResObject + * @property {number} code + * @property {TData} data + * @property {string} message + * @property {boolean} success + */ + +/** + * @interface + * @template TData + * @typedef ResPromise + * @type { import('axios').AxiosPromise> } + */ +``` + +#### 参考 + +- [TypeScript: Documentation](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#template) + +### @type + +#### 简介 + +用于描述对象的类型。 + +#### 语法 + +```plaintext +@type {类型名称} +``` + +**类型名称(名称表达式)** + +> 指定一个类型名称。 + +```plaintext +{boolean} +{number} +{string} +{HTMLElement} +{myNamespace.MyClass} +``` + +**多个类型** + +> 使用括号包括,使用 `|` 分隔多个类型。 +> 表示值可能是几种类型中的一种。 + +```plaintext +{(boolean|number)} +``` + +**数组和对象** + +> JSDoc 支持 Closure Compiler 语法定义的数组和对象类型。 +> 可以在类型名称的后方添加 `[]` 描述数组项的类型。例如 `string[]` 表示字符串数组。 +> 对于具有已知的属性的对象,可以使用 Closure Compiler 语法描述类型。可以分别描述每个属性,以便为每个属性指定更详细的信息。 + +一个保存 MyClass 实例对象的数组: + +```plaintext +{Array.} +{MyClass[]} +``` + +一个 key 类型为 string,值类型为 number 的对象: + +```plaintext +{Object.} +``` + +一个类数组对象: + +```plaintext +{Object.} +``` + +一个名称为 `myObj`,包含属性 `a`(number)和 `b`(任意类型)的对象: + +```plaintext +{{a: number, b: string, c}} myObj + +{Object} myObj +{number} myObj.a +{*} myObj.b +``` + +**导入类型** + +> 可以使用 `import` 导入其他文件中的类型。 +> 注意:此语法是特定于 TypeScript 的,不同于 JSDoc 标准。 + +从文件 `types.js` 中导入 `Example` 类型 + +```plaintext +{ import("./types").Example } +``` + +#### 参考 + +- [Use JSDoc: @type](https://jsdoc.app/tags-type.html) +- [TypeScript: Documentation](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#type) + +### @typedef + +#### 简介 + +用于描述一个自定义的类型。 + +#### 语法 + +```javascript +/** + * @typedef {object} ExampleType - 定义一个名称为 ExampleType 的类型 + * @property {string} prop1 - 一个 string 类型的属性 + * @property {number} prop2 - 一个 number 类型的属性 + * @property {number} [prop3] - 一个 number 类型的可选属性 + */ +``` + +#### 参考 + +- [Use JSDoc: @typedef](https://jsdoc.app/tags-typedef.html) +- [TypeScript: Documentation](https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#typedef-callback-and-param) + +‍ diff --git a/docs/content/linux-ssh-allow-or-deny-user.md b/docs/content/linux-ssh-allow-or-deny-user.md new file mode 100644 index 0000000..583c2a4 --- /dev/null +++ b/docs/content/linux-ssh-allow-or-deny-user.md @@ -0,0 +1,97 @@ +--- +title: Linux 允许或禁止指定用户进行 SSH 登录 +date: 2025-03-16T16:04:28Z +lastmod: 2025-03-16T16:06:51Z +tags: [Linux,SSH,配置] +--- + +# Linux 允许或禁止指定用户进行 SSH 登录 + +## 参考资料 + +- [Ubuntu Manpage: sshd_config](http://manpages.ubuntu.com/manpages/precise/en/man5/sshd_config.5.html) +- [Ubuntu Manpage: ssh_config](http://manpages.ubuntu.com/manpages/precise/en/man5/ssh_config.5.html) + +## 允许指定用户登录(白名单) + +在 sshd 的配置文件 `/etc/ssh/sshd_config` 中添加 `AllowUsers` 项,其后方跟随以空格分隔的用户名 PATTERN 列表。 + +例如允许 `test-a` 用户和从 `192.168.1.100` 登录的 `test-b` 用户: + +```plaintext +AllowUsers test-a test-b@192.168.1.100 +``` + +**原文** + +> This keyword can be followed by a list of user name patterns, separated by spaces. +> +> If specified, login is allowed only for user names that match one of the patterns. +> +> Only user names are valid; a numerical user ID is not recognized. +> +> By default, login is allowed for all users. +> +> If the pattern takes the form USER@HOST then USER and HOST are separately checked, restricting logins to particular users from particular hosts. +> +> The allow/deny directives are processed in the following order: DenyUsers, AllowUsers, DenyGroups, and finally AllowGroups. + +## 禁止指定用户登录(黑名单) + +在 sshd 的配置文件 `/etc/ssh/sshd_config` 中添加 `DenyUsers` 项,,其后方跟随以空格分隔的用户名 PATTERN 列表。 + +例如禁止 `test-c` 用户和从 `192.168.1.100` 登录的 `test-d` 用户: + +```plaintext +DenyUsers test-c test-d@192.168.1.100 +``` + +**原文** + +> This keyword can be followed by a list of user name patterns, separated by spaces. +> +> Login is disallowed for user names that match one of the patterns. +> +> Only user names are valid; a numerical user ID is not recognized. +> +> By default, login is allowed for all users. +> +> If the pattern takes the form USER@HOST then USER and HOST are separately checked, restricting logins to particular users from particular hosts. +> +> The allow/deny directives are processed in the following order: DenyUsers, AllowUsers, DenyGroups, and finally AllowGroups. + +## PATTERN + +一个 PATTERN 由零个或多个非空白字符以及“\*”(匹配零个或多个字符的通配符)或“?”(仅匹配一个字符的通配符)组成。 + +例如匹配主机 `192.168.0.0` \~ `192.168.0.9`,可以使用: + +```plaintext +192.168.0.? +``` + +**原文** + +```plaintext +A pattern consists of zero or more non-whitespace characters, ‘*’ (a wildcard that matches zero or more characters), or ‘?’ (a wildcard that matches exactly one character). +For example, to specify a set of declarations for any host in the “.co.uk” set of domains, the following pattern could be used: + + Host *.co.uk + +The following pattern would match any host in the 192.168.0.[0-9] network range: + + Host 192.168.0.? + +A pattern-list is a comma-separated list of patterns. +Patterns within pattern-lists may be negated by preceding them with an exclamation mark (‘!’). +For example, to allow a key to be used from anywhere within an organisation except from the “dialup” pool, the following entry (in authorized_keys) could be used: + + from="!*.dialup.example.com,*.example.com" +``` + +## 注意 + +- 配置完成后需要重启 `sshd` 服务(例如 `service sshd restart`)。 +- 配置的 allow / deny 指令按照此顺序进行处理:`DenyUsers -> AllowUsers -> DenyGroups -> AllowGroups`​ + +‍ diff --git a/docs/content/minecraft-10th-article.md b/docs/content/minecraft-10th-article.md new file mode 100644 index 0000000..71db4b5 --- /dev/null +++ b/docs/content/minecraft-10th-article.md @@ -0,0 +1,145 @@ +--- +title: Minecraft 十周年,感谢有你 +date: 2025-03-17T00:16:19Z +lastmod: 2025-03-17T00:18:27Z +tags: [Minecraft,周年] +--- + +# Minecraft 十周年,感谢有你 + +不知不觉,距离 Minecraft 首个公开版本的发布日(2009 年 5 月 13 日)已经有 10 年了,Minecraft 十周年(2019年5月17日)即将到来,我接触 Minecraft 这款游戏也将近有 7 年了。十年以来,Minecraft 带给了我们很多的欢笑、回忆和感动。 + +![](assets/network-asset-fab82a145ddc0d2bad0be84a73556a5756283b18-20250317001907-1mf9fwp.gif "https://www.minecraft.net/zh-hans/10th-anniversary")​ + +还记得,初次接触 Minecraft 是在 2012 年的暑假。那天在网上寻找游戏,然后无意中看到了 Minecraft,那时候的版本是 1.2.5。我被其独特的画风(方块、像素)吸引了,就下载来玩了。 + +> 《Minecraft》是一款 3D 的第一人称沙盘游戏,所呈现的世界并不是华丽的画面与特效,而是注重在游戏性上面。玩家在游戏中做着「建设」与「破坏」两件事,但是透过像乐高一样的积木来组合与拼凑,轻而易举的就能制作出小木屋、城堡甚至城市,但是若再加上玩家的想像力,空中之城、地底都市都一样能够实现。 —— 百度百科 + +第一次运行 Minecraft 的时候,玩的是**生存模式**。在游戏时间的第一天,我用橡木木板盖了个**火柴盒**房子。到了晚上,我看到屋外有个手里捧着草方块的**末影人**(那时并不知道名字),我以为那是其他玩家,就走过去看了他几眼,然后…就没有然后了… + +后来在优酷上看到了**籽岷**的 Minecraft 实况,很喜欢籽岷的那句话——“以纪录片的方式探索游戏世界”。再后来,还有凯麒、翔麟、鬼鬼蝈蝈、炎黄、粉字菌、大橙子、五歌、粉鱼、红叔…… + +还记得第一次被熊孩子袭击:事情发生在我刚开始进入服务器玩没多久。我和在服务器认识的朋友们在“热带雨林”建了个树屋,过了几天,突然有几个玩家来到我们的树屋旁边,说发现了个好地方,问我们要不要一起去,然后我们接受了。跟着他们走了一会,我突然感觉不对劲,就用命令(/home)回家了。果然,有玩家在放火烧我们的树屋(那时候资金不足,不能完整地圈地)。还好发现得早,火被灭了,并没有造成太大的损失。 + +2013 年 12 月,在贴吧偶然看到“鬼鬼 Minecraft 代购”。自此,我拥有了 Minecraft 正版账号。(那时候正版的价格是 190 ¥) + +2015 年 7 月 10 日,我在 bilibili 上发布了第一个搬运的 Minecraft 视频。 + +2016 年 7 月 11 日,我在 bilibili 上发布了第一个原创的 Minecraft 教程向视频。 + +在 2016 年的某天,听说网易要代理 Minecraft。我听到此消息后,心情是激动的,充满期待(很多东西都会变得方便)。然而,到了 2017 年 Minecraft 中国版正式公开时(以及之后),并没有如我所愿…… + +2017 年 11 月 6 日,我在 bilibili 上发布了第一个原创的 Minecraft 展示向视频。 + +这只是其中一部分,还有其他难忘的事,这里就不一一列举了。 + +--- + +**还记得你在 Minecraft 的“第一次”吗?** + +- 第一次挖到钻石 +- 第一次建造房屋 +- 第一次被苦力怕(Creeper)炸家 +- 第一次死亡 +- 第一次击败末影龙 +- 第一次安装模组 +- 第一次进入服务器 +- 第一次被熊孩子袭击 +- 第一次开服务器 +- 第一次录制视频 +- …… + +**还记得那些 Minecraft 的老梗吗?** + +- Minecraft 居然有圆了 +- 砍手岩 +- 我有 20 个铁块你怕不怕 +- Minecraft 没有 BUG,这只是特性 +- 移除了 HIM +- 挖三填一 +- …… + +**还记得那些在 Minecraft 中的神奇翻译吗?** + +- 雷石东直放站 +- 大火杆 +- 银鱼 +- …… + +--- + +初次遇见 Minecraft,我还是一名初中生。到了现在,我已经是一名大学生了。在这七年里,我经历了:单机 → 服务器联机 → 自己开服务器。在 Minecraft 的十年里,它不断地更新,出现了多个版本:Java 版、便携版、基岩版、教育版、故事模式……但不要忘记,Minecraft 最初只是一个单人沙盒游戏。 + +可能有人会说 Minecraft 现在凉了,实际上并不是。任何一款游戏都会有生命期,总会有盛、衰的时候。这也许是最近 Minecraft 热度降低的原因。但是,Minecraft 拥有的扩展性,是很多游戏比不上的(资源包、模组、插件)。Minecraft 不只是游戏,你可以在其中做很多想做的事情,只有你想不到,没有它做不到。因此,Minecraft 肯定会有重新火起来的一天。 + +--- + + **《那些年,我们一起玩过的 MC》** + +https://v.youku.com/v\_show/id\_XNTMwNzY1MzMy.html + +> 我喜欢被游戏感动,也喜欢用游戏感动别人。 +> +> 有人十分郑重地问我,是否会有放弃 MC 的一天? +> +> 我无法想象那样的生活,MC 已经是我生活的一部分,无法隔离更加无法抛弃。 +> +> 每一天可以很忙很累,然而却不能缺少这款游戏。 +> +> 记得那时候,仅仅是因为惊叹于 MC 的创造性,也不失可爱。 +> +> 后来却是逐渐地自己去感受这个不一样的世界的内涵。 +> +> 当我站立在这个世界的时候,就像是拥有了第二生命。 +> +> 我的人,随着灵魂到达遥远彼岸的一个方块世界。 +> +> 从最底层通过努力一步步走向世界的顶端,甚至匪夷所思的杀死最强大的黑龙。 +> +> 看着自己的足迹清晰地识别出自己曾经的存在。 +> +> 不仅仅是如此,即使被一群僵尸围殴致死,即使被苦力怕炸得尸骨无存,甚至掉下岩浆,背包里面的东西都付之一炬,也没关系。 +> +> 在这里死亡都不能阻挡我,因为下一秒我还可以站起来,还可以再次投入到这个世界。 +> +> 为了自己曾经的正确去欢心,为了自己曾经的错误去忏悔。 +> +> 就是这样一个不科学,很魔法的世界,带给我温馨和自我。MC 的世界,也忘不了曾经为了自己的生存而努力,不断随机应变。 +> +> 因为你是为了活下去,而工作。 +> +> 有时,你厌倦了。 +> +> 出去走走,发现了一座哪怕只有一丁点儿大的村庄,都会值得庆祝。 +> +> 像是成为一个求生的野蛮人,再次回到了人类的文明里面。 +> +> 你可以整夜无眠地画一份农田规划图纸,即使电脑关闭,你无语地躺在床上,那些画面已经光亮如丝,照亮着孤独的夜晚。 +> +> 你可以久违的失眠,偶尔傻傻地笑了。 +> +> 找几个朋友,大家一起走进这个世界。 +> +> 可以忘记现实里的烦恼,做一些荒诞的事情,尽情地憨笑,互相叫骂互相追逐。 +> +> 大家在一起有个收获,便可以无限制地畅想一下,更为遥远的美好未来。 +> +> 不管我们曾经做了什么,都会在 MC 留下自己的汗水和印记,留下感情和回忆。 +> +> 它不是存档,而是鲜活的曾经。 +> +> 无法放弃 MC,多年以后想起这个游戏,泛照着过去的记忆,感觉到无尽的愉悦。 +> +> 也许会伴随着一丝心酸,那一个个鲜明的方块,一个个灵活的生物,一个个远去的邮轮,都会回到脑海,都是属于我的财富,让我永远也不想放弃。 +> +> 50 年后我还会记得,那些年我们一起玩过的 MC。 + +--- + +**Minecraft,不只是游戏。** + +**此生无悔入MC,来世愿做方块人。** + +**下一个十年,你还会在这里吗?** + +‍ diff --git a/docs/content/minecraft-custom-sounds-resourcepack.md b/docs/content/minecraft-custom-sounds-resourcepack.md new file mode 100644 index 0000000..ea304ff --- /dev/null +++ b/docs/content/minecraft-custom-sounds-resourcepack.md @@ -0,0 +1,237 @@ +--- +title: 「Minecraft」自定义声音资源包 +date: 2025-03-16T17:43:19Z +lastmod: 2025-03-16T17:46:51Z +tags: [Minecraft,教程,资源包] +--- + +# 「Minecraft」自定义声音资源包 + +## 参考资料 + +- [Minecraft Wiki - playsound 命令](https://minecraft-zh.gamepedia.com/命令/playsound) +- [Minecraft Wiki - sounds.json](https://minecraft-zh.gamepedia.com/Sounds.json) +- [Minecraft Wiki - 命名空间ID](https://minecraft-zh.gamepedia.com/命名空间ID) + +## 教程简介 + +- 在资源包中加入自定义的音频文件,并使用 `playsound` 命令进行播放。 +- 本教程主要面向 Java 版 Minecraft。 + +--- + +## 教程正文 + +### 示例资源包文件结构 + +> 使用默认的命名空间:`minecraft`,可根据需要修改。 + +```text +[ ] 为文件夹 + +-- [assets] +---- [minecraft] +------ [sounds] +-------- sound_a.ogg +-------- sound_b.ogg +------ sounds.json +-- pack.mcmeta +-- pack.png +``` + +### sounds.json 解析 + +> 注意:仅包含部分项目。 + +#### 示例文件 + +> 可在原基础上添加更多项,编辑文件时需要注意 `JSON` 格式。 + +```json +{ + "custom.sound.a": { + "replace": false, + "subtitle": "字幕", + "sounds": [ + { + "name": "sound_a", + "volume": 1.0, + "pitch": 1.0, + "stream": false, + "preload": true, + "type": "sound" + } + ] + }, + "custom.sound.b": { + "sounds": [ + { + "name": "sound_b", + "stream": true + } + ] + }, + "custom.sound.ab": { + "sounds": [ + { + "name": "sound_a", + "weight": 1, + "stream": false + }, + { + "name": "sound_b", + "weight": 1, + "stream": true + } + ] + } +} +``` + +#### 声音事件名 + +- custom.sound.a、custom.sound.b、custom.sound.ab(可根据需要修改) +- 通常按照类别以点 `.` 分隔 +- 对应 `playsound` 命令中的 `声音`​ + +#### replace + +- 可选,默认为 `false`​ +- 设定为 true,在 `sounds` 项中定义的音效列表会替换优先级较低的资源包的相同命名空间中与该声音事件名相同的声音。 +- 设定为 false,则补充到已有的音效列表中,而不是替换。 + +#### subtitle + +- 可选,字符串 +- 若在游戏选项中开启了 `显示字幕`,游戏会在该声音事件被触发时将该字符串以声音字幕的的形式显示。 + +#### sounds + +- 该声音事件使用的音频文件列表 +- 当该声音事件被触发时,若列表中存在多个项目(类似 `custom.sound.ab` 中的 `sounds` 项),游戏会从此列表定义的音频文件中随机选取一个播放。 + +#### name + +- 从资源包 `assets/<命名空间>/sounds/` 文件夹到此音频文件的相对路径(不带扩展名) +- 可填写另一个已存在的声音事件名(受 `type` 项影响) +- 音频文件格式必须为 `OGG`​ +- 若音频文件路径为 `assets/minecraft/sounds/custom/sound/a.ogg`,则为 `custom/sound/a`。 +- 若音频文件路径为 `assets/custom/sounds/sound_a.ogg`,则为 `example:sound_a`。 + +#### volume + +- 可选,默认为 `1.0`​ +- 此声音播放时的音量 +- 值为 0.0 到 1.0 的小数 +- 如非必要,可仅在 `playsound` 命令中设定。 + +#### pitch + +- 可选,默认为 `1.0`​ +- 此声音播放时的音调 +- 如非必要,可仅在 `playsound` 命令中设定。 + +#### weight + +- 可选,默认为 `1`​ +- 此声音事件触发时此声音被播放的概率(权重)。 +- 一般用于 `sounds` 项中存在多个项目时。 + +#### stream + +- 可选,默认为 `false`​ +- 设置为 true,此声音会以流式播放。 +- 当声音时长较长时,最好设为 true 以避免卡顿。 +- 所有的 `music` 和 `record` 类型的音效(除了音符盒)都使用流式播放(它们的时长都达到1分多钟)。 + +#### preload + +- 可选,默认为 `false`​ +- 设置为 true,则该音频文件会在加载资源包时被加载,而不是在播放音效时再被加载。 + +#### type + +- 可选,默认为 `sound`​ +- 可填写 `sound` 或 `event`​ +- sound:表明 `name` 项中定义的是文件名 +- event:表明 `name` 项中定义的是声音事件名 + +### 使用 playsound 命令播放设定的声音 + +#### playsound 命令语法 + +> **< >** 必填, **[ ]** 可选 + +```text +playsound <声音> <来源> <玩家> [x] [y] [z] [音量] [音调] [最小音量] +``` + +#### playsound 命令参数解析 + +- 声音 + + - 指定要播放的声音 + - 在 `sounds.json` 中定义的一个声音事件 + - 若命名空间不为默认的 `minecraft`,则需要在前方包含命名空间(例如:`example:`)。 + - 例如:`custom.sound.a`、`example:sound.a`​ +- 来源‌‌ + + - 设定播放的声音所属的类型,对应游戏选项中的 `音乐和声音` 的分类。 + - 可填写:`master, music, record, weather, block, hostile, neutral, player, ambient, voice`​ + - 一般为 `master`​ +- 玩家 + + - 设定播放声音的目标(仅设定的目标可听到该声音) + - 填写 `玩家ID` 或 `目标选择器`​ + - 例如:`Frost_ZX`、`@a[x=0,y=80,z=0,r=16]`​ +- x y z + + - 发出声音的位置 + - 可用波浪号 `~` 来指定一个相对于命令执行者(玩家、命令方块)的位置 + - 例如:`0 85 0`、`~5 ~ ~-5`​ +- 音量 + + - 设定声音能被听见的距离 + - 最小值为 `0.0`​ + - 设定小于 `1.0` 的值,声音的音量较低,可听到该声音的范围(中心坐标为 `x y z` 的球状)会较小。 + - 设定大于 `1.0` 的值,声音的音量不会增大(保持 `1.0`),但可听到该声音的范围(`16`)会与音量相乘。 + - 音量设定为 `1.0` 时,可听到该声音的范围为:中心坐标为 `x y z`,半径为 `16` 方块的球状范围。 + - 声音总会基于目标与球体中心(`x y z`)的距离逐渐衰减至无声(即使对方在 `目标` 范围内,也有可能听不到该声音)。 +- 音调 + + - 设定声音播放时的音调。 + - 数值在 `0.0` 至 `2.0` 之间(含 `0.0` 和 `2.0`) + - 小于 `0.5` 的值与 `0.5` 等价(效果相同) + - 小于 `1.0` 的值会降低音调,增加持续时间。 + - 大于 `1.0` 的值会提升音调,减小持续时间。 +- 最小音量 + + - 设定在可听到该声音的范围外的目标能听到该声音的音量 + - 数值在 `0.0` 至 `1.0` 之间(含 `0.0` 和 `1.0`) + +#### playsound 命令示例 + +```text +# 在命令方块所在的位置,向玩家 Frost_ZX 播放声音 custom.sound.a +playsound custom.sound.a master Frost_ZX ~ ~ ~ + +# 在命令方块所在的位置的上方 20 格处,向全部玩家播放声音 custom.sound.b +# (音量从 ~ ~20 ~ 处开始,随着目标玩家的移动,在半径 160 格方块内衰减) +playsound custom.sound.b master @a ~ ~20 ~ 10 + +# 在命令方块所在的位置,向位于命令方块 16 格范围内的全部玩家 +# 播放位于命名空间 example 的声音 custom.sound.a +playsound example:custom.sound.a master @a[r=16] ~ ~ ~ + +# 在命令方块所在的位置,向位于中心坐标为 0 80 0,半径 20 格范围内的全部玩家 +# 播放位于命名空间 example 的声音 custom.sound.a +# (音量从命令方块所在的位置开始,随着目标玩家的移动,在半径 1600 格方块内衰减) +playsound example:custom.sound.a master @a[x=0,y=80,z=0,r=20] ~ ~ ~ 100 +``` + +### 示例资源包文件 + +- [默认命名空间(Minecraft 1.12.2)](https://c.frost-zx.top/data/static/archive/MinecraftSoundsDemoDefaultNamespace-1.12.2.zip) +- [自定义命名空间(Minecraft 1.12.2)](https://c.frost-zx.top/data/static/archive/MinecraftSoundsDemoCustomNamespace-1.12.2.zip) + +‍ diff --git a/docs/content/minecraft-in-game-info-xml.md b/docs/content/minecraft-in-game-info-xml.md new file mode 100644 index 0000000..360c8a5 --- /dev/null +++ b/docs/content/minecraft-in-game-info-xml.md @@ -0,0 +1,557 @@ +--- +title: 「Minecraft」In-Game Info XML 样式 +date: 2025-03-16T18:37:30Z +lastmod: 2025-03-16T18:39:48Z +tags: [Minecraft,模组,分享,代码片段] +--- + +# 「Minecraft」In-Game Info XML 样式 + +模组本体:[In-Game Info XML](https://www.curseforge.com/minecraft/mc-mods/ingame-info-xml) + +前置模组:[Lunatrius Core](https://www.curseforge.com/minecraft/mc-mods/lunatriuscore) + +游戏版本:Minecraft Java Edition 正式版 1.12.2 + +--- + +## 说明 + +分享一下自己在用的 In-Game Info XML Mod 的样式。 + +## 使用方法 + +#### 方法一 + +1. 把代码保存为 `InGameInfo.xml` 文件(编码 `UTF-8`),放入 `.minecraft/config/` 文件夹。 +2. 启动游戏或直接在游戏中执行命令 `/igi reload` 进行加载。 + +#### 方法二 + +1. 把代码保存为 `文件名.xml` 文件(文件名自定义;编码 `UTF-8`),放入 `.minecraft/config/` 文件夹。 +2. 在游戏中执行命令 `/igi load 文件名.xml`(`文件名` 是第 1 步中自己修改的文件名)进行加载。 + +## 效果图 + +![01](assets/network-asset-01-20250316183929-q7ddndl.jpg) +​![02](assets/network-asset-02-20250316183929-0ve3jsl.jpg) +​![03](assets/network-asset-03-20250316183930-36t5qzg.jpg) +​![04](assets/network-asset-04-20250316183930-29rtu13.jpg) +​![05](assets/network-asset-05-20250316183930-wyhwc0x.jpg) +​![06](assets/network-asset-06-20250316183930-ul5fv7k.jpg) + +## 代码 + +> 若需要二次修改发布,请保留原作者信息,谢谢! + +### 完整版本 + +```xml + + + + + + + 天数: $b{day}$r 时间: $b{mctime24} $a({rltime24})$r + + daytime + $e日$r + $8夜$r $e☾ {moonphase}$r + + + raining + $b☔$r + + + thundering + $b⚡$r + + + snowing + $b❄$r + + + NE + nextweatherchange + ? + 天气切换: $a{nextweatherchange} + + + + + 群系: $a{biome} $r(温: $b{temperature} $r湿: $b{humidity}$r) + + slimechunk + $a史莱姆区块 + + + slimes + (可生成)$f + + + + 亮度: + + light + 7.5 + $e + $c + + light + $r (视野: + + lighteye + 7.5 + $e + $c + + lighteye + $r) + FPS: + + GT + fps + 60 + 45 + 30 + 15 + 0 + $a + $e + $6 + $c + $4 + + + fps + + + 生命: $c{health} $r/ $c{maxhealth}$r 移动速度: $e{speed} + + + 等级: $bLv.{playerlevel} $e{xpthislevel}$f / $e{xpcap}$f ($e + + + xpthislevel + xpcap + + 0 + + %$f)$r + 分数: $6{score} + + + + + + + mouseoverid + 0.5 + 信息 + + + + + + mouseoverid + 0.5 + $e{mouseovername} + + + + + + mouseoverid + 0.5 + $a{mouseoveruniquename} $b{mouseoverid}:{mouseovermetadata} + + + + + + mouseoverpowerinput + 0.5 + $eMin: $7{mouseoverpowerweak} $aMax: $7{mouseoverpowerstrong} $bInput: $7{mouseoverpowerinput} + + + + + + + + + {xi} {yi} {zi} ( + + EQ + abrfinedirection + N + NE + E + SE + S + SW + W + NW + + 东北 + + 东南 + + 西南 + 西 + 西北 + 未知 + + ) + + + + + speed + 1 + 区块 ({chunkx}, {chunkz}) {axisdirection} + + + + + + + + + mainhandicon + + + GE + + mainhanddamageleft + mainhandmaxdamage + + 50 + 20 + 10 + 0 + $e + $6 + $c + $4 + + + + mainhanddamageleft + 0.5 + {mainhanddamageleft}$f / $e{mainhandmaxdamage} + mainhandname + + + + + + + + + potiondurationticks0 + 0.5 + {potionduration0} {potionicon0} + + + + + + potiondurationticks1 + 0.5 + {potionduration1} {potionicon1} + + + + + + potiondurationticks2 + 0.5 + {potionduration2} {potionicon2} + + + + + + potiondurationticks3 + 0.5 + {potionduration3} {potionicon3} + + + + + + potiondurationticks4 + 0.5 + {potionduration4} {potionicon4} + + + + + + potiondurationticks5 + 0.5 + {potionduration5} {potionicon5} + + + + + + potiondurationticks6 + 0.5 + {potionduration6} {potionicon6} + + + + + + potiondurationticks7 + 0.5 + {potionduration7} {potionicon7} + + + + + + potiondurationticks8 + 0.5 + {potionduration8} {potionicon8} + + + + + + + + + + GE + + helmetdamageleft + helmetmaxdamage + + 50 + 20 + 10 + $e + $6 + $c + $4 + + + helmetdamageleft + 0.5 + {helmetdamageleft}$f / $e{helmetmaxdamage} + + + {helmeticon} + + + + GE + + chestplatedamageleft + chestplatemaxdamage + + 50 + 20 + 10 + $e + $6 + $c + $4 + + + chestplatedamageleft + 0.5 + {chestplatedamageleft}$f / $e{chestplatemaxdamage} + + + {chestplateicon} + + + + GE + + leggingsdamageleft + leggingsmaxdamage + + 50 + 20 + 10 + $e + $6 + $c + $4 + + + leggingsdamageleft + 0.5 + {leggingsdamageleft}$f / $e{leggingsmaxdamage} + + + {leggingsicon} + + + + GE + + bootsdamageleft + bootsmaxdamage + + 50 + 20 + 10 + $e + $6 + $c + $4 + + + bootsdamageleft + 0.5 + {bootsdamageleft}$f / $e{bootsmaxdamage} + + + {bootsicon} + + + + + + + + nearbyplayerdistance0 + 0 + {nearbyplayericon0} {nearbyplayername0} {nearbyplayerdistance0} Blocks + + + + + + nearbyplayerdistance1 + 0 + {nearbyplayericon1} {nearbyplayername1} {nearbyplayerdistance1} Blocks + + + + + + nearbyplayerdistance2 + 0 + {nearbyplayericon2} {nearbyplayername2} {nearbyplayerdistance2} Blocks + + + + + + nearbyplayerdistance3 + 0 + {nearbyplayericon3} {nearbyplayername3} {nearbyplayerdistance3} Blocks + + + + + + + + + + ping + 0.5 + {ping}ms {pingicon} + 检测中... + + + + +``` + +### 简洁版本 + +```xml + + + + + + + + mouseoverid + 0.5 + $e{mouseovername} + + + + + + mouseoverid + 0.5 + $a{mouseoveruniquename} $b{mouseoverid}:{mouseovermetadata} + + + + + + mouseoverpowerinput + 0.5 + $eMin: $7{mouseoverpowerweak} $aMax: $7{mouseoverpowerstrong} $bInput: $7{mouseoverpowerinput} + + + + + + + + + {xi} {yi} {zi} ( + + EQ + abrfinedirection + N + NE + E + SE + S + SW + W + NW + + 东北 + + 东南 + + 西南 + 西 + 西北 + 未知 + + ) + + + + + speed + 1 + 区块 ({chunkx}, {chunkz}) {axisdirection} + + + + + + + + + + ping + 0.5 + {ping}ms {pingicon} + 检测中... + + + + +``` + +‍ diff --git a/docs/content/minecraft-java-edition-commands.md b/docs/content/minecraft-java-edition-commands.md new file mode 100644 index 0000000..fbf07b3 --- /dev/null +++ b/docs/content/minecraft-java-edition-commands.md @@ -0,0 +1,168 @@ +--- +title: Minecraft Java Edition 命令合集 +date: 2025-03-16T22:24:06Z +lastmod: 2025-03-16T22:26:03Z +tags: [Minecraft,合集,命令,命令方块] +--- + +# Minecraft Java Edition 命令合集 + +参考资料:[Minecraft Wiki - 命令](https://zh.minecraft.wiki/%E5%91%BD%E4%BB%A4) + +已测试的游戏版本:Minecraft Java 正式版 1.10.2、1.12.2、1.18.2 等 + +--- + +> 如无特殊情况,本文中的 `目标选择器` 均使用 `r=半径` 作为说明,可根据需要自行修改。 +> +> **安全起见,最好先** **​`/testfor`​**​ **一下设定的** **​`目标选择器`​**​ **是否正确选择了所需要修改的** **​`实体`​**​ **。** + +## /data + +获取 UUID(已测试:1.18.2) + +```text +/data get entity @e[distance=..5,limit=1,type=实体类型ID] UUID +``` + +## /entitydata + +打开或关闭 `半径` 范围内的生物的 AI(已测试:1.10.2、1.12.2) + +- 打开(默认状态):`/entitydata @e[r=半径] {NoAI:0}`​ +- 关闭:`/entitydata @e[r=半径] {NoAI:1}`​ + +更改 `半径` 范围内的 `自定义 NPC` 的 `玩家材质 ID` 为 `游戏 ID`(已测试:1.10.2) + +```text +/entitydata @e[r=半径,type=customnpcs.CustomNpc] {SkinUsername:{Name:"游戏 ID"}} +``` + +使 `半径` 范围内的 `RailCraft 永动机车` 的旋转角度变为 `角度`​ + +```text +已测试:1.10.2 +/entitydata @e[r=半径,type=railcraft.locomotive_creative] {Rotation:[0:角度]} + +已测试:1.12.2 +/entitydata @e[r=半径,type=railcraft:locomotive_creative] {Rotation:[角度,0.0f]} + +可用的“角度”:0.0f 90.0f 180.0f 270.0f +``` + +使 `半径` 范围内的 `RailCraft 永动机车` 锁定(私人模式)(已测试:1.10.2) + +```text +/entitydata @e[r=半径,type=railcraft.locomotive_creative] {lock:"PRIVATE"} +``` + +使 `半径` 范围内的 `RailCraft 永动机车` 启动(已测试:1.10.2) + +```text +/entitydata @e[r=半径,type=railcraft.locomotive_creative] {locoMode:2b} +``` + +使 `半径` 范围内的 `RailCraft 永动机车` 停止(已测试:1.10.2) + +```text +/entitydata @e[r=半径,type=railcraft.locomotive_creative] {locoMode:0b} +``` + +使 `半径` 范围内的 `矿车` 内显示方块 ID 为 `ID:数据值` 的方块 + +```text +已测试:1.10.2 +/entitydata @e[r=半径,type=Minecart] {CustomDisplayTile:1b,DisplayTile:"ID",DisplayData:数据值,DisplayOffset:方块垂直位移} + +已测试:1.12.2 +/entitydata @e[r=半径,type=minecart] {CustomDisplayTile:1b,DisplayTile:"ID",DisplayData:数据值,DisplayOffset:方块垂直位移} +``` + +使 `半径` 范围内的 `生物` 无敌(已测试:1.10.2) + +```text +/entitydata @e[r=半径] {Invulnerable:1b} +``` + +使 `半径` 范围内的 `物品` 无法被捡起 & 消失 + +```text +已测试:1.10.2 Sponge 服务端 +/entitydata @e[r=半径,type=Item] {ForgeData:{SpongeData:{InfiniteDespawnDelay:1b,InfinitePickupDelay:1b}},Invulnerable:1b} + +已测试:1.12.2 +/entitydata @e[r=半径,type=minecraft:item] {Age:-32768s,Health:100s,PickupDelay:32767s,UpdateBlocked:1b} +``` + +## /execute + +自定义拴绳目标 + +```text +# 蜜蜂拉铁傀儡(获取蜜蜂的 UUID 设置到铁傀儡) +/execute as @e[type=minecraft:iron_golem,distance=..16] run data modify entity @s Leash.UUID set from entity @e[limit=1,type=minecraft:bee,distance=..16] UUID +``` + +## /give + +给予玩家一块告示牌,右键点击时可生成一个命令中使用了转义符的命令方块(已测试:1.12.2) + +> 若直接在命令方块中使用转义符,不生效,因此需要借助告示牌。 +> +> **可能会损坏存档(游戏崩溃),使用前请备份。** + +```text +/give @p minecraft:sign 1 0 { BlockEntityTag: { Text1: "{ \"text\": \"生成命令方块\", \"clickEvent\": { \"action\": \"run_command\", \"value\": \"setblock ~ ~1 ~ minecraft:command_block 0 destroy { Command: \\\"换行符\\u000a换行符\\\" }\" } }", id: "Sign" } } +``` + +```text +/give @p minecraft:sign 1 0 { "BlockEntityTag": { "Text1": "{ \"text\": \"生成命令方块\", \"clickEvent\": { \"action\": \"run_command\", \"value\": \"setblock ~ ~1 ~ minecraft:command_block 0 destroy { \\\"Command\\\": \\\"换行符\\u000a换行符\\\" }\" } }", "id": "Sign" } } +``` + +## /summom + +在 `原地` 生成半径为 `半径` ,时长为 `游戏刻` 的 `伤害 II` 的药水云(已测试:1.10.2) + +```text +/summon AreaEffectCloud ~ ~ ~ {Age:0,Duration:游戏刻,ReapplicationDelay:20,WaitTime:20,DurationOnUse:0,Radius:半径f,RadiusPerTick:0.0001f,RadiusOnUse:0.0f,Particle:flame,Effects:[{Ambient:0b,Amplifier:1b,Id:7b,ShowParticles:1b,Duration:1}]} +``` + +在 `原地` 生成名称为 `ID` 且 `无敌` 的临时 NPC(已测试:1.10.2 Sponge 服务端) + +```text +/summon Sponge.Human ~ ~ ~ {Invulnerable:1b,CustomName:"ID"} +``` + +在 `原地` 生成一辆内部显示方块 ID 为 `ID:数据值` 的方块的矿车 + +```text +已测试:1.10.2 +/summon Minecart ~ ~ ~ {CustomDisplayTile:1b,DisplayTile:"ID",DisplayData:数据值,DisplayOffset:方块垂直位移} + +已测试:1.12.2 +/summon minecart ~ ~ ~ {CustomDisplayTile:1b,DisplayTile:"ID",DisplayData:数据值,DisplayOffset:方块垂直位移} +``` + +在 `原地` 生成方块 ID 为 `ID:数据值` 的浮空方块(已测试:1.12.2) + +```text +/summon falling_block X Y Z {Block:"ID",Data:数据值b,Time:1,NoGravity:1b,UpdateBlocked:1b,CustomName:"名称"} +``` + +## /testfor + +检测半径为 `半径` 的玩家手上是否 `持有` 相应 `物品 ID` 的物品(已测试:1.10.2) + +```text +/testfor @a[r=半径] {SelectedItem:{id:物品 ID}} +``` + +> 检测的不一定是 `物品`,也可以是 `方块`、`装备` 等等,也支持检测模组中的物品。 +> +> 例: +> +> ​`/testfor @a[r=5] {SelectedItem:{id:minecraft:stone}}`​ +> +> ​`/testfor @a[r=16] {SelectedItem:{id:wheat_plus:MaiZiTong}}`​ + +‍ diff --git a/docs/content/minecraft-java-server-options.md b/docs/content/minecraft-java-server-options.md new file mode 100644 index 0000000..8e862c1 --- /dev/null +++ b/docs/content/minecraft-java-server-options.md @@ -0,0 +1,52 @@ +--- +title: Minecraft Java 版服务端启动参数选项 +date: 2025-03-16T15:41:39Z +lastmod: 2025-03-16T15:42:12Z +tags: [Minecraft,Java,服务器] +--- + +# Minecraft Java 版服务端启动参数选项 + +参考资料:[Minecraft Wiki - Tutorials / Setting up a server](https://minecraft.fandom.com/wiki/Tutorials/Setting_up_a_server) + +在 Minecraft 服务端的启动命令 `-jar minecraft_server.jar` 的后面可以添加参数,传递给服务端: + +- ​`--help` + 查看所有可用的参数。 +- ​`--bonusChest` + 是否在初次生成世界时生成奖励箱。 +- ​`--demo` + 指定服务端是否在演示模式下运行(给玩家显示一个 “演示版” 弹出信息,且在演示结束后玩家不能破坏、放置方块或者吃东西)。 +- ​`--eraseCache` + 清除光照缓存等(与单人游戏进行 “优化世界” 操作时的 “清除缓存” 选项相同)。 +- ​`--forceUpgrade` + 强制升级所有区块到服务端目前的版本(单人游戏世界也可用)。 + 此选项会增加启动服务端所需的时间。 +- ​`--initSettings` + 只初始化 `server.properties` 和 `eula.txt`,然后退出。 +- ​`--jfrprofile` + 启动服务端时初始化 Java Flight Recorder。 + 只在 Minecraft 1.18 及以上的版本可用。 +- ​`--nogui` + 启动服务端不显示服务端内置的图形界面。 + 添加该参数后,只能在系统的 “命令提示符” 或 “终端” 中控制服务端。 +- ​`--port ` + 指定服务端监听的端口(默认值为 -1 ),忽略在 `server.properties` 中的设置。 +- ​`--safeMode` + 安全模式,加载存档时只使用原版数据包。 +- ​`--serverId ` + 给服务端指定一个 ID(似乎没有作用)。 +- ​`--singleplayer ` + 使服务端以离线模式运行(参数值 `` 的用途未知,可能是 Mojang 内部使用的)。 +- ​`--universe ` + 指定查找存档文件夹所在的路径(默认为 `.`,即当前目录)。 +- ​`--world ` + 指定 `level.dat` 所在文件夹的名称(存档文件夹名称)。 +- ​`-o true` + 使服务端以在线模式运行,只有经过认证的用户才能进入(新版本中此选项不可用)。 + +示例命令行: + +- ​`java -Xms256M -Xmx2G -jar minecraft_server.jar --forceUpgrade --nogui`​ + +‍ diff --git a/docs/content/minecraft-links.md b/docs/content/minecraft-links.md new file mode 100644 index 0000000..6679796 --- /dev/null +++ b/docs/content/minecraft-links.md @@ -0,0 +1,49 @@ +--- +title: 「Minecraft」相关链接 +date: 2025-03-16T22:22:44Z +lastmod: 2025-03-16T22:23:24Z +tags: [Minecraft,链接,网站] +--- + +# 「Minecraft」相关链接 + +## 官网 + +- [国际版](https://minecraft.net/) +- [中国版](https://mc.163.com/) + +## 百科 + +- [Wiki](https://minecraft-zh.gamepedia.com/) +- [MOD 百科](https://www.mcmod.cn/) +- [插件百科](https://mineplugin.org/) + +## 查询 + +- [NameMC - 查询(ID、UUID、皮肤、服务器)](https://namemc.com/) + +## 工具 + +- [MC百科 - 命令方块指令生成器](https://www.mcmod.cn/tools/cbcreator) +- [命令方块新人手册](https://commandtutorials.neocities.org/) +- [在线 NBT 编辑器](https://irath96.github.io/webNBT/) + +## 论坛 + +- [Minecraft 中文论坛](https://www.mcbbs.net/forum.php) + +## 下载 + +获取正版用户皮肤(无法使用) + +```plaintext +https://skins.minecraft.net/MinecraftSkins/ID.png +``` + +下载官方原版服务端 + +```text +https://s3.amazonaws.com/Minecraft.Download/versions/版本/minecraft_server.版本.jar +``` + +‍ diff --git a/docs/content/minecraft-mod-funny-items.md b/docs/content/minecraft-mod-funny-items.md new file mode 100644 index 0000000..87b3c20 --- /dev/null +++ b/docs/content/minecraft-mod-funny-items.md @@ -0,0 +1,207 @@ +--- +title: 「Minecraft」Funny Items Mod +date: 2025-03-16T18:41:35Z +lastmod: 2025-03-16T18:44:20Z +tags: [Minecraft,模组] +--- + +# 「Minecraft」Funny Items Mod + +模组版本:Minecraft Java Edition 正式版 1.12.2 Forge 2768+ + +模组版本:1.0 + +模组作者:Frost-ZX + +模组状态:停止更新 + +--- + +## 方块 + +#### TNT + +> 类似“地雷”,有生物踩在上面就爆炸。 + +**合成表**(有序合成) + +TNT(原版) + 铁粒 +​![合成表](assets/network-asset-recipe-tnt-20250316184208-9fsba8n.png) + +**可配置项** + +- 爆炸威力 + +--- + +## 物品 + +#### 羽毛 + +> 右键使用,自动将玩家传送到当前位置的空中(默认为当前高度 `+100`)。 + +**合成表**(有序合成) + +羽毛(原版) + 末影珍珠 `4` +​![合成表](assets/network-asset-recipe-rightclick-to-fly-20250316184209-08yqxu4.png) + +**可配置项** + +- 传送高度差 + +#### 钻石 + +> 会爆炸的钻石,配合 `钻石(控制)` 使用。 + +**合成表**(无序合成) + +钻石(原版) + 火药 +​![合成表](assets/network-asset-recipe-diamond-explode-20250316184209-jln0vzy.png) + +#### 钻石(控制) + +> 右键使用,可以引爆玩家身上的 `钻石`(本 Mod 中的物品)。 + +--- + +## 食物 + +#### 面包 + +> 食用后,饥饿值 -5。 + +**合成表**(无序合成) + +面包(原版) + 腐肉 +​![合成表](assets/network-asset-recipe-bread-hungry-20250316184209-c4hukxb.png) + +#### 苹果 + +> 食用后,饥饿值 -4。 + +**合成表**(无序合成) + +苹果(原版) + 腐肉 +​![合成表](assets/network-asset-recipe-apple-hungry-20250316184209-caab7si.png) + +--- + +## 武器 + +#### 手榴弹 + +> 右键并松开丢出,击中目标就爆炸(受技术限制,暂不支持定时爆炸)。 + +**合成表**(有序合成) + +火药 + 铁锭 `4` +​![合成表](assets/network-asset-recipe-hand-grenade-20250316184209-t0om6f6.png) + +**可配置项** + +- 爆炸威力 + +#### 铁剑(异常) + +> 攻击 `生物` 后,随机给予 `生物` 随机的 `伤害值` 或 `生命值`。 + +**耐久度** + +251 + +**合成表**(无序合成) + +铁剑 + 金粒 +​![合成表](assets/network-asset-recipe-sword-iron-error-20250316184209-n2eqoyg.png) + +**可配置项** + +- 随机值的最大值 + +#### 钻石剑(异常) + +> 攻击 `生物` 后,随机给予 `生物` 随机的 `伤害值` 或 `生命值`。 + +**耐久度** + +1562 + +**合成表**(无序合成) + +钻石剑 + 金粒 +​![合成表](assets/network-asset-recipe-sword-diamond-error-20250316184209-dzg3i4f.png) + +**可配置项** + +- 随机值的最大值 + +--- + +## 生物 + +#### 炸弹人 + +> 类似爬行者(Creeper),但行走速度是爬行者的 2 倍。 + +**图片** + +![炸弹人](assets/network-asset-mob-steve-explode-20250316184209-wzb2afi.jpg) + +**可生成的生物群系** + +- Beaches +- Desert +- Savanna + +**生命值** + +20 + +**经验值** + +10 + +**掉落物** + +- 火药 + +**可配置项** + +- 爆炸威力 + +--- + +## 命令 + +#### 说明 + +- ​`< >` 为必填内容。 +- ​`[ ]` 为可选内容。 + +#### 主命令 + +- ​`/funnyitems` 显示可用的命令列表。 +- ​`/funnyitems info` 获取模组信息。 + +#### 修改配置 + +- ​`/funnyitems get` + 获取当前配置。 +- ​`/funnyitems reset` + 重置配置(第一次使用或更新后如果发现有配置值为 0,最好执行一次,或手动将其 `set` 为默认值以免出现问题)。 +- ​`/funnyitems set AttackRandomDiamond_Max <数值>` + 修改 `钻石剑(异常)` 的随机值的最大值(默认值 14)。 +- ​`/funnyitems set AttackRandomIron_Max <数值>` + 修改 `铁剑(异常)` 的随机值的最大值(默认值 12)。 +- ​`/funnyitems set DiamondExplode_Power <数值>` + 修改 `钻石` 的爆炸威力(默认值 4)。 +- ​`/funnyitems set HandGrenade_Power <数值>` + 修改 `手榴弹` 的爆炸威力(默认值 4)。 +- ​`/funnyitems set SteveExplode_Power <数值>` + 修改 `炸弹人` 的爆炸威力(默认值 2)。 +- ​`/funnyitems set TNTA_Power <数值>` + 修改 `TNT` 的爆炸威力(默认值 4)。 +- ​`/funnyitems set ToSky_High <数值>` + 修改 `羽毛` 的传送高度差(默认值 100)。 + +‍ diff --git a/docs/content/minecraft-official-website-login-problem.md b/docs/content/minecraft-official-website-login-problem.md new file mode 100644 index 0000000..65f44c2 --- /dev/null +++ b/docs/content/minecraft-official-website-login-problem.md @@ -0,0 +1,83 @@ +--- +title: 使用 gooreplacer 插件解决国内在 Minecraft 官网不能登录的问题 +date: 2025-03-16T18:45:10Z +lastmod: 2025-03-16T18:53:44Z +tags: [Minecraft,教程,浏览器,插件] +--- + +# 使用 gooreplacer 插件解决国内在 Minecraft 官网不能登录的问题 + +> 注意: +> +> 在 2019 年 9 月以及之后,在中国大陆已经可以正常登录。 +> +> 本教程也适用于其它使用 reCAPTCHA 的网站。 + +浏览器:Google Chrome + +扩展程序名称:gooreplacer + +扩展程序介绍:[GitHub 仓库](#20250316184740-67klq0m) + +注意事项: + +其他 Chromium 内核的浏览器以及 Firefox 浏览器也可以使用本方法。 + +移动端的 Chrome 暂不支持安装扩展程序,如需使用请安装 Firefox 或其他支持安装扩展的浏览器。 + +--- + +## 前言 + +Minecraft 国际版官网启用了 reCAPTCHA 验证码,由于其使用了 google.com 的域名,在中国大陆不能正常加载,导致点击“登录”按钮后没有任何的反应。 + +本方法通过扩展程序把 `www.google.com/recaptcha` 重定向为 `recaptcha.net/recaptcha`,使 Minecraft 国际版官网上的 reCAPTCHA 能正常加载以登录。 + +## 安装扩展程序 + +#### 链接 + +- [Chrome 扩展](#20250316184736-kq0njqg) +- [Edge 扩展](#20250316184738-2d3t05i) +- [Firefox 扩展](#20250316184739-z21o91c) + +#### 注意 + +由于 Chrome 网上应用商店使用了 google.com 的域名,所以一般情况下,在中国大陆也是不能访问的,你可能要通过以下的方法安装 gooreplacer 扩展程序(如果你使用的是 Firefox 浏览器,则可以直接安装)。 + +1. 进入 gooreplacer 扩展程序的 [GitHub 仓库](#20250316184740-67klq0m) 页面。 +2. 在 `安装` 部分找到 `此外,也可以直接下载本仓库的 crx 文件` ,点击 [crx 文件](https://github.com/jiacai2050/gooreplacer/blob/master/gooreplacer.crx) 字段,然后在打开的页面中点击 [Download](https://github.com/jiacai2050/gooreplacer/raw/master/gooreplacer.crx) 即可下载扩展程序文件(当然,你也可以直接点击这里的 `Download` 进行下载)。 + ​![Download CRX](assets/network-asset-download-crx-20250316184540-c6u4bof.png) +3. 在 Chrome 中打开 `chrome://extensions/`,然后把刚刚下载的 `gooreplacer.crx` 文件拖到页面中,等待一会就会弹出确认安装提示框,点击“添加扩展程序”然后稍等片刻就安装完成了。 + +## 配置扩展程序 + +打开 gooreplacer 的 `选项`,根据下图进行设置即可。 + +![Extension Settings](assets/network-asset-extension-settings-20250316184541-g5c2jtc.gif) + +```text +匹配模式(Source) +www.google.com/recaptcha + +匹配类型(Kind) +通配符 + +目标地址(Destination) +recaptcha.net/recaptcha +``` + +## 完成 + +如果扩展程序安装无误且配置正确,你可以在 Minecraft 国际版官网的 `注册/登录` 页面的右下角看到 reCAPTCHA 的图标: + +![reCAPTCHA](assets/network-asset-logo_48-20250316184541-5cfzwt1.png) + +## 相关链接 + +- [Chrome 扩展](https://chrome.google.com/webstore/detail/gooreplacer/jnlkjeecojckkigmchmfoigphmgkgbip) +- [Edge 扩展](https://microsoftedge.microsoft.com/addons/detail/gooreplacer/cidbonnpjopamnhfjdgfcmjmlmehjnej) +- [Firefox 扩展](https://addons.mozilla.org/zh-CN/firefox/addon/gooreplacer/) +- [GitHub 仓库](https://github.com/jiacai2050/gooreplacer) + +‍ diff --git a/docs/content/minecraft-op-permission-level.md b/docs/content/minecraft-op-permission-level.md new file mode 100644 index 0000000..6bd78b6 --- /dev/null +++ b/docs/content/minecraft-op-permission-level.md @@ -0,0 +1,47 @@ +--- +title: 「Minecraft」OP 权限等级 +date: 2025-03-19T12:32:49Z +lastmod: 2025-03-19T12:35:47Z +tags: [Minecraft,科普] +--- + +# 「Minecraft」OP 权限等级 + +权限等级用于描述玩家或命令执行者的权限。 + +--- + +## 参考 + +- [权限等级 - Minecraft Wiki](https://zh.minecraft.wiki/w/%E6%9D%83%E9%99%90%E7%AD%89%E7%BA%A7) + +## 效果 + +### Java 版 + +- 1级:玩家可无视重生点保护。 +- 2级:玩家或执行者可以使用更多命令(详见[命令](https://minecraft.fandom.com/wiki/Commands)页面),玩家可以使用命令方块。(作弊命令) +- 3级:玩家或执行者可以使用更多命令。(多人管理) +- 4级:玩家或执行者可以使用所有命令。(服务器管理) + +### 基岩版 + +玩家可以使用对应其等级的命令,拥有更高权限等级的玩家可以使用需要较低权限等级的命令。 + +## 定义 + +### Java 版 + +在 Java 版中,可用的权限等级为 0、1、2、3 以及 4。 + +- 命令方块或命令方块矿车拥有权限等级 2。 +- 服务器控制台拥有权限等级 4。 +- 函数(Function)拥有权限等级 2(可以在 `server.properties` 中修改)。 +- 对于玩家: + + - 若玩家在服务器中拥有 OP 权限,其权限等级可在服务端的 `ops.json` 文件中指定,默认权限等级可在 `server.properties` 中设置。 + - 若玩家处于单人世界或为局域网世界的所有者(房主),且启用了作弊,则其权限等级为 4。 + +### 基岩版 + +在基岩版中,可用的权限等级为 0、1、2、3 以及 4。 diff --git a/docs/content/minecraft-optimize-fps.md b/docs/content/minecraft-optimize-fps.md new file mode 100644 index 0000000..11b31a8 --- /dev/null +++ b/docs/content/minecraft-optimize-fps.md @@ -0,0 +1,105 @@ +--- +title: 「优化」使你的 Minecraft 玩起来更流畅 +date: 2025-02-15T19:17:41Z +lastmod: 2025-02-20T23:04:13Z +tags: [游戏,Minecraft,教程,优化] +--- + +# 「优化」使你的 Minecraft 玩起来更流畅 + +虽然现在很多人都用上了高端配置的电脑,但是还仍有一部分的人因为各种条件的限制,导致只能使用低端配置的电脑。 +本教程将会教大家通过一些方法,优化 Minecraft,使你的 Minecraft 玩起来更流畅。 +但是,如果你玩纯净版 Minecraft(无任何模组,视距 4 左右),帧率小于 20,你也许就只能使用升级电脑硬件的方法了。 +本教程仅列举部分已知的方法。 + +--- + +## 方法一:关闭不必要的程序展开目录 + +程序会占用 CPU & 内存,开太多的话,会导致电脑运算效率下降,从而导致游戏卡顿。 +如果你需要听音乐,尽量使用手机或其他设备。 + +## 方法二:更新显卡驱动展开目录 + +新版的显卡驱动有可能会优化性能,如果有条件的话,就尽量更新一下。 +不过,有的显卡只能用特定版本的驱动,这样的话不建议更新,所以更新前最好去网上查一下相关资料。 +若需要下载驱动,最好到官网进行下载: + +- [AMD](https://support.amd.com/zh-cn/download/) +- [NVIDIA](https://www.nvidia.cn/Download/index.aspx?lang=cn) +- [Intel](https://downloadcenter.intel.com/zh-cn) + +如果你实在不会弄 / 嫌麻烦,就去下载驱动安装软件辅助安装(不建议)。 + +## 方法三:选择合适的 Java 运行时展开目录 + +Java 分 32 位和 64 位版本,如果你的系统是 64 位,就安装 64 位的 Java。 +查看电脑是多少位的系统:[百度经验](https://jingyan.baidu.com/article/5d6edee229af8b99eadeeca2.html) +官方 Java 下载地址:[Java](https://www.java.com/zh_CN/download/manual.jsp) + +## 方法四:把 Java 设置为 “高优先展开目录 + +**注意:本方法有一定的危险性(可能导致程序不稳定)。** +在任务管理器中找到 Java 的进程,点击右键,把优先级设置为 “高”: + +![任务管理器](assets/network-asset-728d23a7gw1f7c6gr96zaj20ep04idfw-20250215192021-imfknl3.jpg "任务管理器") + +## 方法五:给 Java 分配更多的内存展开目录 + +本方法以正版启动器为例,其他的第三方启动器通常能在`启动器设置`找到内存分配设置选项。 +**注意:内存只能分配** **​`小于`​** **当前系统剩余内存的大小。** + +#### 步骤展开目录 + +1. 点击启动器左下角的 `Edit Profile` 按钮: + ​![Edit Profile](assets/network-asset-728d23a7gw1f7c6gpkf2uj206t02eq2q-20250215192022-mhqzu1n.jpg "Edit Profile") +2. 勾选 `JVM Arguments` 后,即可修改内容: + ​![JVM Arguments](assets/network-asset-728d23a7gw1f7c6grxp6ej20jf02pt8t-20250215192023-q393aq2.jpg "JVM Arguments") +3. 修改完成后,保存即可: + ​![Save Profile](assets/network-asset-728d23a7gw1f7c6guubkij207401m742-20250215192025-ikuc9bb.jpg "Save Profile") + +## 方法六:安装 Optifine 展开目录 + +Optifine 是一个优化 Minecraft 的 MOD(模组),它提供了非常实用的功能,也解决了部分低配玩家玩 Minecraft 的卡顿现象。 + +**Optifine 下载地址** + +- 国内:[MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=142291) +- 国外:[官网](https://optifine.net/downloads) + +**Forge 下载 & 安装教程** + +- [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=63718) +- [百度贴吧](https://tieba.baidu.com/p/2996506368) + +## 方法七:进行适当的设置展开目录 + +> 注意:使用本方法请先安装 Optifine。 + +#### 方法展开目录 + +适当地调低视野距离(视频设置) + +![设置](assets/network-asset-728d23a7gw1f7c6gb146rj208y01qjr9-20250215192026-v5h81f5.jpg "设置") + +把 `图像品质` 设置为 `流畅`(视频设置) + +![设置](assets/network-asset-728d23a7gw1f7c6gigwd8j208y01qwed-20250215192027-tlsnvyt.jpg "设置") + +启用缓冲区顶点图像(视频设置) + +![设置](assets/network-asset-728d23a7gw1f7c6gkkiauj208y01q3ye-20250215192029-e2sfd15.jpg "设置") + +关闭迷雾(视频设置) + +![设置](assets/network-asset-728d23a7gw1f7c6gln7k5j208y01qjr9-20250215192030-qabmmgz.jpg "设置") + +关闭一些动画效果(视频设置 - 动画) + +![设置](assets/network-asset-728d23a7gw1f7c6gmpkhcj20i70dpq4q-20250215192031-8it9q0g.jpg "设置") + +修改 `性能设置`(视频设置 - 性能) + +![设置](assets/network-asset-728d23a7gw1f7c6go5g3tj20ii06paao-20250215192031-3mie9xu.jpg "设置") + +‍ diff --git a/docs/content/mobile-qq-page-links.md b/docs/content/mobile-qq-page-links.md new file mode 100644 index 0000000..43d6a05 --- /dev/null +++ b/docs/content/mobile-qq-page-links.md @@ -0,0 +1,364 @@ +--- +title: 移动端 QQ & 微信页面链接 +date: 2025-03-16T22:07:27Z +lastmod: 2025-03-16T22:14:01Z +tags: [链接,Android,QQ,微信,软件] +--- + +# 移动端 QQ & 微信页面链接 + +> 部分链接可在浏览器中打开(需要先在 `qzone.qq.com` 登录一次)。 +> +> 部分链接需要在 `手机QQ / 微信` 内打开才能正常显示。 +> +> 部分链接需要根据实际情况修改后再使用;一般情况下,`Q号` 可改为自己的或对方的。 +> +> 部分链接可能已失效(链接下方的日期为最后测试的日期)。 + +## QQ + +### 表情搜索 + +- ​`https://ti.qq.com/hybrid-h5/emoticon/recommend`​ +- 2020-11-44 + +### 打卡 + +#### 主页 + +- ​`https://ti.qq.com/signin/public/index.html`​ + +#### 我的卡片 + +- ​`https://ti.qq.com/signin/public/cardsv2.html`​ +- 2020-07-02 + +#### QQ盲盒 + +- ​`https://h5.qzone.qq.com/v2/vip/giftv2/blindBox`​ +- 2021-03-07 + +### 达人 + +- ​`https://ti.qq.com/xman/self.html`​ + +### 个性装扮 + +- ​`https://zb.vip.qq.com/sonic/index`​ + +### 好友互动标识 + +- ​`https://ti.qq.com/hybrid-h5/interactive_logo/two?target_uin=对方Q号&_nav_txtclr=000000`​ + +### 空间 + +#### 访客周报 + +- ​`https://h5.qzone.qq.com/qzoneVisitor/reporter/detail/Q号`​ +- 2020-08-10 + +#### 好友动态权限设置 + +- ​`https://h5.qzone.qq.com/qzone/setting`​ +- 2020-09-03 + +#### 花藤 + +- ​`https://qzs.qq.com/qzone/phone/m/v4/module/playbar/index.html?appid=1101255595`​ +- 2020-08-10 + +#### 我的好友 + +- ​`https://h5.qzone.qq.com/platform/myfriend`​ + +#### 小秘密 + +- ​`https://h5.qzone.qq.com/secret/list`​ + +### 亲密关系 + +- ​`https://ti.qq.com/hybrid-h5/intimate/list`​ + +### 礼物 + +- ​`https://h5.qzone.qq.com/v2/vip/giftv2/vuemall?friends=Q号`​ +- 2020-07-02 + +### 群发助手 + +- ​`https://h5.qzone.qq.com/v2/mass`​ +- 2020-11-11 + +### 群聊 + +#### 群成员等级 + +- ​`https://qun.qq.com/interactive/levellist?gc=群号`​ +- 2020-08-10 + +#### 群打卡记录 + +- ​`https://qun.qq.com/v2/signin/detail?gc=群号`​ +- 2020-11-11 + +#### 群发消息 + +- ​`https://qun.qq.com/qqweb/m/qun/supermaster/msg.html`​ + +#### 群公告 + +- ​`https://web.qun.qq.com/mannounce/index.html#gc=群号`​ + +#### 群管理 + +##### 群标签编辑 + +- ​`https://web.qun.qq.com/tag/index.html?gc=群号&modifyToSrv=0`​ +- 2021-10-10 + +##### 相关群 + +- ​`https://qun.qq.com/v2/associate/index?gc=群号`​ +- 2021-10-10 + +#### 群机器人 + +- ​`https://qun.qq.com/qqweb/m/qun/qun_robot/setting.html?gc=群号`​ +- ​`https://web.qun.qq.com/qunrobot/data.html?gc=群号&robot_uin=机器人Q号`​ + +#### 群精华消息 + +- ​`https://qun.qq.com/essence/index?gc=群号`​ +- 2020-09-03 + +#### 群聊等级PK + +- ​`https://qun.qq.com/qqweb/m/qun/rank/rank.html?gc=群号&uin=Q号`​ + +#### 群匿名 + +- ​`https://qqweb.qq.com/m/business/anonymoustalk/index.html?gcode=群号&role=1&self=1`​ + +#### 群签到 + +##### 列表 + +- ​`https://qun.qq.com/qqweb/m/qun/checkin/index.html?gc=群号&state=0`​ + +##### 新签到 + +- ​`https://qun.qq.com/qqweb/m/qun/checkin/index.html?gc=群号&state=1`​ + +#### 群日历 + +- ​`https://qun.qq.com/qqweb/m/qun/calendar/index.html?gc=群号`​ + +#### 群荣誉 + +- ​`https://qun.qq.com/interactive/qunhonor?gc=群号`​ + +#### 群收钱 + +- ​`https://mqq.tenpay.com/mqq/groupreceipts/index.shtml?uin=Q号&type=3`​ + +#### 群数据 + +- ​`https://qqweb.qq.com/m/qun/activedata/active.html?gc=群号`​ + +#### 群投票 + +##### 列表 + +- ​`https://client.qun.qq.com/qqweb/m/qun/vote/index.html?groupuin=群号`​ + +##### 发布投票 + +- ​`https://client.qun.qq.com/qqweb/m/qun/vote/form.html?groupuin=群号`​ + +#### 群头衔 + +##### 设置 + +- ​`https://qinfo.clt.qq.com/qlevel/setting.html#gc=群号`​ + +##### 佩戴 + +- ​`https://qun.qq.com/qqweb/m/qun/medal/index.html?gc=群号&uin=Q号`​ + +#### 群头像 + +- ​`https://p.qlogo.cn/gh/群号/群号_头像序号/640`​ +- 2020-08-10 + +#### 群相册 + +##### 普通 + +- ​`https://h5.qzone.qq.com/groupphoto/inqq/album/群号`​ + +##### 最近照片 + +- ​`https://h5.qzone.qq.com/groupphoto/inqq/recent/群号`​ +- ​`https://h5.qzone.qq.com/groupphoto/index?inqq=1&groupId=群号`​ +- ​`https://h5.qzone.qq.com/groupphoto/index?inqq=2&groupId=群号`​ +- ​`https://h5.qzone.qq.com/groupphoto/index?inqq=3&groupId=群号`​ +- ​`https://h5.qzone.qq.com/groupphoto/index?inqq=4&groupId=群号`​ + +#### 群幸运字符 + +- ​`https://qun.qq.com/v2/luckyword/index?qunid=群号`​ +- 2020-11-11 + +#### 群应用 + +##### 普通 + +- ​`https://qun.qq.com/qqweb/m/qunopen/appstore/index.html?gc=群号`​ +- 2020-07-02 + +##### 管理 + +- ​`https://qun.qq.com/slidepanel/manage?gc=群号`​ +- 2020-07-02 + +#### 群员分布 + +- ​`https://web.qun.qq.com/statistics/index.html?gc=群号`​ + +#### 群作业 + +- ​`https://qun.qq.com/homework/features/index.html#gid=群号`​ +- 2020-08-10 + +### 设置 + +#### 撤回消息提示文本 + +- ​`https://zb.vip.qq.com/v2/pages/withdrawMessage`​ +- 2020-09-03 + +#### 发现我的方式 + +- ​`https://ti.qq.com/friendshipauth/find`​ +- 2020-09-03 + +#### 单向好友管理 + +- ​`https://ti.qq.com/friends/unidirection`​ +- 2020-09-03 + +#### 加我为好友的方式 + +- ​`https://ti.qq.com/friendship_auth/index.html`​ +- 2020-09-03 + +#### 聊天记录漫游 + +- QQ:`https://gxh.vip.qq.com/club/client/msgRoam/rel/html/index_v2.html`​ +- TIM:`https://tim.qq.com/htdocs/roaming/index.html`​ +- 2020-09-03 + +#### 群互动标识开关(个人) + +- ​`https://qun.qq.com/interactive/usersetting`​ +- 2020-09-03 + +#### 头像双击互动装扮(拍一拍) + +- ​`https://zb.vip.qq.com/v2/pages/nudgeMall`​ +- 2022-04-25 + +### 坦白说 + +- ​`https://ti.qq.com/honest-say/main.html`​ +- 2021-10-10 + +### 提醒 + +- ​`https://ti.qq.com/remind/index`​ +- 2021-10-10 + +### 天气 + +- ​`https://weather.mp.qq.com/?city=城市`​ +- 广州天气:https://weather.mp.qq.com/?city=%E5%B9%BF%E5%B7%9E + +### 资料 + +#### 成长攻略 + +- ​`https://h5.vip.qq.com/p/mc/card/grow`​ +- 2021-03-07 + +#### 好友纪念日 + +- ​`https://h5.qzone.qq.com/friend/day/自己Q号/对方Q号/friendDay`​ +- 2021-03-07 + +#### 精选照片 + +- ​`https://ti.qq.com/photowall/index.html?uin=Q号`​ +- 2021-10-10 + +#### 匿名提问(资料卡) + +##### 提问 + +- ​`https://ti.qq.com/v2/anonymous/question?uin=好友Q号&from=6`​ +- 2020-11-11 + +##### 回答 + +- ​`https://ti.qq.com/v2/anonymous/answer?uin=自己Q号&from=1`​ +- 2020-11-11 + +#### 头像 + +##### 获取图片 + +> 参考: [https://blog.csdn.net/lddtime/article/details/64590011](https://blog.csdn.net/lddtime/article/details/64590011) + +- ​`https://q1.qlogo.cn/g?b=qq&nk=Q号&s=数值`​ + + |数值(s / spec)|分辨率(px)| + | :-----------------| :-------------| + |1|40 × 40| + |2|40 × 40| + |3|100 × 100| + |4|140 × 140| + |5|640 × 640| + |40|40 × 40| + |100|100 × 100| + +##### 头像挂件 + +- ​`https://zb.vip.qq.com/widget/mine`​ + +##### 历史头像 + +- ​`https://ti.qq.com/avatarlist/public/index.html`​ +- 2020-08-10 + +#### 消息列表(资料卡) + +- ​`https://ti.qq.com/signature/msglist`​ +- 2020-08-10 + +#### 详细资料 + +- ​`https://ti.qq.com/qcard/index.html?qq=Q号`​ + +#### 账号信息(个人) + +- ​`https://mc.vip.qq.com/card/index`​ +- ​`https://club.vip.qq.com/card`​ + +## 微信 + +### ~~添加联系人(URL Scheme)~~ + +- ​`微信`​ +- 复制到输入框修改 `对方微信ID` 后发送,点击发出的 `微信` 即可进入。 +- 使用此方法可以添加自己到联系人列表,也可以重复添加联系人列表中已存在的好友(修改`对方微信ID`的英文字母大小写)。 + +‍ diff --git a/docs/content/nginx-config-snippet.md b/docs/content/nginx-config-snippet.md new file mode 100644 index 0000000..d5e3d80 --- /dev/null +++ b/docs/content/nginx-config-snippet.md @@ -0,0 +1,152 @@ +--- +title: Nginx 常用配置文件片段 +date: 2025-03-15T22:57:21Z +lastmod: 2025-03-15T22:59:02Z +tags: [配置,Nginx,服务器,网站] +--- + +# Nginx 常用配置文件片段 + +## 宝塔单域名子目录站点 + +可直接在 “伪静态” 内填写;假设域名为 “www.example.com”。 + +```nginx +# 注意 alias 和 root 的区别 + +## 访问:`http://www.example.com/example_1/index.html` +## 实际:`/www/wwwroot/example_site/example_1/index.html` +## 注意:不要漏掉末尾的 `/`,以免产生目录穿越漏洞 +location ^~ /example_1/ { + root /www/wwwroot/example_site; + # 可选,默认与“server”中指定的一致 + index index.php index.html; + # 启用 PHP,仅在使用“root”时可用 + include /www/server/nginx/conf/enable-php-74.conf; +} + +## 访问:`http://www.example.com/example_2/index.html` +## 实际:`/www/wwwroot/example_site/example_2/index.html` +location ^~ /example_2/ { + alias /www/wwwroot/example_site/example_2/; + index index.php index.html; +} +``` + +​`enable-php-74.conf` 文件中的内容(该文件自带,不需要创建或修改): + +```nginx +location ~ [^/]\.php(/|$) { + try_files $uri =404; + fastcgi_pass unix:/tmp/php-cgi-74.sock; + fastcgi_index index.php; + include fastcgi.conf; + include pathinfo.conf; +} +``` + +## 负载均衡 + +```nginx +upstream example_servers { + server 192.168.1.101:8080 weight=30; + server 192.168.1.102:8080 weight=20; + server 192.168.1.103:8080 weight=10; + # weight 可选,表示权重,值越大则被分配到的几率越大 +} + +server { + listen 80; + server_name www.example.com; + location / { + proxy_pass http://example_servers; + } +} +``` + +## 禁止访问 + +禁止访问部分扩展名文件 + +```nginx +location ~ \.(conf|ini|php)$ { + deny all; +} +``` + +禁止访问目录 + +```nginx +location ^~ /example/ { + deny all; +} +``` + +## 添加跨域响应头 + +```nginx +location / { + # add_header 'Access-Control-Allow-Origin' '$http_origin'; + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Methods' 'OPTIONS, GET, POST'; + add_header 'Access-Control-Allow-Headers' 'Cache-Control, Content-Type, User-Agent, X-Requested-With'; + add_header 'Access-Control-Allow-Credentials' 'true'; + + if ($request_method = 'OPTIONS') { + return 204; + } +} +``` + +## 一个 server 配置多个域名 + +​`server_name` 中以空格分隔多个域名: + +```nginx +server { + listen 80; + server_name a.frost-zx.top b.frost-zx.top; + ... +} +``` + +## 一个 server 配置多个类型的 SSL 证书 + +参考:[Module ngx_http_ssl_module](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate) + +注意:只有 OpenSSL 1.0.2 及以上版本支持 + +将 `ssl_certificate` 和 `ssl_certificate_key`,复制多一份,然后把路径修改为其他类型证书的路径: + +```nginx +server { + listen 443 ssl; + server_name example.com; + + ssl_certificate example.com.rsa.crt; + ssl_certificate_key example.com.rsa.key; + + ssl_certificate example.com.ecdsa.crt; + ssl_certificate_key example.com.ecdsa.key; + + ... +} +``` + +## 域名重定向 + +```nginx +server { + + ... + + if ($host ~ '^www.example.com') { + return 301 https://test.example.com/; + } + + ... + +} +``` + +‍ diff --git a/docs/content/npm-yarn-vuecli-common-problems-and-solutions.md b/docs/content/npm-yarn-vuecli-common-problems-and-solutions.md new file mode 100644 index 0000000..8657777 --- /dev/null +++ b/docs/content/npm-yarn-vuecli-common-problems-and-solutions.md @@ -0,0 +1,59 @@ +--- +title: NPM、Yarn、Vue CLI 的常见问题以及解决方法 +date: 2025-03-15T23:00:14Z +lastmod: 2025-03-15T23:02:32Z +tags: [NPM,Yarn,Vue CLI] +--- + +# NPM、Yarn、Vue CLI 的常见问题以及解决方法 + +#### 设置国内镜像地址 + +- NPM + + ```plaintext + npm config set registry https://registry.npmmirror.com + ``` +- Yarn + + ```plaintext + yarn config set registry https://registry.npmmirror.com + ``` + +#### Electron 打包时卡在 Downloading electron- *** .zip + +由于网络问题,Electron 打包时可能会一直处于类似 `Downloading electron-v0.37.2-win32-x64.zip` 的状态,可以通过将 Electron 镜像设置为国内镜像地址解决: + +```plaintext +npm config set ELECTRON_MIRROR https://registry.npmmirror.com/-/binary/electron/ +``` + +#### Vue CLI,编译 Less / Sass / Scss 时提示 this.getOptions is not a function + +​`less-loader` 或 `sass-loader` 的版本过高,不兼容,需要降级。 + +对于 Less: + +1. 执行 `npm uninstall less-loader` 卸载已有版本。 +2. 执行 `npm install less-loader@5.0.0 -D` 安装低版本的 `less-loader`。 + +对于 Sass / Scss: + +1. 执行 `npm uninstall sass-loader` 卸载已有版本。 +2. 执行 `npm install sass-loader@8.0.2 -D` 安装低版本的 `sass-loader`。 + +#### 使用 vue init 命令创建 electron-vue 模板项目时一直处于 downloading template 状态 + +使用 `vue init simulatedgreg/electron-vue` 命令创建 electron-vue 模板项目时一直处于 `downloading template` 状态。 + +可能的原因:使用 `vue init` 创建项目时,默认从 GitHub 下载模板,而且还会把 `.vue-templates` 目录下已经下载过的 `simulatedgreg-electron-vue` 模板目录删除,隐藏在网络不好的情况下会一直 `downloading template`。 + +解决办法:下载 [SimulatedGREG/electron-vue](https://github.com/SimulatedGREG/electron-vue/) 到本地,解压放入 `C:\Users\用户名\.vue-templates`,文件夹名称为 `simulatedgreg-electron-vue`。 + +然后执行 `vue init simulatedgreg/electron-vue` 时增加一个参数 `--offline`,否则会重新下载: + +```plaintext +vue init simulatedgreg/electron-vue 项目名称 --offline +``` + +‍ diff --git a/docs/content/obs-fullscreen-capture-failed.md b/docs/content/obs-fullscreen-capture-failed.md new file mode 100644 index 0000000..7a2ca3b --- /dev/null +++ b/docs/content/obs-fullscreen-capture-failed.md @@ -0,0 +1,53 @@ +--- +title: 解决 OBS 显示器捕获黑屏的三个方法 +date: 2025-03-16T16:22:52Z +lastmod: 2025-03-16T16:23:19Z +tags: [Windows,软件,OBS,配置] +--- + +# 解决 OBS 显示器捕获黑屏的三个方法 + +使用双显卡时(例如 Intel 核显 + NVIDIA 独显的笔记本电脑),在 OBS 中添加“显示器捕获”,其中没有显示内容(空白)。 + +可能的原因:系统当前使用的显卡与 OBS 使用的显卡不一致 + +--- + +## 注意 + +- 本教程基于 Windows 10 系统。 +- 使用以下方法之前,请确认已正常安装显卡驱动,且 OBS 未在运行。 +- 建议先单独使用三个方法的其中一个方法(我使用的是方法三),若不成功再尝试组合使用。 + +## 方法一(兼容模式) + +- 找到 OBS 的可执行文件: + + - 32位:`OBS安装路径\bin\32bit\obs32.exe`​ + - 64位:`OBS安装路径\bin\64bit\obs64.exe`​ +- 右键点击 `可执行文件`,点击“属性” +- 根据图中的标出的内容修改设置,并点击“确定” + ​![方法一](assets/network-asset-01-20250316162312-8e508cs.png "方法一") +- 运行 OBS + +## 方法二(首选图形处理器) + +- 打开显卡控制面板(以 NVIDIA 控制面板为例) +- 切换到:3D 设置 - 管理 3D 设置 - 程序设置 +- 在“选择要自定义的程序”中找到“OBS”(若没有,点击右侧的“添加”按钮进行添加,文件路径可参考“方法一”) +- 在“为此程序选择首选图形处理器”中选择“集成图形”,并点击“应用” + ​![方法二](assets/network-asset-02-20250316162313-xsidsmg.png "方法二") +- 运行 OBS + +## 方法三(图形性能首选项) + +- 打开系统的“设置” +- 进入:系统 - 显示 - 图形设置 + ​![方法三](assets/network-asset-03_1-20250316162313-tichlxy.png "方法三") +- 点击“浏览”,添加 OBS 的可执行文件(文件路径可参考“方法一”) + ​![方法三](assets/network-asset-03_2-20250316162313-utdnbnw.png "方法三") +- 点击“选项”,选择“节能”,并点击“保存” + ​![方法三](assets/network-asset-03_3-20250316162313-jcjvisk.png "方法三") +- 运行 OBS + +‍ diff --git a/docs/content/plotsquared-minecraft-default-generator.md b/docs/content/plotsquared-minecraft-default-generator.md new file mode 100644 index 0000000..badb066 --- /dev/null +++ b/docs/content/plotsquared-minecraft-default-generator.md @@ -0,0 +1,83 @@ +--- +title: PlotSquared 创建 Minecraft 默认地形的地皮世界 +date: 2025-03-16T18:28:32Z +lastmod: 2025-03-16T18:30:18Z +tags: [插件,Minecraft,PlotSquared] +--- + +# PlotSquared 创建 Minecraft 默认地形的地皮世界 + +服务端平台:Sponge 1.12.2 7.1.6 + +PlotSquared 插件版本: v3.5.0-SNAPSHOT + +--- + +## 步骤 + +#### 1. 执行 `安装` 命令(查看命令提示) + +```text +/p setup +``` + +#### 2. 选择生成器(默认) + +```text +/p setup PlotSquared +``` + +#### 3. 选择世界类型(增强) + +```text +/p setup AUGMENTED +``` + +#### 4. 选择地形(全部) + +```text +/p setup ALL +``` + +#### 5. 根据需要配置地皮(大小、路宽等……) + +- 5.1 地皮高度 +- 5.2 地皮大小 +- 5.3 地皮内部的方块(由于选择了 `ALL` 地形,无效果) +- 5.4 地皮地面的方块(由于选择了 `ALL` 地形,无效果) +- 5.5 地皮围墙顶部的方块(由于选择了 `ALL` 地形,无效果) +- 5.6 地皮(已被领取)围墙顶部的方块(由于选择了 `ALL` 地形,无效果) +- 5.7 地皮路的宽度 +- 5.8 地皮路面的高度 +- 5.9 地皮路面的方块 +- 5.10 地皮围墙的方块 +- 5.11 地皮围墙的高度 +- 5.12 是否在世界最低层生成 `基岩`​ + +#### 6. 世界的名称(建议仅使用 `英文字母`、`数字`、`下划线`) + +## 提示 + +若在安装过程中输入了错误的参数,可通过 `/p setup cancel` 取消 `安装` 并重新开始。 + +正常安装结束后,在配置文件 `plotsquared/config/worlds.yml` 中会存在以下内容: + +``` +generator: + type: 1 + terrain: 3 + plugin: PlotSquared +``` + +正常安装结束后,在配置文件 `config/sponge/worlds/minecraft/overworld/世界名/world.conf` 中不会存在以下内容: + +``` +# World Generation Modifiers to apply to the world +world-generation-modifiers=[ + PlotSquared +] +``` + +安装结束后,在对应的世界中输入 `/p i`、`/p claim` 等命令,可能会提示 `不在地皮世界中`,此时需要重启服务端。 + +‍ diff --git a/docs/content/qqpet-html5.md b/docs/content/qqpet-html5.md new file mode 100644 index 0000000..447a365 --- /dev/null +++ b/docs/content/qqpet-html5.md @@ -0,0 +1,26 @@ +--- +title: QQ 宠物 HTML5 版 +date: 2025-03-16T22:20:29Z +lastmod: 2025-03-16T22:21:35Z +tags: [QQ,网站,链接] +--- + +# QQ 宠物 HTML5 版 + +只能看不能用…… + +--- + +注意: + +本页面仅支持横屏完整查看。 + +此处为 `iframe` 引用,点击前往 [原页面](http://ossweb-img.qq.com/images/MF/qqpet/index.html)。 + +--- + +
+ +
+ +‍ diff --git a/docs/content/query-domain-srv-records.md b/docs/content/query-domain-srv-records.md new file mode 100644 index 0000000..994895b --- /dev/null +++ b/docs/content/query-domain-srv-records.md @@ -0,0 +1,36 @@ +--- +title: 在 Linux Windows 查询域名的 SRV 记录 +date: 2025-03-16T16:03:27Z +lastmod: 2025-03-16T16:03:47Z +tags: [Windows,Linux,域名,命令] +--- + +# 在 Linux Windows 查询域名的 SRV 记录 + +## Linux(使用 dig 命令) + +例如查询域名 `mc.frost-zx.top` 的用于 Minecraft 服务器的 SRV 记录: + +```text +dig _minecraft._tcp.mc.frost-zx.top srv +``` + +## Windows(使用 NSLOOKUP 命令) + +例如查询域名 `mc.frost-zx.top` 的用于 Minecraft 服务器的 SRV 记录: + +方式一 + +```text +NSLOOKUP -type=SRV _minecraft._tcp.mc.frost-zx.top +``` + +方式二 + +```text +NSLOOKUP +set type=SRV +_minecraft._tcp.mc.frost-zx.top +``` + +‍ diff --git a/docs/content/recommend-usefulwebsites.md b/docs/content/recommend-usefulwebsites.md new file mode 100644 index 0000000..c344e0e --- /dev/null +++ b/docs/content/recommend-usefulwebsites.md @@ -0,0 +1,74 @@ +--- +title: 「推荐」实用网站 +date: 2025-03-19T11:40:35Z +lastmod: 2025-03-19T11:43:06Z +tags: [推荐,网站,合集] +--- + +# 「推荐」实用网站 + +- [HTML5测试](http://html5test.com) - 检测浏览器对 HTML5 的兼容情况 + +- [花瓣网](http://huaban.com) - 陪你做生活的设计师 + + 摄影爱好者,美图收藏者,设计师必备 + +- [豆瓣](http://www.douban.com/) - 发现更多生活 + + 豆瓣表面上看是一个评论(书评、影评、乐评)网站,但实际上它却提供了书目推荐和以共同兴趣交友等多种服务功能,它更像一个集 BLOG、交友、小组、收藏于一体的新型社区网络。 + 在豆瓣上,所有的内容、分类、筛选、排序都由用户产生和决定,甚至在豆瓣主页出现的内容上也取决于你的选择。 + +- [中国天气网](http://www.weather.com.cn/) - 天气早知道 + +- [SongTasty](http://www.songtasty.com) - 用音乐倾听彼此 + + 打开电脑,可能你的第一件事情是戴上耳机,打开音乐播放器。可是寻找你喜欢的音乐并不是件容易的事情,找到那些在音乐品味上与你志同道合的朋友或许更难。 + SongTasty 致力于建立公共分享的系统,记录并分析每个人的音乐爱好,自动寻找那些你可能喜欢的歌,计算任何两个用户之间的相似度。 + 每天你都会发现新的朋友,听着同样的音乐,甚至喝着同样的咖啡。 + +- [果壳网](http://www.guokr.com/) - 科技有意思 + + 果壳网并不是深奥科研的传播平台,不是冷冰冰的知识,而是对身边的生活进行有意思的科技解读和创造。 + 除了看电影听音乐玩手机,你也可以尝试在业余时间做一个长腿机器虫,认识更多的星星和路边植物,或者用科学知识去破解网络上的流言。 + +- [壹心理](http://www.xinli001.com/) - 世界和我爱着你 + + 壹心理网是一个纯粹的心理学网站,它拒绝枯燥、拒绝陈腐,将心理学通过有趣的、多媒体的方式分享给大家。 + 它通过心理游戏、心理测试、心理FM、问答、心理课程等方式帮助大家自我成长。 + +- [哔哩哔哩弹幕视频网](https://www.bilibili.com/) - 哔哩哔哩 (゜-゜)つ 干杯~ + + 哔哩哔哩弹幕视频网,简称 bilibili 或B站,是一家以 ACG(Animation、Comic、Game)为主题的弹幕视频娱乐站点。 + 该网站最大的特点就是悬浮于视频上方的弹幕。 + +- [BiliPlus - banner_fetch](https://www.biliplus.com/task/banner_fetch/) - bilibili 官网首页 banner 历史记录 + +- [BiliPlus - splash_fetch](https://www.biliplus.com/task/splash_fetch/) - bilibili 客户端 splash(启动图)历史记录 + +- [音悦Tai](http://www.yinyuetai.com/) - 让娱乐更美好 + + 每一个时代都需要好歌,在这样一个影像化的年代,我们更需要好的 MV。 + 音悦Tai正是着眼于为音乐爱好者提供最佳的视听盛宴,专注于高清视频体验。 + +- [下厨房](http://www.xiachufang.com/) - 唯有美食与爱不可辜负 + +- [煎蛋](http://jandan.net/) - 地球上没有新鲜事 + + “煎蛋”译介传播网络新鲜资讯,以翻译各个境外网站上出现的有趣的新闻以及传闻为主要内容。 + 主站以编辑从 Digg 等国外资讯网站上翻译的文章为主,动图、无聊图由网友从 9gag 等图片站搬运的图片构成。 + +- [堆糖](http://www.duitang.com/) - 美好生活研究所 + + 你可以用堆糖收集网络上你喜欢的图片和商品,保存你的设计灵感、计划你的旅行、准备你的换季购物清单等等…… + 另外,堆糖还有各种兴趣主题小组,可以轻易地找到日常生活中难以遇到的、跟自己兴趣相同的朋友。 + 而这一切只需要你动动鼠标,开始使用堆糖。 + +- [Office](https://www.office.com) + + Microsoft Office 官网,可下载办公文件的模板、剪贴画以及图片。 + +- [VirusTotal](http://virustotal.com/) + + 对文件或者邮件附件进行病毒扫描。 + +‍ diff --git a/docs/content/record-gamecomplete.md b/docs/content/record-gamecomplete.md new file mode 100644 index 0000000..ec9c93b --- /dev/null +++ b/docs/content/record-gamecomplete.md @@ -0,0 +1,58 @@ +--- +title: 「记录」游戏通关记录 +date: 2025-03-19T12:30:11Z +lastmod: 2025-03-19T12:32:33Z +tags: [游戏,记录] +--- + +# 「记录」游戏通关记录 + +## 2019 + +- **2019-11-17** + [传送门 2 Mod - Portal Stories: Mel](https://store.steampowered.com/app/317400/) + 故事模式;全通关。 + +--- + +## 2018 + +- **2018-11-24** + [LoveChoice 拣爱](https://store.steampowered.com/app/939400/) + 第一章;全成就。 +- **2018-10-26** + [TREE](https://store.steampowered.com/app/888090/) + 全通关;全成就。 + +--- + +## 2017 + +- **2017-12-16** + [Refunct](https://store.steampowered.com/app/406150/) + 全通关;(6 / 10)成就。 + +--- + +## 2015 + +- **2015-12-12** + 2048 + 得分:68540(4096) +- **2015-09-01** + [Blocky Roads 像素公路](http://www.wandoujia.com/apps-com.dogbytegames.blocky_roadserspao) + 全通关 +- **2015-07-12** + [Adventures of Poco Eco - Lost Sounds 波克埃克大冒险](http://www.wandoujia.com/apps-com.possiblegames.edge) + 全通关 +- **2015-04-25** + [纪念碑谷](http://www.wandoujia.com/apps-com.ustwo.monumentvalleyzz) + 全通关 +- **2015-04-23** + [1010!](http://www.wandoujia.com/apps-com.gramgames.tenten) + 得分:3163 +- **2015-04-18** + [Hook](http://www.wandoujia.com/apps-com.rt.hook) + 全通关 + +‍ diff --git a/docs/content/software-chrome-urls.md b/docs/content/software-chrome-urls.md new file mode 100644 index 0000000..00e8f05 --- /dev/null +++ b/docs/content/software-chrome-urls.md @@ -0,0 +1,170 @@ +--- +title: Chrome URLs 列表(List of Chrome URLs) +date: 2025-03-16T22:14:24Z +lastmod: 2025-03-16T22:17:01Z +tags: [软件,Chrome,Chromium,链接] +--- + +# Chrome URLs 列表(List of Chrome URLs) + +参考资料:[https://blog.csdn.net/LY_Dengle/article/details/78543770](https://blog.csdn.net/LY_Dengle/article/details/78543770) + +--- + +## 普通 URL + +- **chrome://about** + + 进入 `chrome://chrome-urls`​ +- **chrome://accessibility** +- **chrome://appcache-internals** + + 管理HTML5应用的离线存储 +- **chrome://apps/** + + 管理 Chrome 应用 +- **chrome://blob-internals** +- **chrome://bluetooth-internals** +- **chrome://bookmarks** + + 管理 Chrome 书签 +- **chrome://chrome-urls** + + 显示 Chrome URLs 列表 +- **chrome://components** + + 组件 +- **chrome://crashes** + + 开关上传崩溃报告 +- **chrome://credits** + + 查看第三方软件许可证 +- **chrome://devices/** + + 查看设备 +- **chrome://device-log** +- **chrome://dino** + + 小恐龙(断网时的小游戏彩蛋) +- **chrome://dns/** + + 查看 DNS 记录 +- **chrome://downloads/** + + 查看下载文件 +- **chrome://download-internals** +- **chrome://eoc-internals** +- **chrome://extensions/** + + 查看和管理扩展程序 +- **chrome://flags** + + 实验性功能 +- **chrome://flash/** + + 查看 Flash 插件的详细信息 +- **chrome://gcm-internals** + + 查看消息推送服务(GCM)的日志 +- **chrome://gpu** +- **chrome://histograms** +- **chrome://history** + + 历史记录 +- **chrome://indexeddb-internals** + + 查看 HTML5 的本地储存 +- **chrome://inspect/** + + 查看开发工具 +- **chrome://interventions-internals** +- **chrome://invalidations** +- **chrome://local-state** +- **chrome://media-engagement** +- **chrome://media-internals** + + 查看媒体内部数据 +- **chrome://memory-redirect/** + + 查看内存占用信息 +- **chrome://net-export** +- **chrome://net-internals** +- **chrome://network-error** +- **chrome://network-errors** +- **chrome://newtab** + + 新标签页 +- **chrome://ntp-tiles-internals** +- **chrome://offline-internals** +- **chrome://omnibox** + + 调试 `智能地址栏`​ +- **chrome://password-manager-internals** +- **chrome://plugins/** + + 启用/停用 插件 +- **chrome://policy** + + 策略 +- **chrome://predictors** + + 查看 `Chrome 输入预测` 的数据 +- **chrome://quota-internals** +- **chrome://safe-browsing** +- **chrome://sandbox** + + 查看 `沙盒` 信息 +- **chrome://serviceworker-internals** +- **chrome://settings/** + + 设置 +- **chrome://signin-internals** +- **chrome://site-engagement** +- **chrome://snippets-internals** +- **chrome://suggestions** +- **chrome://supervised-user-internals** +- **chrome://sync-internals** +- **chrome://taskscheduler-internals** +- **chrome://translate-internals** +- **chrome://usb-internals** +- **chrome://user-actions** +- **chrome://version** + + 关于和版本 +- **chrome://webapks** +- **chrome://webrtc-internals** +- **chrome://webrtc-logs** +- **chrome-devtools://devtools/bundled/devtools_app.html** + +--- + +## 调试 URL + +> The following pages are for debugging purposes only. Because they crash or hang the renderer, they're not linked directly; you can type them into the address bar if you need them. +> +> 以下的页面仅用于调试。你不能直接点击它们来使用,因为它们可能会使浏览器崩溃或使渲染器挂起;如果你要使用他们,你需要手动把它们输入浏览器的地址栏。 + +- **chrome://badcastcrash/** +- **chrome://inducebrowsercrashforrealz/** +- **chrome://crash/** +- **chrome://crashdump/** +- **chrome://kill/** +- **chrome://hang/** +- **chrome://shorthang/** +- **chrome://gpuclean/** +- **chrome://gpucrash/** +- **chrome://gpuhang/** +- **chrome://memory-exhaust/** +- **chrome://ppapiflashcrash/** +- **chrome://ppapiflashhang/** +- **chrome://gpu-java-crash/** +- **chrome://java-crash/** +- **chrome://quit/** + + 退出浏览器 +- **chrome://restart/** + + 重启浏览器 + +‍ diff --git a/docs/content/temporarily-set-java-path.md b/docs/content/temporarily-set-java-path.md new file mode 100644 index 0000000..0e89ae2 --- /dev/null +++ b/docs/content/temporarily-set-java-path.md @@ -0,0 +1,36 @@ +--- +title: 临时设置 Java 环境变量(PATH) +date: 2025-03-16T16:09:15Z +lastmod: 2025-03-16T16:10:28Z +tags: [Linux,Windows,命令,命令提示符,Java,终端] +--- + +# 临时设置 Java 环境变量(PATH) + +适用于 Linux 和 Windows 系统。对于 Linux 系统,可在终端或脚本文件中使用;对于 Windows 系统,可在命令提示符或批处理文件中使用。 + +--- + +## Linux + +例如设置为 JDK 16: + +```bash +export JAVA_HOME=/home/jdk/jdk_16 +export PATH=$JAVA_HOME/bin:$PATH +``` + +其中,`/home/jdk/jdk_16` 为使用的 JDK 的安装路径,需要根据实际情况进行修改。 + +## Windows + +例如设置为 JDK 16: + +```bat +SET JAVA_HOME=C:\Programs\System\Java\jdk_16.0.2 +SET PATH=%JAVA_HOME%\bin;%PATH% +``` + +其中,`C:\Programs\System\Java\jdk_16.0.2` 为使用的 JDK 的安装路径,请需要实际情况进行修改。 + +‍ diff --git a/docs/content/termux-jdk.md b/docs/content/termux-jdk.md new file mode 100644 index 0000000..5a31326 --- /dev/null +++ b/docs/content/termux-jdk.md @@ -0,0 +1,237 @@ +--- +title: 「教程」在 Termux 中安装任意版本的 JDK +date: 2025-03-16T15:43:12Z +lastmod: 2025-03-16T15:45:51Z +tags: [教程,Android,Java,JDK,Termux] +--- + +# 「教程」在 Termux 中安装任意版本的 JDK + +## 简介 + +- 主要通过在 Termux 中安装系统的方式实现,本教程以安装 Ubuntu 系统为例。 +- 本教程基于 MIUI 12(Android 11),并在 Mokee 100.0(Android 10)中测试通过。 +- 本教程中可能会存在描述不准确的地方,欢迎各位在评论区中指出。 +- 建议您在有一定的 Linux 命令行操作经验的情况下阅读本教程。 +- 建议在开始阅读前先大致浏览一遍本教程的内容,了解大概步骤。 + +## 准备 + +### 软件下载 + +- [Termux - 本体](https://f-droid.org/zh_Hans/packages/com.termux/) +- [AnLinux - 获取系统安装脚本](https://f-droid.org/zh_Hans/packages/exa.lnx.a/) +- [MT管理器 - 管理文件,可用其他类似软件代替](https://coolapk.com/apk/bin.mt.plus) + +### 相关链接 + +- [Adoptium(用于下载 JDK)](https://adoptium.net/) +- [离线安装系统用文件(密码:9hac)](https://frost-zx.lanzoul.com/b00p69g4b/) + +## 启动 Termux & 安装相关的软件包 + +1. 启动 Termux,等待初始化完成(仅在第一次启动时)。 +2. 执行 `pkg update` 命令,更新软件包信息。 + 可能会出现类似这样的提示,如果没有手动修改过提示中的文件, + 可以输入 `Y`,否则输入 `N`,然后点击 `ENTER`。 + ​![初始化](assets/network-asset-pkg_update-20250316154503-v6p17lv.jpg "初始化") +3. 执行 `pkg install openssl-tool proot vim wget -y` 命令,安装4个软件包。 + +## 安装系统 + +### 方式一、在线安装 + +> 此方式需要访问位于海外的服务器,因此对网络环境的要求较高。 +> 如果网络不稳定,建议参考离线安装方式进行操作。 + +1. 打开 AnLinux,选择需要安装的系统。 + ​![在线安装](assets/network-asset-A01_AnLinux_Panel-20250316154503-5qp14m5.jpg "在线安装") +2. 复制软件给出的安装命令。 + ​![在线安装](assets/network-asset-A02_AnLinux_Ubuntu-20250316154503-pqddget.jpg "在线安装") +3. 在 Termux 中执行 `cd ~` 命令,切换工作目录到 `home` 文件夹。 + 然后粘贴复制的命令,等待脚本自动完成安装操作。 + 如果网络状况不稳定,可能会出现安装失败或文件下载失败的情况。 + 一般来说,如果在输出的内容中已经出现 `Resolving...`、`Connecting...` 之类的提示,则表示命令前方部分的 `pkg install` 部分已执行成功,但在后方部分的 `wget` 下载安装脚本或 Rootfs 文件的过程中出现错误。 + ​![在线安装](assets/network-asset-A03_1_fail-20250316154503-31kfbli.jpg "在线安装") + ​![在线安装](assets/network-asset-A03_2_fail-20250316154503-jiwqkc3.jpg "在线安装") + 如果文件下载失败(输出的内容中有类似 `Connection timed out`、`Unable to establish connection`、`Unexpected EOF in archive` 的提示),则执行 `ls -a` 命令,查看是否存在 `start-ubuntu.sh`、`ubuntu.sh`、`ubuntu-rootfs.tar.gz`、`ubuntu-binds`、`ubuntu-fs` 这几个文件(文件夹)。如果存在则执行 `rm -rf <文件名>` 命令将其删除(也可以直接执行 `rm -rf *ubuntu*` 命令),才能再次执行复制的命令,否则可能会被误认为文件已经下载完成或出现其他问题。 + ​![在线安装](assets/network-asset-A03_3_fail-20250316154504-pfofs04.jpg "在线安装") +4. 如果文件下载完毕且安装成功,则会出现类似这样的提示: + ​![在线安装](assets/network-asset-A04_success-20250316154504-ae5ey2o.jpg "在线安装") + +### 方式二、离线安装 + +1. 打开 AnLinux,点击侧边栏中的“下载 Rootfs(离线用途)”。 + ​![离线安装](assets/network-asset-B01_AnLinux_Offline-20250316154504-45yc5x7.jpg "离线安装") +2. 点击界面中的“查看”按钮,跳转到下载页面。 + ​![离线安装](assets/network-asset-B02_AnLinux_GitHub_Rootfs-20250316154504-hhpgaap.jpg "离线安装") +3. 根据所需要安装的版本和 CPU 架构,进入对应的文件夹。 + + > 目前手机 CPU 的架构一般为 64 位 ARM。 + > 对于 Ubuntu 系统,路径为 `Anlinux-Resources/Rootfs/Ubuntu/arm64/`。 + > + + ![离线安装](assets/network-asset-B03_AnLinux_GitHub_Ubuntu-20250316154504-msh2i8i.jpg "离线安装") +4. 点击文件 `ubuntu-rootfs-arm64.tar.xz`,进入详情页面,然后点击“Download”按钮进行下载。 + + > 本教程中使用的文件的更新日期为 **2021-08-14**。 + > +5. 进入 `Anlinux-Resources/Scripts/Installer/` 文件夹,下载对应系统的安装脚本。 + + > Ubuntu 系统的安装脚本路径为 `Anlinux-Resources/Scripts/Installer/Ubuntu/ubuntu.sh`。 + > 本教程中使用的文件的更新日期为 **2020-01-15**。 + > + + ![离线安装](assets/network-asset-B04_AnLinux_GitHub_Script-20250316154504-g092bkz.jpg "离线安装") +6. 将下载好的安装脚本和 Rootfs 文件移动到任意位置放好(也可以不移动)。 + ​![离线安装](assets/network-asset-B05_move_files-20250316154505-w5dix74.png "离线安装") +7. 点击安装脚本(ubuntu.sh),选择“编辑”,查看 Rootfs 的文件名。 + ​![离线安装](assets/network-asset-B06_1_edit_script-20250316154505-losgqch.png "离线安装") + ​![离线安装](assets/network-asset-B06_2_edit_script-20250316154505-mrxg556.png "离线安装") +8. 重命名 Rootfs 文件名,与脚本中的一致。 + ​![离线安装](assets/network-asset-B07_rename_rootfs-20250316154505-67z62qt.png "离线安装") +9. 执行 `cp <源路径> <目标路径>` 命令,复制 Rootfs 文件和安装脚本到 Termux 中。 + + > 注: + > 执行 `cp` 命令前可以先执行 `cd` 命令切换工作目录; + > 建议执行 `cd ~` 命令,回到 `home` 目录,方便后续操作。 + > 命令中的 `.` 表示执行命令时的工作目录。 + > + + ![离线安装](assets/network-asset-B09_copy_files-20250316154505-ewfiral.png "离线安装") +10. 执行 `bash <安装脚本文件名>` 命令,调用脚本,安装系统。 + ​![离线安装](assets/network-asset-B10_run_script-20250316154505-6sp5xib.jpg "离线安装") + +## 进入 Ubuntu 系统 + +1. 如果需要挂载手机的内部储存到 Ubuntu 中,可以按以下步骤修改 Ubuntu 的启动脚本。 + + > **建议修改,方便传输文件。** + > + + 执行 `vim ~/start-ubuntu.sh` 命令,打开编辑器: + ​![离线安装](assets/network-asset-B11_1_modify_script-20250316154506-vr52sud.jpg "离线安装") + 点击 `i` 键,进入插入模式,然后将第 20 行前的 `#` 删除(取消注释): + ​![离线安装](assets/network-asset-B11_2_modify_script-20250316154506-hzyxqre.jpg "离线安装") + 点击 `ESC`,输入 `:wq`,点击 `ENTER`,保存并关闭文件: + ​![离线安装](assets/network-asset-B11_3_modify_script-20250316154506-jhkwc9m.jpg "离线安装") +2. 然后就可以执行 `bash ~/start-ubuntu.sh` 命令,进入安装的 Ubuntu 系统了。 + + > 注: + > 如果当前的工作目录为 `home`,可以执行 `./start-ubuntu.sh`。 + > 下一次打开 Termux 时也是通过执行此命令进入 Ubuntu 系统。 + > + + ![离线安装](assets/network-asset-B12_start_ubuntu-20250316154506-gnltn4h.jpg "离线安装") +3. 进入系统后,执行一次 `apt update` 命令,更新软件包信息。 + + > 如果有需要,可以继续执行 `apt upgrade\` 命令更新软件包。 + > +4. 执行 `apt install vim` 命令,安装 Vim。 + +## 安装 JDK + +### 方式一、安装 Ubuntu 软件源中的 JDK + +1. 执行 `apt search openjdk` 命令,查看可安装的 JDK 版本。 +2. 如果需要安装 OpenJDK 8,则执行 `apt install openjdk-8-jdk-headless`。 + + > 因为不使用图形化界面,所以安装 headless 版本即可。 + > +3. 安装完成后,执行 `java -version` 命令进行验证。 + +### 方式二、从 Adoptium 网站下载 JDK + +#### 下载文件 + +1. 访问 Adoptium 网站。 +2. 点击“Other platforms”,然后选择所需要的版本。 + ​![方式二](assets/network-asset-B01_Adoptium_Other-20250316154506-635xr67.jpg "方式二") + ​![方式二](assets/network-asset-B02_Adoptium_Version-20250316154507-a71ovzm.jpg "方式二") +3. 选择操作系统和 CPU 架构 + + > 操作系统:Linux + > CPU 架构:32位 - arm32 / 64位 - aarch64 + > + + ![方式二](assets/network-asset-B03_Adoptium_OS-20250316154507-us44v02.jpg "方式二") +4. 点击列表项右侧的图标进行下载。 + + > 部分可以选择下载 JDK 或 JRE 版本,如果只是需要 Java 运行环境(例如开 Minecraft 服务器),可以下载 JRE 版本。 + > + + ![方式二](assets/network-asset-B04_Adoptium_Download-20250316154507-midlp40.jpg "方式二") + +#### 安装 & 设置环境变量 + +> 注:如无特殊说明,以下在 Termux 中进行的操作均在安装的 Ubuntu 中进行。 + +1. 将下载好的 JDK 文件移动到任意位置放好(也可以不移动)。 + ​![方式二](assets/network-asset-B05_move_file-20250316154507-umldi6l.png "方式二") +2. 在 Termux 中执行 `cd` 命令切换工作目录(例如 `cd ~`); + 然后执行 `mkdir <文件夹名称>` 命令创建用于放置 JDK 的文件夹; + 然后执行 `cd <文件夹名称>` 命令切换工作目录到创建的文件夹。 +3. 执行 `cp <源路径> <目标路径>` 命令,把下载的 JDK 文件复制到 Ubuntu 中。 + + > 例如 `cp /sdcard/Files/OpenJDK_16.tar.gz .` + > 注:`/sdcard` 为手机的内部储存挂载路径,需要修改 Ubuntu 启动脚本才能使用。 + > + + ![方式二](assets/network-asset-B06_copy_file-20250316154507-3i571xi.png "方式二") +4. 执行 `tar -xzf <文件名>` 命令,解压文件。 + ​![方式二](assets/network-asset-B07_extract_file-20250316154507-xowa0v8.png "方式二") +5. 执行 `mv <文件夹名称> <目标名称>` 命令,重命名 JDK 文件夹。 + + > 主要是方便使用,不一定需要重命名。 + > + + ![方式二](assets/network-asset-B08_rename_folder-20250316154508-nck7bmp.jpg "方式二") +6. 执行 `cd <文件夹名称>/bin/` 命令,将工作目录切换到 JDK 的 `bin` 文件夹。 + 然后执行 `ls -al` 命令,查看其中的文件是否有可执行权限(左侧的权限属性有三个 `x`)。 + 一般情况下,该权限在 JDK 文件打包前已经被设置,解压时会自动识别。 + 如果没有,可以在当前文件夹执行一次 `chmod +x *` 命令。 + ​![方式二](assets/network-asset-B09_check_permission-20250316154508-5znmk6q.png "方式二") +7. 执行 `./java -version` 命令,测试是否能出现对应的版本号。 + ​![方式二](assets/network-asset-B10_test_command-20250316154508-luxyd8x.jpg "方式二") +8. 执行 `vim ~/.bash_profile` 命令(也可以先 `cd ~` 再 `vim .bash_profile`), + 打开“home”目录下的 `.bash_profile` 文件,设置环境变量。 + 默认情况下,应该没有这个文件,将会在保存后自动创建。 + + ```bash + export JAVA_HOME=~/jdk/jdk_16.0.2 + export PATH=$PATH:$JAVA_HOME/bin + ``` + + ![方式二](assets/network-asset-B11_1_set_variables-20250316154508-15g0q87.jpg "方式二") + ​![方式二](assets/network-asset-B11_2_set_variables-20250316154508-h1fh5sm.jpg "方式二") +9. 保存后,执行 `exit` 命令退出 Ubuntu 系统, + 然后再执行 `bash ~/start-ubuntu.sh` 命令,重新进入 Ubuntu 系统。 + ​![方式二](assets/network-asset-B12_restart_ubuntu-20250316154508-2czuiy6.jpg "方式二") +10. 此时执行 `java -version` 命令,有显示对应的版本号则安装成功,否则检查环境变量是否设置正确。 + ​![方式二](assets/network-asset-B13_jdk_version-20250316154509-szxns7p.jpg "方式二") + +## 注意事项 + +- 因为该 JDK 是在 Ubuntu 中安装的,所以需要进入 Ubuntu 后才能使用。 +- 建议在关闭 Termux 前先执行 `exit` 命令退出系统。 + +## 补充内容 + +### Termux + +- 在系统的通知栏中点击 Termux 通知的“Acquire wakelock”(使用完毕后点击“Release wakelock”),并在“最近任务”中锁定 Termux,可防止 Termux 被系统关闭。 + ​![补充内容](assets/network-asset-wakelock-20250316154509-alafbmi.jpg "补充内容") +- 安装“Termux:Styling”(可在 F-Droid 上下载)后可以调整 Termux 的样式。 + +### Ubuntu + +- 如果需要同时使用多个会话,可以安装 `screen` 软件包(`apt install screen`)。 + +### Vim 操作提示 + +- 打开编辑器时,默认是“正常模式”,点击键盘上的“i”可进入“插入模式”(此时左下角会显示“INSERT”),然后就可以编辑内容。进入“插入模式”后,点击“ESC”可回到“正常模式”。 +- 点击“上”“下”“左”“右”箭头可以移动光标。 +- 在“正常模式”下,点击键盘上的“u”可以进行撤销操作。 +- 在“正常模式”下,输入“:wq”,按下“回车”键,保存并关闭文件(输入“:w”,仅保存;输入“q”,仅退出;输入“:q!”,不保存并关闭)。 + +‍ diff --git a/docs/content/test.md b/docs/content/test.md new file mode 100644 index 0000000..339c9d6 --- /dev/null +++ b/docs/content/test.md @@ -0,0 +1,149 @@ +--- +title: 内容格式测试 +date: 2025-03-16T22:27:03Z +lastmod: 2025-10-07T18:32:34Z +tags: [测试,格式,Markdown] +--- + +# 内容格式测试 + +## 目录 + +​`[TOC]`​ + +## 字体样式 + +
+字体:宋体 +
+字体:黑体 +
+字体:华文彩云 +
+颜色:#0099FF 大小:2 字体:微软雅黑 +
+颜色:#66CCFF 大小:5 +
+颜色:Gray 大小:5 +
+ +## 待办事项 + +- [X] 已完成 +- [ ] 未完成 + +## 标题 + +```markdown +# 一级标题 +## 二级标题 +### 三级标题 +#### 四级标题 +##### 五级标题 +###### 六级标题 +``` + +## 引用 + +> 一级引用 +> +>> 二级引用 +>> +>>> 三级引用 +>>> +>> + +## 列表 + +- 一级列表 + + - 二级列表 + + - 三级列表 + +1. 有序列表 + + 1. 有序子列表 + 2. 有序子列表 + + - 无序子列表 + - 无序子列表 + +- 无序列表 + + 1. 有序子列表 + 2. 有序子列表 + + - 无序子列表 + - 无序子列表 + +## 代码 + +```java +System.out.println("MarkDown"); +``` + +```html +Frost-ZX +Minecraft +``` + +## 格式 + +- ​`重点文字`​ +- ~~删除线~~ +- 下划线 +- ==高亮== +- ***粗斜体*** +- **粗体** +- *斜体* + +## 图片 + +![Favicon](/favicon.ico)​ + +## 表格 + +简单的表格 + +|First Header|Second Header|Third Header| +| --------------| ---------------| --------------| +|Content Cell|Content Cell|Content Cell| +|Content Cell|Content Cell|Content Cell| + +出于美观的考虑,可以把两端都包围起来 + +|First Header|Second Header|Third Header| +| --------------| ---------------| --------------| +|Content Cell|Content Cell|Content Cell| +|Content Cell|Content Cell|Content Cell| + +通过在标题分隔行添加冒号 `:`,定义表格单元的对齐格式:居左、居中、居右 + +|First Header|Second Header|Third Header| +| :-------------| :-------------: | -------------: | +|Left|Center|Right| +|Left|Center|Right| + +表格使用示例 + +|姓名|年龄|描述| +| :----: | :-----: | :-----| +|张三|10 岁|**加粗 Bold**| +|李四|20 岁|[链接 Link](/)| + +## 其他 + +### 位置 + +
+

居左

+

居中

+

居右

+
+ +### 手动换行 + +HTML 标签 `
`​ + +‍ diff --git a/docs/content/text-english-sentences.md b/docs/content/text-english-sentences.md new file mode 100644 index 0000000..d4883e3 --- /dev/null +++ b/docs/content/text-english-sentences.md @@ -0,0 +1,162 @@ +--- +title: 英语句子 +date: 2025-03-16T19:54:20Z +lastmod: 2025-03-16T19:58:30Z +tags: [文字,英语,句子] +--- + +# 英语句子 + +本文内容收集自网络。 + +--- + +## A + +- **A dog starving at his master's gate predicts the ruin of the state.** + 树死先从叶子黄。 +- **Action speak louder than words.** + 行动胜于言语! + +## B + +- **Believe in yourself.** + 相信你自己! + +## D + +- **Do one thing at a time, and do well.** + 一次只做一件事,做到最好! +- **Don't aim for success if you want it; just do what you love and believe in, and it will come naturally.** + 如果你想要成功,不要去追求成功;尽管做你自己热爱的事情并且相信它,成功自然到来。 +- **Don't look forward to the day you stop suffering, because when it comes you know you'll be dead.** + 生于忧患,死于安乐。 + +## E + +- **Everyone has some tricks they can do, but each has his own way of doing them.** + 八仙过海,各显神通。 + +## G + +- **Gather you rosebuds while you may, old time is still a flying, and this same flower that smiles today, tomorrow will be dying.** + 有花堪折直须折,莫待无花空折枝。(未雨绸缪) + +## I + +- **I can because I think I can.** + 我行,因为我相信我行! +- **I would rather have a mind opened by wonder than one closed by custom.** + 宁愿创新,不愿陈腐。 +- **It is hard to please all.** + 众口难调。 + +## J + +- **Jack of all trades and master of none.** + 门门精通,样样稀松。 +- **Judge not from appearances.** + 人不可貌相,海不可斗量。 +- **Justice has long arms.** + 天网恢恢,疏而不漏。 + +## K + +- **Keep good men company and you shall be of the number.** + 近朱者赤,近墨者黑。 +- **Keep on going never give up.** + 勇往直前, 决不放弃! +- **Kill two birds with one stone.** + 一箭双雕。 +- **Kings go mad, and the people suffer for it.** + 君王发狂,百姓遭殃。 +- **Kings have long arms.** + 普天之下,莫非王土。 +- **Knowlegde can change your fate.** + 知识改变命运。 +- **Knowledge is power.** + 知识就是力量。 +- **Knowledge makes humble, ignorance makes proud.** + 博学使人谦逊,无知使人骄傲。 + +## L + +- **Learn and live.** + 活着,为了学习。 +- **Learn not and know not.** + 不学无术。 +- **Learn to walk before you run.** + 先学走,再学跑。 +- **Learning makes a good man better and ill man worse.** + 好人越学越好,坏人越学越坏。 +- **Let bygones be bygones.** + 过去的就让它过去吧。 +- **Let sleeping dogs lie.** + 别惹麻烦。 +- **Let the cat out of the bag.** + 泄漏天机。(走漏风声) +- **Lies can never changes fact.** + 谎言终究是谎言。 +- **Lies have short legs.** + 谎言站不长。 +- **Life is half spent before we know what it is.** + 人过半生,方知天命。 +- **Life is just like the sea, only the one with strong will can come over it. — Karl Heinrich Marx** + 生活就像海洋,只有意志坚强的人才能到达彼岸。 — 卡尔·马克思 +- **Life is not all roses.** + 人生并不是康庄大道。 +- **Life without a friend is death.** + 没有朋友,虽生犹死。 +- **Like a rat in a hole.** + 瓮中之鳖。 +- **Like author, like book.** + 文如其人。 +- **Like father, like son.** + 有其父必有其子。 +- **Like for like.** + 一报还一报。 +- **Like knows like.** + 惺惺相惜。 +- **Like mother, like daughter.** + 有其母必有其女。 +- **Like teacher, like pupil.** + 什么样的老师教什么样的学生。 +- **Like tree, like fruit.** + 羊毛出在羊身上。 + +## N + +- **Never forget to say "thanks".** + 永远不要忘了说“谢谢”! +- **Never put off what you can do today until tomorrow.** + 今日事今日毕! +- **Never say die.** + 永不气馁! + +## O + +- **Other people's harvests are always the best harvests, but one's own children are always the best children.** + 别人的成就(收获)怎么看都比自己的好,而自己的孩子怎么看都比别人的孩子好。 + +## T + +- **The best preparation for tomorrow is doing your best today.** + 对明天做好的准备就是今天做到最好! +- **There is no feast on earth that does not end in parting.** + 天下无不散之宴席。 +- **Those who can lose shall gain; those who wish for gain shall lose.** + 有意栽花花不开,无心插柳柳成荫。(阴差阳错) + +## W + +- **Water off a duck's back.** + 水过鸭背。(毫无作用) +- **Whatever is worth doing is worth doing well.** + 任何值得做的事就值得把它做好! + +## Y + +- **You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.** + 你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。 + +‍ diff --git a/docs/content/translation-universe-guard-2.md b/docs/content/translation-universe-guard-2.md new file mode 100644 index 0000000..1ed7ecf --- /dev/null +++ b/docs/content/translation-universe-guard-2.md @@ -0,0 +1,237 @@ +--- +title: 「Minecraft」UniverseGuard 2 插件部分提示文本汉化 +date: 2025-03-16T19:06:28Z +lastmod: 2025-03-16T19:07:34Z +tags: [Minecraft,翻译,插件] +--- + +# 「Minecraft」UniverseGuard 2 插件部分提示文本汉化 + +服务端平台:Sponge API 7.1.5 + +插件版本:2.17 + +--- + +## 使用方法 + +使用文本编辑工具(例如 Visual Studio Code),复制相应字段到本插件的配置文件(universeguard.conf)中替换相应的字段。 + +## 汉化文本 + +> 开始位置:第 107 行 + +```plaintext +texts { + "added_to_region"="您已被加入领地" + commands=命令 + "configuration_converting_old_regions"="发现旧领地! 正在转换..." + "configuration_loading_exception"="加载配置文件时出现异常. 详情查看日志" + "configuration_old_regions_converted"="已转换旧领地! 请删除旧领地文件夹, 否则它们将在每次服务器启动时被转换!" + "configuration_regions_updated"="领地信息已更新!" + "configuration_save_exception"="保存默认配置文件时出现异常. 详情查看日志" + "configuration_updating_regions"="正在更新领地信息..." + "dimension_not_found"="世界不存在" + editing=正在编辑领地 + "editing_global"="警告! 您正在编辑全局领地. 编辑它将会影响整个世界的保护!" + effects=效果 + "explosions_damage"="爆炸伤害" + "explosions_destroy"="爆炸破坏" + "farewell_message"="告别信息" + "first_point_set"="设置第一个点为:" + "flag_help"="Flags 帮助" + "flag_hidden"="无法查看此 Flag" + flags=Flags + from=从 + "greeting_message"="欢迎信息" + help=帮助 + interacts=交互 + loaded="已加载!" + "loaded_configuration"="已加载配置文件!" + loading="加载中..." + "loading_configuration"="正在加载配置文件" + members=成员 + "message_empty"="信息不能为空!" + "mobs_damage"="Mobs 伤害" + "mobs_drop"="Mobs 掉落" + "mobs_interact"="Mobs 交互" + "mobs_pve"="Mobs PvE" + "mobs_spawn"="Mobs 生成" + "no_pending_region"="没有编辑中的领地!" + "no_permission_command"="您没有权限执行此命令!" + "no_permission_item"="您没有权限使用此物品!" + "no_permission_region"="您没有权限这么做!" + "no_region_at"="指定区域无领地!" + "no_region_here"="这里没有领地!" + "no_regions_selled"="没有可以购买的领地!" + "pending_region"="已将玩家添加至领地!" + "pending_region_updated"="Pending region updated!" + "player_added_to_region"="已将玩家添加至领地" + "player_in_region"="此玩家已经是此领地的成员了" + "player_max_regions"="你不能再加入新的领地" + "player_no_region"="此玩家不在领地中" + "player_removed_from_region"="已将玩家从领地中移除" + "players_max_regions"="此玩家不能再加入新的领地!" + priority=优先级 + "purchasable_regions_disabled"="无法出售领地! 在配置文件中启用 PURCHASABLE_REGIONS 以开启出售领地功能" + region=领地 + "region_add_member_exception"="把玩家加入到领地时遇到异常. 详情查看日志" + "region_buyed"="已购买领地!" + "region_command_disabled"="命令已被禁用" + "region_command_enabled"="命令已被启用" + "region_command_not_found"="命令不存在!" + "region_copied"="已复制领地!" + "region_dimension_exists"="已有此世界的全局领地!" + "region_direction_not_valid"="错误的方向" + "region_expanded"="领地已扩大!" + "region_farewell_message_updated"="领地告别信息已更改!" + "region_flag_help_cactus_damage"="Sets if player will receive damage from cactus in the region" + "region_flag_help_can_spawn"="Sets if players can use the /rg spawn command while in the region" + "region_flag_help_can_tp"="Sets if players can use the /rg tp command while in the region" + "region_flag_help_chests"="Sets if non-members are allowed to open chests in the region" + "region_flag_help_destroy"="Sets if non-members can break blocks in the region" + "region_flag_help_drown"="Sets if players can drown in the region" + "region_flag_help_ender_chests"="Sets if non-members can open enderchests in the region" + "region_flag_help_ender_dragon_block_damage"="Sets if Ender Dragon can break blocks in the region" + "region_flag_help_enderman_grief"="Sets if enderman can place/break blocks in the region" + "region_flag_help_enderpearl"="Sets if non-members are allowed to use enderpearls in the region" + "region_flag_help_enter"="Sets if players can get inside this region" + "region_flag_help_exit"="Sets if players can go outside of this region" + "region_flag_help_exp_drop"="Sets if mobs can drop experience in the region" + "region_flag_help_explosion_damage"="Allow/disallow explosion damage to entities in the region" + "region_flag_help_explosion_destroy"="Allow/disallow explosion damage to blocks in the region" + "region_flag_help_fall_damage"="Sets if players can take fall damage in the region" + "region_flag_help_fire_damage"="Sets if player will receive damage from fire in the region" + "region_flag_help_fire_spread"="Sets if fire will spread in the region" + "region_flag_help_fishing_pole"="Sets if non-members can use fishing poles in the region" + "region_flag_help_frost_walker"="Allow/disallow the placing of Frosted Ice by Frost Walker boots in the region" + "region_flag_help_hide_flags"="Sets if region flags will not be displayed using the /rg info or the /rg flaginfo command" + "region_flag_help_hide_locations"="Sets if region locations will not be displayed using the /rg info command" + "region_flag_help_hide_members"="Sets if region members will not be displayed using the /rg info command" + "region_flag_help_hide_region"="Sets if region will be displayed using the /rg here command" + "region_flag_help_hunger"="Sets if players will loose hunger points while in the region" + "region_flag_help_ice_melt"="Sets if ice will melt in this region" + "region_flag_help_interact"="Allow/disallow block interaction in the region" + "region_flag_help_invincible"="Sets if players are invincible in the region" + "region_flag_help_item_drop"="Sets if players are allowed to drop items in the region" + "region_flag_help_item_pickup"="Sets if players are allowed to pickup items in the region" + "region_flag_help_lava_flow"="Sets if lava can flow in the region" + "region_flag_help_leaf_decay"="Sets if leaves will decay in the region" + "region_flag_help_lighter"="Sets if non-members are allowed to use lighter in the region" + "region_flag_help_mob_damage"="Allow/disallow mob damage to player in the region" + "region_flag_help_mob_interact"="Allow/disallow mob interaction in the region" + "region_flag_help_mob_pve"="Allow/disallow players damage to mob in the region" + "region_flag_help_mob_spawn"="Allow/disallow mob spawn in the region" + "region_flag_help_other_liquids_flow"="Sets if liquids that are not water or lava can flow in the region" + "region_flag_help_pistons"="Sets if non-members are allowed to use pistons in the region" + "region_flag_help_place"="Sets if non-members can place blocks in the region" + "region_flag_help_potion_splash"="Sets if non-members are allowed to thrown potions in the region" + "region_flag_help_pvp"="Sets if players can pvp in the region" + "region_flag_help_send_chat"="Sets if players can send chat messages while in the region" + "region_flag_help_shulker_boxes"="Sets if non-members are allowed to open shulker boxes in the region" + "region_flag_help_sleep"="Sets if non-members are allowed to sleep in the region" + "region_flag_help_trample"="Sets if trampling on fields will break them in this region" + "region_flag_help_trapped_chests"="Sets if non-members are allowed to open trapped chests in the region" + "region_flag_help_vehicle_destroy"="Allow/disallow destroying vehicles in the region" + "region_flag_help_vehicle_place"="Allow/disallow placing vehicles in the region" + "region_flag_help_vines_growth"="Sets if vines can grow in this region" + "region_flag_help_wall_damage"="Sets if players can take suffocate in walls in the region" + "region_flag_help_water_flow"="Sets if water can flow in the region" + "region_flag_not_valid"="领地 Flag 不存在!" + "region_flag_updated"="领地 Flag 已更改!" + "region_gamemode_not_valid"="请指定有效的游戏模式" + "region_gamemode_updated"="已更改领地游戏模式!" + "region_greeting_message_updated"="领地欢迎信息已更改!" + "region_help_add"="Add a player to the current editing region or the specified one with the specified role" + "region_help_buy"="Buy a Region" + "region_help_command"="Allow or disallow a command (and all it's sub-commands) in the current editing region" + "region_help_delete"="Delete the specified region" + "region_help_edit"="Allows to edit the specified region" + "region_help_effect_add"="Add a potion effect to a Region" + "region_help_effect_remove"="Remove a potion effect from a Region" + "region_help_exclude_block"="Exclude a block from being handled by the place or destroy flags" + "region_help_expand"="Expand the selected area for creating a region in the selected direction until the world limit or by the number of specified blocks" + "region_help_farewell"="Set the farewell message of a Region" + "region_help_flag"="Set the flag value of the current editing region" + "region_help_gamemode"="Set the gamemode of the current editing region" + "region_help_global_for"="Create a global region for a dimension" + "region_help_greeting"="Set the greeting message of a Region" + "region_help_help"="Shows this help or the flags help" + "region_help_here"="Tells wich region you are currently in" + "region_help_include_block"="Include a block from being handled by the place or destroy flags" + "region_help_info"="Display the details of the specified region" + "region_help_itemuse"="Sets if you can or can't use an item inside a Region" + "region_help_list"="Show the list of all regions" + "region_help_name"="Set the name of the current editing region" + "region_help_priority"="Set the priority of the current editing region" + "region_help_reload"="Reload cached regions" + "region_help_remove"="Remove a player from the current editing region or the specified one" + "region_help_remove_value"="Remove the value from a Region" + "region_help_removefarewell"="Remove the farewell message of a Region" + "region_help_removegreeting"="Remove the greeting message of a Region" + "region_help_rg"="Get the region selector item" + "region_help_save"="Save the current editing region" + "region_help_sell"="Sells a Region" + "region_help_set_spawn"="Set the spawn location of the current editing region" + "region_help_set_teleport"="Set the teleport location of the current editing region" + "region_help_set_value"="Set the value of a Region" + "region_help_spawn"="Teleports the player to the specified region spawn location" + "region_help_teleport"="Teleports the player to the specified region teleport location" + "region_help_template"="Sets or remove a pending Region from being a Template" + "region_info"="正在显示领地信息" + "region_item_disabled"="物品已禁用" + "region_item_enabled"="物品已启用" + "region_list"="领地列表" + "region_load_exception"="加载领地时发生异常. 详情查看日志" + "region_local_only"="此命令仅在非全局领地使用!" + "region_max_size"="领地太大了!" + "region_mob_not_found"="Mob 不存在!" + "region_name_not_valid"="领地名称重复!" + "region_name_updated"="已重命名领地!" + "region_no_point"="请先选择领地点!" + "region_no_spawn"="您无法传送到此领地的重生点!" + "region_no_tp"="无法传送到此领地!" + "region_not_copied"="领地未被复制! 详情查看日志" + "region_not_found"="领地不存在!" + "region_not_removed"="移除领地是发生异常. 详情查看日志" + "region_not_saved"="领地未被保存! 详情查看日志" + "region_priority_updated"="已更改领地优先级!" + "region_reader_close_exception"="停止读取领地文件时发生异常. 详情查看日志" + "region_reload"="已重新加载领地!" + "region_remove_member_exception"="从领地移除玩家时遇到异常. 详情查看日志" + "region_removed"="已移除领地!" + "region_save_exception"="保存领地时遇到异常. 详情查看日志" + "region_save_index_exception"="保存领地索引时发生异常. 详情查看日志" + "region_saved"="已保存领地!" + "region_select_points"="请先选择两个点!" + "region_selector_added"="已将领地区域选择工具添加到您的背包!" + "region_selled"="领地已被出售!" + "region_selled_remove"="领地已被取消出售!" + "region_spawn_location_updated"="领地重生点已更改!" + "region_teleport_location_updated"="领地传送点已更改!" + "region_value"="值" + "region_writer_close_exception"="停止写入领地文件时发生异常. 详情查看日志" + "region_writer_index_close_exception"="停止写入领地索引文件时发生异常. 详情查看日志" + "removed_from_region"="您已被从领地中移除" + "role_not_found"="错误的角色" + "second_point_set"="第二个点设置为:" + spawn=重生点 + teleport=传送点 + "text_cant_buy"="您无法购买此领地!" + "text_effect_added"="效果已被添加到领地!" + "text_effect_removed"="效果已从领地中移除!" + "text_invalid_buy"="您没有足够的材料来购买此领地!" + "text_purchase_material_not_found"="找不到购买所需的材料!" + "text_wrong_effect_level"="错误的效果等级. 必须要大于或等于0!" + "text_wrong_max_region_size"="错误的领地最大大小数值. 将会使用: " + "text_wrong_max_regions"="错误的领地最大数量数值. 将会使用: " + "text_wrong_purchase_cost"="错误的购买价格. 必须要大于0!" + "text_wrong_selector_item"="错误的领地区域选择工具ID. 将会使用: " + to=到 + type=类型 + "vehicles_destroy"="破坏交通工具" + "vehicles_place"="放置交通工具" +} +``` + +‍ diff --git a/docs/content/tutorial-custom-block-in-minecart.md b/docs/content/tutorial-custom-block-in-minecart.md new file mode 100644 index 0000000..34dbeda --- /dev/null +++ b/docs/content/tutorial-custom-block-in-minecart.md @@ -0,0 +1,30 @@ +--- +title: 「Minecraft」矿车内显示自定义方块 +date: 2025-03-16T19:32:19Z +lastmod: 2025-03-16T19:38:03Z +tags: [Minecraft,教程,命令,命令方块] +--- + +# 「Minecraft」矿车内显示自定义方块 + +参考资料:[Minecraft Wiki](https://zh.minecraft.wiki/%E5%91%BD%E4%BB%A4) + +已测试可用的游戏版本:Minecraft Java 正式版 1.10.X、1.11.X、1.12.X + +--- + +## 用到的命令 + +```text +/summon Minecart ~ ~ ~ {CustomDisplayTile:1,DisplayTile:"`方块 ID`",DisplayData:`方块数据值`,DisplayOffset:`方块垂直位移`} +``` + +```text +/entitydata @e[r=`半径`,type=Minecart] {CustomDisplayTile:1,DisplayTile:"`方块 ID`",DisplayData:`方块数据值`,DisplayOffset:`方块垂直位移`} +``` + +--- + +[阅读全文](https://www.bilibili.com/read/cv1718197) + +‍ diff --git a/docs/content/tutorial-minecraft-server-on-android.md b/docs/content/tutorial-minecraft-server-on-android.md new file mode 100644 index 0000000..27bf434 --- /dev/null +++ b/docs/content/tutorial-minecraft-server-on-android.md @@ -0,0 +1,37 @@ +--- +title: 「教程」在 Android 手机上开 Minecraft 服务器 +date: 2025-03-16T19:03:33Z +lastmod: 2025-03-16T19:05:46Z +tags: [Minecraft,教程,服务器,Android] +--- + +# 「教程」在 Android 手机上开 Minecraft 服务器 + +主要通过 Android 上的一款多功能终端软件 NeoTerm 安装 JDK 实现此操作。 + +--- + +## 效果演示 + +- [在手机上开 Minecraft 服务器是什么感觉?](https://www.bilibili.com/video/av47523062) + +## 前言 + +此操作对手机的性能有要求:建议 CPU 为高通骁龙 820 或更高 + +已测试可运行的服务端:Minecraft Java Edition 正式版 1.12.2 官方、Nukkit API 1.0.8 + +(其他未测试,理论上可运行大部分 Java 平台的服务端) + +本教程基于: + +- 系统:Nubia UI V5.0(Android 7.1.1,未获取 ROOT 权限) +- CPU:高通骁龙 820 +- 软件:NeoTerm 2.0.3-cc862be + **本教程适合有一定的开服经验者阅读** + +--- + +[阅读全文](https://www.bilibili.com/read/cv2535765) + +‍ diff --git a/docs/content/tutorial-signpicture.md b/docs/content/tutorial-signpicture.md new file mode 100644 index 0000000..44b3df1 --- /dev/null +++ b/docs/content/tutorial-signpicture.md @@ -0,0 +1,46 @@ +--- +title: 「Minecraft」SignPicture(告示牌图片)教程 +date: 2025-03-16T22:18:01Z +lastmod: 2025-03-16T22:19:24Z +tags: [Minecraft,模组,教程] +--- + +# 「Minecraft」SignPicture(告示牌图片)教程 + +## 对于网络图片 + +1. 获取图片链接。 +2. 若链接长度较长,需要使用 `短链接服务` 把链接缩短([例](https://tinyurl.com/))。 + + 若链接长度较短,则直接到第 3 步。 +3. 在游戏中按下打开告示牌图片 GUI 的按键(默认是 `\`)。 +4. 点击右上角的 `粘贴链接`(Paste)。 +5. 根据需要在 GUI 的左上角对图片的显示进行一些调整(大小、方向等)。 + + 点击 `预览`(Preview)并根据提示操作可以查看调整是否合适。 +6. 调整完成后,点击 `放置`(Place),然后手动放置一块告示牌,即可显示你要显示的图片。 + +## 对于本地图片 + +1. 寻找合适的图床([例](https://sm.ms/))。 +2. 把图片上传至图床。 +3. 获取图片链接。 +4. 若链接长度较长,需要使用 `短链接服务` 把链接缩短([例](https://tinyurl.com/))。 + + 若链接长度较短,则直接到第 5 步。 +5. 在游戏中按下打开告示牌图片 GUI 的按键(默认是 `\`)。 +6. 点击右上角的 `粘贴链接`(Paste)。 +7. 根据需要在 GUI 的左上角对图片的显示进行一些调整(大小、方向等)。 + + 点击 `预览`(Preview)并根据提示操作可以查看调整是否合适。 +8. 调整完成后,点击 `放置`(Place),然后手动放置一块告示牌,即可显示你要显示的图片。 + +## 对于资源包中的图片 + +> 参考:[local files · Issue #19 · Team-Fruit/SignPicture](https://github.com/Team-Fruit/SignPicture/issues/19) + +若需要使用资源包中的图片,可以将格式为 `!命名空间:文件名` 的文本作为图片链接在 SignPicture 中使用。 + +例如图片文件在资源包中的路径为 `/assets/image_pack/frost-zx.png`,则对应的链接文本为 `!image_pack:frost-zx.png`。 + +‍ diff --git a/docs/content/ubuntu-20-04-netplan.md b/docs/content/ubuntu-20-04-netplan.md new file mode 100644 index 0000000..3a27ee6 --- /dev/null +++ b/docs/content/ubuntu-20-04-netplan.md @@ -0,0 +1,94 @@ +--- +title: 记一次 Ubuntu 20.04 双网卡配置过程 +date: 2025-03-16T15:59:37Z +lastmod: 2025-03-16T15:59:55Z +tags: [网络,Linux,Ubuntu,系统,配置] +--- + +# 记一次 Ubuntu 20.04 双网卡配置过程 + +## 情况说明 + +现有如图所示的网络结构(非专业网络拓扑图,仅供参考) + +![网络结构](assets/network-asset-01-20250316155958-gldjlz4.png "网络结构") + +其中: + +- 主路由有两个 DHCP 服务器(IP 为 10.32.1.1 和 10.32.2.1)。 +- 子路由设置了 DMZ 主机,指向服务器(192.168.148.100)。 +- 网卡A - `enp6s0`,网卡B - `ens4`。 + +注意: + +- 一台主机只配置一个默认网关,若有多个,会自动选择优先级较高的一个进行通信。 + + 因此,需要手动给网卡配置静态路由。 + +## 要求 + +- 服务器可以访问子路由、主路由,以及外网。 +- 连接到主路由的设备能通过 IP 10.32.1.34 和 10.32.2.1 访问服务器。 + +## 参考资料 + +- [Netplan](https://netplan.io/reference/) + +## 用到的命令 + +```text +ip a +sudo netplan apply +sudo service systemd-networkd restart +sudo ip route show +sudo netstat -rn +traceroute -m 10 -n www.baidu.com +``` + +## 配置 + +修改 `/etc/netplan/00-installer-config.yaml`(文件名不一定是这个) + +### 方案一 + +服务器通过主路由访问外网 + +```yaml +network: + renderer: networkd + ethernets: + ens4: + dhcp4: true + enp6s0: + dhcp4: false + addresses: [192.168.148.100/24] + routes: + - to: 192.168.148.0/24 + via: 192.168.148.1 + - to: 10.32.2.0/24 + via: 192.168.148.1 + version: 2 +``` + +### 方案二 + +服务器通过子路由访问外网 + +> 一般来说,使用方案一就可以了(已测试),但在部分网络环境下需要使用方案二这样的配置(原因未知,猜测可能与路由器设置有关)。 + +```yaml +network: + renderer: networkd + ethernets: + ens4: + dhcp4: false + addresses: [10.32.1.29/24] + enp6s0: + dhcp4: true + routes: + - to: 192.168.148.0/24 + via: 192.168.148.1 + version: 2 +``` + +‍ diff --git a/docs/content/useful-css-javascript-libraries.md b/docs/content/useful-css-javascript-libraries.md new file mode 100644 index 0000000..9f6b692 --- /dev/null +++ b/docs/content/useful-css-javascript-libraries.md @@ -0,0 +1,68 @@ +--- +title: 「合集」实用的 CSS、JavaScript 库 +date: 2025-03-15T23:12:36Z +lastmod: 2025-03-15T23:13:16Z +tags: [Web 前端,CSS,JavaScript,Node.js,NPM] +--- + +# 「合集」实用的 CSS、JavaScript 库 + +## CSS + +- [Font Awesome](https://www.npmjs.com/package/font-awesome) - 图标库 +- [Material Icons](https://www.npmjs.com/package/material-icons) - 图标库 +- [ress](https://www.npmjs.com/package/ress) - CSS reset + +## Node.js + +- [env-cmd](https://www.npmjs.com/package/env-cmd) - 环境变量 +- [Terminal Kit](https://www.npmjs.com/package/terminal-kit) - 成熟的终端库,具有输入处理、输入字段、进度条以及屏幕缓冲区等功能) + +## Vue 组件 / 组件库 + +- [v-area-select](https://www.npmjs.com/package/v-area-select) - PC 端区域框选 +- [Vue-drag-resize](https://www.npmjs.com/package/vue-drag-resize) - 元素拖拽和大小调整 +- [vue-easytable](https://happy-coding-clans.github.io/vue-easytable/) - 一个基于 Vue 2.x 的表格组件 +- [BootstrapVue](https://bootstrap-vue.org/) - 基于 Bootstrap 的组件库 +- [Buefy](https://buefy.org/) - 基于 Bulma CSS 的轻量级组件库 +- [Element UI](https://element.eleme.cn/) - 基于 Vue 2.x 的桌面端组件库 +- [Naive UI](https://www.naiveui.com/) - 一个 Vue 3 组件库 +- [Quasar](https://quasar.dev/) - 基于 Vue.js 的开源框架,可以快速地创建多种类型的响应式网站或应用 +- [Vant](https://vant-contrib.gitee.io/vant/) - 轻量、可靠的移动端组件库 +- [Vuestic UI](https://vuestic.dev/) - Vue.js 3.0 UI 框架 +- [Vuetify](https://vuetifyjs.com/zh-Hans/) - Material Design 风格组件库 + +## 插件 + +- [gesto](https://www.npmjs.com/package/gesto) - 在任意的浏览器上添加手势事件 +- [Overlay Scrollbars](https://kingsora.github.io/OverlayScrollbars/) - 多功能自定义滚动条 +- [Perfect Scrollbar](https://perfectscrollbar.com/) - 自定义滚动条 +- [SimpleBar](https://www.npmjs.com/package/simplebar) - 自定义滚动条 +- [simple-keyboard](https://www.npmjs.com/package/simple-keyboard) - 多功能虚拟键盘 + +## 工具 + +- [Ajv JSON schema validator](https://www.npmjs.com/package/ajv) - JSON 校验库 +- [Apache ECharts](https://echarts.apache.org/) - JavaScript 可视化图表库 +- [axios](https://www.npmjs.com/package/axios) - 基于 Promise 的 HTTP 客户端 +- [bookmark-file-parser](https://www.npmjs.com/package/bookmark-file-parser) - 解析 Chrome / Firefox / IE / Safari 浏览器的 HTML 书签文件 +- [crypto-js](https://www.npmjs.com/package/crypto-js) - JavaScript 加密算法库 +- [jsPlumb](https://www.npmjs.com/package/jsplumb) - 流程图、拓扑图绘制工具库 +- [localForage](https://localforage.github.io/localForage/) - 类似 localStorage API 的异步存储库 +- [Lodash](https://www.npmjs.com/package/lodash) - JavaScript 实用工具库 +- [opencc](https://www.npmjs.com/package/opencc) - 中文简繁转换 +- [UAParser.js](https://www.npmjs.com/package/ua-parser-js) - 解析浏览器 User-Agent 信息 + +## 其它 + +- [Ant Design](https://ant.design/) - 蚂蚁集团打磨出的一个服务于企业级产品的设计体系 +- [Arco Design](https://arco.design/) - 字节跳动出品的企业级设计系统 +- [TDesign](https://tdesign.tencent.com/) - 腾讯各业务团队在服务业务过程中沉淀的一套企业级设计体系 +- [CountUp.js](https://www.npmjs.com/package/countup.js) - 数值动画效果 +- [html2canvas](https://www.npmjs.com/package/html2canvas) - DOM 节点转 Canvas +- [LuLu UI](https://github.com/yued-fe/lulu) - 阅文集团荣誉出品的跨端跨框架的原生 UI 组件库 +- [NutUI](https://nutui.jd.com/) - 京东风格的轻量级移动端 Vue2、Vue3、小程序组件库 +- [screenfull](https://www.npmjs.com/package/screenfull) - 全屏切换 +- [Sortable.js](https://github.com/SortableJS/Sortable) - 拖拽排序 + +‍ diff --git a/docs/content/video-2017-guangzhou-international-light-festival-1.md b/docs/content/video-2017-guangzhou-international-light-festival-1.md new file mode 100644 index 0000000..8a26cdc --- /dev/null +++ b/docs/content/video-2017-guangzhou-international-light-festival-1.md @@ -0,0 +1,18 @@ +--- +title: 「摄影」2017 广州国际灯光节(固定机位夜景) +date: 2025-03-16T19:44:02Z +lastmod: 2025-03-16T19:46:49Z +tags: [视频,广州,灯光节,摄影,分享] +--- + +# 「摄影」2017 广州国际灯光节(固定机位夜景) + +作者:[炸鸡的咸鱼](https://space.bilibili.com/4779239) + +bilibili UID:4779239 + +--- + + + +‍ diff --git a/docs/content/video-av38895913.md b/docs/content/video-av38895913.md new file mode 100644 index 0000000..7b11f0f --- /dev/null +++ b/docs/content/video-av38895913.md @@ -0,0 +1,14 @@ +--- +title: 「生活」中国人到底有多拼? +date: 2025-03-16T16:56:37Z +lastmod: 2025-03-16T16:56:56Z +tags: [视频,生活,分享] +--- + +# 「生活」中国人到底有多拼? + +作者:国家电网福建电力泉州供电局 + +--- + + diff --git a/docs/content/video-honor-your-father-and-your-mother.md b/docs/content/video-honor-your-father-and-your-mother.md new file mode 100644 index 0000000..2269d95 --- /dev/null +++ b/docs/content/video-honor-your-father-and-your-mother.md @@ -0,0 +1,31 @@ +--- +title: 「公益」当孝敬父母 +date: 2025-03-16T21:54:03Z +lastmod: 2025-03-17T00:50:55Z +tags: [视频,分享,公益] +--- + +# 「公益」当孝敬父母 + +作者:思埠集团 + +--- + + + +‍ diff --git a/docs/content/video-minecraft-played-together.md b/docs/content/video-minecraft-played-together.md new file mode 100644 index 0000000..bb16924 --- /dev/null +++ b/docs/content/video-minecraft-played-together.md @@ -0,0 +1,88 @@ +--- +title: 「游戏」那些年,我们一起玩过的 MC +date: 2025-03-17T00:05:10Z +lastmod: 2025-03-17T00:10:53Z +tags: [Minecraft,视频,籽岷,分享] +--- + +# 「游戏」那些年,我们一起玩过的 MC + +仅以此片,献给所有 MC 玩家。 + +初稿:黑白の扫帚 + +定稿、配音:炎黄 + +素材、剪辑:籽岷 + +--- + +## 视频 + + + +[https://v.youku.com/v_show/id_XNTMwNzY1MzMy.html](https://v.youku.com/v_show/id_XNTMwNzY1MzMy.html) + +--- + +## 文案 + +我喜欢被游戏感动,也喜欢用游戏感动别人。 + +有人十分郑重地问我,是否会有放弃 MC 的一天? + +我无法想象那样的生活,MC 已经是我生活的一部分,无法隔离更加无法抛弃。 + +每一天可以很忙很累,然而却不能缺少这款游戏。 + +记得那时候,仅仅是因为惊叹于 MC 的创造性,也不失可爱。 + +后来却是逐渐地自己去感受这个不一样的世界的内涵。 + +当我站立在这个世界的时候,就像是拥有了第二生命。 + +我的人,随着灵魂到达遥远彼岸的一个方块世界。 + +从最底层通过努力一步步走向世界的顶端,甚至匪夷所思的杀死最强大的黑龙。 + +看着自己的足迹清晰地识别出自己曾经的存在。 + +不仅仅是如此,即使被一群僵尸围殴致死,即使被苦力怕炸得尸骨无存,甚至掉下岩浆,背包里面的东西都付之一炬,也没关系。 + +在这里死亡都不能阻挡我,因为下一秒我还可以站起来,还可以再次投入到这个世界。 + +为了自己曾经的正确去欢心,为了自己曾经的错误去忏悔。 + +就是这样一个不科学,很魔法的世界,带给我温馨和自我。 + +MC 的世界,也忘不了曾经为了自己的生存而努力,不断随机应变。 + +因为你是为了活下去,而工作。 + +有时,你厌倦了。 + +出去走走,发现了一座哪怕只有一丁点儿大的村庄,都会值得庆祝。 + +像是成为一个求生的野蛮人,再次回到了人类的文明里面。 + +你可以整夜无眠地画一份农田规划图纸,即使电脑关闭,你无语地躺在床上,那些画面已经光亮如丝,照亮着孤独的夜晚。 + +你可以久违的失眠,偶尔傻傻地笑了。 + +找几个朋友,大家一起走进这个世界。 + +可以忘记现实里的烦恼,做一些荒诞的事情,尽情地憨笑,互相叫骂互相追逐。 + +大家在一起有个收获,便可以无限制地畅想一下,更为遥远的美好未来。 + +不管我们曾经做了什么,都会在 MC 留下自己的汗水和印记,留下感情和回忆。 + +它不是存档,而是鲜活的曾经。 + +无法放弃 MC,多年以后想起这个游戏,泛照着过去的记忆,感觉到无尽的愉悦。 + +也许会伴随着一丝心酸,那一个个鲜明的方块,一个个灵活的生物,一个个远去的邮轮,都会回到脑海,都是属于我的财富,让我永远也不想放弃。 + +50 年后我还会记得,那些年我们一起玩过的 MC。 + +‍ diff --git a/docs/content/video-ppt-gzl9-lcd.md b/docs/content/video-ppt-gzl9-lcd.md new file mode 100644 index 0000000..8c70b7b --- /dev/null +++ b/docs/content/video-ppt-gzl9-lcd.md @@ -0,0 +1,20 @@ +--- +title: 「还原」使用 PPT 还原广州地铁 9 号线 LCD(单站) +date: 2025-03-17T00:11:25Z +lastmod: 2025-03-17T11:49:22Z +tags: [视频,临摹,PPT,广州地铁] +--- + +# 「还原」使用 PPT 还原广州地铁 9 号线 LCD(单站) + +## 视频 + + + +## 链接 + +- [去 bilibili 观看](https://www.bilibili.com/video/av33201169) + +- [站酷发布页](https://www.zcool.com.cn/work/ZMzExMTM5MjQ=.html) + +‍ diff --git a/docs/content/video-shanghai-a-city-on-the-rise.md b/docs/content/video-shanghai-a-city-on-the-rise.md new file mode 100644 index 0000000..ec24268 --- /dev/null +++ b/docs/content/video-shanghai-a-city-on-the-rise.md @@ -0,0 +1,16 @@ +--- +title: 「生活」上海,不夜的精彩 +date: 2025-03-16T21:42:59Z +lastmod: 2025-03-16T21:44:04Z +tags: [视频,上海,生活,分享] +--- + +# 「生活」上海,不夜的精彩 + +作者:上海广播电视台 + +--- + + + +‍ diff --git a/docs/content/vscode-minecraft-nbt-editor.md b/docs/content/vscode-minecraft-nbt-editor.md new file mode 100644 index 0000000..a16add5 --- /dev/null +++ b/docs/content/vscode-minecraft-nbt-editor.md @@ -0,0 +1,149 @@ +--- +title: 使用 VSCode 查看和编辑 Minecraft 存档的 NBT +date: 2025-03-15T22:16:38Z +lastmod: 2025-03-15T22:22:27Z +tags: [Minecraft,教程,工具,VSCode,NBT] +--- + +# 使用 VSCode 查看和编辑 Minecraft 存档的 NBT + +## 简介 + +目前已知常用的 NBT 数据编辑工具有 NBTExplorer、Universal Minecraft Editor、webNBT 等,但他们目前都不太兼容 Minecraft 1.12.2 以上版本的存档。 + +实际上,除了使用上述的几款工具以外,还可以使用 VSCode 编辑 NBT 数据。主要用到**由 Misode 开发的 NBT Viewer 扩展**([misode/vscode-nbt: NBT extension for VSCode](https://github.com/misode/vscode-nbt))。本文将会从 VSCode 的安装开始讲述使用方法。 + +## 一、安装 VSCode + +1. 访问 VSCode 官网([code.visualstudio.com](https://code.visualstudio.com/)),点击页面左侧的下载按钮,下载自动识别的版本,或点击 “other platforms”,根据实际情况下载合适的版本。 + + > 注:若下载速度较慢,可参考文末中的 “VSCode 安装包下载太慢” 解决方法。 + > + + ![image](assets/network-asset-vscode-download-1-20250315221732-pbbk9r2.png) + 本文中以 Windows 平台 `System Installer` `x64` 为例。 + ​![image](assets/network-asset-vscode-download-2-20250315221732-ydvbqhq.png) + 若有需要,可以访问 “[Setting up Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview)” 页面查看安装说明文档(英文): + ​![image](assets/network-asset-vscode-setup-doc-20250315221732-5nop15f.png) +2. 下载完成后,双击运行安装程序以开始安装。 + ​![image](assets/network-asset-vscode-exe-20250315221732-z39ucpa.png) +3. 根据提示进行相关操作,直到安装完成: + ​![image](assets/network-asset-vscode-setup-1-20250315221733-72b0edr.png) + ​![image](assets/network-asset-vscode-setup-2-20250315221733-mo1zslf.png) + ​![image](assets/network-asset-vscode-setup-3-20250315221733-tn3mz90.png) + ​![image](assets/network-asset-vscode-setup-4-20250315221733-lncj84v.png) + ​![image](assets/network-asset-vscode-setup-5-20250315221733-yvrwxxi.png) + +## 二、安装语言包 + +在系统菜单或桌面中找到 VSCode,运行。初次启动时,软件右下角会根据当前系统语言设置,提示安装对应的语言包。若点击 “安装并重启” 按钮,软件将会自动安装语言包并重启。 + +![image](assets/network-asset-vscode-first-launch-20250315221733-6jgjbd0.png) + +--- + +若有需要,可以按下 `Ctrl + Shift + P` 或 `F1`,输入 “display language”,选择 “Configure Display Language”,然后选择安装所需的语言包。 + +> 注:使用 `↑` `↓` 键切换选项,按下 `Enter` 键进行确认。 + +![image](assets/network-asset-vscode-configure-display-language-20250315221734-iudmfwz.png) + +![image](assets/network-asset-vscode-select-language-pack-20250315221734-h6w04w1.png) + +选择语言后,会提示需要重启以生效。若点击 “Restart” 按钮则自动重启,若点击 “Cancel” 按钮则可以在稍后手动重启。 + +![image](assets/network-asset-vscode-language-pack-restart-20250315221734-bhzvs3f.png) + +## 三、更改默认设置和主题 + +若有需要,可以先对软件的默认设置进行一些调整以及更换主题。 + +![image](assets/network-asset-vscode-change-default-settings-20250315221734-8d97hmy.png) + +![image](assets/network-asset-vscode-change-default-theme-20250315221734-9qceson.png) + +## 四、安装 NBT Viewer 扩展 + +点击左侧边栏中的 “扩展” 图标,然后在输入框中填写 “Misodee.vscode-nbt” 或 “NBT Viewer” 进行搜索。 + +> 若使用关键词 “NBT Viewer” 进行搜索,可能会有多个结果,请注意不要安装错。 + +![image](assets/network-asset-vscode-search-nbt-viewer-20250315221734-oq5endx.png) + +点击 “安装” 按钮,安装找到的 NBT Viewer 扩展。 + +![image](assets/network-asset-vscode-install-nbt-viewer-20250315221734-6wylbjd.png) + +## 五、打开存档文件夹 + +点击左侧边栏中的 “资源管理器” 图标,然后点击 “打开文件夹” 按钮选择存档文件夹,或直接将存档文件夹拖动到左侧区域以打开。 + +![image](assets/network-asset-vscode-resource-manager-20250315221735-amxkeq2.png) + +初次打开文件夹时会弹出 “信任文件夹” 对话框,根据需要选择即可(不影响 NBT Viewer 扩展的正常使用)。 + +![image](assets/network-asset-vscode-trust-folder-20250315221735-44tp8j0.png) + +--- + +若有需要,可以按下 `Ctrl + Shift + P` 或 `F1`,输入 “workspace trust”,选择 “Manage Workspace Trust”,查看工作区信任配置情况。 + +> 注:使用 `↑` `↓` 键切换选项,按下 `Enter` 键进行确认。 + +![image](assets/network-asset-vscode-manage-workspace-trust-1-20250315221735-kinmnr6.png) + +![image](assets/network-asset-vscode-manage-workspace-trust-2-20250315221735-jdc14gu.png) + +--- + +如果需要添加多个文件夹,可以通过将文件夹拖动到文件列表中,或选择菜单(工具栏 / 右键菜单)中的 “将文件夹添加到工作区” 项的方式进行添加。 + +![image](assets/network-asset-vscode-add-folder-20250315221735-gpztq20.png) + +在弹出的对话框中选择 “将文件夹添加到工作区”。 + +![image](assets/network-asset-vscode-open-folder-20250315221735-hawxfl5.png) + +## 六、查看和编辑 NBT 数据 + +单击左侧文件列表中文件项即可将其打开: + +![image](assets/network-asset-nbt-open-level-dat-20250315221735-5pv885l.png) + +注意:通过 “单击” 方式打开的文件默认不保持打开,会在**打开其他文件时自动关闭**。通过 “双击” 方式打开,或点击文件标签页右键菜单中的 “保持打开状态” 项,可以把它变为 “保持打开”。 + +![image](assets/network-asset-vscode-keep-open-20250315221736-scacdfz.png) + +打开文件后,需要**等待 NBT Viewer 扩展从 GitHub 下载所需要的依赖文件后才能看到内容**。由于服务器在国外,**你可能需要使用网络加速工具以提高下载速度**。在 VSCode 的 “输出” 面板中可以看到详细情况: + +![image](assets/network-asset-vscode-view-output-20250315221736-z53qis5.png) + +![image](assets/network-asset-nbt-downloading-outputs-20250315221736-3yeszbs.png) + +目前该扩展支持读取的文件类型: + +![image](assets/network-asset-nbt-support-file-1-20250315221736-p5rcfo9.png) + +![image](assets/network-asset-nbt-support-file-2-1-20250315221736-ned6gpf.png) + +![image](assets/network-asset-nbt-support-file-2-2-20250315221736-khkl54l.png) + +![image](assets/network-asset-nbt-support-file-2-3-20250315221737-j62zsid.png) + +![image](assets/network-asset-nbt-support-file-3-20250315221737-q7lu500.png) + +## 常见问题 + +### VSCode 安装包下载太慢 + +1. 在 VSCode 的下载页面根据需要点击下载按钮。 + ​![image](assets/network-asset-faq-installer-download-slow-1-20250315221737-ihrkqkr.png) +2. 等待开始下载。 + ​![image](assets/network-asset-faq-installer-download-slow-2-20250315221737-qb1gq9i.png) +3. 打开浏览器的 “下载” 页面,复制安装包的下载链接。 + ​![image](assets/network-asset-faq-installer-download-slow-3-20250315221737-zgc931w.png) +4. 将下载地址中的 `az764295.vo.msecnd.net` 部分替换为 `vscode.cdn.azure.cn`,填入到浏览器的地址栏中访问,以通过国内的镜像服务器进行下载。 + ​![image](assets/network-asset-faq-installer-download-slow-4-20250315221737-y875dvj.png) + ​![image](assets/network-asset-faq-installer-download-slow-5-20250315221737-ngc984s.png) + +‍ diff --git a/docs/content/vue-cli-less-global-variables.md b/docs/content/vue-cli-less-global-variables.md new file mode 100644 index 0000000..891e557 --- /dev/null +++ b/docs/content/vue-cli-less-global-variables.md @@ -0,0 +1,114 @@ +--- +title: 「Web 前端」Vue CLI 配置 Less 全局变量 +date: 2025-03-15T23:16:58Z +lastmod: 2025-03-15T23:19:03Z +tags: [Web 前端,Vue.js,Vue CLI,JavaScript,教程] +--- + +# 「Web 前端」Vue CLI 配置 Less 全局变量 + +## 参考资料 + +- [Working with CSS | Vue CLI](https://cli.vuejs.org/guide/css.html#automatic-imports) +- [vue-cli-plugin-style-resources-loader - npm](https://www.npmjs.com/package/vue-cli-plugin-style-resources-loader) + +## 预先准备 + +1. 若项目正在运行,需要先停止。 + + > 安装依赖和修改 `vue.config.js` 需要重新启动项目以生效。 + > +2. 安装 `less` 和 `less-loader`。 + + > 若已安装则可忽略(例如使用 Vue CLI 创建项目时选择了 Less CSS 预处理器)。 + > + + ```plaintext + npm install less less-loader --save-dev + # 可以简写为 + npm i less less-loader -D + ``` + +## 方式一、手动配置 + +1. 安装 `style-resources-loader`。 + + ```plaintext + npm install style-resources-loader --save-dev + ``` +2. 修改项目根目录下的 `vue.config.js` 文件(若无则创建)。 + + > 以使用 `src/assets/css/global.less` 和 `src/assets/css/variables.less` 文件为例。 + > + + ```javascript + const path = require('path'); + + function addStyleRes({ config = null, processor = '', patterns = [] }) { + if (!config) { + return; + } + + const rule = config.module.rule(processor); + const types = ['normal', 'normal-modules', 'vue', 'vue-modules']; + + types.forEach((type) => { + rule.oneOf(type) + .use('style-resources-loader') + .loader('style-resources-loader') + .options({ patterns }); + }); + } + + module.exports = { + chainWebpack: (config) => { + + addStyleRes({ + config, + processor: 'less', + patterns: [ + path.resolve(__dirname, 'src/assets/css/global.less'), + path.resolve(__dirname, 'src/assets/css/variables.less'), + ] + }); + + }, + }; + ``` + +## 方式二、使用插件 + +1. 安装 `style-resources-loader` 插件。 + + > 注意: + > 安装该插件时会自动修改 `vue.config.js` 文件,建议先使用 Git 暂存或提交当前的更改后再安装。 + > 安装过程中可能会弹出 CSS 预处理器选择菜单,根据实际情况选择即可。 + > + + ```plaintext + vue add style-resources-loader + ``` +2. 根据需要修改 `vue.config.js` 文件。 + + > 以使用 `src/assets/css/global.less` 和 `src/assets/css/variables.less` 文件为例。 + > + + ```javascript + const path = require('path'); + + module.exports = { + pluginOptions: { + + 'style-resources-loader': { + preProcessor: 'less', + patterns: [ + path.resolve(__dirname, 'src/assets/global.less'), + path.resolve(__dirname, 'src/assets/variables.less'), + ], + }, + + }, + }; + ``` + +‍ diff --git a/docs/content/vue-jsx-syntax.md b/docs/content/vue-jsx-syntax.md new file mode 100644 index 0000000..62202c8 --- /dev/null +++ b/docs/content/vue-jsx-syntax.md @@ -0,0 +1,154 @@ +--- +title: 「Web 前端」在 Vue 中使用 JSX 的语法 +date: 2025-03-15T23:05:31Z +lastmod: 2025-10-07T16:10:57Z +tags: [Web 前端,JavaScript,JSX,Vue.js] +--- + +# 「Web 前端」在 Vue 中使用 JSX 的语法 + +## 来源 + +- [GitHub - vuejs/jsx](https://github.com/vuejs/jsx#syntax) + +## 语法 + +### 内容(Content) + +```javascript +render() { + return

hello

; +} +``` + +动态内容: + +```javascript +render() { + return

hello { this.message }

; +} +``` + +使用自闭合标签: + +```javascript +render() { + return ; +} +``` + +使用组件: + +```javascript +import MyComponent from './my-component'; + +export default { + render() { + return hello; + }, +} +``` + +### Attributes / Props + +```javascript +render() { + return ; +} +``` + +动态绑定: + +```javascript +render() { + return ; +} +``` + +使用 “展开” 操作符: + +> 传递的对象需要与 [深入数据对象](https://cn.vuejs.org/v2/guide/render-function.html#%E6%B7%B1%E5%85%A5%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1) 相匹配。 + +```javascript +render() { + const inputAttrs = { + type: 'email', + placeholder: 'Enter your email', + }; + return ; +} +``` + +### 插槽(Slots) + +具名插槽: + +```javascript +render() { + return ( + +
header
+
footer
+
+ ); +} +``` + +作用域插槽: + +```javascript +render() { + const scopedSlots = { + header: () =>
header
, + footer: () =>
footer
, + }; + return ; +} +``` + +### 指令(Directives) + +```html + +``` + +使用修饰符(modifier): + +```html + +``` + +使用参数(argument): + +```html + +``` + +同时使用参数和修饰符: + +```html + +``` + +v-html: + +```html +

+``` + +### 函数式组件(Functional Components) + +> [渲染函数 & JSX - 函数式组件](https://cn.vuejs.org/v2/guide/render-function.html#%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BB%84%E4%BB%B6) + +```javascript +export default ({ props }) => (

hello {props.message}

); +``` + +```javascript +const HelloWorld = ({ props }) => (

hello {props.message}

); +``` + +‍ diff --git a/docs/content/vue-scrollbar-plugin.md b/docs/content/vue-scrollbar-plugin.md new file mode 100644 index 0000000..bc45aae --- /dev/null +++ b/docs/content/vue-scrollbar-plugin.md @@ -0,0 +1,122 @@ +--- +title: 「Web 前端」Vue 使用滚动条插件 +date: 2025-03-15T23:15:09Z +lastmod: 2025-03-15T23:15:38Z +tags: [Web 前端,JavaScript,Vue.js,代码片段] +--- + +# 「Web 前端」Vue 使用滚动条插件 + +#### PerfectScrollbar + +```javascript +import PerfectScrollbar from 'perfect-scrollbar'; +import 'perfect-scrollbar/css/perfect-scrollbar.css'; + +/** + * @description 初始化 PerfectScrollbar + * @param {HTMLElement} el DOM 元素 + * @param {object} [options] 配置选项 + * @param {boolean} [options.x] 是否启用水平滚动条,默认为 false + * @param {boolean} [options.y] 是否启用垂直滚动条,默认为 false + */ +const fnInitScrollbar = (el, options = {}) => { + if (!el) { + return; + } + + /** 自定义属性名称,保存实例 */ + const attrName = '__ps__'; + + /** @type {PerfectScrollbar} */ + const instance = el[attrName]; + + if (instance instanceof PerfectScrollbar) { + // 已存在,更新 + instance.update(); + } else { + // 不存在,创建 + el[attrName] = new PerfectScrollbar(el, { + suppressScrollX: !options.x, + suppressScrollY: !options.y, + swipeEasing: true, + }); + } +}; + +// 注册自定义指令 v-scrollbar +Vue.directive('scrollbar', { + // 被绑定元素插入父节点时 + inserted: function (el, binding) { + const rules = ['fixed', 'absolute', 'relative', 'sticky']; + const { modifiers } = binding; + + // 判断元素是否已设置定位 + // 滚动条需要相对于父元素进行绝对定位 + if (rules.includes(getComputedStyle(el).position)) { + fnInitScrollbar(el, { + x: modifiers.x, + y: modifiers.y, + }); + } else { + console.error('PerfectScrollbar 所在的元素未设置有效的定位'); + console.error('元素', el); + } + }, + // 指令所在组件的 VNode 及其子 VNode 全部更新后 + componentUpdated: function (el, binding, vnode) { + // vnode.context 为 Vue 实例 + // 也可以写成为 Vue.$nextTick() + vnode.context.$nextTick(() => { + fnInitScrollbar(el); + }); + }, +}); +``` + +#### SimpleBar + +```javascript +/** + * @description 初始化 SimpleBar + * @param {HTMLElement} el DOM 元素 + * @param {object} [options] 配置选项 + * @param {object} [options.keep] 保持显示,不自动隐藏 + */ +const fnInitScrollbar = (el, options = {}) => { + if (!el) { + return; + } + + /** 自定义属性名称,保存实例 */ + const attrName = '__scrollbar__'; + + /** @type {SimpleBar} */ + const instance = el[attrName]; + + // 移除已存在 + if (instance instanceof SimpleBar) { + instance.unMount(); + } + + // 初始化 + el[attrName] = new SimpleBar(el, { + autoHide: !options.keep, + timeout: 2000, + }); +}; + +// 注册自定义指令 v-scrollbar +Vue.directive('scrollbar', { + // 元素插入父节点时 + inserted: function (el, binding) { + const { modifiers } = binding; + + fnInitScrollbar(el, { + keep: modifiers.keep, + }); + }, +}); +``` + +‍ diff --git a/docs/content/warning-network-error.md b/docs/content/warning-network-error.md new file mode 100644 index 0000000..147b1ab --- /dev/null +++ b/docs/content/warning-network-error.md @@ -0,0 +1,49 @@ +--- +title: 「提示」网络连接不可用 +date: 2025-03-16T21:35:26Z +lastmod: 2025-03-16T21:36:42Z +tags: [提示,网页,软件] +--- + +# 「提示」网络连接不可用 + +## Chrome + +
+小恐龙 +
+ +## 未连接到互联网 + +请试试以下办法: + +- 关闭飞行模式 +- 开启移动数据网络或 Wi-Fi +- 检查您所在区域的网络信号 + +
+ERR_INTERNET_DISCONNECTED +
+ +--- + +# 微信 + +## 未能连接到互联网 + +您的设备未启用移动网络或无线局域网 + +
+
+
+ +如需要连接到互联网,请参考以下几点: + +- 检查手机中的无线局域网设置,查看是否有可接入的无线局域网信号。 +- 检查手机是否已接入移动网络,并且手机没有被停机。 + +如果您已接入无线局域网: + +- 请检查您所连接的无线局域网热点是否已接入互联网,或该热点是否已允许您的设备访问互联网。 + +‍ diff --git a/docs/content/windows-10-explorer-ogg-file-lag.md b/docs/content/windows-10-explorer-ogg-file-lag.md new file mode 100644 index 0000000..06e6510 --- /dev/null +++ b/docs/content/windows-10-explorer-ogg-file-lag.md @@ -0,0 +1,42 @@ +--- +title: 解决 Windows 10 资源管理器操作 OGG 文件时未响应的问题 +date: 2025-03-16T16:27:26Z +lastmod: 2025-03-16T16:28:19Z +tags: [Windows,资源管理器,卡顿,文件,未响应] +--- + +# 解决 Windows 10 资源管理器操作 OGG 文件时未响应的问题 + +系统版本:Windows 10 专业版 1909 + +--- + +## 简介 + +在 Windows 10 使用资源管理器查看、重命名、删除、移动 OGG 文件的时候会出现“未响应”的情况,要等一段时间才好。 + +而且,显示 OGG 文件的右键菜单时,等待时间比其他文件的要久。 + +## 解决方法 + +经过多次的安装与卸载测试,导致未响应的源头是 `Web 媒体扩展` 这个应用。 + +> [Web 媒体扩展包](https://www.microsoft.com/zh-cn/p/web-media-extensions/9n5tdp8vcmhs) 对 Microsoft Edge 和 Windows 10 进行扩展,使其能够打开 Web 上常见的源格式。 +> +> 通过安装此媒体扩展包,用户将可以随意播放 OGG 容器中的内容以及使用 Vorbis 或 Theora 编解码器编码的内容。 +> +> 安装后,无需用户操作,Web 站点和应用便可以自动使用此扩展。 +> +> 只需进行安装,便可立即在 Microsoft Edge 和应用中播放新内容! + +![](assets/network-asset-01_1-20250316162751-0zm4eys.png) + +![](assets/network-asset-01_2-20250316162752-9dv7tm2.png) + +![](assets/network-asset-01_3-20250316162752-tj2hi4r.png) + +若不需要使用,可在 `Windows 设置 - 应用 - 应用和功能` 将其卸载,即可解决 OGG 文件导致资源管理器 `未响应` 的问题。 + +![](assets/network-asset-02-20250316162752-ng03hvu.png) + +‍ diff --git a/docs/content/windows-10-unable-to-login.md b/docs/content/windows-10-unable-to-login.md new file mode 100644 index 0000000..9e7702a --- /dev/null +++ b/docs/content/windows-10-unable-to-login.md @@ -0,0 +1,140 @@ +--- +title: 解决 Windows 10 提示“无法登录到你的账户”问题 +date: 2025-03-15T22:24:21Z +lastmod: 2025-03-15T22:26:43Z +tags: [系统,Windows,Windows 10] +--- + +# 解决 Windows 10 提示“无法登录到你的账户”问题 + +## 前言 + +前几天,我一位朋友说登录系统之后弹出了一个 “无法登录到你的账户” 的提示框,桌面壁纸和文件变成了系统刚安装完毕的时候的状态。 + +![提示框](assets/network-asset-prompt-20250315222636-lpnjg76.png "提示框") + +看了下任务管理器,用户名变成了 “TEMP”。然后试过很多种方法: + +- 根据提示重启系统,重新登录。 +- 使用 “系统还原” 功能回滚到 “还原点”(无法进行,“系统还原” 功能没有开启)。 +- 重启,进入安全模式登录。 +- 打开注册表 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList`,将末尾带 “.bak” 的项和不带 “.bak” 的同名项重命名互换。 +- 打开注册表 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList`,将当前用户项中的 `State` 属性值改为 `0`。 + +但是都没有效果,登录之后还是弹出错误提示。 + +之后看到官方帮助文档里说创建一个新的账户,然后把文件复制到新账户的文件夹里可以解决,就试了下(开始之前先用虚拟机测试过一次),确实有效果,而且大部分软件的数据都在(小部分保存在注册表 `HKEY_CURRENT_USER` 里的不能恢复,据说这部分数据保存在 `NTUSER.DAT`)。 + +## 官方帮助文档 + +- [Windows 错误消息:无法登录到你的帐户 - Microsoft 支持](https://support.microsoft.com/zh-cn/windows/18d55f00-a6e7-9106-29ee-54fa223c0ca8) +- [修复 Windows 中损坏的用户配置文件 - Microsoft 支持](https://support.microsoft.com/zh-cn/windows/1cf41c18-7ce3-12f9-8e1d-95896661c5c9) + +## 操作步骤 + +> 注意: +> 步骤与官方帮助文档中的不完全一致。 +> 对于不同的情况,该方法不一定有效。 +> 本文中的**原账户**用户名为 `my-user`,**新账户**用户名为 `temp-user`。 + +### 一、创建新的本地帐户并设置为管理员 + +1. 打开系统 “设置” 中的 “账户 - 家庭和其他用户” 页面。 +2. 点击 “将其他人添加到这台电脑”,等待对话框内容加载。 + ​![设置](assets/network-asset-settings-add-user-1-20250315222636-uutpf1a.png "设置") +3. 点击 “我没有此人的登录信息”,然后在下一页点击 “添加一个没有 Microsoft 帐户的用户”。 + ​![设置](assets/network-asset-settings-add-user-2-20250315222637-3vehn3q.png "设置") + ​![设置](assets/network-asset-settings-add-user-3-20250315222637-wet8f7c.png "设置") +4. 根据提示,输入用户名和密码等信息(密码可以为空),然后点击 “下一步”。 +5. 在账户列表中选择创建的新账户,然后点击 “更改帐户类型”。 + ​![设置](assets/network-asset-settings-user-actions-20250315222637-6clegcb.png "设置") +6. 在 “帐户类型” 中,选择 “管理员”,然后点击 “确定”。 + ​![设置](assets/network-asset-settings-change-user-type-20250315222637-1s97ium.png "设置") +7. 重启系统,然后使用**新的管理员帐户**登录。 + +**注意:若原账户没有设置密码,系统启动后可能会自动登录原账户,则需要按以下步骤修改注册表。** + +1. 右键任务栏中的 “Windows” 图标,点击 “运行”,输入 “regedit”,然后点击 “确定”。 +2. 在注册表编辑器的地址栏中输入 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`,按下回车键(Enter)。 +3. 双击 `DefaultUserName` 项,输入新账户的用户名,然后点击 “确定”。 + ​![注册表编辑器](assets/network-asset-regedit-defaultusername-20250315222637-sr47gip.png "注册表编辑器") +4. 关闭注册表编辑器。 + +### 二、将原账户的用户数据文件夹移动到其它地方 + +1. 打开 `C:\Users` 文件夹,右键点击名称为**原账户**用户名的文件夹,点击 “剪切”(或使用快捷键 `Ctrl + X`)。 + ​![剪切](assets/network-asset-user-data-cut-20250315222637-f2o5a0x.png "剪切") +2. 打开用于放置该文件夹的目录,右键点击空白处,选择 “粘贴”(或使用快捷键 `Ctrl + V`)。 + ​![粘贴](assets/network-asset-user-data-paste-20250315222637-8x3flj0.png "粘贴") + 若提示 “你需要提供管理员权限才能移动此文件夹”,则点击 “继续”。 + ​![权限](assets/network-asset-user-data-permission-20250315222638-cu41iou.png "权限") + +### 三、确认用户数据移动情况 + +1. 右键点击资源管理器左侧边栏中的 “此电脑”,选择 “属性”。 + ​![右键菜单](assets/network-asset-this-computer-right-menu-20250315222638-v2gvwnh.png "右键菜单") +2. 在打开的 “设置” 窗口中点击 “高级系统设置”。 + ​![设置](assets/network-asset-settings-sys-properties-20250315222638-7x0ubnb.png "设置") +3. 切换到 “高级” 标签页,点击 “用户配置文件” 项中的 “设置”。 + ​![系统属性](assets/network-asset-sys-properties-user-profiles-20250315222638-s5osk9p.png "系统属性") +4. 正常情况下,窗口中的 “储存在本机上的配置文件” 列表不包含原账户的信息。 + ​![配置文件列表](assets/network-asset-user-profile-list-20250315222638-6idg29j.png "配置文件列表") +5. 关闭 “用户配置文件” 和 “系统属性” 窗口。 + +### 四、删除原账户,然后重新创建 + +> 后来用虚拟机测试过发现如果不重新创建账户,还是会弹出 “无法登录到你的账户” 提示。 + +1. 打开系统 “设置” 中的 “账户 - 家庭和其他用户” 页面。 +2. 在账户列表中选择**原账户**,然后点击 “删除”。 +3. 点击 “将其他人添加到这台电脑”,等待对话框内容加载。 +4. 点击 “我没有此人的登录信息”,然后在下一页点击 “添加一个没有 Microsoft 帐户的用户”。 +5. 根据提示,输入用户名和密码等信息(密码可以为空),然后点击 “下一步”。 + + > 注意:用户名必须与原来保持一致,否则一些使用绝对路径读写用户数据的软件可能会出现异常。 + > +6. 在账户列表中选择创建的账户(**以下仍称为 “原账户”** ),然后点击 “更改帐户类型”。 +7. 在 “帐户类型” 中,选择 “管理员”,然后点击 “确定”。 + +### 五、登录原账户进行初始化 + +1. 右键任务栏中的 “Windows” 图标,选择 “关机或注销”,点击 “注销”。 + ​![注销](assets/network-asset-menu-logout-20250315222638-6h7d5hd.png "注销") +2. 登录**原账户**,等待初始化,并根据提示进行相关设置。 +3. 重启系统,再次登录**原账户**(若系统自动登录了新账户,则需要先 “注销” 再切换到原账户)。 + +**注意:正常情况下,由于原账户的数据已重置,此时登录原账户不会弹出 “无法登录到你的账户” 提示。若仍然弹出该提示,则表示该错误是系统问题导致,无法通过该方法解决。** + +### 六、登录新账户,还原原账户的数据 + +1. 重启系统,登录**新账户**(确保系统启动后初次登录的是**新账户**)。 +2. 打开资源管理器,在 “显示 / 隐藏” 中勾选 “隐藏的项目”。 + ​![显示隐藏的项目](assets/network-asset-explorer-show-hidden-items-20250315222638-qo64e3c.png "显示隐藏的项目") +3. 打开 `C:\Users` 文件夹,进入名称为**原账户**用户名的文件夹(以下称为 `user_data`)。 + 若提示 “你当前无权限访问该文件夹。单击‘继续’获取永久访问该文件夹的权限。”,则点击 “是”。 + ​![文件夹权限](assets/network-asset-folder-permission-20250315222638-q4sv7jn.png "文件夹权限") +4. 打开 “第二步” 中移动的用户数据文件夹(以下称为 `backup_data`)。 +5. 将 `backup_data` 中的文件夹和文件依次移动到 `user_data` 中。 + **注意** + 不需要移动文件名以 `ntuser` 或 `NTUSER` 开头的文件。 + ​![ntuser](assets/network-asset-ntuser-files-20250315222639-1xlzxem.png "ntuser") + 不需要移动图标左下角带箭头的隐藏文件夹。 + ​![箭头文件夹](assets/network-asset-linked-folders-20250315222639-ejwvemn.png "箭头文件夹") + 移动文件夹前需要先把 `user_data` 中对应的文件夹删除。 + 若文件夹中没有实际的文件,可以不移动。 + ​![空文件夹](assets/network-asset-empty-folder-20250315222639-8gpgu8t.png "空文件夹") + +### 七、登录原账户,验证结果 + +1. 右键任务栏中的 “Windows” 图标,选择 “关机或注销”,点击 “注销”。 + ​![注销](assets/network-asset-menu-logout-20250315222639-b8pu7z0.png "注销") +2. 登录**原账户**。 +3. 若系统不再弹出 “无法登录到你的账户”,则表示成功。 + +### 八、删除新账户 + +1. 打开系统 “设置” 中的 “账户 - 家庭和其他用户” 页面。 +2. 在账户列表中选择**新账户**,然后点击 “删除”。 + ​![设置](assets/network-asset-settings-user-actions-20250315222639-lqpmk9y.png "设置") + +‍ diff --git a/docs/content/windows-antivirus-ability-test.md b/docs/content/windows-antivirus-ability-test.md new file mode 100644 index 0000000..607fc18 --- /dev/null +++ b/docs/content/windows-antivirus-ability-test.md @@ -0,0 +1,34 @@ +--- +title: 杀毒软件能力测试 +date: 2025-03-19T11:48:36Z +lastmod: 2025-03-19T11:49:20Z +tags: [测试,软件] +--- + +# 杀毒软件能力测试 + +参考资料: [百度百科](https://baike.baidu.com/item/EICAR/10506202) + +--- + +## 操作方式 + +把下方内容复制到记事本中,保存为文本文件,观察杀毒软件的反应。 + +```text +X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* +``` + +## 注意 + +- 要把杀毒软件的全部功能打开才能测出杀毒软件的真正能力。 + +## 等级评定 + +- **特等** 复制完代码后就提示病毒 +- **优等** 刚保存完就提示病毒(或者直接删除) +- **中等** 保存后几秒提示病毒(或者直接删除) +- **下等** 需自己启动病毒扫描查杀才提示病毒(或者直接删除) +- **劣等** 无论怎么扫描都无法提示病毒 + +‍ diff --git a/docs/content/windows-bat-anti-autorun-virus.md b/docs/content/windows-bat-anti-autorun-virus.md new file mode 100644 index 0000000..cc4b57f --- /dev/null +++ b/docs/content/windows-bat-anti-autorun-virus.md @@ -0,0 +1,77 @@ +--- +title: 「BAT工具」防止病毒在打开U盘时自动运行 +date: 2025-03-16T21:39:48Z +lastmod: 2025-03-16T21:41:56Z +tags: [Windows,代码片段,BAT,工具,脚本] +--- + +# 「BAT工具」防止病毒在打开U盘时自动运行 + +参考资料:[百度百科](https://baike.baidu.com/item/autorun.inf/10548193) + +注意事项:运行前可能需要关闭杀毒软件(例如 360),以免误报。 + +--- + +## 方法一(手动创建文件) + +### 步骤 + +1. 新建一个空白的 `文本文档`。 +2. 写入以下内容: + + ```bat + @echo off + title 防止病毒在打开U盘时自动运行 + :choose + echo 请选择需要进行的操作: + echo 1. 启用(不能自动运行) + echo 2. 停用(能自动运行) + echo 3. 退出 + echo; + set /p choose=选择: + if /i '%choose%'=='1' goto job_1 + if /i '%choose%'=='2' goto job_2 + if /i '%choose%'=='3' goto end + cls && echo 选择有误,请重新输入 && echo; && goto choose + :job_1 + echo; + echo 第一步: 删除已存在的 AUTORUN.INF 文件(若有) + del /F /Q AUTORUN.INF + del /F /Q /A:H AUTORUN.INF + del /F /Q /A:R AUTORUN.INF + del /F /Q /A:S AUTORUN.INF + echo 第二步: 创建 AUTORUN.INF 文件夹 + md AUTORUN.INF + echo 第三步: 进入 AUTORUN.INF 文件夹并创建 CON\ 文件夹 + cd AUTORUN.INF && md CON\ && cd .. + echo; && echo 操作已结束 + goto end + :job_2 + echo; + echo 第一步: 进入 AUTORUN.INF 文件夹 + cd AUTORUN.INF + echo 第二步: 删除 CON\ 文件夹 + rd CON\ + echo 第三步: 返回上一级文件夹并删除 AUTORUN.INF 文件夹 + cd .. && rd AUTORUN.INF + echo; && echo 操作已结束 + goto end + :end + echo; + pause + exit + ``` +3. 把它重命名为 `AntiAutorun.bat`(`文件名` 可以不一样,但 `扩展名` 必须为 `.bat`)。 +4. 把文件放到U盘 `根目录` 下,运行,根据提示操作(保留文件,可多次使用)。 + +--- + +## 方法二(直接下载文件) + +### 步骤 + +1. 下载此 BAT 脚本文件([AntiAutorun.bat](https://c.frost-zx.top/data/static/script/AntiAutorun.bat))。 +2. 把文件放到U盘 `根目录` 下,运行,根据提示操作(保留文件,可多次使用)。 + +‍ diff --git a/docs/content/windows-command-forfiles.md b/docs/content/windows-command-forfiles.md new file mode 100644 index 0000000..34b1737 --- /dev/null +++ b/docs/content/windows-command-forfiles.md @@ -0,0 +1,109 @@ +--- +title: Windows forfiles 命令 +date: 2025-03-16T16:07:42Z +lastmod: 2025-03-16T16:08:11Z +tags: [Windows,命令,命令提示符] +--- + +# Windows forfiles 命令 + +## 参考 + +[forfiles | Microsoft Docs](https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/forfiles) + +## 简介 + +forfiles 命令用于对单个文件或一组文件执行特定的命令,通常用于批量处理文件。 + +## 命令语法 + +```text +forfiles [/P pathname] [/M searchmask] [/S] + [/C command] [/D [+ | -] {yyyy-MM-dd | dd}] +``` + +## 命令参数 + +``` +/P pathname 表示开始搜索的路径。默认文件夹是当前工作的目录(.)。 + +/M searchmask 根据搜索掩码搜索文件。默认搜索掩码是 '*'。 + +/S 指导 forfiles 递归到子目录。像 "DIR /S"。 + +/C command 表示为每个文件执行的命令。命令字符串应该用双引号括起来。 + + 默认命令是 "cmd /c echo @file"。下列变量可以用在命令字符串中: + + @file - 返回文件名。 + @fname - 返回不带扩展名的文件名。 + + @ext - 只返回文件的扩展名。 + + @path - 返回文件的完整路径。 + @relpath - 返回文件的相对路径。 + + @isdir - 如果文件类型是目录,返回 "TRUE";如果是文件,返回 "FALSE"。 + @fsize - 以字节为单位返回文件大小。 + + @fdate - 返回文件上一次修改的日期。 + + @ftime - 返回文件上一次修改的时间。 + + 要在命令行包括特殊字符,字符请以 0xHH 形式 + 使用十六进制代码(例如 0x09 为 tab)。 + + 内部 CMD.exe 命令前面应以 "cmd /c" 开始。 + +/D date 选择文件,其上一次修改日期大于或等于(+), + 或者小于或等于(-)用 "yyyy-MM-dd" 格式指定的日期; + + 或选择文件,其上一次修改日期大于或等于(+)当前日期加 "dd" 天, + 或者小于或等于(-)当前日期减 "dd" 天。 + 有效的 "dd" 天数可以是 0 - 32768 范围内的任何数字。 + 如果没有指定,"+" 被当作默认符号。 + +/? 显示此帮助消息。 +``` + +## 命令示例 + +```text +FORFILES +FORFILES /? +FORFILES /P C:\WINDOWS /S /M DNS*.* +FORFILES /S /M *.txt /C "cmd /C type @file | more" +FORFILES /P C:\ /S /M *.bat +FORFILES /D -30 /M *.exe /C "cmd /C ECHO @path 0x09 在 30 前就被更改。" +FORFILES /D 2001-01-01 /C "cmd /C ECHO @fname 在 2001年1月1日就是新的。" +FORFILES /D +2021-8-30 /C "cmd /C ECHO @fname 今天是新的。" +FORFILES /M *.exe /D +1 +FORFILES /S /M *.doc /C "cmd /C ECHO @fsize" +FORFILES /M *.txt /C "cmd /C if @isdir==FALSE notepad.exe @file" +``` + +### 列出当前文件夹下所有文件和文件夹的相对路径 + +```bat +FORFILES /S /C "cmd /C ECHO @relpath" +``` + +### 删除指定文件夹下指定天数前的文件 + +```bat +FORFILES /P <文件路径> /M <搜索掩码> /S /C "cmd /C IF @isdir==FALSE DEL @path /F /Q" /D <文件日期> +``` + +> **<文件路径>** 示例:`"D:\Example\Folder"`、`".\Example\Folder"`​ +> +> **<搜索掩码>** 示例:`*.exe`、`*.png`、`*.txt`​ +> +> **<文件日期>** 示例:`-100`(100 天前)、`-200`(200 天前)、`-365`(365 天前) + +## 相关链接 + +- [Microsoft Docs - forfiles](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/forfiles) +- [CSDN - forfiles 命令说明 & 用法示例](https://blog.csdn.net/sandy9919/article/details/82932460) +- [CSDN - 使用 CMD 删除指定文件夹下指定时间的文件](https://blog.csdn.net/qq_35957944/article/details/108282201) + +‍ diff --git a/docs/content/windows-command-mklink.md b/docs/content/windows-command-mklink.md new file mode 100644 index 0000000..12bdc3f --- /dev/null +++ b/docs/content/windows-command-mklink.md @@ -0,0 +1,67 @@ +--- +title: Windows mklink 命令 +date: 2025-03-15T22:29:09Z +lastmod: 2025-03-15T22:30:51Z +tags: [Windows,命令,命令提示符] +--- + +# Windows mklink 命令 + +## 参考 + +- [mklink | Microsoft Docs](https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/mklink) +- [Windows 中的 mklink 命令 | 始终](https://liam.page/2018/12/10/mklink-in-Windows/) + +## 简介 + +该命令用于在 Windows 系统上创建对于文件或目录的符号链接,类似 Linux 上的 `ln` 命令,但两者的功能不完全相同。 + +该命令创建的链接与 “快捷方式” 功能创建的链接并不相同。 + +使用该命令创建链接时需要拥有管理员权限,否则无法创建,并提示 “你没有足够的权限执行此操作”。 + +## 命令语法 + +```plaintext +mklink [[/d] | [/h] | [/j]] link target + + /d 创建目录符号链接。 + /h 创建硬链接而非符号链接。 + /j 创建目录联接。 + link 指定要创建的符号链接的名称。 + target 指定新链接引用的路径(相对或绝对)。 +``` + +默认情况下,该命令创建的是文件符号链接。 + +## 参数效果对比 + +|描述|不带参数|/D 参数|/H 参数|/J 参数| +| ------------------| ---------------| --------------------| ----------------| --------------------| +|中文名称|符号链接|符号链接|硬链接|联接| +|英文名称|Symbolic Link|Symbolic Link|Hard Link|Junction| +|作用对象|文件|目录|文件|目录| +|是否一定指向路径|否|否|否|是| +|dir 类型|SYMLINK|SYMLINK|无特殊显示|JUNCTION| +|资源管理器类型|.symlink|文件夹|无特殊显示|文件夹| +|资源管理器图标|快捷方式|文件夹快捷方式|无特殊显示|文件夹快捷方式| +|修改同步|是|是|是|是| +|删除同步|否|否|否|否| +|彻底删除源|删除源路径|删除源路径|删除所有硬链接|删除源路径| +|引用错误报错|无|引用了不可用的位置|-|引用了不可用的位置| + +## 命令示例 + +### 将部分软件在 C 盘的数据转移到其他分区 + +例如 + +```bat +@REM 1. 将文件夹移动到新的路径(例如 D:\Minecraft\Main\.minecraft\) +@REM 2. 执行 `cd` 命令,切换工作目录 +cd /d C:\Users\用户名\AppData\Roaming +@REM 3. 执行 `mklink /j` 命令,创建目录联接 +mklink /j .minecraft D:\Minecraft\Main\.minecraft +``` + +‍ diff --git a/docs/content/windows-command-prompt-file-checksum.md b/docs/content/windows-command-prompt-file-checksum.md new file mode 100644 index 0000000..8494684 --- /dev/null +++ b/docs/content/windows-command-prompt-file-checksum.md @@ -0,0 +1,53 @@ +--- +title: Windows 通过命令提示符校验文件(MD5、SHA1等) +date: 2025-03-16T18:30:47Z +lastmod: 2025-03-16T18:33:57Z +tags: [Windows,命令,命令提示符,校验,CertUtil] +--- + +# Windows 通过命令提示符校验文件(MD5、SHA1等) + +用到的命令:CertUtil + +已测试系统:Windows 7、Windows 10、Windows Server 2012 R2 + +--- + +## 使用方法 + +### 命令 + +```plaintext +CertUtil -hashfile 文件路径 [算法] +``` + +### 使用举例 + +校验 `当前路径` 下的 `Test.zip` 的 MD5 + +```plaintext +CertUtil -hashfile Test.zip MD5 +``` + +校验 `D:\Temp\ZIP\Test.zip` 的 SHA1 + +```plaintext +CertUtil -hashfile "D:\Temp\ZIP\Test.zip" SHA1 +``` + +### 使用截图 + +![命令提示符](assets/network-asset-checksum-01-20250316183328-2ijfqbg.png) +​![软件](assets/network-asset-checksum-02-20250316183328-mewlvcs.png) + +### 支持的算法 + +- MD2 +- MD4 +- MD5 +- SHA1 +- SHA256 +- SHA384 +- SHA512 + +‍ diff --git a/docs/content/windows-rdp-custom-port-and-60fps.md b/docs/content/windows-rdp-custom-port-and-60fps.md new file mode 100644 index 0000000..02b176e --- /dev/null +++ b/docs/content/windows-rdp-custom-port-and-60fps.md @@ -0,0 +1,87 @@ +--- +title: 修改 Windows 远程桌面端口以及开启 60FPS +date: 2025-03-16T19:08:57Z +lastmod: 2025-03-16T19:12:48Z +tags: [Windows,教程,远程桌面] +--- + +# 修改 Windows 远程桌面端口以及开启 60FPS + +## 参考资料 + +- [百度经验](https://jingyan.baidu.com/article/ce43664928d5293773afd39b.html) +- [Microsoft 支持](https://support.microsoft.com/en-us/help/2885213/frame-rate-is-limited-to-30-fps-in-windows-8-and-windows-server-2012-r) + +## 修改远程桌面端口 + +> **请仔细按照本说明中的步骤操作。如果错误地修改了注册表,可能会导致系统出现严重问题。** +> +> 已测试:Windows 7、Windows 8、Windows 10、Windows Server 2012、Windows Server 2016 + +#### 用到的工具 + +- Windows 注册表编辑器(regedit.exe) + +#### 步骤 + +1. 启动 `注册表编辑器`。 + + > 打开 `运行` —— 输入 `regedit` —— 点击 `确定`​ + > +2. 找到并 `点击` 以下注册表子项。 + + ```text + HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp + ``` +3. ​`鼠标右键` 点击 `PortNumber`,然后点击 `修改`。 +4. ​`选中` 弹出来的对话框中的 `十进制`,把 `数值数据` 输入框中的 `数字`(默认是 3389)改为 `新的端口号`(不能与已使用的端口相同),然后点击 `确定`。 +5. 找到并 `点击` 以下注册表子项: + + ```text + HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp + ``` +6. ​`鼠标右键` 点击 `PortNumber`,然后点击 `修改`。 +7. ​`选中` 弹出来的对话框中的 `十进制`,把 `数值数据` 输入框中的 `数字`(默认是 3389)改为 `想要的端口号`,然后点击 `确定`。 +8. 关闭 `注册表编辑器`,然后 `重新启动` 系统,以应用设定。 + +--- + +## 开启 60FPS + +> **请仔细按照本说明中的步骤操作。如果错误地修改了注册表,可能会导致系统出现严重问题。** +> +> 已测试:Windows 8、Windows 10、Windows Server 2012、Windows Server 2016 + +#### 用到的工具 + +- Windows 注册表编辑器(regedit.exe) + +#### 步骤 + +1. 启动 `注册表编辑器`。 + + > 打开 `运行` —— 输入 `regedit` —— 点击 `确定`​ + > +2. 找到并 `点击` 以下注册表子项: + + ```text + HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations + ``` +3. 在 `编辑` 菜单上,点击 `新建`,然后点击 `DWORD(32-bit)值`。 +4. 输入 `DWMFRAMEINTERVAL`,然后按 `Enter` 键。 +5. ​`鼠标右键` 点击 `DWMFRAMEINTERVAL`,然后点击 `修改`。 +6. ​`选中` 弹出来的对话框中的 `十进制`,在 `数值数据` 输入框中,输入 `16`,然后点击 `确定`。 + + > **注意** + > + > 仅修改了远程桌面会话允许传输并显示的最大帧率,在远程桌面会话中的实际帧率取决于其他因素。 + > + > 并非所有的远程显示协议都支持大于 30 FPS。 + > + > 此注册表项也可以用于限制远程桌面的帧率。 + > + > 数值计算方式:`1000 / 最大 FPS`(数值越小,FPS 越高) + > +7. 关闭 `注册表编辑器`,然后重新连接远程桌面或重新启动系统,以应用设定。 + +‍ diff --git a/docs/content/windows-run-minecraft-with-discrete-graphics-card.md b/docs/content/windows-run-minecraft-with-discrete-graphics-card.md new file mode 100644 index 0000000..3c3cee0 --- /dev/null +++ b/docs/content/windows-run-minecraft-with-discrete-graphics-card.md @@ -0,0 +1,30 @@ +--- +title: Windows 10 设置独立显卡运行 Minecraft +date: 2025-03-16T16:01:49Z +lastmod: 2025-03-16T16:02:22Z +tags: [Minecraft,Windows,Java,配置] +--- + +# Windows 10 设置独立显卡运行 Minecraft + +## 操作步骤 + +1. 打开“Windows 设置”,点击“系统”。 + ​![截图](assets/network-asset-01-20250316163935-rkvoa6y.png "截图") +2. 点击“显示”选项卡下方的“图形设置”。 + ​![截图](assets/network-asset-02-20250316163935-pjkkzbs.png "截图") +3. 在“选择要设置首选项的应用”中选择“桌面应用”(一般情况下,默认为该选项),然后点击“浏览”,将 `java.exe` 和 `javaw.exe` 添加进来。 + ​![截图](assets/network-asset-03-20250316163935-pc8y963.png "截图") + ​`java.exe` 和 `javaw.exe` 在 Java 安装路径的 `bin` 文件夹中。 + 默认的 Java 安装路径的父路径为: + + ```text + C:\Program Files\Java\ + C:\Program Files (x86)\Java\ + ``` +4. 点击每一项中的“选项”,打开对应的“图形首选项”对话框。 + ​![截图](assets/network-asset-04-20250316163936-tfcpoky.png "截图") +5. 在对话框中选择“性能”(一般情况下,该选项对应独立显卡,实际可参考下方的文本),然后点击“保存”。 + ​![截图](assets/network-asset-05-20250316163936-c1g0etk.png "截图") + +‍ diff --git a/docs/content/windows-useful-tools.md b/docs/content/windows-useful-tools.md new file mode 100644 index 0000000..5eab160 --- /dev/null +++ b/docs/content/windows-useful-tools.md @@ -0,0 +1,104 @@ +--- +title: Windows 实用小工具推荐 +date: 2025-03-16T16:18:24Z +lastmod: 2025-03-16T16:19:42Z +tags: [推荐,软件,Windows] +--- + +# Windows 实用小工具推荐 + +软件名称:DeskPins、LICEcap、OnTopReplica、PiP-Tool + +已测试系统:Windows 7、Windows 10 + +--- + +## DeskPins - 将任意的窗口置顶 + +### 简介 + +我们经常需要打开多个软件窗口,有时可能需要让某个窗口保持置顶显示,方便查看。 + +但是部分软件没有内置“置顶”功能,而且 Windows 也没有提供相关功能。 + +这时候就可以借助 `DeskPins` 这个小工具,让任意窗口置顶显示。 + +### 使用方法 / 功能介绍 + +安装并运行软件后,可以在任务栏托盘中看到软件的图标: + +![](https://c.frost-zx.top/data/uploads/blog/windows-useful-tools/DeskPins_01.png) + +右键图标,可以打开它的菜单: + +![](https://c.frost-zx.top/data/uploads/blog/windows-useful-tools/DeskPins_02.png) + +点击右键菜单中的 `Options...`,打开设置选项界面: + +- 设置图钉图标的样式(颜色、跟踪速率)以及托盘图标激活方式(单击 / 双击) + ​![](https://c.frost-zx.top/data/uploads/blog/windows-useful-tools/DeskPins_03.png) +- 设置自动置顶窗口 + + > 试了下,设置之后好像没有效果,可能规则没写对? + > + + ![](https://c.frost-zx.top/data/uploads/blog/windows-useful-tools/DeskPins_04.png) +- 设置快捷键 + ​![](https://c.frost-zx.top/data/uploads/blog/windows-useful-tools/DeskPins_05.png) + +在需要置顶窗口时,可以通过以下三种方式之一进入 `Pin Mode`​ + +- 单击或双击托盘图标(由 `TrayIcon Activation` 设置决定) +- 点击右键菜单中的 `Enter pin mode`​ +- 按下快捷键(默认 `Ctrl` + `F11`) + +进入 `Pin Mode` 后(此时鼠标指针的样式会变为图钉),点击目标窗口即可将其置顶; + +也可直接按下快捷键(默认 `Ctrl` + `F12`)将当前窗口置顶。 + +置顶的窗口上方会有一枚“图钉”,点击它可以取消置顶(也可以点击右键菜单中的 `Remove all pins` 取消全部)。 + +![](https://c.frost-zx.top/data/uploads/blog/windows-useful-tools/DeskPins_06.png) + +## LICEcap - GIF 录屏工具 + +### 简介 + +LICEcap 是一款免费、开源的 GIF 录制软件。 + +启动软件后,会显示一个内部透明的窗口框,它可以将框内的内容录制下来并保存为 GIF 格式的图片。 + +网站:[https://www.cockos.com/licecap/](https://www.cockos.com/licecap/) + +### 特性 + +- 直接录制为 .GIF 或 .LCF 文件。 +- 录制时可移动窗口。 +- 录制时可暂停,也可以插入文本信息(仅支持英文)。 +- 录制时可以使用全局快捷键(`Shift` + `空格`)暂停录制。 +- 可调整最大帧率,以限制 CPU 使用率。 +- 可设置标题帧。 +- 可记录鼠标点击。 +- 可显示录制用时。 + +### 注意 + +- 文件保存路径不可以有中文,否则可能无法保存。 + +## OnTopReplica - 画中画 + +一个应用程序窗口画中画工具,适用于 Windows Vista、Windows 7、 Windows 8 以及 10。 + +这个工具默认显示一个空白的置顶窗口,可以选择当前系统中的其他窗口,让它显示在其中。 + +对于监控后台进程、工作时查阅资料等情况非常实用。 + +GitHub: [LorenzCK / OnTopReplica](https://github.com/LorenzCK/OnTopReplica) + +## PiP-Tool - 画中画 + +另一个应用程序窗口画中画工具,但功能比 OnTopReplica 少,只有简单的应用程序选择和区域裁剪功能。 + +GitHub: [LionelJouin / PiP-Tool](https://github.com/LionelJouin/PiP-Tool) + +‍ diff --git a/docs/content/windows-vbs-code.md b/docs/content/windows-vbs-code.md new file mode 100644 index 0000000..94ce385 --- /dev/null +++ b/docs/content/windows-vbs-code.md @@ -0,0 +1,255 @@ +--- +title: 「合集」VBS 代码 +date: 2025-03-16T22:03:27Z +lastmod: 2025-03-16T22:06:33Z +tags: [合集,Windows,VBS,脚本,代码片段] +--- + +# 「合集」VBS 代码 + +## 激活窗口 + +```vbs +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +WshShell.AppActivate "窗口标题" +``` + +--- + +## 模拟输入 + +```vbs +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +WshShell.SendKeys "按键" +``` + +参考:[博客园](https://www.cnblogs.com/xhyang110/archive/2011/03/25/1995327.html) + +**1. 基本键** + +一般来说,要发送的按键都可以直接用该按键字符本身来表示: + +> 发送字母 `X`,用 `WshShell.SendKeys "X"`。 + +也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可: + +> 发送按键 `Test`,用 `WshShell.SendKeys "Test"`。 + +**2. 特殊功能键** + +对于需要与 `Shift`、`Ctrl`、`Alt` 三个控制键组合的按键,SendKeys 使用特殊字符来表示: + +|按键|代码| +| :------| :----------------------| +|Shift|WshShell.SendKeys "+"| +|Ctrl|WshShell.SendKeys "^"| +|Alt|WshShell.SendKeys "%"| + +> 注意:这样使用时,不需要使用 `大括号` 括起这些特殊字符。 + +由于 `+`、`^` 这些字符用来表示特殊的控制按键,所以如果要表示这些 `字符` 的按键,要用 `大括号` 括住这些字符: + +> 发送加号 `+`,用 `WshShell.SendKeys "{+}"`。 + +对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称。 +如果发送是基本字符用 `“”` 括起来: + +> 发送 `回车键`,用 `WshShell.SendKeys "{ENTER}"` +> 发送 `向下的方向键`,用 `WshShell.SendKeys "{DOWN}"`​ + +**3. 组合键** + +发送 `Ctrl + Shift + ESC`,用 `WshShell.SendKeys "^+{ESC}"`。 + +**4. 发送多个重复的单字母按键** + +不必重复输入该字母,SendKeys 允许使用简化格式进行描述。 +使用格式:`{按键 数字}`​ + +> 发送 10 个字母 `X`,用 `WshShell.SendKeys "{X 10}"`。 + +**5. 列表** + +|按键|代码| +| :------------------| :----------------------------| +|↑(UP ARROW)|{UP}| +|↓(DOWN ARROW)|{DOWN}| +|←(LEFT ARROW)|{LEFT}| +|→(RIGHT ARROW)|{RIGHT}| +|BACKSPACE|{BACKSPACE} / {BS} / {BKSP}| +|BREAK|{BREAK}| +|CAPS LOCK|{CAPSLOCK}| +|DEL(Delete)|{Delete} / {DEL}| +|END|{END}| +|ENTER|{ENTER} / ~| +|ESC|{ESC}| +|HELP|{HELP}| +|HOME|{HOME}| +|INS(Insert)|{Insert} / {INS}| +|NUM LOCK|{NUMLOCK}| +|PAGE DOWN|{PGDN}| +|PAGE UP|{PGUP}| +|PRINT SCREEN|{PRTSC}| +|SCROLL LOCK|{SCROLLLOCK}| +|Space|​` `(空格)| +|TAB|{TAB}| +|F1|{F1}| +|F2|{F2}| +|F3|{F3}| +|F4|{F4}| +|F5|{F5}| +|F6|{F6}| +|F7|{F7}| +|F8|{F8}| +|F9|{F9}| +|F10|{F10}| + +--- + +## 循环 + +```vbs +do +... +loop +``` + +--- + +## 语音合成(TTS) + +```vbs +CreateObject("SAPI.SpVoice").Speak "内容" +``` + +--- + +## 暂停 + +```vbs +WScript.Sleep 毫秒 +``` + +--- + +## 示例代码 + +### 模拟输入 + +#### 键盘灯闪烁 + +倒计时(时间到后闪烁 NumLock 5 次,间隔 0.2s) + +```vbs +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +m = InputBox("分") +s = InputBox("秒") +WScript.sleep m*6000+s*1000 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +WScript.sleep 200 +WshShell.SendKeys "{NUMLOCK}" +``` + +循环闪烁(NumLock,间隔 1s) + +```vbs +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +do +WshShell.SendKeys "{NUMLOCK}" +WScript.Sleep 1000 +loop +``` + +循环闪烁(NumLock,自定义间隔) + +```vbs +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +t = InputBox("请输入闪烁间隔(毫秒)") +do +WshShell.SendKeys "{NUMLOCK}" +WScript.Sleep t +loop +``` + +循环闪烁(3 灯轮换,间隔 0.5s) + +```vbs +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +WshShell.SendKeys "{NUMLOCK}" +WScript.Sleep 500 +WshShell.SendKeys "{NUMLOCK}" +WScript.Sleep 500 +do +WshShell.SendKeys "{NUMLOCK}" +WshShell.SendKeys "{CAPSLOCK}" +WScript.Sleep 500 +WshShell.SendKeys "{CAPSLOCK}" +WshShell.SendKeys "{SCROLLLOCK}" +WScript.Sleep 500 +WshShell.SendKeys "{SCROLLLOCK}" +WshShell.SendKeys "{NUMLOCK}" +WScript.Sleep 500 +loop +``` + +### 提示框 + +#### 简易,有输入框 + +```vbs +Dim i, msg +msg = "请输入内容:" +i = InputBox(msg) +Msgbox i +``` + +### 音乐播放器 + +#### 简易,有输入框 + +```vbs +Set Player = CreateObject("WMPlayer.OCX") +song = InputBox("请输入歌曲路径" & vbCrLf & "", "简易音乐播放器 [等待中]") +if song <>"" then +do +Player.url = song +song = InputBox(song & vbCrLf & "", "简易音乐播放器 [正在播放]", song) +if song = "" then exit do +loop +end if +Set Player = nothing +``` + +### 语音合成 + +#### 有输入框 + +```vbs +Set s = CreateObject("SAPI.SpVoice") +i = InputBox("请输入内容" & vbCrLf & "", "语音合成 [等待中]") +s.speak i +``` + +‍ diff --git a/docs/content/wtp-video-show-201802-201807.md b/docs/content/wtp-video-show-201802-201807.md new file mode 100644 index 0000000..cd48753 --- /dev/null +++ b/docs/content/wtp-video-show-201802-201807.md @@ -0,0 +1,28 @@ +--- +title: 「MC」麦子茶会展示(201802 - 201807) +date: 2025-03-22T22:11:32Z +lastmod: 2025-03-22T22:14:13Z +tags: [Minecraft,麦子服务器,视频] +--- + +# 「MC」麦子茶会展示(201802 - 201807) + +## 播放器 + + + +## 分P + +- [蘑菇岛(2018-07-03)](https://www.bilibili.com/video/av18576113) +- [抽奖机(2018-07-03)](https://www.bilibili.com/video/av18576113) +- [麦子铁路总局(2018-07-03)](https://www.bilibili.com/video/av18576113) +- [麦子轨道交通 1 号线车辆段 & 车库(2018-07-03)](https://www.bilibili.com/video/av18576113) +- [红绿灯-2(2018-07-03)](https://www.bilibili.com/video/av18576113) +- [红绿灯-1-1(2018-02-05)](https://www.bilibili.com/video/av18576113) +- [红绿灯-1-2(2018-02-05)](https://www.bilibili.com/video/av18576113) +- [电梯(2018-02-03)](https://www.bilibili.com/video/av18576113) +- [麦子通(2018-02-03)](https://www.bilibili.com/video/av18576113) +- [列车进站倒计时(2018-02-03)](https://www.bilibili.com/video/av18576113) +- [列车进站 & 出站(2018-02-03)](https://www.bilibili.com/video/av18576113) + +‍ diff --git a/docs/content/wtp-video-wr-l1-1.md b/docs/content/wtp-video-wr-l1-1.md new file mode 100644 index 0000000..2e940f3 --- /dev/null +++ b/docs/content/wtp-video-wr-l1-1.md @@ -0,0 +1,12 @@ +--- +title: 「MC」麦子轨道交通 1 号线 1 期展示 +date: 2025-03-22T22:10:10Z +lastmod: 2025-03-22T22:15:04Z +tags: [Minecraft,麦子服务器,视频] +--- + +# 「MC」麦子轨道交通 1 号线 1 期展示 + + + +‍ diff --git a/docs/content/wtp-video-wr-l1-2.md b/docs/content/wtp-video-wr-l1-2.md new file mode 100644 index 0000000..e714ad3 --- /dev/null +++ b/docs/content/wtp-video-wr-l1-2.md @@ -0,0 +1,12 @@ +--- +title: 「MC」麦子轨道交通 1 号线 2 期展示 +date: 2025-03-22T22:07:17Z +lastmod: 2025-03-22T22:15:13Z +tags: [Minecraft,麦子服务器,视频] +--- + +# 「MC」麦子轨道交通 1 号线 2 期展示 + + + +‍ diff --git a/docs/content/wtp-video-wr-l1-preview-201805.md b/docs/content/wtp-video-wr-l1-preview-201805.md new file mode 100644 index 0000000..6618b94 --- /dev/null +++ b/docs/content/wtp-video-wr-l1-preview-201805.md @@ -0,0 +1,12 @@ +--- +title: 「MC」麦子轨道交通 1 号线工程预览(2018-05) +date: 2025-03-22T22:05:12Z +lastmod: 2025-03-22T22:15:17Z +tags: [Minecraft,麦子服务器,视频] +--- + +# 「MC」麦子轨道交通 1 号线工程预览(2018-05) + + + +‍