<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>M学院</title><link>https://tech.mornlong.com/</link><description>梦龙网络</description><item><title>npm install -g 报 EACCES 怎么办？先别用 sudo</title><link>https://tech.mornlong.com/post/117.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/06/50f0c94e5c381c03b9440cd1c315f880.svg&quot; title=&quot;npm EACCES 权限错误处理示意图&quot; alt=&quot;npm EACCES 权限错误处理示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt; &lt;p&gt;npm 全局安装报 &lt;code&gt;EACCES&lt;/code&gt; 时，先把 npm 全局目录改到当前用户目录，再补 PATH，别急着用 &lt;code&gt;sudo&lt;/code&gt;。&lt;/p&gt; &lt;p&gt;有时装一个全局命令，刚跑 &lt;code&gt;npm install -g&lt;/code&gt;，终端就回一串 &lt;code&gt;EACCES&lt;/code&gt; 或 &lt;code&gt;permission denied&lt;/code&gt;。不少人第一反应是前面加 &lt;code&gt;sudo&lt;/code&gt;，但这样容易把全局包和缓存目录搞成 root 权限，后面更乱。&lt;/p&gt; &lt;p&gt;先用当前用户目录接住 npm 的全局安装。可以按 npm 官方文档给的做法，先执行：&lt;/p&gt; &lt;pre&gt;&lt;code&gt;mkdir ~/.local npm config set prefix ~/.local&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;然后把这个目录加到 PATH。当前 shell 先临时执行一次：&lt;/p&gt; &lt;pre&gt;&lt;code&gt;export PATH=&quot;$HOME/.local/bin:$PATH&quot;&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;想长期生效，就把同一行加到你常用 shell 的配置文件里，比如 &lt;code&gt;~/.zshrc&lt;/code&gt; 或 &lt;code&gt;~/.bashrc&lt;/code&gt;，保存后重新打开终端，或者执行一次：&lt;/p&gt; &lt;pre&gt;&lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;这时再重试原来的全局安装命令，一般就能过去。如果你只是偶尔跑一次命令，不一定非要全局装。npm 文档也提到，可以直接试试 &lt;code&gt;npx your-package-name&lt;/code&gt;。&lt;/p&gt; &lt;p&gt;另外，npm 官方把 Node 版本管理器列为更推荐的长期方案，因为它会把 Node 和 npm 放在当前用户可写的位置，后面少踩很多权限坑。参考：&lt;a href=&quot;https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Resolving EACCES permissions errors when installing packages globally&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;最后提醒两点：第一，别把 &lt;code&gt;sudo npm install -g&lt;/code&gt; 当默认解法；第二，如果你之前已经用过 sudo 装全局包，后面仍报权限问题，还要顺手检查 npm 缓存和旧目录属主是不是已经被改乱了。&lt;/p&gt;</description><pubDate>Sat, 06 Jun 2026 10:48:06 +0800</pubDate></item><item><title>Excel 打开 CSV 中文乱码怎么办？用数据导入选 UTF-8</title><link>https://tech.mornlong.com/post/116.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/06/20260604235406178058844678255.svg&quot; title=&quot;Excel CSV UTF-8 导入示意图&quot; alt=&quot;Excel CSV UTF-8 导入示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;有时从系统导出一个 CSV，双击用 Excel 打开，姓名、地址、备注里的中文全变成乱码。&lt;/p&gt;
&lt;p&gt;文件本身不一定坏，多数是 Excel 直接打开时没有按正确编码解析。先别在乱码单元格里手动改，也不要马上让对方重新发 Excel 文件。&lt;/p&gt;
&lt;p&gt;可以从导入入口重新打开。先在 Excel 里新建空白工作簿，进入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;数据 &amp;gt; 获取数据 &amp;gt; 自文件 &amp;gt; 从文本/CSV&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;选择这个 CSV 后，在预览窗口里看“文件原点”或编码选项，把它改成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;65001: Unicode (UTF-8)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后再看分隔符是不是逗号。预览里的中文正常、列也没有挤在一起，再点“加载”。&lt;/p&gt;
&lt;p&gt;如果你能控制导出端，导出时优先选择 CSV UTF-8。有些系统会写成带 BOM 的 UTF-8，这样 Excel 直接打开时更容易识别。&lt;/p&gt;
&lt;p&gt;Microsoft 支持文档说明，Excel 可以导入或导出文本、CSV 文件，也有专门页面说明 CSV UTF-8 文件在 Excel 中正确打开的问题。参考：&lt;a href=&quot;https://support.microsoft.com/en-us/office/import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Import or export text (.txt or .csv) files&lt;/a&gt;、&lt;a href=&quot;https://support.microsoft.com/en-us/office/opening-csv-utf-8-files-correctly-in-excel-8a935af5-3416-4edd-ba7e-3dfd2bc4a032&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Opening CSV UTF-8 files correctly in Excel&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，乱码 CSV 先保留原文件副本，别覆盖保存；第二，如果预览里仍然不正常，可能原文件不是 UTF-8，而是 GBK、Big5 等其他编码，需要按实际来源选择。&lt;/p&gt;</description><pubDate>Thu, 04 Jun 2026 23:55:00 +0800</pubDate></item><item><title>curl 提示 SSL certificate problem 怎么办？先更新 CA 证书</title><link>https://tech.mornlong.com/post/115.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/20260531121631178020099149063.svg&quot; title=&quot;curl SSL 证书校验失败处理示意图&quot; alt=&quot;curl SSL 证书校验失败处理示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在服务器上用 &lt;code&gt;curl&lt;/code&gt; 访问 HTTPS 地址，突然看到 &lt;code&gt;SSL certificate problem: unable to get local issuer certificate&lt;/code&gt;，或者提示本地证书无法校验。&lt;/p&gt;
&lt;p&gt;这种情况先别急着加 &lt;code&gt;-k&lt;/code&gt;。它会跳过证书校验，临时测试可以，长期写进脚本里不合适。&lt;/p&gt;
&lt;p&gt;先看系统 CA 证书包是不是太旧。Debian/Ubuntu 可以先更新并重新生成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install --reinstall ca-certificates
sudo update-ca-certificates&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RHEL、Rocky Linux、CentOS 这类系统可以用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf reinstall ca-certificates
sudo update-ca-trust&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行完再试一次：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -I https://example.com&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果只对某个测试服务失败，不要直接关掉校验。更稳的做法是把对应 CA 证书加入系统信任库，或者只在这次请求里显式指定：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --cacert ca.pem https://example.com&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还有一个判断方法：加 &lt;code&gt;-v&lt;/code&gt; 看 &lt;code&gt;curl&lt;/code&gt; 正在使用哪个 CA store 或证书文件。如果显示的证书来源不对，通常就是安装包或环境配置问题。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; 官方文档说明，默认会进行证书验证；校验失败时可以使用 &lt;code&gt;--cacert&lt;/code&gt; 指定 CA 文件，也可以修正本机 CA store；&lt;code&gt;-k&lt;/code&gt; / &lt;code&gt;--insecure&lt;/code&gt; 会降低连接校验强度，不适合作为长期方案。参考：&lt;a href=&quot;https://curl.se/docs/sslcerts.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;curl - SSL CA Certificates&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，访问公开网站时，顺手检查服务器时间是否明显错误；第二，如果是自己维护的 HTTPS 服务，还要确认服务端有没有发完整证书链。&lt;/p&gt;</description><pubDate>Sun, 31 May 2026 12:13:58 +0800</pubDate></item><item><title>GitHub Actions 定时任务时间不对怎么办？先看时区</title><link>https://tech.mornlong.com/post/114.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/2026-05-30-github-actions-schedule-timezone.svg&quot; title=&quot;GitHub Actions 定时任务时区设置示意图&quot; alt=&quot;GitHub Actions 定时任务时区设置示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;GitHub Actions 里写了一个定时任务，本来想每天早上执行，结果总是差几个小时，或者偶尔没有准点开始。&lt;/p&gt;
&lt;p&gt;这种情况先别去改服务器时区，也不用反复改 runner。更常见的原因是 &lt;code&gt;schedule&lt;/code&gt; 里的 cron 时区没有看清楚。&lt;/p&gt;
&lt;p&gt;如果只写 &lt;code&gt;cron&lt;/code&gt;，GitHub Actions 默认按 UTC 来算。比如想按北京时间每天 9:10 运行，可以先换算成 UTC 1:10：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;on:
  schedule:
    - cron: '10 1 * * *'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在官方文档也支持在计划任务里写 IANA 时区。想直接按上海时间写，可以这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;on:
  schedule:
    - cron: '10 9 * * *'
      timezone: 'Asia/Shanghai'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还有一个容易忽略的点：不要都卡在整点跑。GitHub 官方说明，高负载时段可能导致定时任务延迟，整点附近尤其常见。能接受的话，把时间写成 &lt;code&gt;10&lt;/code&gt;、&lt;code&gt;17&lt;/code&gt;、&lt;code&gt;43&lt;/code&gt; 这类非整点分钟，会更稳一点。&lt;/p&gt;
&lt;p&gt;如果任务完全不触发，再检查三件事：第一，workflow 文件必须在默认分支；第二，定时任务会跑默认分支上的最新提交；第三，公开仓库长时间没有活动时，计划任务可能被自动停用。&lt;/p&gt;
&lt;p&gt;GitHub 官方文档说明，&lt;code&gt;schedule&lt;/code&gt; 使用 POSIX cron 语法，默认 UTC，可选 IANA timezone，最短间隔是 5 分钟；同时也提示高负载时可能延迟或丢弃排队任务。参考：&lt;a href=&quot;https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Events that trigger workflows - schedule&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，定时任务不是实时调度器，不适合要求秒级准点的工作；第二，涉及线上发布、扣费、删除数据这类操作时，最好保留手动触发入口和日志通知。&lt;/p&gt;</description><pubDate>Sat, 30 May 2026 19:52:51 +0800</pubDate></item><item><title>Windows 摄像头打不开怎么办？先检查相机权限</title><link>https://tech.mornlong.com/post/113.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/20260529093442178001848246495.svg&quot; title=&quot;Windows 摄像头权限设置示意图&quot; alt=&quot;Windows 摄像头权限设置示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;电脑摄像头明明在设备里能看到，但打开视频会议、浏览器网页或聊天软件时，就是黑屏，或者提示没有权限访问摄像头。&lt;/p&gt;
&lt;p&gt;这种情况先别急着重装驱动，也不要随便下载第三方驱动包。很多时候只是 Windows 的相机权限被关掉了。&lt;/p&gt;
&lt;p&gt;Windows 11 可以先打开：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;设置 &amp;gt; 隐私和安全性 &amp;gt; 相机&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依次检查这几个开关：&lt;/p&gt;
&lt;p&gt;第一，打开“相机访问权限”。&lt;/p&gt;
&lt;p&gt;第二，打开“允许应用访问你的相机”。如果列表里有你要用的应用，也把对应开关打开。&lt;/p&gt;
&lt;p&gt;第三，如果用的是浏览器、Teams、Zoom、微信这类桌面软件，还要往下看“允许桌面应用访问你的相机”，这个开关也要打开。&lt;/p&gt;
&lt;p&gt;Windows 10 的入口略有不同：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;设置 &amp;gt; 隐私 &amp;gt; 相机&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同样检查设备相机访问、允许应用访问相机，以及桌面应用访问相机。&lt;/p&gt;
&lt;p&gt;改完以后，彻底退出正在用摄像头的软件，再重新打开。网页会议还要看浏览器地址栏附近的摄像头权限，确认当前网站没有被单独禁止。&lt;/p&gt;
&lt;p&gt;Microsoft 支持文档说明，在 Windows 中使用相机需要在相机隐私设置里打开权限；桌面应用可能不会出现在单个应用列表里，但仍需要打开桌面应用访问开关。参考：&lt;a href=&quot;https://support.microsoft.com/zh-cn/windows/%E5%9C%A8-windows-%E4%B8%AD%E7%AE%A1%E7%90%86%E7%9B%B8%E6%9C%BA%E7%9A%84%E5%BA%94%E7%94%A8%E6%9D%83%E9%99%90-87ebc757-1f87-7bbf-84b5-0686afb6ca6b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;在 Windows 中管理相机的应用权限&lt;/a&gt;，以及 &lt;a href=&quot;https://support.microsoft.com/zh-cn/windows/%E7%9B%B8%E6%9C%BA%E5%9C%A8-windows-%E4%B8%AD%E4%B8%8D%E5%B7%A5%E4%BD%9C-32adb016-b29c-a928-0073-53d31da0dad5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;相机在 Windows 中不工作&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，如果相机权限开关是灰色的，可能是管理员或组织策略限制，需要找设备管理员处理；第二，如果 Windows 自带相机应用也打不开，再检查物理遮挡开关、笔记本快捷键、USB 连接和设备管理器里的驱动状态。&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 09:35:41 +0800</pubDate></item><item><title>systemd 服务文件改完不生效怎么办？先 daemon-reload</title><link>https://tech.mornlong.com/post/112.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/20260528124005177994320597534.svg&quot; title=&quot;systemd daemon-reload 操作示意图&quot; alt=&quot;systemd daemon-reload 操作示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在服务器上改了一个 &lt;code&gt;.service&lt;/code&gt; 文件，比如调整 &lt;code&gt;ExecStart&lt;/code&gt;、&lt;code&gt;Environment&lt;/code&gt; 或依赖关系，保存后直接 &lt;code&gt;restart&lt;/code&gt;，有时还是按旧配置跑，甚至提示 unit 文件已经变化。&lt;/p&gt;
&lt;p&gt;这种情况先别反复重启服务。更常见的原因是 systemd 还没有重新读取 unit 文件。&lt;/p&gt;
&lt;p&gt;先执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后再重启对应服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart your-service.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后看一下状态，确认有没有加载失败或启动错误：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status your-service.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果改的是当前用户自己的服务，不是系统服务，命令要加 &lt;code&gt;--user&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl --user daemon-reload
systemctl --user restart your-service.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;systemd 官方 &lt;code&gt;systemctl&lt;/code&gt; 手册说明，&lt;code&gt;daemon-reload&lt;/code&gt; 会重新加载 systemd 管理器配置，重新读取所有 unit 文件，并重建依赖树。参考：&lt;a href=&quot;https://www.freedesktop.org/software/systemd/man/latest/systemctl.html#daemon-reload&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;systemctl daemon-reload 文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，&lt;code&gt;daemon-reload&lt;/code&gt; 只让 systemd 重新认识 unit 文件，不会替你重启正在运行的服务；第二，如果文件语法写错，先看 &lt;code&gt;systemctl status&lt;/code&gt; 和 &lt;code&gt;journalctl -u your-service.service&lt;/code&gt; 的报错，不要只盯着 reload 命令本身。&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 12:39:12 +0800</pubDate></item><item><title>Windows 开机慢怎么办？先关掉启动应用</title><link>https://tech.mornlong.com/post/111.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/20260526123535177977013558532.svg&quot; title=&quot;Windows 启动应用设置示意图&quot; alt=&quot;Windows 启动应用设置示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;电脑能正常开机，但进桌面以后右下角程序一个接一个弹出来，鼠标也有点卡，等一会儿才能正常打开浏览器或文档。&lt;/p&gt;
&lt;p&gt;这种情况先别急着重装系统，也不要一上来就清注册表。可以先检查启动应用，把不需要开机自动运行的项目关掉。&lt;/p&gt;
&lt;p&gt;方法一，打开 Windows 设置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;设置 &amp;gt; 应用 &amp;gt; 启动&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以按 &lt;code&gt;Win + I&lt;/code&gt; 打开设置，再进入“应用”和“启动”。列表里会看到各个应用的开关，优先看“影响大”或平时用不到的软件，把它们关掉。&lt;/p&gt;
&lt;p&gt;方法二，用任务管理器看得更细一点：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;右键开始菜单 &amp;gt; 任务管理器 &amp;gt; 启动应用&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以按 &lt;code&gt;Ctrl + Shift + Esc&lt;/code&gt; 打开任务管理器。选中不需要自动启动的应用，点“禁用”。这样它不会在登录时自动运行，但以后仍然可以手动打开。&lt;/p&gt;
&lt;p&gt;Microsoft 支持文档也说明，设备启动时自动运行的应用可能影响启动速度和系统整体性能；启动应用可以通过“设置”或“任务管理器”来配置。参考：&lt;a href=&quot;https://support.microsoft.com/zh-cn/windows/%E5%9C%A8-windows-%E4%B8%AD%E9%85%8D%E7%BD%AE%E5%90%AF%E5%8A%A8%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F-115a420a-0bff-4a6f-90e0-1934c844e473&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;在 Windows 中配置启动应用程序 - Microsoft 支持&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，不确定用途的项目不要一口气全关，输入法、触控板、显卡、同步工具和安全软件要按实际需要判断；第二，如果某个软件关掉后又自己打开，可以再进这个软件的设置里找“开机启动”或“登录时启动”选项。&lt;/p&gt;</description><pubDate>Tue, 26 May 2026 12:47:53 +0800</pubDate></item><item><title>移动硬盘插上不显示怎么办？先看看有没有盘符</title><link>https://tech.mornlong.com/post/110.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/202605241779605146360329.jpg&quot; title=&quot;Windows 移动硬盘盘符设置示意图&quot; alt=&quot;Windows 移动硬盘盘符设置示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;插上移动硬盘或 U 盘以后，Windows 有提示音，设备管理器里也能看到设备，但资源管理器里就是没有新的盘符。这个时候很多人会怀疑硬盘坏了，或者想点“格式化”试试。&lt;/p&gt;
&lt;p&gt;先别急。如果磁盘管理里能看到已有分区，常见原因之一只是这个分区没有分配盘符。&lt;/p&gt;
&lt;p&gt;可以右键开始菜单，打开：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;磁盘管理&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以按 &lt;code&gt;Win + R&lt;/code&gt;，输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diskmgmt.msc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在下方磁盘列表里找到对应的移动硬盘。重点看分区状态：如果显示“正常”，但卷名旁边没有 &lt;code&gt;D:&lt;/code&gt;、&lt;code&gt;E:&lt;/code&gt; 这样的盘符，就右键这个分区，选择“更改驱动器号和路径”。&lt;/p&gt;
&lt;p&gt;然后点“添加”，选一个没有被占用的字母，确认后再打开资源管理器，一般就能看到这个盘了。&lt;/p&gt;
&lt;p&gt;Microsoft Learn 的磁盘管理文档也说明，可以用 Disk Management 更改、添加或删除驱动器号；前提是当前账号有相应管理权限，并且不要对系统盘或应用所在盘随意改盘符。参考：&lt;a href=&quot;https://learn.microsoft.com/en-us/windows-server/storage/disk-management/change-a-drive-letter&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Change a Drive Letter - Microsoft Learn&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，如果 Windows 弹出“必须格式化才能使用”，而硬盘里有重要资料，不要直接格式化，先考虑备份或数据恢复；第二，如果磁盘管理里显示“未知”“未初始化”“未分配”，这就不是单纯缺盘符，先别乱点初始化或新建卷。&lt;/p&gt;
</description><pubDate>Sun, 24 May 2026 14:46:42 +0800</pubDate></item><item><title>VS Code 保存时不自动格式化怎么办？打开 Format On Save</title><link>https://tech.mornlong.com/post/109.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/202605231779506077173298.svg&quot; title=&quot;VS Code Format On Save 设置示意图&quot; alt=&quot;VS Code Format On Save 设置示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;写代码或改配置文件时，有时保存以后缩进、空格、换行还是乱的。每次手动点“格式化文档”又很麻烦。&lt;/p&gt;
&lt;p&gt;如果你用的是 VS Code，可以先打开保存时自动格式化。&lt;/p&gt;
&lt;p&gt;方法一：打开设置，搜索 &lt;code&gt;Format On Save&lt;/code&gt;，勾选 &lt;code&gt;Editor: Format On Save&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;方法二：打开设置 JSON，加入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;editor.formatOnSave&quot;: true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只想对某一种语言生效，也可以写在语言范围里。比如只对 JavaScript 生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;[javascript]&quot;: {
    &quot;editor.formatOnSave&quot;: true
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果保存后仍然没变化，先右键编辑器选 &lt;code&gt;Format Document With...&lt;/code&gt;，再选 &lt;code&gt;Configure Default Formatter...&lt;/code&gt;，指定一个默认格式化器。&lt;/p&gt;
&lt;p&gt;VS Code 官方文档也说明，它支持 &lt;code&gt;Format Document&lt;/code&gt;、&lt;code&gt;Format Selection&lt;/code&gt;，并可以用 &lt;code&gt;editor.formatOnSave&lt;/code&gt; 在保存时格式化文件。参考：&lt;a href=&quot;https://code.visualstudio.com/docs/editing/codebasics#_formatting&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;VS Code Basic Editing - Formatting&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后提醒两点：第一，项目里如果已经有团队统一配置，优先按项目配置来；第二，不同语言可能需要不同扩展，没有可用格式化器时，开关打开也不会自动生效。&lt;/p&gt;</description><pubDate>Sat, 23 May 2026 11:15:25 +0800</pubDate></item><item><title>Docker 日志越滚越大怎么办？给 json-file 加上大小上限</title><link>https://tech.mornlong.com/post/108.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tech.mornlong.com/zb_users/upload/2026/05/202605221779433856353891.jpg&quot; title=&quot;Docker json-file 日志轮转设置示意图&quot; alt=&quot;Docker json-file 日志轮转设置示意图&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Docker 容器跑久了，有时系统盘空间突然变小。顺着目录查下去，常见结果是某个容器的 &lt;code&gt;*-json.log&lt;/code&gt; 一直在增长。&lt;/p&gt;
&lt;p&gt;这种情况不要先去手动编辑 Docker 的日志文件。更稳的做法，是给默认的 &lt;code&gt;json-file&lt;/code&gt; 日志驱动加上大小上限。&lt;/p&gt;
&lt;p&gt;先看当前默认日志驱动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker info --format '{{.LoggingDriver}}'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果输出是 &lt;code&gt;json-file&lt;/code&gt;，可以编辑 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;，加入下面这一段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;log-driver&quot;: &quot;json-file&quot;,
  &quot;log-opts&quot;: {
    &quot;max-size&quot;: &quot;10m&quot;,
    &quot;max-file&quot;: &quot;3&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;已经有其它 Docker 配置时，不要直接整段覆盖，只把 &lt;code&gt;log-driver&lt;/code&gt; 和 &lt;code&gt;log-opts&lt;/code&gt; 合并进去，保证 JSON 格式正确。&lt;/p&gt;
&lt;p&gt;保存后重启 Docker：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart docker&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生产环境重启 Docker 前，先安排维护窗口，避免正在运行的容器被影响。&lt;/p&gt;
&lt;p&gt;上面这个配置的意思是：单个日志文件最多 10MB，最多保留 3 个文件。Docker 官方文档也说明，&lt;code&gt;daemon.json&lt;/code&gt; 里的 &lt;code&gt;log-opts&lt;/code&gt; 选项值要写成字符串，所以 &lt;code&gt;3&lt;/code&gt; 也要加引号。&lt;/p&gt;
&lt;p&gt;还有一个容易忽略的点：改完默认配置后，只会影响后续新建的容器。已经在跑的容器不会自动套用新日志规则，需要按你的部署方式重建容器。&lt;/p&gt;
&lt;p&gt;如果只想给某个新容器单独设置，也可以在启动时加参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 alpine echo hello&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://docs.docker.com/engine/logging/drivers/json-file/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker json-file logging driver 文档&lt;/a&gt;。&lt;/p&gt;
</description><pubDate>Fri, 22 May 2026 15:11:28 +0800</pubDate></item></channel></rss>