[{"content":" 教程性质： 本文以 狼的提问箱 项目为例，但所有原理与步骤对任何「不备案、有海外用户、想让境内/境外各走最优线路」的站点通用。\n场景速览：域名权威 DNS 托管在 DNSPod（免费版支持按「境内 / 境外 / 默认」线路返回不同解析结果）；境内线路 CNAME 到腾讯 EdgeOne 国际站（免备案区域，大陆用户落到香港等最近节点，走腾讯跨境骨干，比 Cloudflare 免费版大陆绕行明显更快）；境外/默认线路 CNAME 到 Cloudflare 优选 IP（经 Cloudflare for SaaS 自定义主机名识别流量，由既有 Cloudflare Tunnel 回源）。\n1. 为什么能这么搭 —— 三个关键认知 整套方案成立的前提，是先把三个「概念解耦」想清楚：\n1.1 Cloudflare for SaaS：让「流量识别」与「DNS 解析权」解耦 Cloudflare 普通接入（Free 套餐）要求把整域 NS 迁到 Cloudflare，这与「DNS 要放在 DNSPod 做分线路」天然冲突——NS 在谁手里，谁才说了算。\nCloudflare for SaaS（免费额度 100 个自定义主机名）绕开这个限制：\n你有一个承载 zone（例如 cf-zone.example.net，托管在 Cloudflare）； 在承载 zone 里把目标域名（box.example.com）加为 Custom Hostname，并验证归属； Cloudflare 边缘从此「认识」这个域名：任何带着 Host: box.example.com 到达 CF 边缘的请求，都会被匹配证书、按配置路由（本项目为 Tunnel 回源）。 关键结论：CF 侧只负责\u0026quot;来了流量怎么认、怎么转\u0026quot;，不负责\u0026quot;流量怎么来\u0026quot;。流量能不能到 CF 边缘，取决于你自己的 DNS（DNSPod）把境外用户解析到哪。所以「境外走 CF」必须在 DNSPod 配一条境外线路指向 CF 的 IP/CNAME——CF 自己不会拉客。\n1.2 DNSPod 分线路：免费就能「同一域名，不同答案」 腾讯云解析（DNSPod）免费版就支持按查询来源返回不同记录：线路可选「中国境内 / 境外 / 默认」，境内细分到省、运营商。默认线路是兜底，任何未命中的查询都走它。\n要理解一个易错点：分线路的判定发生在 DNSPod 的权威服务器上，依据是「递归 DNS 服务器的出口 IP 归属地」——所以「境外用户走境外线路」成立的前提是境外用户的递归 DNS（8.8.8.8 等）能真的问到 DNSPod 权威，且没被中间网络劫持/污染（第 6 节有实战案例）。\n1.3 EdgeOne 国际站：选对「加速区域」就不用备案 EdgeOne 分「中国大陆可用区 / 全球可用区（不含中国大陆）/ 海外可用区」等区域配置。官方口径：\n选 全球可用区（不含中国大陆） 或海外区域 → 不要求 ICP 备案； 选中国大陆区域 → 必须备案。 不备案的代价：大陆用户没有本地节点，请求落到最近的海外节点（大陆一般落香港，也有日韩/新加坡等），由腾讯跨境骨干回源。实测体验通常仍明显优于 Cloudflare 免费版大陆线路（后者常绕美/日且抖动大）——所以「不备案也选 EO 当境内线路」是有实测前提的，切换前建议先测速对比。\n补充：Cloudflare for SaaS 启用通常需要账户先绑定支付方式，额度内不扣费。\n2. 目标架构 DNS 层 DNSPod（example.com 整域权威，免费版支持按线路返回） NS = byron.dnspod.net / sunshine.dnspod.net（官方 NS） box CNAME 记录 ├─ 境内 ──▶ box.example.com.edgeone.example （EdgeOne 接入目标） ├─ 境外 ──▶ cf-pref.example.net （CF 优选 IP 域名） └─ 默认 ──▶ cf-pref.example.net （兜底，语义同境外） ┌──────────────┴──────────────────────────────┐ 大陆用户 ▶▶（命中境内线路） ◀◀ 海外用户（命中境外/默认线路） ▼ ▼ EdgeOne 国际站 Cloudflare 边缘 区域: 全球(不含中国大陆) 优选 IP: 198.51.100.x（示例段） 证书: TrustAsia, CN=box.example.com 识别: for SaaS 自定义主机名 回源: EO 直连源站公网端口 回源: Cloudflare Tunnel（纯出站） │ │ └──────────────────┬──────────────────────────┘ ▼ 源站防火墙 iptables+ipset（仅放行 EO 回源网段；cloudflared 走 127.0.0.1 不受影响） ▼ HTTP 应用直接监听公网高位端口（本项目 TamaBox，无 nginx） 两条回源路径互不干扰：EO 是 入站直连（需开放端口 + 白名单锁定），CF 是 Tunnel 出站（无需任何入站规则）。\n3. 前置条件清单 # 条件 说明 1 一个域名（example.com），权威 DNS 托管在 DNSPod 免费版即可；注册局委派的 NS = byron/sunshine.dnspod.net 2 一个 Cloudflare 账户 + 承载 zone（cf-zone.example.net） 用于 for SaaS 与 Tunnel；域名本身的 DNS 不用迁给 CF 3 cloudflared Tunnel 已在跑 服务器 → CF 纯出站连接，绑定承载域 box.cf-zone.example.net 4 服务器有公网 IP，且能开一个高位入站端口 给 EO 回源用；不需要 nginx，应用直接监听即可 5 EdgeOne 账户（本例国际站 edgeone.ai） 选免备案区域 6 CF 账户已绑支付方式 启用 for SaaS 的前提（额度内不扣费） 7 服务器 1C1G 级别即可 iptables/ipset 是内核规则，无常驻进程 4. 分步实施 建议顺序：先 CF（步骤 A）→ 再 EO（步骤 B）→ 再 DNS（步骤 C）→ 最后服务器（步骤 D）。 前两步做完，流量仍在旧路径上，随时可暂停；步骤 C/D 才真正切换与收敛。\nStep A —— Cloudflare 侧：SaaS 自定义主机名 + Tunnel（本次零改动，讲解原理） 本项目 box.example.com 的 SaaS 自定义主机名此前已配好（放在承载 zone cf-zone.example.net 下），Tunnel 已正常回源。若从零配置，动作是：\n承载 zone cf-zone.example.net → SSL/TLS → Custom hostnames → Add custom hostname，填 box.example.com； 按提示完成归属验证（加一条 TXT 或 CNAME 验证记录）； 在 Tunnel 的路由里把 box.example.com 指到本地 HTTP 服务（http://127.0.0.1:端口）； 记录页里能拿到该主机名的 CNAME target（形如 \u0026lt;hash\u0026gt;.cdn.cloudflare.net）——它是「把流量引到 CF 边缘」的官方入口。 ⚠️ 本项目实际没用 SaaS CNAME target，而是用优选 IP CNAME（cf-pref.example.net）：一个第三方维护的、解析到 CF 低延迟边缘 IP 的域名。原理相同——解析结果落在 CF 边缘，CF 靠 Host: box.example.com 识别出这是 SaaS 自定义主机名流量再按 Tunnel 路由。优选域名的可用性依赖第三方维护，失效时换回官方 CNAME target 即可（第 7 节维护清单）。\n本项目 DNSPod 上境外/默认线路指向的是 cf-pref.example.net。\nStep B —— EdgeOne 侧：添加站点（CNAME 接入，免备案区域） EO 控制台 → 添加站点 → 填 box.example.com； 接入方式选 CNAME 接入（⚠️ 不要选 NS 接入——NS 接入会要求把域名托管给 EO，与 DNSPod 分线路冲突，和「DNS 在 CF 手里没法分线路」是同一个问题）； 加速区域选「全球可用区（不含中国大陆）」（免备案的关键选择）； 归属验证：按 EO 提示添加验证记录（本项目用 TXT：edgeonereclaim.example.com TXT ...），记录加在 DNSPod 的默认线路（CA/验证服务器多在境外，放默认线路全球可见最稳）； 配置回源：源站地址 = 你的公网 IP + 高位端口，Host 头 = box.example.com；回源协议按你的源站监听协议选（应用直监听 HTTP 就选 HTTP，TLS 由 EO 边缘终结）； 免费证书：CNAME 验证通过 + 回源配置就绪后，EO 自动签发（本项目 TrustAsia，CN=box.example.com）。签发需要几分钟到几小时——在证书签发完成前，443 会拿 *.cdn.myqcloud.com 兜底证书应答，浏览器会出现证书/HSTS 报错（第 6 节排障 6.1），属正常过程，等签发即可； 开启「客户端 IP 头」（关键，默认关闭！）：站点 → 网络优化 / 规则引擎 → 客户端 IP 头部 → 开启，自定义头部名必须填 EO-Client-IP——应用侧固定读取这个名字； 删除/改写伪造的 CF 头：在 EO 加一条规则引擎规则，把客户端可能携带的 CF-Connecting-IP / X-Real-IP 等头删掉——否则大陆攻击者经 EO 带假 CF 头，会被应用当成 CF 流量优先信任（头信任模型见 Step D）。 Step C —— DNSPod 分线路：三条记录 权威 DNS 在 DNSPod（整域 zone example.com），所以直接在整域 zone 里配，不需要任何子域委派。\n主机记录 类型 线路 记录值 TTL box CNAME 中国境内 box.example.com.edgeone.example（EO 分配的目标） 120~600 box CNAME 境外 cf-pref.example.net（CF 优选 / 或 SaaS CNAME target） 600 box CNAME 默认 cf-pref.example.net（兜底，语义同境外） 600 要点：\nEO 归属验证 TXT 保持「默认」线路（全球可见），别只放境内； 若之前误把 EO 的 CNAME 建在「默认」线路，会导致全球都走 EO——把它改成「中国境内」，境外/默认补 CF 两条； TTL 别太大，方便回滚与换优选域时快速生效。 Step D —— 服务器侧：应用监听 + 信任头 + 端口锁定 D1 应用直接监听公网端口（免 nginx） 本项目 TamaBox 自带 HTTP 服务器，改配置即可：\n[server] listen = 0.0.0.0:18080 ; 从仅本机 127.0.0.1 改为全网卡，EO 才能远程连入（18080 仅为示例端口） cloudflared 连的是 127.0.0.1:端口，0.0.0.0 监听兼容回环连入，Tunnel 分支不受影响； nginx 在本方案中从头到尾不是必需——防火墙（iptables/ufw）是内核规则，零常驻进程，比 nginx 轻得多，适合 1C1G 小机器。 D2 应用信任两家 CDN 的权威头 conf/app.ini：\n[security] trust_proxy = true 配合代码层支持（本项目 internal/shared/ip.go 的 ResolveClientIP），信任顺序：\nCF-Connecting-IP（Cloudflare 权威头，海外分支）； EO-Client-IP（EdgeOne 权威头，境内分支）； 兜底：TCP 对端 RemoteAddr。 ⚠️ 头信任的安全前提（缺一不可）：\n源站防火墙只放行两家 CDN 的回源来源（EO 直连需要；CF 分支天然安全——Tunnel 是出站，外人到不了源站）； EO 侧已删除伪造的 CF 头（Step B-8）； 若还有 CF 侧直连，同样在 CF 规则里删除伪造的 EO 头。 任一缺失，「信任头」就会被攻击者直连源站 + 自带假头绕过——限流/封禁会拿到伪造 IP。\nD3 端口白名单：iptables + ipset 自动维护（EO 免费档没有官方回源段） EO 官方回源清单由「源站防护 / Origin ACL」提供（配套 DescribeOriginACL API），但该功能只支持付费套餐——免费档在控制台找不到入口，也没有可拉取的清单 URL。因此免费档采用**「种子清单 + 连接观察学习 + 定期同步」**的方案：\n交付脚本 scripts/edgeone-origin-whitelist.sh（bash，需 root，架构要点）：\n白名单放 ipset 集合 EO_ORIGIN，iptables 一条规则引用它：自建链 EO_IN 内「放行 127.0.0.0/8（保 cloudflared 回环）→ 命中集合放行 → 其余 REJECT tcp-reset」； 更新走「临时集填充 → ipset swap 原子替换」：同步全程无规则清空窗口； fail-safe：拉取失败 / 清单为空 / 全非法 → 拒绝更新、保留现网，绝不误删导致端口裸奔； 命令：sync（周期入口）/ learn（从连接表收集当前实际回源源 IP，做种子）/ show / flush（回滚）/ --dry-run； 清单来源：本地文件（/etc/edgeone-origin/cidr.txt）+ 可选 URL，取并集。 落地四步：\n# 1. 改端口（默认 18080 → 你的实际端口） # 2. 安装 ipset apt-get install -y ipset # 3. 生成种子：多跑几次 learn，把输出合并审阅后写入 cidr.txt（注意：种子是 EO 的\u0026#34;出口 IP\u0026#34;， # 不是应用日志里的客户端 IP！日志里是 EO-Client-IP 客户端真实 IP，不能当白名单） bash edgeone-origin-whitelist.sh learn bash edgeone-origin-whitelist.sh sync --dry-run bash edgeone-origin-whitelist.sh sync # 4. 验证：外网机器 nc -zv \u0026lt;IP\u0026gt; 18080 应 refused；https://box.example.com 应正常 # 5. 挂定时：cron「17 4 * * *」或 systemd timer，每日一次足够（EO 段 3~6 个月才变） 日后升级付费套餐：把 DescribeOriginACL API 的输出写入 cidr.txt 即可，脚本零改动。\n5. 验证方法（含大陆 DNS 劫持陷阱） 5.1 分线路是否生效（🔴 重点：别在大陆本机 nslookup 境外 DNS） 大陆网络对发往境外公共 DNS（8.8.8.8 / 1.1.1.1 / 9.9.9.9 / OpenDNS，UDP 53 和 TCP 53 都会被劫持）的查询会返回按境内线路伪造的答案——在本机 nslookup box.example.com 8.8.8.8 永远显示 EO，即使境外线路早已配好。正确验证通道：\n# 境内视角（本机直接查即可，通道可信） nslookup box.example.com 223.5.5.5 # 期望 → CNAME edgeone.example → 203.0.113.x（EO 示例段） nslookup box.example.com 119.29.29.29 # 同上（DNSPod 自家 DNS） # 境外视角：用「境外服务器代为查询」，浏览器直接打开下面两个 API 之一 # https://api.hackertarget.com/dnslookup/?q=box.example.com # https://networkcalc.com/api/dns/lookup/box.example.com # 期望 → CNAME cf-pref.example.net → 198.51.100.x（CF 边缘 IP 示例段） 两条结果不一样 = 分线路生效。\n5.2 HTTPS 证书是否就绪 echo | openssl s_client -connect box.example.com:443 -servername box.example.com \\ | openssl x509 -noout -subject -issuer -dates # 期望 subject = CN=box.example.com（而不是 *.cdn.myqcloud.com 兜底证书） 5.3 真实 IP 是否被正确识别 境内访问后看源站/EO 访问日志中的客户端 IP = 你的大陆公网出口 IP（说明 EO-Client-IP 生效）；海外访问后同理应为你的海外出口 IP（CF-Connecting-IP）。\n6. 今日排障实录（每个坑都值得记） 6.1 「网站使用 HSTS」报错 = EO 证书还没签发（不是配置错） 现象：DNS 切到 EO 后浏览器报 HSTS 错误页。 原因链：之前走 CF HTTPS 时应用下发了 Strict-Transport-Security: max-age=31536000; includeSubDomains（按 ExternalURL 以 https 开头就对每个响应下发）→ 浏览器记录「一年内必须 HTTPS」→ 切到 EO 后证书尚未签发、443 拿 *.cdn.myqcloud.com 兜底证书 → 证书与域名不匹配 → HSTS 错误页。 处理：等 EO 证书签发（几分钟~几小时）即可，域名不在 HSTS preload 列表，浏览器自动恢复，无需清缓存。紧急回滚 = DNS 改回 CF。 （若在 preload 列表里才是真麻烦——需先修好证书再等 preload 移除，故平时别主动提交 preload。）\n6.2 误判「权威 DNS 在 Cloudflare」（方向性错误） 现象：一度以为 example.com 权威在 Cloudflare，推导出「需要子域 NS 委派」的复杂方案，差点让用户在 CF 做一堆不存在 zone 的操作。 根因：apex example.com 本身是一条 CNAME → your-project.pages.dev（Cloudflare Pages 项目）——nslookup 查 NS 时一路跟随 CNAME 链走到 pages.dev 的 NS（CF），被误读为「example.com zone 在 CF」。 正确做法：查域名权威必须问注册局（RDAP）或直查 SOA，不能信递归 CNAME 链：\n# RDAP（注册局铁证）：https://rdap.org/domain/example.com → 应返回 byron/sunshine.dnspod.net # 或直查 SOA：nslookup -type=SOA example.com byron.dnspod.net 6.3 「境外也返回 EO」的假象 = 大陆 DNS 劫持（连 TCP 53 都劫） 现象：从大陆本机用 nslookup 测 8.8.8.8 / 9.9.9.9 / OpenDNS（UDP 和 TCP 都试），境外视角全部返回 EO，一度以为分线路没生效、甚至怀疑 DNSPod 配置错了。 真相：大陆网络劫持出境 DNS 查询，返回按境内线路伪造的 EO 答案，请求根本没到境外服务器。 破案手段：用境外服务器（hackertarget / networkcalc API）代为查询，立刻看到 CF 答案——DNSPod 三线路配置完全正确，从未出过错。教训见 5.1。\n6.4 残留的阿里云验证记录 实测发现 DNSPod 上有历史残留 _dnsauth.box.example.com CNAME → xxxxxxxx...aliyunauth.certificate-validations.com（以前阿里云申请证书留下的）。_dnsauth / _acme-challenge 下的旧验证记录会干扰证书自动续期验证——证书验证记录的坑，建议确认证书正常后删除。\n6.5 免费档没有「源站防护」，回源 IP 段拿不到 见 Step D3：免费档无官方清单，用 learn 观察法兜底；付费后切 DescribeOriginACL，脚本零改动。\n7. 日常维护清单 周期 事项 证书到期前 EO 免费证书自动续期并重新做域名验证——⚠️ CA 验证服务器多在境外，所有验证记录务必放默认线路；到期前留意 EO 控制台证书状态，失败会提示重新验证 每日（定时任务） 白名单 sync（EO 回源段 3~6 个月才变，每日一次足够） 每月 抽查 learn 输出是否有新回源源 IP 需补种；确认优选域名 cf-pref.example.net 仍解析到 CF 边缘（失效则换回官方 SaaS CNAME target，只改 DNSPod 一条记录） EO 回源突然失败 先临时放行全段定位，再按 learn 结果收紧——EO 免费档收不到段变更通知，要有这个预案 长期 若升级 EO 付费套餐：启用源站防护拿官方段 → 接入 DescribeOriginACL 输出到 cidr.txt 8. 回滚 快速回滚（境外也要回 CF 之外的兜底）：DNSPod 把「境内」线路改指向 CF（或删掉境内线路，让默认兜底接管）→ 全球走 CF，分钟级生效； 彻底回滚（回到纯 CF 时代）：删除 EO 站点/记录、撤防火墙放行、DNSPod 三线路合并为默认→CF； EO 证书到期前回滚，记得去 EO 控制台删除站点避免残留验证记录干扰。 附：配置快照（示例，2026-09-03 实测定稿，域名已脱敏） 域名: box.example.com（权威 DNS: DNSPod，NS=byron/sunshine.dnspod.net） 境内: CNAME box.example.com.edgeone.example → 203.0.113.x （EdgeOne 国际站，区域不含大陆，示例段） 境外/默认: CNAME cf-pref.example.net → 198.51.100.x （CF 优选 IP，示例段） CF 侧: SaaS 自定义主机名（承载 zone cf-zone.example.net）+ Tunnel 出站回源 EO 证书: TrustAsia, CN=box.example.com（签发后约 90 天到期，自动续期） EO 归属验证: edgeonereclaim.example.com TXT（DNSPod 默认线路 ✅） EO 客户端头: EO-Client-IP（手动开启，头名固定 EO-Client-IP） 源站: TamaBox 直监听 0.0.0.0:高位端口（无 nginx）；iptables+ipset 白名单 应用信任: trust_proxy=true；ResolveClientIP 信任 CF-Connecting-IP → EO-Client-IP → RemoteAddr ","date":"2026-09-03T15:26:54+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/tutorial-dual-cdn-split-routing.html","title":"以狼的提问箱为例-免备案双 CDN 分流实战教程：境内走 EdgeOne、境外走 Cloudflare"},{"content":" 近期更新速览（9 月 1 日 — 9 月 2 日） 面向站点使用者的简要更新说明，已省略技术细节。 提示：以下内容在服务端部署最新版本后才会全部生效。\n2026-09-01 新增 / 改进 管理后台的「功能设置」为提问、私聊、投票新增三种开放方式：一直开放、指定时间段开放、每周固定时段循环开放。以前定时开放一旦结束，功能就会一直关闭；现在可以设定每周循环时间，到期自动开启与关闭。 未登录访客查看问题详情页时，「分享」按钮自动居中，页面更整齐。 修复 修复未登录用户切换界面语言不生效的问题。 全站提示文字（错误提示、操作结果、表单校验等）统一跟随所选界面语言显示，简体中文 / 繁體中文 / English / 日本語 不再混用。 2026-09-02 新增 / 改进 投票的自定义回答框加入实时字数统计，超过字数上限会标红并阻止提交，不再被悄悄截断。 站长创建投票时，每个选项文本的长度上限放宽到 300 字。 标签与屏蔽词改为「标签块」式输入：回车或逗号即可生成一个词，点 × 删除，无需手动敲英文逗号分隔，并实时显示数量。 提问、回答、追问、私聊消息的字数上限已统一，超出时会有明确提示。 私聊的会话消息条数上限可在 1～200 之间自行设置（新用户默认 200 条）。 修复 修复已发布投票在编辑保存后出现「未知的投票类型」、选项看似丢失的问题，现在保存后投票与选项均正常显示。 修复「加载更多」按钮失效：公开主页与后台投票列表可以正常翻页；列表到底后按钮不再出现，连点也不会重复加载。 修复头像、背景、分享卡片等图片偶尔加载超时失败的问题。 调整 屏蔽词现在对提问、私聊（对方发来的消息）与投票的自定义内容同时生效；提问 / 私聊 / 投票三个设置面板展示同一份屏蔽词，改一处即全局同步。 精简后台投票设置页，移除重复的「投票内容管理」入口（投票列表仍可从顶栏进入）。 多项安全与稳定性加固（细节略）。 ","date":"2026-09-03T00:26:54+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/tamabox_changelog_20260903.html","title":"狼的提问箱 功能与修复变更记录 - 功能开关和全局屏蔽词"},{"content":" 一、投票功能能做什么 TamaBox 投票让你在自己的提问箱里发起各种投票或问卷，参与者打开链接就能投，完全不需要注册（也可以设置仅注册用户可投）。从简单的\u0026quot;大家更喜欢哪个选项\u0026quot;，到一份多题的结构化问卷，都能做。\n适合的场景举例：\n让粉丝 / 朋友帮你做选择：新头像二选一、周末活动定在哪天 收集意见：产品功能投票、内容选题调查 做一份完整问卷：既能打分、又能排顺序、还能自由填写 二、六种投票类型，怎么选 类型 用在哪里 例子 单选 只能选一个答案 新头像二选一 多选 可以选多个答案，可设最多选几个 最想看哪几个栏目（最多选 3 个） 评分 打 1–10 分 给今天的活动体验打分 排序 把几个选项排出先后 功能优先级：把 5 个功能按最想要到最不想要排序 表单收集 一份多题问卷，题型随便混搭 报名表 + 满意度调查：填空、单选、多选、评分、排序全放一起 其中「表单收集」最灵活——一份问卷里的每一道题都可以是不同题型，就像用工具搭问卷一样。\n三、本次更新，三个新亮点 1. 每道题都能单独开放\u0026quot;补充答案\u0026quot; 以前\u0026quot;允许参与者补充自定义选项\u0026quot;是对整个投票统一开关的，而且表单问卷里根本用不了。现在：在表单问卷里，每一道选择题都可以单独决定要不要开放自由补充。\n想开放的题：参与者除了选预置选项，还能点「其他」自己填写 想封闭的题：参与者只能选预置选项，保证答案可控 比如满意度调查里，评分题保持封闭打分；\u0026ldquo;最喜欢的水果\u0026quot;这道题开放补充——有人选不到满意选项时可以直接填\u0026quot;榴莲\u0026rdquo;，不再将就。\n结果页里，大家补充的内容会单独列出来（相同内容自动归到一起并显示次数），不会和预置选项的票数混在一起，一眼就能看出补充意见集中在哪些。\n2. 新题目默认就是\u0026quot;单选\u0026quot; 添加表单字段时，默认题型改为最高频的「单选」，少一步选择；题型下拉列表里\u0026quot;单选\u0026quot;也排到了第一位。\n3. 题目顺序随时调整 每道题卡片右上角有 ↑ / ↓ 按钮，点一下就能把题目往上移或往下移，顺序随你排。调整后，参与者和结果页都会按新顺序展示。\n四、完整流程：从创建到看结果 第 1 步：新建投票 进入「投票管理」，点新建，填好标题和说明，选择类型。\n第 2 步：搭题目（表单收集类型）\n点「添加字段」新增题目，默认就是单选 每道题可设置：题型、标签（即问题内容）、是否必填、字数上限（文本类）、选项内容 需要开放补充的选择题，勾选「允许补充自定义选项」 用 ↑ / ↓ 调整题目顺序 第 3 步：预览一下 不用急着发布——点「预览」会自动保存为草稿并打开参与者视角的页面，可以先检查排版和交互，随时点「返回」继续改。\n第 4 步：发布 发布时系统会做完整检查（必填项、选项数量、内容安全等），没问题就上线。可以设开始 / 结束时间、公开范围、结果可见时机。\n第 5 步：看结果 在投票管理里打开结果页：预置选项以条形图 + 票数百分比展示；开放补充的题目，自定义内容单独列出；文本类填写内容可以逐条展开查看；还支持一键导出 CSV。\n五、几个实用小提示 草稿随便存：没编辑完就点「保存草稿」，下次继续，发布前别人看不到 结果可见时机可设：投票后立即可见 / 结束后可见 / 仅自己可见，适合不同的玩法（比如先收答案后公布） 防重复投票：系统会按登录账号或设备指纹做防刷，同一人重复提交会被拦住；还可以要求匿名投票先过验证码 开放补充有底线：自定义选项有字数限制，且发布时会自动做内容安全校验，不合规内容无法提交 六、常见问题 Q：开放补充的题，参与者可以不填补充内容吗？ 可以。补充选项是可选的——参与者可以照常选预置选项，也可以选「其他」再填写；但如果选了「其他」却不填内容，提交会被提示补全。\nQ：发布后还能改题目顺序吗？ 发布后的投票选项和字段会锁定（避免破坏历史投票结果），要调整请在发布前用预览 / 草稿阶段完成。\nQ：补充的自定义选项会算进预置选项的票数吗？ 不会。预置选项各自计票，补充内容单独归类展示，互不干扰。\n如需了解本次更新的技术细节，可参考项目内开发文档。\n","date":"2026-08-25T18:40:54+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/tamabox_changelog_20260825.html","title":"狼的提问箱 新增投票功能 20260825"},{"content":" 一、新增功能 # 功能 说明 1 问题置顶 / 精选回答 提问箱主人在管理页可置顶/取消置顶提问，公开主页置顶优先展示（is_pinned 字段 + PinFirst 排序） 2 单题分享图 单个问题（提问+回答）生成分享卡片图，仅公开且已回答可生成；复用主页分享图的绘制/缓存/字体模块 3 回答后追问 提问者凭 token/登录身份对已回答的问题最多追问 3 次，主人可回复；事务+行锁保证并发上限；追问框仅在主人回复上一轮后显示，等待期间提示提问者 4 回答 Markdown 渲染 回答与追问回答支持 Markdown 排版，服务端渲染 + HTML 白名单过滤（防存储型 XSS），带 XSS 单测 5 深色模式 全站一键切换深/浅色（cookie 持久化 365 天）；桌面端顶栏图标、移动端底部固定操作栏，双入口 6 同 IP 重复内容拦截 同一 IP 在 5 分钟内提交相同内容（提问/私聊首条）会被拒绝，防刷屏 7 匿名 / 登录分级限流 登录用户享有 3 倍请求额度，匿名与登录独立限流器统计（滑动窗口） 8 封禁用户连带清理 新增 CLI 命令 TamaBox ban --email/--domain：事务级联删除该用户提问、追问、私聊、消息、图片关联并物理删除账号（含二次确认） 9 提问箱统计看板 管理页顶部 6 张统计卡：总提问 / 已回答 / 未回答 / 私密 / 置顶 / 私聊会话 10 热门标签榜 探索页展示高频用户标签（点击即搜索），热门问题区块按需移除 11 全文搜索提问箱 管理页可按关键词搜索自己收到的提问与回答 12 JSON 全量导出 /user/profile/export-json 导出用户信息 + 提问/回答/追问/图片 + 私聊全部消息，满足数据可携带权；与既有 Excel 导出并存 13 多语言（i18n） 简体中文 / 繁體中文 / English / 日本語；按 语言 cookie \u0026gt; 登录用户配置 \u0026gt; 提问箱主人配置 \u0026gt; 站点默认 解析；注册页可直接选择界面语言（登录后即刻生效），注册成功提示跟随所选语言 14 私聊（已有功能完善） 登录用户可向开启私聊的提问箱发起会话，支持图片、拉黑、每日条数上限、会话关闭 15 页面密码 / 提问密码 提问箱页面可设置访问密码、提问可设置密码（bcrypt 存储） 二、性能与体积优化（分享图） 画布尺寸 1280×720 → 960×540：绘制与编码工作量降至约 40% **输出体积约减小 90%，编码更快 文字宽度测量改估算（逐字符宽度累加，替代每次创建 freetype.Context + DrawString 测量） 分享图结果缓存 TTL 由 30 分钟延长至 1 小时，远程图片缓存 1 小时不变 名称文字增加柔和投影，增强复杂背景上的可读性 三、新增命令与配置 配置项（conf/app.ini） 配置 说明 [app] default_lang 站点默认语言（zh-CN / zh-TW / en / ja），留空默认简体中文 [security] ip_blacklist / ip_blacklist_redirect_url 逗号分隔 IP/CIDR 黑名单，命中跳转指定 URL [security] trust_proxy 反代部署且代理已覆盖 X-Real-IP/X-Forwarded-For 时设为 true，否则 false（防伪造 IP 绕过限流/黑名单） [recaptcha] captcha_type recaptcha / turnstile / math（本地算数验证码） [upload] image_* / aliyun_* 图片存储（R2/S3 或 OSS） [mail] skip_tls_verify 自签名 SMTP 证书时跳过校验 [service] tls_insecure_skip_verify 内网后端自签名证书时跳过校验 ","date":"2026-08-13T01:08:54+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/tamabox_changelog_20260813.html","title":"狼的提问箱 重大更新：多语言、追问、搜索、深色模式等一系列功能实装"},{"content":"各位好，狼的提问箱断断续续运营至今已将近三年，并获得将近三百位用户,也算是有了一些流量。我也会时不时根据用户的反馈对提问箱进行调整和改进。近期一位用户反馈“可不可以实现提问后继续回复被提问者的功能，就像在同一层聊天一样；”其实这类建议并不是第一次被提到，趁着这两天有空，我姑且把功能的雏形做了出来。\n首先说一下提问箱分享，就是在个人主页会有一个“分享提问箱”的按钮，执行会生成一张1280*720大小的图片，图上包含头像、签名、社交信息以及访问二维码和链接，个人感觉比直接截图好看，且图片尺寸也更适合分享。\n接下来重点说一下私聊功能：\n功能介绍\n本功能的实现实际类似于“私聊”，本功能需要被提问者手动开启。提问者在发出问题时，可以选择使用一般的匿名提问或是发送“私聊”，如选择私聊则需要注册登录提交。提交私聊后提问者会在后台的“提问”页面看到“我发送的私聊”卡片，在此可进行私聊管理。\n私聊发出后，将会出现在被提问者的“我收到的私聊”提问页面，且被提问者将收到一封包含私聊内容和链接的邮件，此链接仅有提问者和被提问者两方的账号能够查看内容，点击链接之后可以进行一对一的私聊，私聊状态下被提问者用户名不可见。\n注意事项\n被提问者可以设置单个私聊的对话轮数上限以及单个提问者一天内允许发送的私聊个数。 私聊请求发出后，被提问者可以对私聊进行管理（如删除、拉黑），提问者无权操作发出的私聊，被提问者操作拉黑后该提问者账号所有的提问都会被打上“已拉黑”的标签。 目前存在的功能缺陷\n邮箱发送的邮件不能正确显示私聊内容； 一些文字上表述的错乱，后期再进行优化。 下一步改进计划\n增加私聊中的图片回复功能。 ","date":"2026-05-13T23:13:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/tamabox-update-20260513.html","title":"狼的提问箱 新增功能：私聊和提问箱分享"},{"content":"标题基本上已经把昨晚上我的经历全部说清楚了。从COS16版本16.0.3.501开始，一加就偷偷往更新包里面加料阻止用户进行降级，即所谓的防回滚保护机制（Anti-Rollback，简称 ARB），如果是喜欢更新体验最新系统的用户，完全就在不知不觉中中招，如果正巧升级后有降级需求，恭喜，喜提黑砖一台。ARB使用户无法将系统降级至16.0.3.501之前的任何版本，硬刷就会直接黑砖，据称即使找售后也只能换主板，完全无法修复。\n而我的运气还是比较好，在更新到502之后觉得系统的安装器广告实在太多了，本来想直接降级，但感觉降下去之后广告还是一样多，不如去XDA看看有没有好用的第三方ROM推荐，实在不行还可以切换到OOS。然后就看到了这条帖子： 。初略的看一下就是在说一加偷偷塞ARB不是人做的事什么的，以及因为OOS一直以来更新都会相对COS晚一些，目前还没有中招，但不久之后估计也会一样（后面确实也往OOS塞ARB了）。另外就是因为之前的大部分第三方ROM都是基于旧版本的固件改的，如果已经更新到501之后的版本想要刷到第三方固件也是一样的结果。\n目前官方放出了一个带ARB的COS15固件，可以去下载OPPO官方的ColorOS助手并使用其中的固件降级功能，它会自动检查能够适用于当前手机固件版本的降级包并下载安装，目前的版本号是15.0.0.862。降级也很简单，在手机上打开开发者设置和USB调试，然后数据线连接电脑并选择传输文件模式，这样ColorOS助手就能识别到手机，然后按步骤操作即可。需要注意的是降级也是需要格机的，所以需要提前做好数据备份。\n因为ColorOS有些地方的广告实在是让人难以忍受，我这次选择降级之后直接Root了，方便后续系统再作妖的时候我能够做一些反击。看到很多人推荐使用KernelSU，我还以为和Magisk差不多，直接从ColorOS助手下载的降级包（顺带一提，这个ozip格式的降级包其实和一般的刷机包没有什么差异）提取了boot.img，然后在手机上安装KernelSU做修补，再用fastboot flash boot kernelsuxxx.img写到手机去，结果发现KernelSU还是提示未安装，我还以为操作有问题就再反复操作一次，还是提示未安装。然后我就根据KernelSU的教程去下载了系统内核同版本的img固件（6.6.66），并把这个boot.img刷进手机里，悲剧便发生了。系统重启之后5秒会直接黑屏，一段时间后系统会检测到手机但是设备管理器提示900e错误，重启到bootloader我再用降级包原来的boot.img刷进去，重启之后还是原来的问题，这个时候我已经有点慌了。当想到还有Recovery模式的时候，我重启进去却发现只有格式化、重启、关机三个选项\u0026hellip;连sideload都没有。这时候我已经在思考要去哪里找售后了，但就在XDA上随便翻翻的时候，我看到一个OrangeFox的第三方Recovery项目（原谅我只知道TWRP，而且24年之后TWRP就没有更新了，我还以为没有第三方Recovery支持。），下载了他的Recovery镜像然后在bootloader下刷入:fastboot flash recovery OrangeFoxRecovery固件然后重启到Recovery模式，发现能正常使用。因为图方便我想着用sideload的方式把降级包刷进去，结果直接报错了，还以为这个包只能用电脑刷\u0026hellip;最后我用OrangeFox把MTP打开把降级包固件复制到手机里，再执行安装zip，发现居然成功了（ozip的后缀不需要改，能够识别），再次重启发现已经能够进入系统初始化界面了。\n再次检查我发现KernelSU官网对不同版本号的内核有不一样的处理方式，对于一加15降级包的6.6.66内核，实际需要提取并修补的是init_boot这个镜像而非传统的boot镜像，刷写命令也是fastboot flash init_boot 修补的init_boot镜像，一系列的错误导致悲剧的发生。\n归纳以上内容也就这几个重点：\nCOS16版本16.0.3.501以后只能降级到官方包含ARB版本的固件。 有刷机需求的及时准备像OrangeFox这样的第三方Recovery。 kernelsu修补的镜像和传统magisk不一样，乱刷会导致系统无法启动并掉入900e模式。 好久好在解了bl锁的一加不容易死，不然真要跑售后了。\n","date":"2026-03-12T18:57:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/oneplus13-arb-and-root.html","title":"关于我不小心更新一加13被塞了防降级后退到含ARB的ColorOS15并Root导致黑砖的那些事"},{"content":"前言 原来我好多两步验证服务都是托管在微软的Authenticator上，一开始我以为这玩意带云同步功能，就算换手机了只要重新登入微软账号就能把两步验证也同步过去，但实践之后的惨痛的代价告诉我这样行不通（现在还有几个设置了两步验证的网站上不去，人工客服也爱理不理，感觉要凉），但看看同类的软件无非就是谷歌验证器之类那几个，以下是D老师做的对比：\n同类软件对比 软件名称 主要功能 优点 缺点 平台支持 价格模型 是否开源 微软 Authenticator 双因素认证 (2FA)，特别集成微软账户 1. 与微软生态系统无缝集成\n2. 支持便捷的推送通知验证\n3. 提供云备份和跨设备同步 1. 功能主要围绕微软账户优化\n2. 推送验证需网络连接\n3. 备份数据存储在微软云，存在隐私顾虑 iOS, Android 免费 否 谷歌验证器 (Google Authenticator) 基于TOTP/HOTP标准的2FA验证器 1. 轻量、简洁、启动快\n2. 完全开源，代码透明\n3. 完全离线工作，无需网络\n4. 支持账户导出/导入 (较新版本) 1. 功能单一，仅限2FA\n2. 无官方云备份，设备丢失可能导致账户锁定\n3. 用户需自行管理密钥备份 iOS, Android 免费 是 Bitwarden 综合性密码管理器，内置2FA验证器 1. 开源且经过安全审计\n2. 集密码管理与2FA于一体，一站式安全\n3. 强大的跨平台客户端和浏览器扩展\n4. 支持自托管 (需付费订阅) 1. 使用官方服务器需信任其基础设施\n2. 高级功能 (如自托管、紧急访问) 需付费订阅\n3. 作为密码管理器，功能比纯验证器复杂 Web, Windows, macOS, Linux, iOS, Android， 主流浏览器扩展 免费版功能完整；高级功能需付费订阅 是 Vaultwarden (原 Bitwarden_rs) Bitwarden 密码管理服务器的自托管替代方案 1. 完全掌控数据，服务器私有化部署\n2. 兼容所有官方 Bitwarden 客户端，无需修改\n3. 资源占用低，对硬件要求友好\n4. 可免费使用 Bitwarden 付费版的大部分功能 1. 需要一定的技术能力进行部署、维护、更新和备份\n2. 安全责任由用户自己承担\n3. 非官方服务器，尽管社区活跃且受信任 任何可部署 Docker 或二进制文件的服务器；通过 Bitwarden 客户端访问 软件免费；需自行承担服务器成本 是 考虑到这类软件的安全敏感性，最终还是选择自己部署Vaultwarden。\n如果服务器资源充裕可以直接使用docker进行部署，而我为了节约成本选择自己编译二进制文件。\n前期准备 Docker方式 一般来说使用Docker构建是最快的，直接编辑docker-compose.yml：\nversion: \u0026#39;3.7\u0026#39; services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped expose: - \u0026#34;80\u0026#34; volumes: - ./vw-data:/data environment: - SIGNUPS_ALLOWED=true # 首次运行允许注册 - WEBSOCKET_ENABLED=true - ADMIN_TOKEN=your_admin_token_here # 管理员界面访问令牌 - DOMAIN=https://your-domain.com networks: - nginx-reverse-proxy networks: nginx-reverse-proxy: external: true 这样就会构建一个使用SQLite+Nginx的vaultwarden环境，再配置一下反代即可：\nserver { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; location / { proxy_pass http://vaultwarden:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /notifications/hub { proxy_pass http://vaultwarden:3012; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } 必须要配置ssl才能访问。\n二进制直接运行 因为我机器上已经有Postgresql+Nginx，加上docker本身会有一些开销，vaultwarden本身就是rust编译的，运行内存很小，套上docker之后优势就不存在了。\n编译的过程非常痛苦，本地机器4c8g都能被干到卡死，所以干脆用Github Action编译，如果使用postgres作为数据库的可以直接用我这个项目：tamakyi/vaultwarden。\n新建一个文件夹把内容解压其中：\nwget https://github.com/tamakyi/vaultwarden/releases/download/1.35.4/vaultwarden-1.35.4-linux.tar.gz tar zxvf vaultwarden-1.35.4-linux.tar.gz 会获得二进制文件vaultwarden_linux和文件夹web-vault，配置文件和目录\n编写初始配置文件/etc/vaultwarden.env DATA_FOLDER=/var/lib/vaultwarden/data/ DATABASE_URL=postgresql://[数据库用户名]:[数据库密码]@127.0.0.1:5432/[数据库名] IP_HEADER=X-Real-IP WEB_VAULT_FOLDER=/var/lib/vaultwarden/web-vault/ WEB_VAULT_ENABLED=true ADMIN_TOKEN=[base64码] DOMAIN=https://vaultwarden.tama.guru 数据库需要提前创建，ADMIN_TOKEN可以通过执行：\nopenssl rand -base64 48 获取，这属于明文密码，官方不推荐，建议配置完关掉admin页面访问权限。\n使用systemctl管理vaultwarden 新建/etc/systemd/system/vaultwarden.service并编辑内容：\n[Unit] Description=Vaultwarden Server Documentation=https://github.com/tamakyi/vaultwarden After=network.target postgresql.service Requires=postgresql.service [Service] User=vaultwarden Group=vaultwarden EnvironmentFile=/etc/vaultwarden.env ExecStart=/usr/bin/vaultwarden LimitNOFILE=1048576 LimitNPROC=64 PrivateTmp=true PrivateDevices=true ProtectHome=true ProtectSystem=strict WorkingDirectory=/var/lib/vaultwarden ReadWriteDirectories=/var/lib/vaultwarden AmbientCapabilities=CAP_NET_BIND_SERVICE [Install] WantedBy=multi-user.target 然后可以尝试启动vaultwarden了：\nsystemctl daemon-reload systemctl enable vaultwarden systemctl start vaultwarden 如果提示：\nRocket has launched from http://127.0.0.1:8000 则表明服务已经正常启动了。\n配置cloudflare tunnle访问 虽然可以用nginx反代，但我还是更喜欢用tunnle的方式，因为我的域名已经绑定了cloudflare，直接把我的目标域名https://vaultwarden.tama.guru引导到http://127.0.0.1:8000即可，现在就可以通过https://vaultwarden.tama.guru访问vaultwarden了。\n其他 登录后新建完用户，一般来说是要把注册权限关掉的，可以登录https://vaultwarden.tama.guru/admin，admin_token即时之前我们配置的vaultwarden.env中的ADMIN_TOKEN。登录进去之后找到SIGNUPS_ALLOWED的配置项，默认是打勾的，取消掉保存即可。\n然后我们需要关掉管理面板的访问，去/var/lib/vaultwarden/data/config.conf找到admin_token这一行，直接删掉整行保存，再执行systemctl restart vaultwarden即可。\n因为我使用的编译环境是Ubuntu22.04，glibc版本是2.35，如果系统glibc版本低于2.35的就建议自己编译吧，不然是执行不了的。查询系统glibc版本：\n$ ldd --version ldd (GNU libc) 2.36 ","date":"2026-02-27T16:55:00+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/vaultwarden-selfhost.html","title":"自托管密码柜 - 自建vaultwarden密码管理服务"},{"content":"前言 新年好！2026年给提问箱加了点小功能，最开始是我想起来曾经有一位水友在群里问我，我开通了提问箱，为啥没有人给我提问？对于NekoBox这个项目来说，最开始的时候往外分享出去的方式只有链接，再后来我结合现有资源弄了个二维码并不断优化。（但是对于大多数人来说，扫码工具无非就是微信和QQ，而这俩东西是带白名单机制的，本站域名因为不在白名单内，经常是需要扫码完再手动复制链接到浏览器访问，还是有点复杂。）而无论是链接访问还是扫码访问，这都需要提问箱的箱主主动去分享，上面这个水友则是想要一种被动得到提问的形式，所以我选择添加这个探索的功能。\n如何使用 登录后在用户设置页面底部的标签设置模块，目前我设置的是允许给自己写下五个标签，每个标签五个字之内，可以写任何东西，这里可以写一些希望大家知道你特长的板块，这样你的主页就会在探索页面展现出来。当然这个功能是默认关闭的，如果不开启“在首页展示我的标签”则不会显示。探索页面位于：探索用户。\n如果大家有什么新的想法可以提出来，我尽量修改。 欢迎大家注册使用：狼的提问箱。\n","date":"2026-02-26T18:00:00+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/tamabox-tags.html","title":"狼的公告板功能更新：探索和标签"},{"content":"其实原作者很早之前就写好了打通PostgreSQL的代码，只是我一直没啥时间弄，最近趁着年末最忙的时候想找点乐子释放下压力，就干脆把数据库迁移过来了。 迁移到PostgreSQL算是大势所趋吧，目前还在运行的几个项目中基本上都在使用这个数据库（之前还有部分部署在vercel上因为无法访问的原因也一并迁移到本地部署，而MySQL上就还存着提问箱的数据没别的东西了，对于服务器资源紧张的现状来说为了提问箱单独跑个MySQL也有点多余。\n我有尝试过使用pgloader一类的工具来迁移，但过程并不顺利，最后是使用navicat进行迁移的，写下这篇记录的时候数据库已迁移两个小时，在本地测试一切功能正常直接就放上线了。操作也很简单，大部分步骤参照原作者博客中的内容：再看 NekoBox：迁移、重构、展望 - Light Cube，再根据我迁移过程中碰到的问题整理而成。\n1.下载安装navicat，并配置好MySQL和PostgreSQL的数据库连接信息。\n2. 在PostgreSQL右键新建数据库命令新建一个名称为nekobox的数据库，然后新建一个查询来新建关系：\nCREATE SCHEMA nekobox; 3.使用工具-数据传输功能，源选定为MySQL下的原数据库，目标为PostgreSQL下的nekobox数据库，模式选为nekobox，然后选定所有的表执行迁移，根据数据量大小可能花点时间。 4.检查下把迁移是否把MySQL tinyint(2) 类型迁移成了 Postgres smallint 类型，而非 bool 类型，如有就手动修改它的类型：\nALTER TABLE \u0026#34;nekobox\u0026#34;.\u0026#34;questions\u0026#34; ALTER COLUMN is_private TYPE BOOLEAN USING CASE WHEN is_private = 0 THEN FALSE ELSE TRUE END; ALTER TABLE \u0026#34;nekobox\u0026#34;.\u0026#34;censor_logs\u0026#34; ALTER COLUMN pass TYPE BOOLEAN USING CASE WHEN pass = 0 THEN FALSE ELSE TRUE END; 5.解决迁移过程中没有把自增序列迁移过来的问题：\n-- 1. 查看当前最大 ID（先确认数据） SELECT MAX(id) FROM \u0026#34;nekobox\u0026#34;.users; -- 2. 创建序列并设置起始值（假设最大 id 是 1000） CREATE SEQUENCE \u0026#34;nekobox\u0026#34;.users_id_seq START WITH 1001; -- 3. 将序列绑定到 id 列 ALTER TABLE \u0026#34;nekobox\u0026#34;.users ALTER COLUMN id SET DEFAULT nextval(\u0026#39;nekobox.users_id_seq\u0026#39;); -- 4. 将序列的所有权给表（表删除时序列也删除） ALTER SEQUENCE \u0026#34;nekobox\u0026#34;.users_id_seq OWNED BY \u0026#34;nekobox\u0026#34;.users.id; 6.因为更新之后的源码已经不需要content_censor_pass和answer_censor_pass的数据，还需要手动删除：\nALTER TABLE questions DROP COLUMN IF EXISTS content_censor_pass; ALTER TABLE questions DROP COLUMN IF EXISTS answer_censor_pass; 修改完以上内容之后，clone源码到本地重新编译就正常运行了。\n","date":"2025-12-30T17:32:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/tamabox-database-move-to-postgres.html","title":"狼的提问箱数据库已迁移至PostgreSQL"},{"content":"本站多数服务都是通过CloudFlare提供的CDN服务实现加减速，默认配置在多数情况下对于我提供的轻量服务也基本够用，一些比较重的资源比如自建图床、静态资源挂在阿里云OSS上，但前几天CloudFlare全球大面积崩溃导致部分服务无法使用（控制台都上不去，想切出来都切不了），在服务恢复后我对现存的几个服务做比较分析，发现之前使用CNAME优选加速的提问箱整体速度要比公告板和分享盘要快很多，而后两者一个是通过CloudFlare Pages的默认CNAME，一个是直接点开小云朵加速，于是我决定花点时间将所有的服务都切换使用CNAME优选加速，在过程中碰到的些许问题在此记录。\n通用加速前提 前提就是要有两个域名，一个需要绑定在CloudFlare上，另一个可以放在其他类似腾讯云的平台，方便做分线路解析。以我自己为例，我绑定在CloudFlare上的域名是337845818.best，先在域名下的DNS \u0026gt; 记录下新增一个用作回退源的解析，比如我设置如下：\n类型=A 名称=origin 内容=服务器IP 代理状态=已代理 TTL=自动 这样就添加了一个指向服务器IP的源origin.337845818.best。 然后在SSL/TLS \u0026gt; 自定义主机名中设置回退源为origin.337845818.best，刷新等待回退源状态变为有效。 这种情况下就可以通过SSL/TLS \u0026gt; 自定义主机名中的添加自定义主机名实现解析到服务器IP上的服务。比如添加一个提问箱的自定义服务，首先需要在DNS \u0026gt; 记录中新增一个解析，比如box.337845818.best，这个A记录直接指向服务器并点开小黄云，然后在SSL/TLS \u0026gt; 自定义主机名中的添加自定义主机名内设置：\n自定义主机名=box.tama.guru 最低TLS版本=TLS1.0（默认） 证书类型=由CloudFlare提供 证书验证方法=TXT验证（推荐） 自定义源服务器=box.337845818.best 然后会得到两组TXT用于域名核验，我的tama.guru域名绑定的是DNSPOD，所以需要在DNSPOD上把这两组TXT添加到解析，并等待刷新提示证书状态为有效且主机名状态为有效，然后就可以在DNSPOD添加两组CNAME解析：\n主机记录=box 记录类型=CNAME 线路类型=默认 记录值=box.337845818.best TTL=600 主机记录=box 记录类型=CNAME 线路类型=境内 记录值=tamabox.cloudflare.182682.xyz TTL=600 这里的visa.cn即为优选域名，网上有很多可以自己找找适合自己的。这样设置之后一段时间后可以通过dig命令查询是否生效：\n~$ dig box.tama.guru ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.18.33-1~deb12u2-Debian \u0026lt;\u0026lt;\u0026gt;\u0026gt; box.tama.guru ;; global options: +cmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 48864 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;box.tama.guru. IN A ;; ANSWER SECTION: box.tama.guru. 539 IN CNAME tamabox.cloudflare.182682.xyz. tamabox.cloudflare.182682.xyz. 9 IN CNAME 我爱学习壹.cloudflare.182682.xyz. ... ... ;; Query time: 63 msec ;; SERVER: 223.5.5.5#53(223.5.5.5) (UDP) ;; WHEN: Fri Nov 21 10:51:58 CST 2025 ;; MSG SIZE rcvd: 410 可以看到应答结果叽里咕噜叽里咕噜添加一堆东西，然后通过ping.cn之类的工具查询域名box.tama.guru，全国都很绿了。\nPages加速 在设置好的Pages下找到自定义域，比如我把公告板服务解析到blog.tama.guru，然后到DNSPOD一样添加两组CNAME解析，一组指向默认的***.pages.dev，另一组设置区域为境内，指向优选CNAME，这样就实现了分流。\nWorker加速 比如我有一个worker名称设定为60S，先在域名下的DNS \u0026gt; 记录下新增一个CNAME解析，指向优选域名，比如：\n类型=CNAME 名称=60s-cname 内容=cloudflare-proxy.cloudflare.182682.xyz 代理状态=**仅DNS** TTL=自动 注意代理状态是仅DNS，这样可以得到一个60s-cname.337845818.best的加速域名。然后在域名下的Workers路由新增一条HTTP路由 ，路由为60s-cname.337845818.best/*，worker选择60S，保存生效后就可以通过60s-cname.337845818.best这个域名加速访问到这个Worker。当然，这样只适用于域名绑定在CloudFlare上的情况。\nQA Q：通用加速可以让多个服务器使用吗？\nA：不能，因为只有一个回退源，而这个源指向的是单独的IP，就算添加了自定义主机名也只能指向这个服务器IP提供的服务，如果有多个服务器IP就要有多个CloudFlare账号来操作。\nQ：自定义主机名提示custom hostname does not CNAME to this zone.\nA：到DNSPOD检查一下是否有增加目标域名解析，比如自定义主机名设置了share.tama.guru-\u0026gt;share.337845818.best，则在DNSPOD添加名为share指向share.337845818.best的CNAME解析。\nQ：自定义主机名提示The custom origin hostname you specified is a gray clouded DNS record. Please update the record to be proxied.\nA:CloudFlare不支持没有代理的目标域名做自定义主机源，需要到CloudFlare的DNS解析中找到对应的域名把仅DNS改成代理。\nQ：访问代理网站提示ERR_TOO_MANY_REDIRECTS\nA：检查CloudFlare上域名的SSL/TLS \u0026gt; 概览中SSL/TLS加密方式，确保为自动SSL/TLS（默认）或者完全模式。\n","date":"2025-11-21T15:35:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/cloudflare-cname-issus.html","title":"记录一些使用CloudFlare CNAME优选加速碰到的问题"},{"content":"如果是全新安装双系统，个人建议还是先安装linux部分再安装windows，因为这样可以直接调整efi分区大小，如果先安装windows系统就会出现efi分区只有100M的情况，对于动辄几十兆的linux内核来说属实是不够的，还需要进PE系统使用diskgeniues之类的工具重建efi，有可能会导致无法启动。\nArchlinux安装 首先是使用rufus刻录到U盘，直接使用默认的配置dd写入即可，如果使用ventoy的方式安装的话可能会出现找不到init导致安装无法进行。\n连接网络并同步时间 输入iwctl进入 iwd 的控制台, 然后依次键入如下命令:\ndevice list # 列出可用无线网卡, 我这里输出的是 wlan0 station wlan0 scan # 扫描附近的无线网络 station wlan0 get-networks # 列出扫描到的网络 station wlan0 connect {SSID} # 连接指定网络, 这里我连的是手机热点 exit # 退出 iwd 控制台 然后, 输入 ping www.baidu.com 测试是否成功联网.\n联网后, 输入如下命令设置时间为 UTC 并完成 NTP 时间同步:\nhwclock --systohc --utc # 设置时间为 UTC timedatectl set-ntp true # 完成 NTP 时间同步 使用SSH执行安装 ip -brief address # 查询IP地址 passwd # 修改密码 之后就在其他电脑上用ssh客户端连接root@ip:22，密码就是passwd的密码。因为gpd win mini的键盘实在太小了，避免误操作~~（其实是方便ctrl+c和ctrl+v）~~。\n分区 我仅保证基础的系统运行需求，只配置了：\nEFI 600M SWAP 8G ROOT Linux root (x86-64) 如果有把home单独分开的习惯另行建立一个linuxfilesystem的分区就行了，但我不需要。\nfdisk -l # 查看硬盘和分区目录，机器上配置单块nvme，显示为nvme0n1 cfdisk /dev/nvme0n1 # 使用cfdisk进行分区操作，操作简单 fdisk -l # 查看硬盘和分区目录是否配置生效 Device Start End Sectors Size Type /dev/nvme0n1p1 2048 1230847 1228800 600M EFI System /dev/nvme0n1p2 1230848 18008063 16777216 8G Linux swap /dev/nvme0n1p3 18008064 353552383 335544320 160G Linux root (x86-64) mkfs.vfat -F32 /dev/nvme0n1p1 # 格式化efi分区为fat32 mkswap /dev/nvme0n1p2 # 配置swap分区 mkfs.ext4 /dev/nvme0n1p3 # 格式化root为ext4，如果使用其他格式另说 mount /dev/nvme0n1p3 /mnt # 挂载root分区到/mnt mkdir -p /mnt/boot # 在root分区下新建boot文件夹用于挂载efi分区 mount /dev/nvme0n1p1 /mnt/boot # 挂载efi分区到/boot目录 swapon /dev/nvme0n1p2 # 启用swap分区 安装基本系统 安装基础软件并配置fstab挂载\ncurl -L -o /etc/pacman.d/mirrorlist \u0026#34;https://archlinux.org/mirrorlist/?country=CN\u0026#34; # 抓取archlinux.org上的mirrorlist文件保存本地 nano /etc/pacman.d/mirrorlist # 该文件包含基本上国内所有活跃的源，删掉前面的#即可，一般留个三四个https开头的就行了 pacman -Syy # 更新索引 export LANG=C #避免乱码 pacstrap /mnt base linux linux-firmware bash-completion e2fsprogs nano networkmanager pacman-contrib sudo amd-ucode intel-ucode sof-firmware #安装基础软件，实体机器安装时根据cpu安装 amd-ucode或intel-ucode，一起安装也没事就是了 genfstab -U /mnt \u0026gt;\u0026gt; /mnt/etc/fstab # 生成fstab文件 arch-chroot /mnt # 切换到新系统 系统初始化设置 主要是一些时区、hostname、语言、新建用户等基础设置\nln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 修改时区为上海 hwclock --systohc # 系统时间同步到硬件时钟 echo miniarch \u0026gt; /etc/hostname # 修改hostname，这里和下一步相关联 nano /etc/hosts #编 辑host解析 127.0.0.1 localhost ::1 localhost 127.0.0.1 miniarch # 添加ipv4解析到hostname ::1 miniarch # 添加ipv6解析到hostname nano /etc/locale.gen # 修改多语言设置，建议使用en_US.UTF-8和zh_CN.UTF-8 locale-gen # 使多语言设置文件生效 echo LANG=en_US.UTF-8 \u0026gt; /etc/locale.conf # 设置默认语言，使用en_US.UTF-8是避免显示乱码 SUDO_EDITOR=nano visudo # 修改sudo设置，把%wheel ALL=(ALL) ALL前面的#删掉 useradd -m -G wheel -s /bin/bash admin # 增加新用户并添加到wheel组 passwd admin # 修改新用户密码 pacman -S grub # 安装grub pacman -S grub efibootmgr os-prober # 安装用于多系统的配套软件 grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck # 在grub增加一个efi分区指向boot目录的启动项 echo \u0026#34;GRUB_DISABLE_OS_PROBER=false\u0026#34; \u0026gt;\u0026gt; /etc/default/grub # 启用os-prober grub-mkconfig -o /boot/grub/grub.cfg # 生成grub配置 配置基础功能 图形化界面和字体、基础软件的安装和配套设置\npacman -S --noconfirm plasma sddm konsole noto-fonts noto-fonts-cjk noto-fonts-emoji openssh dhcpcd # 安装kde+plasma+基础字体+openssh+dhcp pacman -S --asdeps gst-plugins-good power-profiles-daemon # 补齐配套软件，power-profiles-daemon用于管理电源配置 systemctl enable NetworkManager # 启用NetworkManager systemctl enable sddm # 启用sddm systemctl enable sshd # 启用ssh systemctl disable NetworkManager-wait-online # 服务用于确保网络连接在启动过程中达到“在线”状态后，才允许依赖网络的其他服务启动，没必要使用。 timedatectl set-ntp true # 启用ntp systemctl enable systemd-resolved # 启用本地解析 systemctl enable dhcpcd # 启用dhcp ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf # 可能会提示已经做过链接了 exit # 退出当前环境 umount -R /mnt # 卸载/mnt和/mnt/boot reboot # 重启系统 重启后就可以使用图形界面登录了。\n进入系统后一些设置 安装完系统后依旧可以使用ssh远程操作，如果需要修改ssh配置就修改/etc/ssh/sshd_config。\n安装输入法 sudo pacman -S fcitx5-im fcitx5-chinese-addons # 安装输入法 sudo nano /etc/environment #配置使用输入法，把下面\u0026gt;\u0026gt;\u0026gt;之间的内容添加到这个文件 \u0026gt;\u0026gt;\u0026gt; GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx SDL_IM_MODULE=fcitx \u0026gt;\u0026gt;\u0026gt; 修改启动界面语言 sudo SYSTEMD_EDITOR=nano systemctl edit sddm # 修改启动界面语言，把\u0026gt;\u0026gt;\u0026gt;之间的内容添加到第三行起的空行中。 \u0026gt;\u0026gt;\u0026gt; [Service] Environment=LANG=zh_CN.UTF-8 \u0026gt;\u0026gt;\u0026gt; 安装rust并换源 sudo pacman -S rustup #使用rustup安装rust nano ~/.cargo/config.toml # 修改默认索引源为中科大的，速度快很多，编辑这个文件把\u0026gt;\u0026gt;\u0026gt;之间的内容添加进去，.cargo目录默认也是没有的，要自己新建 \u0026gt;\u0026gt;\u0026gt; [source.crates-io] replace-with = \u0026#39;ustc\u0026#39; [source.ustc] registry = \u0026#34;git://mirrors.ustc.edu.cn/crates.io-index\u0026#34; [net] git-fetch-with-cli = true \u0026gt;\u0026gt;\u0026gt; nano ~/.bashrc # 添加环境变量，\u0026gt;\u0026gt;之间的内容添加到最后即可 \u0026gt;\u0026gt;\u0026gt; export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup \u0026gt;\u0026gt;\u0026gt; source ~/.bashrc # 使环境变量生效 rustup default stable # 安装rust 安装paru yay还是paru都可以，个人更习惯paru，上面安装rust主要也是因为paru是用rust写的，不换源安装会非常的久。\nsudo pacman -S --needed base-devel git # 安装编译所需套件 git clone https://aur.archlinux.org/paru.git # 拉取源码到本地 cd paru # 进入源码目录 makepkg -si # 开始编译安装 安装golang并配置代理 sudo pacman -S go # 安装go go env -w GO111MODULE=on # 启用 Go Modules 功能 go env -w GOPROXY=https://goproxy.cn,direct #切换使用七牛云做代理源 安装steam sudo nano /etc/pacman.conf #启用multilib支持，删除掉[multilib]部分前面的# \u0026gt;\u0026gt;\u0026gt; ... [multilib] Include = /etc/pacman.d/mirrorlist ... \u0026gt;\u0026gt;\u0026gt; sudo pacman -S steam # 安装steam steam #安装完执行一次steam来拉取安装包，安装过程中使用ssh还是本地终端都行，但是使用ssh安装完会提示找不到x环境，不影响 至此，基本的archlinux环境已经安装完成。\n安装Windows 11 LTSC 其实安装啥版本都行，使用ltsc是因为没有那些杂七杂八的功能，更新也少一些，使用rufus或者ventoy安装都可以，这里主要讲安装完成后的一些必要操作。正常安装进入系统后先不要急着联网，首先进设备管理器可以看到一堆感叹号，但是千万不要把驱动全部安装，不然大概率会在后续重启后死循环！\n注意AMD DRTM Boot Driver驱动问题 未安装驱动中有一项（一般是最后一项）显示是未知设备的，详细信息中设备实例路径是ACPI\\DRTM00001\\0，实际是叫AMD DRTM Boot Driver的东西，如果使用AMD Chipset Drivers安装驱动会默认把这一项一起安装，千万要记得到设备管理器里面卸载这一项的驱动并且停用这个设备。\n这个驱动貌似和安全启动相关，但是无论我开启安全启动还是关闭安全启动，只要安装这个就会在下次重启无法进入系统，具体症状就是开机后使用Windows Boot Manager不能进入系统加载（就是转圈圈），然后黑屏自动重启，多次之后掉到自动修复但是修复提示失败；如果使用refind或者grub的启动项进去会提示0xc0000001启动失败，具体原因目前我也找不到资料，所以建议是千万不要去动这个东西。一开始我还以为是系统问题，但是无论是官方的固件还是最新WIN11、LTSC都有复现，所以从更新的角度去考虑，我进PE用dism++把安装的驱动一项项排除发现只要把系统设备下的amddrtm.inf删掉问题就解决了，所以很明显就是这个AMD DRTM Boot Driver的问题。\n所以在安装好系统后，一是停用设备，二是避免安装这个驱动。最好就是针对性的屏蔽这个设备的驱动安装，先在设备管理器里右键这个设备找到详细信息\u0026gt;类Guid，这是一个用{}包括起来的值，右键复制，然后到组策略的计算机配置\u0026gt;管理模版\u0026gt;系统\u0026gt;设备安装\u0026gt;设备安装限制，找到阻止使用与下列设备安装程序类相匹配的驱动程序安装设备，切换到已启用，并在下方的显示中把上面的类Guid复制进去并应用，之后应用即可，之后再安装这个设备驱动就会报错提示系统策略禁止安装。目前这么操作几天之后没有发现其他问题。\n","date":"2025-11-11T11:11:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/dual-system-on-gpd-win-mini.html","title":"自用的windows+archlinux双系统安装过程（在gpd win mini 2024上验证通过）"},{"content":"[TOC]\n前言 我一直很想找个足够小且带屏幕、满足基本输入方式的X86设备，最早的时候是因为接触到诺基亚的N900，这玩意能够跑linux且自带侧滑键盘，是我理想的形态，但无奈的是硬件性能实在跟不上，且很多软件已经没有维护，最终也只能当个玩具。在这之后，我接触到Steamdeck、N305带屏小主机甚至是刷WIN10改运存的小米平板2，但每个都有不满意的地方，steamdeck屏幕不大但是整体体积很大，而且是为游戏设计的，操作对我来说有点别扭；带屏小主机算是一段时间内我带出门的主力设备，机身接口丰富且整体尺寸控制不错，但是缺少触屏之外的输入方式，也就是真要干活就得自带鼠标键盘；至于小米平板2，小是够小而且可以加装超薄的键盘皮套，但是atom的性能摆在那里，就只能当个玩具玩玩。所以在我发现win2屏幕只有6寸的时候是真的震惊了，而且是翻盖全功能键盘，cpu也是8100y而不是那一众atom，还能加装固态，唯一的问题就是价格离谱，去年前年刚看到的时候一个要千五千八，最近刚看已经降到千元出头，最后找到个九百多乱改过散热和电池导致有点鼓包的。\n上手 刚上手的时候是用个小袋子装的，确实小很多，基本上就比手机宽一些，两倍厚度；机身IO相比N305主机少很多，就一个USB3.0+一个TypeC（兼容供电）+外星科技3.5mm接口+MicroHDMI。6寸屏幕在720P分辨率下显示尚可接受，但是操作起来就有点麻烦（主要是系统UI太小了），手柄部分可以切换成鼠标模式，用摇杆模拟滚动，肩键模拟左右键，但是摇杆的灵敏度很低，只能说够应急但是绝对不能说得上用的爽。\n姑且跑个分，CPU144150 显卡57990，内存86582，硬盘53269，合计341991，对于这么小尺寸的设备我觉得还是可以接受。\n这系统原机主连重置都懒得重置一下，很多个人资料在里面，卖二手设备要注意信息安全啊\u0026hellip;\n换硬盘装WIN11 机身带的硬盘只有256G，装个系统剩下也不够干啥了，但这机子固态用的是2242长度，手头上最大的也只有512G，姑且先换一个上去装系统。 我用的是win11的官方ltsb镜像，使用ventoy安装，安装过程中如果使用新版安装器在硬盘检测步骤必定会出现Windows安装遇到错误。错误代码：0x8007001-0x4002F的问题，必须要切换到旧版安装器。\n**注意！在所有驱动安装完成之前先不要联网！**安装完成后进入系统很多硬件都是没有驱动的，特别是触屏，官方虽然发布了触屏修复补丁，但是如果安装那玩意轻则只是触屏错位，重则完全失灵。查一些资料之后在一个帖子（https://tieba.baidu.com/p/7675530378#)下发现类似状况和解决方案，我在这个方案的基础上做一些调整，实现WIN下所有设备驱动正常：\n先修复触屏驱动：\n去官网下载V6驱动包、4.4.2.4923版本的触屏驱动和贴吧提供的未签名版本特定驱动到U盘或SD卡上，解压好备用。 去高级启动中修改启动配置为禁用驱动程序强制签名（F7 / 7），重启进入系统后到解压后的未签名版本特定驱动文件夹下找到.inf文件右键安装，安装过程中会弹出驱动未签名的红色警告，继续安装。安装完此时触摸是正常的，也没有漂移。到设备管理器中检查GoodixTouchDriver Device版本为14.47.23.751，然后重启。 重启后触屏再次时效，设备管理器中检查GoodixTouchDriver Device装填变为无法验证此设备所需的驱动程序的数字签名，再次回到解压后的未签名版本特定驱动文件夹，找到关闭测试模式.bat，运行并重启。（关闭测试模式这一步是否有必要有待考究，也许重启之后就自动关闭了，但原文如此，且不影响我操作，暂且保留） 进入设备管理器，右键GoodixTouchDriver Device并选择更新驱动程序，来源选择浏览我的电脑以查找驱动程序，选择官方提供的4.4.2.4923版本的触屏驱动文件夹，等待安装完成，此时触屏已恢复且重启后不会掉驱动，至此触屏驱动修复完成。 解决其他驱动问题：\n修复完触屏后还剩下10个感叹号，我们需要按照上面的第四点这样操作，手动从电脑中更新驱动，驱动的文件夹选择V6驱动包的解压路径。需要注意显示适配器默认只是Microsoft基本显示适配器，也需要在V6驱动包中安装UHD615的驱动。\n需要注意：\n如果安装完后系统运行正常，还是不要联网，先去把自动安装硬件驱动更新给关掉，参考：如何禁止 Windows 11 自动安装或更新驱动程序 - 系统极客\n方法 1：禁止 Windows 11 自动安装驱动程序：按Windows + R快捷键打开「运行」对话框，执行systempropertiesadvanced打开「系统属性」窗口；切换到「硬件」选项卡，点击「设备安装设置」按钮；在新弹出的窗口中，选择「否」，关闭驱动自动安装功能；最后，点击「保存更改」，让设置生效。\n方法 2：通过组策略阻止「Windows 更新」提供驱动程序 （不建议，会连正常驱动都无法安装）：按Windows + R快捷键打开「运行」对话框，执行gpedit.msc打开组策略编辑器；依次展开「计算机配置」\u0026gt;「管理模板」\u0026gt;「Windows 组件」\u0026gt;「Windows 更新」\u0026gt;「管理从 Windows 更新提供的更新」；双击「Windows 更新不包括驱动程序」策略，将它设置为「已启动」。\n方法 3：通过注册表禁止从「Windows 更新」搜索驱动程序：按Windows + R快捷键打开「运行」对话框，执行regedit打开注册表编辑器，导航到\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DriverSearching 找到名为SearchOrderConfig的 DWORD (32 位) 值，并将其设置为：2 ，即不搜索 Windows 更新。\n之所以这么做，是因为机子自带的无线网卡在通过windows更新驱动时，100%会导致蓝屏并循环！（关键文件：ndis.sys，错误代码： SYSTEM THREAD EXCEPTION NOT HANDLED），如果你不小心联网了，手动重启到安全模式，把C:\\Windows\\SoftwareDistribution\\Download下的文件全部删除，特别是install文件夹内的文件，存放的就是系统下载并解压后的网卡驱动。\n当你做完这一切，Win11 on GPD win2算是完全正常运行了，后续的激活和优化根据自己的要求即可。\n双系统安装，准确来说是安装archlinux 以下是一些注意事项的记录，并不涉及到系统的安装。\n因为这台机器我打算就玩些小游戏，512G也基本够用（实在不够扔内存卡也不是不行），我就把100G空间划出来给linux用。 ，安装前需要先进PE系统用diskgenius把ESP分区文件备份，然后把ESP和MSR都删掉再重建，ESP分区要大于500M。\n一样使用ventoy安装archlinux，需要注意的是安装时选择的是grub安装而不是正常安装（不知道是不是我设备的问题，正常安装会直接显示USB电涌然后找不到init，根本安装不下去）。\n在grub界面时不要直接点install archlinux，先按e调整下参数，具体是找到linux开头的那行的末位添加以下内容：\nmodprobe.blacklist=sdhci_pci sdhci.debug_quirks=0x8000 这也可能是我机器的问题，因为在安装时终端会一直报错：\nmmc0: Timeout waiting for hardware cmd interrupt. ... 查资料后有说是SD卡控制器的问题，我尝试过插拔内存卡都没有效果，只能通过这个方式屏蔽，不然安装过程中会不停报错甚至卡死只能长按电源关机。\n还要注意的是，安装系统时并没有办法直接调用无线网络连接WIFI（iw直接检测不到设备，也扫不出来任何SSID），需要用手机连接上设备共享网络。\n正常安装后触屏、显示、WIFI都是正常的，但是在终端执行\ndmesg | grep sd 发现还是会报一样的错：\nmmc0: Timeout waiting for hardware cmd interrupt. ... 我的建议是添加/etc/modprobe.d/blacklist.conf文件，文件内容是：\nblacklist sdhci blacklist sdhci_pci 保存并执行sudo update-initramfs -u命令生成内核初始化文件。\n安装完后可以用refind之类的做引导或者用grub做引导器。\n更新：如果archlinux的欢迎界面（SDDM）显示的是竖屏而非横屏，可以编辑：\nsudo nano /usr/share/sddm/scripts/Xsetup 在最后面添加：\nxrandr --output eDP-1 --rotate right 其中eDP-1是屏幕的名称，right表示右转。如果还出现SDDM界面输入密码后黑屏的情况，可以试着执行：\nsudo rm -rf /etc/sddm.conf.d/ ~/.config/sddm/ 然后重启SDDM服务：\nsudo systemctl restart sddm 如果发现SDDM界面变回初始主题但是能正常使用，那就说明原来的主题或者配置文件异常冲突了。\n","date":"2025-10-14T11:09:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/multi-system-on-win2.html","title":"在GPD Win2上装Win11和archlinux双系统的那些事"},{"content":"[TOC]\n简介 我就是感觉这样一个东西应该会有，但是一直找不到，所以干脆自己写个\u0026hellip;一个使用Python的简约销售管理系统，支持商品、分类、库存、销售流水、用户权限、批量导入、统计报表、仪表盘等功能。适合小规模使用，数据支持sqlite或mysql存储，可能会在某些情况下有用处。 项目地址：https://github.com/tamakyi/simple-sales-system\n一些截图 仪表盘 商品管理 商品导入 进销存 移动端进销存 商品分类 用户管理 操作记录 功能特色 商品管理（增删改查，支持图片、批量导入） 分类管理 进销存：商品表格展示，直接在行内录入进货/销售（针对移动端单独做优化） 销售流水、历史/今日销售、库存统计 销售排行榜、分类饼图、销售数据卡片 用户权限（管理员/普通用户/审核） 操作日志 导出销售报表（Excel） 支持分页、搜索、图片外链或本地上传 可选使用sql轻量化存储数据或使用mysql存储 网页公告 背景图片 网页跟踪脚本 快速开始 1. 安装依赖 pip install -r requirements.txt 2.复制.env.sample为.env并编辑 UPLOAD_FOLDER = \u0026#39;static/uploads\u0026#39; #图片上传路径 SECRET_KEY = mysecretkey #安全密钥，建议替换 SQLALCHEMY_DATABASE_URI = \u0026#39;sqlite:///sales.db\u0026#39; # 使用SQLITE作为数据库时使用 SQLALCHEMY_DATABASE_URI = mysql+pymysql://root:password@localhost:3306/test_sale # 使用MYSQL作为数据库时使用 MAX_CONTENT_LENGTH = 2097152 #最大上传大小，默认2M，即2*1024*1024 PER_PAGE = 10 # 商品页面每页体现的商品数量 BACKGROUND_IMAGE_URL=https://xxx.com/xxx.png # 默认背景图片地址 BACKGROUND_OPACITY=0.1 # 背景图片不透明度，范围0-1，越接近0越透明。 BACKGROUND_SIZE=cover #背景图片尺寸，默认cover即可，详情查看web css中关于background_size的参数说明。 DASHBOARD_ANNOUNCEMENT=\u0026#34;请注意：系统将于本周五晚进行维护，届时可能无法访问。\u0026#34; ANNOUNCEMENT_ENABLED=True # 控制公告是否显示 ANALYZE_SCRIPT=\u0026#34;\u0026#34; #分析脚本，建议使用umami ANALYZE_ENABLE=True #开启分析脚本功能 2. 启动项目 python app-mysql.py #使用mysql存储数据 python app-sqlite.py #使用sqlite存储数据 3. 访问地址 浏览器打开 http://localhost:5000/\n4. 初始管理员 用户名：admin 密码：admin 批量导入商品 支持 CSV 批量导入，需包含下列列名：\n商品名、单价、库存、分类 示例见 sample_products.csv。 网页内支持直接导出模板文件，修改好导入即可实现批量导入。\n测试 当前已在Debian12 + conda python 3.11 下测试通过。 ","date":"2025-09-19T15:09:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/simple_sales_system.html","title":"狼的小卖部 - 基于 Flask + Jinja2 的进销存与销售管理系统"},{"content":"[TOC]\n前言 自从爱快添加Docker插件之后我有第一时间就安装，使用一段时间后感觉这玩意问题蛮多的，首先就是功能残废，系统提供的界面只能实现修改镜像源、配置存储位置这些基础功能（修改镜像源还是最近几个版本才添加，原来直连官方国内已经无法访问）；然后就是访问异常，我使用Chromium内核的浏览器（包括但不限于Chrome、Edge）访问Docker的管理页面，总是会莫名其妙的跳出来，每点一下就跳一次，拉个镜像配置完参数硬是要花我几分钟时间。而且Docker功能需要到云服务端去手动开启，一直搞不懂为什么要这样。\n但是现在多个路子，就是通过自带的虚拟机虚拟linux环境专门来跑docker，听说它自带的虚拟机也有一些问题，长期使用会影响到宿主系统的性能，但是我使用一段时间之后并没有感觉，日常使用占用CPU最多也就跑到40%，内存我限制了1G，感觉基本够用了。 我使用的是某鱼上购入的双网口j1900+4G+32G MSata主板作为旁路由，原来用的是基于openwrt的istore，功能很全面，使用起来也很简单，日常维护甚至不需要进ssh，但是我监控家中的网络时发现这个软路由总是莫名其妙的掉线，好在下级做过故障转移，旁路由挂的时候AP能够直接过光猫，不然家里老人断网了我都不知道怎么和他们解释。\n之所以用Alpine是因为它有专门针对虚拟机的版本，体积仅有65M，安装完占用硬盘不到300M，但是能全功能安装Docker甚至其他软件，对于j1900+4G这种配置再合适不过了。\n准备工作 分区 建议先对爱快分区内的文件备份，因为需要单独给Alpine配置一个分区。 因为硬盘只有32G，我打算分成三块，4G给系统日志绰绰有余，12G分配做普通存储，用自带的Docker还有存放一些文件的时候使用，剩下的全部都留作Alpine的分区。注意的是Alpine的分区不需要绑定业务，也无需挂载，格式化好之后放着就行。\n上传镜像 刚才我们分配做普通存储的分区下新建一个文件夹ISO，然后到https://www.alpinelinux.org/downloads/找到Virtual下的x86_64（如果是arm系统就下载arm/aarch），下载针对虚拟机的最新版本ISO，目前最新的是：https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/x86_64/alpine-virt-3.22.1-x86_64.iso存放到ISO文件夹，或者不限难看直接放在根目录也行。 找到文件后点击查看路径并复制路径备用。\n新增虚拟机 配置虚拟机 在高级应用-虚拟机下选择添加。 配置方面根据自己的实际情况添加即可，虚拟机名称任意天蝎，系统类型选Linux，CPU使用率我只给80%，核心数给2，内存分配1024M。 设备管理需要手工添加一个分区，设备类型为磁盘，磁盘类型选引用分区，勾选半虚拟化，分区名称选择前面我们分区时没格式化的那个，我这里显示的是sda7。 下面虚拟机光驱就填写前面我们的ISO文件路径，VNC外部访问一定要打开，密码和端口任意，下面的开机自启、UEFI启动和硬件加速也打开，然后保存。 安装Alpine 启动虚拟机，返回上一层的操作部分点击VNC，输入之前配置的密码，进入到系统安装界面。 默认的用户名是root，没有密码直接回车。 然后按提示进行配置：\nlocalhost:~# setup-alpine #执行安装脚本 ... ... Select keyboard layout:[none] us #选择键盘布局，选us即可 ... ... Select variant (or \u0026#39;abort\u0026#39;): us-intl #选择布局变种，我是随便选的 ... ... Enter system hostname (fully qualified from, e.g. \u0026#39;foo.example.org\u0026#39;)[localhost] #系统名，一般直接保持localhost ... ... Which one do you want to initialize? (or \u0026#39;?\u0026#39; or \u0026#39;done\u0026#39;) [eth0] #选择网卡，一般默认eth0即可，如果有另外添加网卡或其他特殊情况再调整 ... ... Ip address for eth0?(or \u0026#39;dhcp\u0026#39;, \u0026#39;none\u0026#39;, \u0026#39;?\u0026#39;)[dhcp]192.168.233.233 #获取eth0网卡IP的方式，默认dhcp，但是我爱快没开dhcp，配置的静态路由，所以我填写爱快网段内任意一个没占用的IP。 ... ... Do you want to do any manual network configuration?(y/n) [n] #是否需要手动设置网络，y则进入vi界面编辑网络配置文件，如无需要直接n .. ... New Password: #设置root用户的密码 Retype password: #再输入一次 ... ... Which timezone are you in? (or \u0026#39;?\u0026#39; or \u0026#39;none\u0026#39;) [UTC] Asia #选择时区 What sub-timezone of \u0026#39;Asia\u0026#39; are you in? (or \u0026#39;?\u0026#39;) Shanghai #选择子时区 ... ... HTTP/FTP proxy URL? (e.g. \u0026#39;http://proxy:8080\u0026#39;, or \u0026#39;none\u0026#39;) [none] #是否需要代理访问网络 ... ... Which NTP client to run? (\u0026#39;busybox\u0026#39;, \u0026#39;openntpd\u0026#39;, \u0026#39;chrony\u0026#39; or \u0026#39;none\u0026#39;) [busybox] #用哪个作为ntp终端，默认即可 ... ... Enter mirror number or URL: [1] f #选择软件源，最好选择第一项，即f，会遍历所有镜像留下最快的那个 ... ... Setup a user? (enter a lower-case loginname, or \u0026#39;no\u0026#39;) [no] alpine #是否新建各一般用户，是则输入用户名，否则no ... ... Full name for user alpine [alpine] #新用户的全名 ... ... New Password: #设置root用户的密码 Retype password: #再输入一次 ... ... Enter ssh key or URL for alpine (or \u0026#39;none\u0026#39;) [none] #输入新用户的ssh key，直接回车给它自己处理 ... ... Which ssh server?(\u0026#39;openssh\u0026#39;, \u0026#39;dropbear\u0026#39; or \u0026#39;none\u0026#39;) [openssh] #选择默认的ssh服务，一般都是用openssh，直接回车 ... ... Which disk(s) you like to use (or \u0026#39;?\u0026#39; for help or \u0026#39;none\u0026#39;) [none] vda2 #要安装在哪个硬盘。如果前面没有手工把sda7分区添加进来这里则是空的，我这边系统中显示这个分区是vda2 ... ... How would you like to use it? (\u0026#39;sys\u0026#39;\u0026#39;, \u0026#39;data\u0026#39;, \u0026#39;lvm\u0026#39; or \u0026#39;?\u0026#39; for help) [?] sys #要怎么使用这个硬盘，一般选sys即可，所有文件都放在这个分区上，如果挂了多个分区可以分别配置 ... ... WARNING: Erase the above disk(s) and continue? [y/N]: y #是否要格式化硬盘 ... ... Installation is complete. Please reboot. reboot #是否重启 配置必要环境和Docker 重启后可以直接用ssh连接alpine了，不需要再使用VNC。首先把软件包升级，Aplnes的安装器是apk，有点抽象。 先执行su -和apk update拉取索引，然后用apk add sudo安装sudo包，如果提示：\nlocalhost:~# apk add sudo ERROR: unable to select packages: sudo (no such package): required by: world[sudo] 可能是dns的问题，需要手动调整dns：\nlocalhost:~# vi /etc/resolv.conf nameserver 223.5.5.5 然后再重新安装sudo:\nlocalhost:~# apk add sudo localhost:~# vi /etc/sudoers ... root ALL=(ALL:ALL) ALL alpine ALL=(ALL:ALL) ALL #添加这行到上面那行下面，alpine换成实际用户名 ... 接下来安装Docker：\nlocalhost:~# apk add docker localhost:~# rc-update add docker boot #添加docker到开机自启动 localhost:~# service docker start #启动docker服务 localhost:~# docker -v Docker version 28.3.3, build 980b85681696fbd95927fd8ded8f6d91bdca95b0 还可以给自己新增的一般用户增加docker权限：\nlocalhost:~# apk add shadow #因为alpine默认没有usermod，需要手动安装 localhost:~# usermod -aG docker alpine #alpine换成实际用户名 localhost:~# newgrp docker #重新登录用户，也可以直接注销会话再登录 ","date":"2025-09-09T15:09:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/alpine_docker_on_ikuai.html","title":"使用Alpine linux在爱快中作为虚拟机运行Docker"},{"content":"前言 注意：以下软件均在iOS环境下使用，如使用其他平台相同软件也可能有功能上的差异。 其实我很久之前就想到处走走，就是感觉走完什么都没能留下，也许像之前那样每到一个地方到处拍拍照回来的时候记下笔记写到博客里是个好办法，但基本都是对着照片回想，很容易疏忽一些琐碎的事情，所以我很需要一个软件来辅助记录行程。\n对于软件的功能要求，主要有以下几点：\n省电，一直用最大精度定位的话出门都要挂尿袋了。 简洁，我需要的功能很简单，就是记录行程，甚至不需要联网。 数据私有化，最好是能自建服务器存储在本地，因为涉及到位置信息算是隐私嘛。 为什么不用traccar了 对于自建服务这块之前有尝试用过traccar这个开源软件，可以实现在本地服务器搭建服务后穿透给连接，再到外网服务端安装对应版本的软件就能连接上报位置信息。但是实际使用和我的想法并不太一样：\n使用内网穿透对于穿透服务的稳定性有很高的要求，使用nat123这样的软件限制很多，而且速率不敢恭维，而用cloudflared做隧道的话又因为cloudflare难以预料的间歇性断联导致稳定性不佳。最好的办法是找个VPS跑，但这个程序是java写的，吃内存很大，但买个大内存的VPS成本就很高了，长久使用并不适合。 软件比较臃肿且内容不直观，除了行程路线，他还记录了速度、方向等一堆信息，还支持多个设备，对我来说不是很需要，而且实际线路它显示的是一段段的黑色箭头，如果定位间隔较长误差就会很大，如果很短在小范围内就会出现一堆箭头混一起的情况，非常混乱。 地图不友好，内置的几款地图要么没使用火星坐标系导致偏差很大，要么就是地图数据极老，网上倒是有办法修改源码实现转化为火星坐标，但每次升级都要改。 最后选了什么软件 结合网上的推荐，我购买了rond和世界迷雾两个软件。目前Rond只支持ios系统，世界迷雾支持安卓和苹果但不能通用，也就是说如果双持党想都用的话得买两份。\nrond可以直接在国区购买，日常价就是128，我等了很久都没降价所以原价入的。\n世界迷雾不建议在国区买！我在日区买日常价只要3000JPY（折合人民币145.77元），但是国区买需要198元\u0026hellip; 这两个都是同类型软件中常年下载量靠前的，体验一番后感觉确实都不错，两个应用应对的情景不一致，但互补使用效果更好。\n世界迷雾 基本介绍 关于世界迷雾(https://fogofworld.app/zh-hans/)这个软件的介绍网上已经很多了（注意，虽然软件支持苹果和安卓双端，但目前只推荐评估用户使用），它主要的界面包括地图、成就、备份几个，其中地图界面类似于塞尔达这样的游戏地图，一开始整个世界地图都是淡淡的白色（也就是迷雾），当你打开定位到处闲逛的时候，迷雾便会消除，这就是它的基础逻辑。 它还带了个成就系统，很据地图迷雾被消除区域的面积、到达过的国家、大洲等内容来提升经验值，玩一个月现在已经65级了（这段时间基本都是各个城市乱晃，所以提升挺快的），但是这个成就系统基本上都是以国家/地区作为单位的，还有一些比如造访10个亚洲国家或地区、造访3个赢得过世界杯的国家、造访过南极洲所有的国家和地区、探索全世界1%的面积这样刁钻的成就，估计这辈子都很难完成。\n数据存储 对于数据，默认情况下只留存在本地，但也支持iCloud、Dropbox、Google Drive、OneDrive和坚果云几种云端存储模式，其中坚果云貌似已经用不了了，一般就用iCloud、OneDrive这两个。\n软件使用fwss这个格式作为数据库快照，可以导入导出并使用迷雾资料库(https://fog.vicc.wang/)这样的软件进行读写，也可以直接在其他软件上生成GPX、KML这样的通用格式导入到软件内实现手工解锁迷雾，这种情形主要针对于忘记打开迷雾解锁开关或是身处地铁或高铁上难以定位的时候手工补全，如果为了成就甚至可以自己到处乱画，但那就没意思了。 定位不到的地方怎么办 正如前面所说，当身处地下或是在高速移动时，极大概率是无法完成定位的，即使设置里有定位精度的选项（即通用中的高精度定位开关）打开也无济于事，所以这种时候就需要第三方工具来补救。基本用法是在软件内生成一个快照并做好备份，导出到电脑后使用迷雾资料库(https://fog.vicc.wang/)这样的网页端工具进行再编辑，主要用到的有两种，一个是编辑软件生成的fwss快照，另一个是铁路线路导出。前者就很好理解，可以手工添加、删除线段实现对文件的修改，对于高铁线路可以到铁路线路导出选定路线、起点和终点生成kml文件，然后使用编辑工具直接导入。需要注意的是，这个网站的数据并不全，有一些较新的线路或是比较偏远的线路资料库里是没有的，这种情况就只能借助Google Earth Map之类的软件绘制GPX或者手工去一点一点的画了。\n修改后的fwss按原来的方式命名，修改一下时间，导入到手机的快照文件夹重新同步就行了。 类似软件 其实这样的系统在高德地图上是有类似的实现，但是高德是只要你到达某个区域并打开APP，它会把这一整块行政区域都”点亮“，把整块区域的面积都纳入”到过“的记录中，而世界迷雾则更细化，它只会根据在设置中设置的迷雾路径粗细估算实际走过的面积，基本上就是看到过的地方他才记录，所以高德记录我某个城市已探索的面积已经有几千平方公里，世界迷雾记录的则十分之一都不到。如果只是记录到过什么城市我个人认为是不需要花钱去买世界迷雾的，这软件只适合那些对每个城市的每一条街道都有探索欲的人，或者说花点小钱逼自己出去走走也挺好的。 有什么问题 使用过一段时间之后还是想吐槽点东西：\n成就难以达成，除非是AAA全球可飞这辈子基本不可能拿全成就。 软件需要常驻后台，iOS本身没有锁定软件的操作逻辑，一不小心清后台就会把这玩意踢出去，虽然负一屏有小组件能够实现点击后直接开始记录而不在后台中留下记录，但我个人不太喜欢负一屏。 多端需要多次购买，安卓和iOS是独立的，两边都想用只能两边都买，而且听说安卓版不如iOS那么省电，使用的还是谷歌的定位框架，要么是定位不到要么挂后台突然就没了，谷歌Play上差评非常多。 Rond 基本介绍 Rond和世界迷雾偏重的内容不一样，而且基础功能是不用花钱的。如果世界迷雾注重“线”，Rond则注重的是“点”。它直接调用iOS系统的定位（貌似iOS自身会经常获取位置信息，而Rond直接调用这些信息不重复去定位，因此软件本身耗电极小），获取设备本身所在的点的位置，因此它的主界面显示的是一条条的位置信息，而不是以地图的形式去展现。它的逻辑就是根据你在设置中配置的停留时长，当你在某处停留超过这个时长后把这个位置的点记录下来，比如下面这样的： 对于世界迷雾而言，Rond需要动手维护的地方多很多，但它就像是一个毛坯房，维护好之后可以装修得漂漂亮亮的。\n使用这个软件需要提前设置好活动类型、交通方式等信息，比如说定位到的地点属于医院，对应的活动可以标注为”看病“，然后后面每次到达定位为”医院“的建筑附近时会在时间轴上自动标注为”看病“。或者可以在设置内配置关键词，比如配置关键词规则检测到”喵“，活动添加一个”撸猫馆“也可以实现自动匹配。\n当然更多的情况是那些奇奇怪怪的店名和地名，这种情况下就只能手工匹配了。\n交通工具的维护也是非常重要的，因为软件定位方式的特殊型，其无法获取很高精度的速度信息，只有对于步行这样的慢速移动能够精确识别，使用自行车、电动车、汽车乃至地铁公交高铁都是难以识别，因此需要在交通工具中维护一个默认的交通方式，再手动调整。\n还需要对通勤和家的信息做维护，设置好家和单位的位置后，对于通勤的信息也能记录下来。\n维护好一切后，每天软件都能生成图表，了解自己一天下来在每种活动上花了多少时间。 也能根据城市、地点信息记录简短的游记，写下自己旅行中的奇思妙想，软件会自动获取天气等信息，算是个简单的日记。 数据存储 Rond只支持icloud备份和本地导入导出两种模式，本地导出的文件是csv格式的数据表，包含字段有”活动 位置 抵达时刻 离开时刻 时区 经纬度 标签 备注“这些内容，非常方便修改，但是一些时间和经纬度信息要手工补充就得手工查询了。\n类似软件 目前完全没有找到类似软件。\n有什么问题 目前碰到的都是一些小问题，属于能接受但能改善更好的那种：\n交通方式识别问题，我默认的交通方式是电动车，走路的时候能正常识别，但是我坐个时速350的高铁你也识别做电动车我感觉很难绷。 地图显示问题，有时候定位不准需要手动选择点，但是我感觉这个地图的交互模式很奇怪，而且有部分店铺是找不到的，最后只能凭借记忆手动标记，不是很友好。 导出时间轴分享的时候每次都分享出两张一样的图片，莫名其妙的。 ","date":"2025-08-25T10:19:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/travel/travel-record-tools.html","title":"行程记录类软件分享 - 那些记录旅行和日常点点滴滴的小工具"},{"content":"之前看到有人推荐了cloudpaste这个项目，主要作用是能够提供简单的文本及文件分享服务，前后端部分使用GitHub Action+Cloudflare Worker，存储桶部分使用Cloudflare R2等免费服务，即可实现免费使用。除了在国内因为众所周知的原因Worker域名无法访问，需要自行配置域名。\n前后端配置基本可以直接参照项目内文档：\nGitHub 仓库fork和后端配置 受限要将仓库fork下来，然后为fork的仓库添加变量，具体路径为仓库的Settings-Secrets and variables-Actions-New repository secrets。添加的secrets为：\nCLOUDFLARE_API_TOKEN CLOUDFLARE_ACCOUNT_ID ENCRYPTION_SECRET 前面两个参数在后面获取到，后面的ENCRYPTION_SECRET可以选填，如果没有会自动生成。\nCloudFlare TOKEN配置 登录CloudFlare后访问API令牌管理界面，创建一个新的API令牌，模版选择\u0026quot;Cloudflare Workers\u0026quot;，并编辑内容添加D1数据库编辑权限，记录下TOKEN，即为后面要用到的CLOUDFLARE_API_TOKEN。 CLOUDFLARE_ACCOUNT_ID位于Cloudflare主界面的右侧。\n开通D1和R2，并配置Pages D1位于左侧的存储和数据库下，的D1 SQL数据库；R2位于左侧的R2对象存储。两者都是需要点进去开通即可，其他不需要动。 D1和R2都有免费额度，可以大胆使用。\nGitHub 配置Actions前端自动部署 返回到GitHub仓库页，找到Actions，运行deploy-front-cloudflare.yml这个工作流，初次运行会进行D1数据库和Pages的创建。\n配置CloudFlare Workers Pages现在已经移动到计算（Workers）下，找到Workers和Pages，此时应该会看到刚才工作流创建的Pages，我的前端名称是cloudpaste-frontend，后端为cloudpaste-backend。 先配置cloudpaste-backend，在项目内的设置-变量和机密，添加一个文本类型的变量，变量名是ENCRYPTION_SECRET，值即之前我们自己填的或者自动生成的。然后要配置域和路由，添加一个自定义域，这里最好设置一个自己的域名（例如https://backend.tama.guru），因为默认分配的workers.dev这个域名无法直接访问，使用部分功能时会受限。 然后到配置cloudpaste-frontend这边，也是进到设置，找到变量和机密，添加一个文本类型的变量，变量名是VITE_BACKEND_URL，对应的值是刚才在cloudpaste-backend中的workers.dev域名或自定义的域名，注意填写末尾不带\u0026quot;/\u0026quot;。同样的，还需要在cloudpaste-frontend的自定义域配置一个自己的域名（例如https://frontend.tama.guru），并配置好解析。\n重新运行前端工作流 返回到GitHub仓库页，找到Actions，再次运行deploy-front-cloudflare.yml这个工作流。运行完成之后之前的配置才回生效，此时可以通过https://frontend.tama.guru访问前端，而对应的后端则是https://backend.tama.guru。\n完成初步配置工作 访问前端地址登录后台，默认的管理员信息是：用户名: admin, 密码: admin123，登录后请马上修改。\n挂载S3存储 完成以上工作后仅能实现文本分享和编辑的功能，如果需要实现文件分享还需要配置S3存储，目前建议使用的包括R2、B2、七牛云三个，三个都有免费额度，且经过一段时间的试用相关功能都是正常的。\n挂载R2存储桶 打开CloudFlare R2对象存储页面，新建一个存储桶，比如我命名为cloudpaste-r2，并添加一个API令牌。令牌权限为读和写，制定存储桶为cloudpaste-r2，其他不用动，保存并记录API令牌，然后点进cloudpaste-r2存储桶，在设置下找到CORS策略，点击编辑，内容为：\n[ { \u0026#34;AllowedOrigins\u0026#34;: [\u0026#34;http://localhost:3000\u0026#34;, \u0026#34;https://根据自己的前端域名来替代，比如我的https://frontend.tama.guru\u0026#34;], \u0026#34;AllowedMethods\u0026#34;: [\u0026#34;GET\u0026#34;, \u0026#34;PUT\u0026#34;, \u0026#34;POST\u0026#34;, \u0026#34;DELETE\u0026#34;, \u0026#34;HEAD\u0026#34;], \u0026#34;AllowedHeaders\u0026#34;: [\u0026#34;*\u0026#34;], \u0026#34;ExposeHeaders\u0026#34;: [\u0026#34;ETag\u0026#34;], \u0026#34;MaxAgeSeconds\u0026#34;: 3600 } ] 然后回到前端页面的后台，在S3存储配置下添加一个新配置，配置名称任意，为了区分我起名和r2存储桶一样的名字cloudpaste-r2，提供商为Cloudflare R2，存储桶名称即cloudpaste-r2，存储容量最好就保留10G，好像就免费10G？端点URL按要求的格式填写https://\u0026lt;accountid\u0026gt;.r2.cloudflarestorage.com，accountid在cloudflare页面下可以找到，也就是前面所说的CLOUDFLARE_ACCOUNT_ID。区域根据建桶时所选的位置，我选的亚太，这里就填apac，默认填auto也可以。访问密钥 ID和秘密访问密钥即上面申请到的API令牌信息，其他可以保持默认不变，保存即可。此时点击测试连接，应该会提示：\n配置完全可用 ✓ 读权限正常 ✓ 写权限正常 ✓ CORS 配置正确 ✓ 前端上传模拟成功 如果没有配置CORS，这里会提示CORS配置不正确，上传文件时也会报错。\n最后到挂载管理处，选择新建挂载点，挂载点名称也是任意的，为保持一致我使用cloudpaste-r2，存储类型为S3存储，S3存储配置选择刚才创建的cloudpaste-r2(Cloudflare R2)，挂载路径我填写的是/r2，根据个人情况填写即可，最后勾选启用状态，选择创建即可。 此时在文件上传页面和挂载浏览页面都可以看到这个r2挂载点了，可以尝试上传文件，如果提示大小超限需要到后台的系统设置中调整最大上传文件大小，并更新设置，该选项默认为100MB。\n挂载七牛云对象存储kodo 我以七牛云作为兼容S3标准的代表，在七牛云的对象存储中选择空间管理-新建空间，存储空间名称和R2中存储桶名称意义一致，我填写的是cloudpaste-qiniu，存储区域选择国外任意地点（选择国内需要实名），我选择北美-洛杉矶，访问控制选择为私有。还需要配置CORS规则，点进cloudpaste-qiniu这个桶的空间设置，跨域设置内新增规则，来源填写我们的前端域名https://frontend.tama.guru，允许 Methods我全勾选了，然后保存。 七牛云并没有针对存储桶有单独的API密钥，需要到个人中心中的密钥管理，打开密钥访问权限，并新增一组AccessKey/SecretKey，保存好这组AK和SK。 回到网站后台，操作和前面一样，只不过提供商类型要选择其他S3兼容服务，端点URL为：http://存储空间名称.s3.存储区域名称.qiniucs.com，根据上述配置我这里对应的是http://cloudpaste-qiniu.s3.us-north-1.qiniucs.com，访问密钥即前面的AK，秘密访问密钥即SK，保存即可，其他参照R2的添加步骤即可。 需要注意的是，七牛云的免费套餐只支持http。\n","date":"2025-07-18T10:21:11+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/cloudpaste.html","title":"[好软推荐] Cloudpaste-开源在线文本/文件分享平台"},{"content":"去年6月的时候看到市里有这个考试，当时也经常刷到网上经常有人晒无线电通联的相关消息，觉得超酷的，买了个欧迅UV9DP，并在考试后一个月成功拿到执照。小地方也不愧是小地方，在后来这段时间里我经常拿不是很合法的设备全频段扫描，基本上除了业务波段之外就都是杂音，还买了拉伸天线、八木天线，一年到头也没碰到过人（就算有也只有偷听铁路联控和FM广播的时候），后来调查了下市里是没有中继台的，周围又都是山，要么跑到山顶上，不然通讯范围基本被限制很死。还印了点QSL卡片，看这样子怕是这辈子都发不出去。\n正好过一年，闲得没事的时候刷到二季度考试开始报名，而且智谱APP下线了在线考试功能，有人推测是要换题库了，而且往后会更难，赶紧进行一个报名。\nB类的题目其实相当一部分在A类都见过，变化的地方主要是Q码简称变多了，并新增了一些物理学计算和电路判断的题目，我主要是靠前花几天时间用电脑刷题、看看大纲、总结规律，这次也顺利考过了。\n接下来可以考虑整点大功率设备搞点远距离通联，毕竟小小手台功率摆在那里，希望今年能在某个时候CQ到活人吧。\n","date":"2025-07-02T16:08:54+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/record/ham-rank-b.html","title":"成功考取业余无线电B证"},{"content":"在经历过wordpress、zblog等一系列重型动态博客后，我切换到typecho并持续使用了很长一段时间。 typecho很好，它很轻量，超棒的插件和主题到处都是，我甚至入正了handsome主题。\n但是，typecho更新实在太慢，属于是没有重大BUG几年不见更新一次那种，在我升级到php8.x之后经常冒出莫名其妙的错误，再加上驱动typecho需要nginx+php+mysql环境，对我的小鸡来说负担太重了，而且网站的访问量并不大，没必要占用这么大服务器资源，如果只是为了时不时写点东西，那还不如用静态博客好了。\nhexo用过一段时间，现在的导航页就是基于hexo搭建的，这次尝试一下hugo。\n总而言之，文章基本都迁移过来了，剩下的评论再看看怎么导入waline，就基本完成了迁移工作。\n也许以后不会再见，还是谢谢你两年的陪伴。\n","date":"2025-07-01T21:46:00+08:00","image":"https://images.337845818.best/20250806/6b0378c33ae92cb2cc02a8a7bce5a2fa.webp","permalink":"https://blog.tama.guru/new-record/typecho.html","title":"再见了 TypeCho"},{"content":"20260626更新：还真上线配置共享了，目前尝试了下8e5大部分旮旯给木都能运行。\n前言 放以前啊，如果要在手机上玩galgame，基本都要等krkr ons Artemis这类能够移植到多平台的引起。再后来出现了exgear、winlator等一系列模拟器，通过wine环境模拟windows运行的必要组件实现galgame的运行，但这类软件总是有一些问题，最常见的就是缺少运行库、没有中文字体等，需要自己手动打补丁，因此也有很多网友制作了“整合包”，比如Winlator-在安卓上运行exe程序的更好方案这里提供的7.1汉化整合包，能够满足部分游戏的运行要求。但是wine哪怕不同版本，不同系统也经常有一台手机能跑另一台又跑不了的情况，而这个盖世游戏能够提供不少环境组合，貌似是目前的最优解。\n软件介绍 提起盖世大家应该多少听说过小鸡模拟器这东西，后面还做了手柄啥的，我手里的g3s从大一买到现在都还能用,个人对这个牌子还挺有好感的。 那什么是盖世游戏？\n盖世游戏是一款多功能游戏平台，支持PC模拟器、云游戏和游戏串流。它允许用户使用手柄或触摸操作进行游戏，满足各种游戏需求。\n是的，除了模拟之外这玩意还能弄串流，最新版本甚至还能登录steam玩上面的游戏，但我没试过，也不想试。 软件官网：https://gamehub.xiaoji.com/zh-cn 目前是免费的，不知道啥时候会收费。\n软件使用 安装完就是我们熟悉的注册登录环节了。。。没错，这玩意要注册才能用，但也就只需要手机号验证而已，目前不知道有什么必要，但是国产软件嘛。。。 主界面不算花里胡哨，基本上都是些串流的游戏，感兴趣可以自己试，我就主要说兼容层等的安装。点击左上角头像的位置（那个流汗黄豆），找到游戏库，然后到PC游戏这个地方，有个运行时，这里可以选择兼容层、转译器、GPU驱动、DXVK、VKD3D等内容的安装。 以兼容层举例，截至2025年5月6日能够支持wine9.5-10以及proton x64和arm64，这就是重点的地方了，我们跑游戏如果闪退或者碰到奇奇怪怪的地方，可以直接在这里切换兼容层、GPU驱动等内容，相比winlator要到处找包好多了，毕竟手机推galgame真的是需要多次尝试。 接下来我就拿saga的花之天使的夏日恋歌举例，把所有文件移动到手机上后，在游戏库的PC游戏这里有个加号，直接选中游戏的运行文件，即SiglusEngineCHS.exe，之后会在PC游戏这里生成一个快捷方式，运气好的话直接点击立即游戏就能跑起来了。 有时候碰到闪退，或是花屏等问题，这就需要手动调整运行参数，具体就是点击立即游戏旁边的小齿轮，找到游戏设置。 需要动的基本就是兼容性设置和组件设置这两个位置，其中兼容性设置选择就是上面我们配置运行时维护安装的兼容层等配置的组合。比如说wine9.5+box64_0.32.1跑不动，就切换到proton兼容层试试，还不行？那试试换个GPU驱动。而如果进入游戏的时候提示缺少xxx组件（比如说dx组件），那就要到组件依赖这里，通过安装新组件的方式手动给当前兼容层环境打组件补丁。（注意组件依赖貌似服务器在国外，部分组件下载极度缓慢，建议尝试多个网络或者干脆挂个梯子）在多次尝试之后，游戏基本都能跑起来。 经过尝试，我使用OnePlus13+ColorOS15，在8e CPU+24G运存下目前玩的几款游戏都能完美运行： 之前还玩过几个忘记了，现在想起来写文章就把最近玩的放上来。\n总结 总的来说，盖世游戏能够提供多种兼容层组合方便切换，这是我选择它最主要的原因，而且它提供的组件依赖也比较完善，说到底就是把原来复杂的操作给简单化、图形化了，能一步到位何乐而不为？ 个人评价优缺点： 优点：\n界面相对友好，白痴化操作 提供多种兼容层和组件依赖，一步安装 提供官方的虚拟键盘，也可以映射到实体手柄上 缺点：\n需要注册才能使用（关键也没什么需要注册才能用的地方），有精神洁癖估计受不了 按国内软件的尿性保不齐啥时候就需要开始收费了 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 ","date":"2025-05-07T00:26:00+08:00","image":"https://r2.337845818.best/tamabox/2025/07/02/686410ca3aae0.png","permalink":"https://blog.tama.guru/record/gamehub.html","title":"[好软推荐] 盖世游戏-意外好用的windows游戏模拟器"},{"content":"服务地址：AcFun礼物统计\n注意！！！网站不需要你提供账号密码或cookie等隐私信息，网站也不存储用户提供的任何信息，请做好个人隐私保护！！！\n前言 前面基本都是废话，请直接跳转到第二部分。\n因为基本没人给我打赏所以不怎么关注，但是上次群里有在说原来的acfun统计插件无法使用了，我检查了一下发现确实是没办法正常使用。虽然通过打开插件开发者设置+全局挂梯子还可以继续安装，但是在实际使用环节中是获取不到数据的，具体问题是获取收到/送出礼物失败，懒得去看是啥原因了，毕竟最近浏览器对插件的管控貌似越来越严格。 但是，经过对原插件的分析，法院获取数据源是通过\nconfig.ACFUN_MOBILE_SERVER + config.URLS.WALLET.SEND_GIFT 实现的，也就是对应的:\nhttps://m.acfun.cn /rest/apph5-direct/pay/reward/giveRecords /rest/apph5-direct/pay/reward/receiveRecords 经过访问发现API没换，能正常访问，那只能说明是插件端的问题，希望作者修修了。\n教程部分 目前做了个网页，目的是让用户自己复制礼物数据提交给网站处理输出内容，虽然只是临时方案，有总比没有好。 前提只要确保：\n正常登录了AcFun网页端 然后访问对应的网址，如果是查询收到礼物则在登录了AcFun的同一浏览器访问：\nhttps://m.acfun.cn/rest/apph5-direct/pay/reward/receiveRecords 查询送出的礼物则是：\nhttps://m.acfun.cn/rest/apph5-direct/pay/reward/giveRecords 网页输出的内容近似于：\n{\u0026#34;result\u0026#34;:0,\u0026#34;pcursor\u0026#34;:\u0026#34;*********\u0026#34;,\u0026#34;host-name\u0026#34;:\u0026#34;hb2-acfun-kce-node26.aliyun\u0026#34;,\u0026#34;records\u0026#34;:[{\u0026#34;giftCount\u0026#34;:1,\u0026#34;createTime\u0026#34;:1711986490403,\u0026#34;userId\u0026#34;:46213698,\u0026#34;giftName\u0026#34;:\u0026#34;桃子\u0026#34;,\u0026#34;azuanAmount\u0026#34;:80,\u0026#34;userName\u0026#34;:\u0026#34;七耳兔软糖72two\u0026#34;},{\u0026#34;giftCount\u0026#34;:6,\u0026#34;createTime\u0026#34;:1711986486397,\u0026#34;userId\u0026#34;:46213698,\u0026#34;giftName\u0026#34;:\u0026#34;桃子\u0026#34;,\u0026#34;azuanAmount\u0026#34;:480,\u0026#34;userName\u0026#34;:\u0026#34;七耳兔软糖72two\u0026#34;}]} 这样输出的结果会很乱，一是因为需要手工转换时间戳，二是API不提供按时间筛选的功能，三是它只会输出明细，所以这个网页只是为了帮你解决以上三个问题。 你需要做的是：\n直接把所有内容复制过来，粘贴到网页数据输入区域。 选择统计开始时间和结束时间，不选择的话就默认输出所有时间。 点击获取结果。 最后会按UID汇总礼物信息，后附明细数据。\n样例 汇总统计：\nUID 用户名 总礼物数 总钻石数 打赏金额（元） 46213698 七耳兔软糖72two 7 560 0.70 明细数据：\nUID 用户名 礼物名称 数量 时间 钻石数 打赏金额（元） 46213698 七耳兔软糖72two 桃子 1 2024/4/1 23:48:10 80 0.10 46213698 七耳兔软糖72two 桃子 6 2024/4/1 23:48:06 480 0.60 ","date":"2025-05-04T04:11:00+08:00","permalink":"https://blog.tama.guru/record/acfun-gift-count.html","title":"关于AcFun礼物统计网页的说明"},{"content":"单位电脑上强制要使用大数字，自从某数字推出了极速版，相比起原版的臃肿倒是简洁了不少，把一些选项关掉后还真就老老实实干活基本上没出现过什么问题。但是从上个月开始，右键菜单就多了个\u0026quot;360看图\u0026quot;的选项，可真是恶心人。而且这玩意不会出现在开始菜单里面，需要到控制面板里面找出来卸载掉，问题是卸载了下次不知道啥时候就会突然冒出来（至今我也没找到到底是点了什么地方导致的），只能先按照对付其他流氓软件的方法处理了。\n软件的安装目录位于C:\\Program Files (x86)\\360AlbumViewer，使用控制面板卸载该软件后会残留一个垃圾文件，卸载完后软件是无法直接删除这个文件夹的，会显示被占用，需要手动重启（普通模式或者安全模式都可以）后会自动删除。\n然后我们需要在原位置下新建一个360AlbumViewer文件夹，右键属性切换安全选项卡，点击高级，把所有者修改为你当前的用户名（找不到就点高级-立即查找），把文件夹及其继承全部修改掉再应用确认。此时安全选项卡下得组或用户名应该只剩下当前用户名这一个选项，点击编辑，把所有权限给拒绝掉，然后保存，现在这个文件夹的读写权限就都没了。\n目前还没死灰复燃，如果有情况再更新。\n需要注意的是以下路径会有一些残余垃圾，建议手动删除: C:\\Program Files (x86)\\360\\360Safe\\Utils\\360AlbumViewer C:\\Users\\admin\\AppData\\Roaming\\360Safe\\360AlbumViewer64Ex 注册表里就算卸载了还有很多不干净的东西，查找360AlbumViewer都删掉吧。\n也顺便记录一下大数字极速版一些该关掉的东西：\n软件设置内 基本设置-用户体验改善计划 弹窗设置-网购安全提示、邮件安全提示、聊天安全提示、下载安全提示（可选）、WIFI安全提示、垃圾清理提示（空闲提醒、软件卸载残留提醒）、硬件驱动提示、游戏优化结果提醒、性能模式、资讯推荐、AI办公推荐。基本上这里都要关掉，除非有需求的功能再单个开启。 开机小助手-取消所有勾选 安全防护中心-看片安全防护、搜索安全防护，应用防护-文档图片防护（可能是这个东西导致360AlbumViewer被安装？待核实） 软件管家设置内 安装升级-升级设置-开启智能升级提醒功能 卸载设置-强力卸载-根据需求该关的关 快捷设置-快捷方式-关掉“在桌面上添加大数字软件管家的快捷方式和定期修复大数字软件管家的桌面快捷方式 其他设置-未知文件设置-当您打开位置文件时，为您推荐适合软件和智能推荐设置-通过智能分析，为您提供问题解决方案和产品功能 还有浏览器极速版，现在也变得乱七八糟的了，也写一下：\n选项内 基本选项-搜索-在被选中文本的右上角显示“划词搜索工具条”、启用搜索栏的热搜词推荐功能和地址栏搜索展示联想词。 界面设置-工具栏-显示头像 高级设置-后台应用-最小化浏览器到系统托盘、关闭浏览器后最小化到系统托盘、保护您和您的设备不受危险网站的侵害。 实验室-AI大会员-在浏览器工具栏显示“360AI大会员”按钮，后台加速-关闭浏览器后，后台最少进程运行，实现加速启动浏览器。 ","date":"2025-04-25T14:52:00+08:00","permalink":"https://blog.tama.guru/record/anti-360albumviewer.html","title":"如何避免大数字自动安装大数字看图(360AlbumViewer)"},{"content":"今天外出玩耍的时候突发奇想我能不能每天记录一下自己每天的生活轨迹，百度了下已经有很多成熟的应用了，但是这种比较私密的数据要发送到别人的服务器上说实话我是不太想的，然后去github上找了下，发现了好几个方案，都尝试了一遍，主要是https://github.com/cctyl/TrackRecord，搭完发现太简陋了，不适合我，其他几个更是已经几年没更新了，最后尝试了下traccar，感觉算是比较成熟的方案，也符合我的需求。\n正常安装 其官网位于：https://www.traccar.org/，项目主要仓库在Github上：https://github.com/traccar/traccar。直接去release上根据服务器类型下载对应的文件就行了，目前linux支持arm和x64，windows仅支持x64。以我在树莓派上运行为例，下载之后解压执行就能自动配置好：\nwget https://bgithub.xyz/traccar/traccar/releases/download/v6.6/traccar-linux-arm-6.6.zip unzip traccar-linux-arm-6.6.zip sudo ./traccar.run 然后执行:\nsudo systemctl start traccar.service 再等个几分钟（树莓派太慢了，所以会很久），就可以访问设备IP:8082进入管理界面。初次使用需要配置服务名称、邮箱和密码，然后使用邮箱和密码登录即可。\n使用docker安装 首先执行:\ndocker run --rm --entrypoint cat traccar/traccar:latest /opt/traccar/conf/traccar.xml \u0026gt; /root/traccar/traccar.xml 其中/root/traccar/traccar.xml根据实际情况配置，我的配置文件放在/root/traccar下所以这么弄了。 然后执行：\ndocker run -d --restart always --name traccar --hostname traccar -p 8082:8082 -p 5023:5023 -p 5023:5023/udp -p 5055:5055 -p 5055:5055/udp -v /root/traccar/traccar/logs:/opt/traccar/logs:rw -v /root/traccar/traccar.xml:/opt/traccar/conf/traccar.xml:ro -v /root/traccar/templates:/opt/traccar/templates/short -e TZ=Asia/Shanghai traccar/traccar:latest 这里所有的/root/traccar都要根据实际情况修改，然后确保8082 5023 5055这三个端口都是没有被占用的，有的话改到其他端口下。 同样再等个几分钟，就可以访问设备IP:8082进入管理界面。初次使用需要配置服务名称、邮箱和密码，然后使用邮箱和密码登录即可。\n修改数据库 默认情况下它使用的是h2作为数据库，这是一种开源的关系型数据库，采用Java语言编写，数据存储于内存内，为了保证数据安全建议修改为mysql连接方式。 具体操作是修改数据目录下的traccar.xml文件，原内容是：\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE properties SYSTEM \u0026#39;http://java.sun.com/dtd/properties.dtd\u0026#39;\u0026gt; \u0026lt;properties\u0026gt; \u0026lt;!-- Documentation: https://www.traccar.org/configuration-file/ --\u0026gt; \u0026lt;entry key=\u0026#39;database.driver\u0026#39;\u0026gt;org.h2.Driver\u0026lt;/entry\u0026gt; \u0026lt;entry key=\u0026#39;database.url\u0026#39;\u0026gt;jdbc:h2:./data/database\u0026lt;/entry\u0026gt; \u0026lt;entry key=\u0026#39;database.user\u0026#39;\u0026gt;sa\u0026lt;/entry\u0026gt; \u0026lt;entry key=\u0026#39;database.password\u0026#39;\u0026gt;\u0026lt;/entry\u0026gt; \u0026lt;/properties\u0026gt; 修改为：\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE properties SYSTEM \u0026#39;http://java.sun.com/dtd/properties.dtd\u0026#39;\u0026gt; \u0026lt;properties\u0026gt; \u0026lt;!-- Documentation: https://www.traccar.org/configuration-file/ --\u0026gt; \u0026lt;entry key=\u0026#39;database.driver\u0026#39;\u0026gt;com.mysql.cj.jdbc.Driver\u0026lt;/entry\u0026gt; \u0026lt;entry key=\u0026#39;database.url\u0026#39;\u0026gt;jdbc:mysql://sql地址:端口/数据库名称?zeroDateTimeBehavior=round\u0026amp;amp;serverTimezone=UTC\u0026amp;amp;allowPublicKeyRetrieval=true\u0026amp;amp;useSSL=false\u0026amp;amp;allowMultiQueries=true\u0026amp;amp;autoReconnect=true\u0026amp;amp;useUnicode=yes\u0026amp;amp;characterEncoding=UTF-8\u0026amp;a\u0026gt; \u0026lt;entry key=\u0026#39;database.user\u0026#39;\u0026gt;数据库用户名\u0026lt;/entry\u0026gt; \u0026lt;entry key=\u0026#39;database.password\u0026#39;\u0026gt;数据库密码\u0026lt;/entry\u0026gt; \u0026lt;/properties\u0026gt; 保存文件，如果使用正常方式安装的执行:\nsudo systemctl restart traccar.service 如果使用的是docker则执行：\ndocker restart 容器ID 需要注意的是修改数据库不会把h2上的数据迁移过去，所以需要重新设置密码。\n添加设备 Github上提供了编译好的APP，支持IOS和安卓，可以直接下载安装。 下载完后需要添加好定位权限并锁定后台，然后在APP中修改服务器地址，比如服务器IP是192.168.50.121，那这里就要填写http://192.168.50.121:5055。当然，这是针对没有公网的情况，如果需要在外网访问就自行做穿透。 然后记录下显示的设备编码，是个6位数字。 精度可选高中低，应该是越高耗电越多。 定位频率：多久一次上报位置信息，我设置了1200秒，不需要太高。 后面距离、角度等我没调整。\n网页端使用 要做的主要就是连接设备和配置地图信息了。\n连接设备 点击左上角的加号，会跳转到设备页面，要求的必填项有名称和标识符，名称可以随意填写，标识符就是刚才我们手机上的六位数字，如果手机端配置地址无误，几秒钟之后手机的位置和电量就显示在网页上了。可以查看到详细的经纬度、海拔和轨迹信息。\n配置地图信息 设置里的首选项第一行的地图中可选的地图很多，红色需要添加key或者付费，免费的支持LocatioIQ、谷歌、高德等地图，但是高德会因为你知道的原因产生偏移，可以通过修改编译原文件的方式解决，但我就算了，不一定用高德其他效果也还不错。\n其他 添加两步验证 如果要暴露在公网上，建议还是添加个2FA保护登录信息，具体操作是在设置的服务器选项下的属性，点击添加，属性选择启用一次性密码，然后确认添加，在出现的启用一次性密码复选框上打勾，此时到设置的账户界面会多一行一次性密码密钥，点击里面有个刷新按钮，然后就弹出密钥了，把它复制到那些两步验证APP上保存即可，网页端也要记得点击保存。\n感想 这个东西整体基本符合我的要求，该有的功能都有了，配置里还有很多个性化玩法，也看到有好多人把这东西接入hass或者rednode，后面我也会研究研究。 当然该吐槽的也要吐槽，基于JAVA的东西是真吃内存啊，光容器就吃掉了800M+的内存，mysql那边也盯着内存不放，还好树莓派买的4G版，不然真不敢玩。\n","date":"2025-04-20T05:57:00+08:00","permalink":"https://blog.tama.guru/record/traccar.html","title":"搭建自己的轨迹记录程序 Traccar"},{"content":"说说一直在用的这个堡垒机软件，官网是：https://docs.next-terminal.typesafe.cn/，提供了开源和付费两个版本，开源版本完全够用，但是在此基础上有更高需求的可以考虑专业版，之前我都是白嫖，但今天我看了下单用户专业版永久限时只要177，马上就买了。 先上点图： 界面很简洁很直观，支持OTP，安全性是有保证的。\n安装和使用 我是从1.x版本升级上来的，官方文档表示两者并不完全兼容，因此我使用2.x版本的时候直接选择重新搭建了。 官方推荐使用的方式是Docker允许，分为PostgreSQL + Next Terminal和Mysql + Next Terminal以及原生安装三种模式，使用docker最大的好处就是一步到位，不用做很多事，但是因为我自身的原因不得不选择原生安装的方式。 原生安装直接参照官方的文档：https://docs.next-terminal.typesafe.cn/install/native-install.html 需要注意的是安装 Next Terminal这里执行:\ntar -zxvf next-terminal.tar.gz -C /usr/local/next-terminal 后，需要到/usr/local/next-terminal内修改配置文件，主要是数据库和guacd：\ndatabase: enabled: true type: sqlite # 可选 mysql,sqlite,postgres 选择对应的数据库类型之后，请填写对应的数据库配置 sqlite: path: ./data/nt.db # postgres: # hostname: localhost # port: 5432 # username: next-terminal # password: next-terminal # database: next-terminal # mysql: # hostname: localhost # port: 3306 # username: terminal-new # password: terminal-new # database: terminal-new ... guacd: drive: \u0026#34;/usr/local/next-terminal/data/drive\u0026#34; hosts: - hostname: 127.0.0.1 port: 4822 weight: 1 主要就是根据数据库的类型修改type，然后把对应的注释删掉，填写信息就行了，guacd这里需要把hostname修改一下，原来的内容是guacd，手动改成127.0.0.1，不然后面RDP跑不起来。\n","date":"2025-04-14T20:49:20+08:00","permalink":"https://blog.tama.guru/record/next-terminal.html","title":"[软件推荐]Next-terminal堡垒机"},{"content":"本站之前基本上都是使用site-status+UptimeRobot这样的监控方案，算是常用且成熟的一种方式了，界面也美观，但问题是，它太大了，几个js+css轻松干到500k。放在本地占用带宽是个问题，放在oss上如果被无聊的人拿来做坏事也不是很好玩，于是还是要从源头解决，换用一个更小的方案，即目前的tinystatus方案。\n官方提供的demo:here\ntinystatus的构成包括三个文件：tinystatus、checks.csv、incidents.txt。\nchecks.csv是需要监控的服务列表，格式为:\nCommand, Expected Code, Status Text, Host to check Command：监控服务类型，支持http ping port三种类型，可指定使用IPv4或IPv6监控，比如http4 http6。\nExpected Code：返回的正常值，比如http服务返回200时为正常\nStatus Text：服务的名称\nHost to check：服务的链接/IP/端口\nincidents.txt可以手工写入事件等信息，没有格式要求。\ntinystatus即主程序，一个简单的脚本，通过\ntinystatus即主程序，很简单的一个脚本，作用就是通过nc curl ping三个命令实现对checks.csv内进行监控然后通过内置的html模版输出成html文件，因此它只有一个用法：\n./tinystatus 或者\n./tinystatus \u0026gt; index.html 输出的html大小在3k左右，可以说是非常小了。\n原版非常简单，我在原版的基础上稍微美化了下：\n#!/usr/bin/env sh # Configuration variables TITLE=\u0026#34;狼的状态板 3.0\u0026#34; HEADER=\u0026#34;全局状态\u0026#34; CHECKS_FILE=\u0026#34;${1:-checks.csv}\u0026#34; #读取监控列表 INCIDENTS_FILE=\u0026#34;${2:-incidents.txt}\u0026#34; #读取公告文件 OUTAGE_RC=false TIMEOUT=10 USER_AGENT=\u0026#34;User-Agent: Mozilla/5.0 (X11; Linux x86_64; Debian) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36\u0026#34; TMP_DIR=\u0026#34;$(mktemp -d)\u0026#34; command_exists(){ if ! command -v \u0026#34;${1}\u0026#34; \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then echo \u0026gt;\u0026amp;2 \u0026#34;错误:未找到组件 ${1} ,请自行安装\u0026#34; exit 1 fi } get_element(){ echo \u0026#34;${2}\u0026#34; | awk -v col=\u0026#34;${1}\u0026#34; -F\u0026#39;,\u0026#39; \u0026#39;{gsub(/^[ \\t]+|[ \\t]+$/, \u0026#34;\u0026#34;, $col); print $col}\u0026#39; } check(){ check=\u0026#34;${1}\u0026#34; host=\u0026#34;${2}\u0026#34; name=\u0026#34;${3}\u0026#34; expected_rc=\u0026#34;${4}\u0026#34; id=\u0026#34;${5}\u0026#34; ipversion=\u0026#34;$(echo \u0026#34;${check}\u0026#34; | grep -o \u0026#39;[46]$\u0026#39;)\u0026#34; case \u0026#34;${check}\u0026#34; in http*) rc=\u0026#34;$(curl -${ipversion}sSkLo /dev/null -H \u0026#34;${USER_AGENT}\u0026#34; -m \u0026#34;${TIMEOUT}\u0026#34; -w \u0026#34;%{http_code}\u0026#34; \u0026#34;${host}\u0026#34; 2\u0026gt; \u0026#34;${TMP_DIR}/${id}.ko.info\u0026#34;)\u0026#34; if [ -s \u0026#34;${TMP_DIR}/${id}.ko.info\u0026#34; ]; then sed -e \u0026#39;s,curl: ([0-9]*) ,,\u0026#39; -i \u0026#34;${TMP_DIR}/${id}.ko.info\u0026#34; else echo \u0026#34;Status code: ${rc}, expected: ${expected_rc}\u0026#34; \u0026gt; \u0026#34;${TMP_DIR}/${id}.ko.info\u0026#34; fi;; ping*) ping -${ipversion}W \u0026#34;${TIMEOUT}\u0026#34; -c 1 \u0026#34;${host}\u0026#34; \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 rc=$? [ \u0026#34;${rc}\u0026#34; -ne \u0026#34;${expected_rc}\u0026#34; ] \u0026amp;\u0026amp; echo \u0026#39;Host unreachable\u0026#39; \u0026gt; \u0026#34;${TMP_DIR}/${id}.ko.info\u0026#34;;; port*) error=\u0026#34;$(nc -${ipversion}w \u0026#34;${TIMEOUT}\u0026#34; -zv ${host} 2\u0026gt;\u0026amp;1)\u0026#34; rc=$? [ \u0026#34;${rc}\u0026#34; -ne \u0026#34;${expected_rc}\u0026#34; ] \u0026amp;\u0026amp; echo \u0026#34;${error}\u0026#34; | sed -e \u0026#39;s,nc: ,,\u0026#39; \u0026gt; \u0026#34;${TMP_DIR}/${id}.ko.info\u0026#34;;; esac # verity status and write files if [ \u0026#34;${rc}\u0026#34; -eq \u0026#34;${expected_rc}\u0026#34; ]; then echo \u0026#34;${name}\u0026#34; \u0026gt; \u0026#34;${TMP_DIR}/${id}.ok\u0026#34; else echo \u0026#34;${name}\u0026#34; \u0026gt; \u0026#34;${TMP_DIR}/${id}.ko\u0026#34; fi } # Verify requirements command_exists \u0026#39;curl\u0026#39; command_exists \u0026#39;nc\u0026#39; command_exists \u0026#39;ping\u0026#39; mkdir -p \u0026#34;${TMP_DIR}\u0026#34; || exit 1 # Execute checks id=0 while IFS=\u0026#34;$(printf \u0026#39;\\n\u0026#39;)\u0026#34; read -r line; do check=\u0026#34;$(get_element 1 \u0026#34;${line}\u0026#34;)\u0026#34; code=\u0026#34;$(get_element 2 \u0026#34;${line}\u0026#34;)\u0026#34; name=\u0026#34;$(get_element 3 \u0026#34;${line}\u0026#34;)\u0026#34; host=\u0026#34;$(get_element 4 \u0026#34;${line}\u0026#34;)\u0026#34; check \u0026#34;${check}\u0026#34; \u0026#34;${host}\u0026#34; \u0026#34;${name}\u0026#34; \u0026#34;${code}\u0026#34; \u0026#34;${id}\u0026#34; \u0026amp; : $((id++)) done \u0026lt; \u0026#34;${CHECKS_FILE}\u0026#34; wait OUTAGES_COUNT=\u0026#34;$(ls \u0026#34;${TMP_DIR}/\u0026#34;*.ko | wc -l)\u0026#34; # Generate HTML cat \u0026lt;\u0026lt; EOF \u0026lt;!DOCTYPE html\u0026gt;\u0026lt;html lang=\u0026#34;zh_CN\u0026#34;\u0026gt;\u0026lt;head\u0026gt;\u0026lt;meta charset=\u0026#34;utf-8\u0026#34;\u0026gt;\u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=1, shrink-to-fit=no\u0026#34;\u0026gt;\u0026lt;title\u0026gt;${TITLE}\u0026lt;/title\u0026gt;\u0026lt;style\u0026gt; body { font-family: segoe ui,Roboto,Oxygen-Sans,Ubuntu,Cantarell,helvetica neue,Verdana,sans-serif;background-image: url(\u0026#39;background.png\u0026#39;);background-size: cover;background-position: center;background-repeat: no-repeat;} h1 { margin-top: 30px; } ul { padding: 0px; } li { list-style: none; margin-bottom: 2px; padding: 5px; border-bottom: 1px solid #ddd; } .container { max-width: 600px; width: 100%; margin: 15px auto; background-color: rgba(0, 0, 0, 0.5); padding: 20px; border-radius: 10px; color: white; } .panel { text-align: center; padding: 10px; border: 0px; border-radius: 5px; } .failed-bg { color: white; background-color: #E25D6A; } .success-bg { color: white; background-color: #52B86A; } .failed { color: #E25D6A; } .success { color: #52B86A; } .small { font-size: 80%; } .status { float: right; } .footer { text-align: center; margin-top: 20px; } .footer a { text-decoration: none; color: #52B86A; text-shadow: 1px 1px 2px black; } \u0026lt;/style\u0026gt;\u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#39;container\u0026#39;\u0026gt; \u0026lt;h1\u0026gt;${HEADER}\u0026lt;/h1\u0026gt; EOF if [ \u0026#34;${OUTAGES_COUNT}\u0026#34; -ne 0 ]; then echo \u0026#34;\u0026lt;ul\u0026gt;\u0026lt;li class=\u0026#39;panel failed-bg\u0026#39;\u0026gt;${OUTAGES_COUNT} 个服务中断\u0026lt;/li\u0026gt;\u0026lt;/ul\u0026gt;\u0026#34; else echo \u0026#34;\u0026lt;ul\u0026gt;\u0026lt;li class=\u0026#39;panel success-bg\u0026#39;\u0026gt;所有服务运行正常\u0026lt;/li\u0026gt;\u0026lt;/ul\u0026gt;\u0026#34; fi cat \u0026lt;\u0026lt; EOF \u0026lt;h1\u0026gt;服务\u0026lt;/h1\u0026gt; \u0026lt;ul\u0026gt; EOF for file in \u0026#34;${TMP_DIR}/\u0026#34;*.ko; do [ -e \u0026#34;${file}\u0026#34; ] || continue echo \u0026#34;\u0026lt;li\u0026gt;$(cat \u0026#34;${file}\u0026#34;) \u0026lt;span class=\u0026#39;small failed\u0026#39;\u0026gt;($(cat \u0026#34;${file}.info\u0026#34;))\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#39;status failed\u0026#39;\u0026gt;已中断\u0026lt;/span\u0026gt;\u0026lt;/li\u0026gt;\u0026#34; done for file in \u0026#34;${TMP_DIR}/\u0026#34;*.ok; do [ -e \u0026#34;${file}\u0026#34; ] || continue echo \u0026#34;\u0026lt;li\u0026gt;$(cat \u0026#34;${file}\u0026#34;) \u0026lt;span class=\u0026#39;status success\u0026#39;\u0026gt;正常运作\u0026lt;/span\u0026gt;\u0026lt;/li\u0026gt;\u0026#34; done cat \u0026lt;\u0026lt; EOF \u0026lt;/ul\u0026gt; \u0026lt;p class=small\u0026gt; 最后检查时间: $(date +%FT%T%z)\u0026lt;/p\u0026gt; EOF if [ -f \u0026#34;${INCIDENTS_FILE}\u0026#34; ]; then echo \u0026#39;\u0026lt;h1\u0026gt;事件\u0026lt;/h1\u0026gt;\u0026#39; if [ -s \u0026#34;${INCIDENTS_FILE}\u0026#34; ]; then sed \u0026#39;s|^\\(.*\\)$|\u0026lt;p\u0026gt;\\1\u0026lt;/p\u0026gt;|\u0026#39; \u0026#34;${INCIDENTS_FILE}\u0026#34; else echo \u0026#39;\u0026lt;p\u0026gt;没有事件需要通报 ;)\u0026lt;/p\u0026gt;\u0026#39; fi fi cat \u0026lt;\u0026lt;EOF \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#39;footer\u0026#39;\u0026gt; \u0026lt;a href=\u0026#34;https://blog.tama.guru\u0026#34;\u0026gt;公告板\u0026lt;/a\u0026gt; | \u0026lt;a href=\u0026#34;https://box.tama.guru\u0026#34;\u0026gt;提问箱\u0026lt;/a\u0026gt; | \u0026lt;a href=\u0026#34;https://share.tama.guru\u0026#34;\u0026gt;盘\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt;\u0026lt;/html\u0026gt; EOF # Cleanup and exit rm -r \u0026#34;${TMP_DIR}\u0026#34; 2\u0026gt;/dev/null if \u0026#34;${OUTAGE_RC}\u0026#34;; then exit \u0026#34;${OUTAGES_COUNT}\u0026#34; fi 主要就是汉化了添加了背景，添加了一点css和footer。\n需要注意的是nc命令可能不是默认安装的，需要手工安装netcat才能正常运行。\n最后可以通过crontab来定时执行，实现自动刷新：\n10　*　*　*　*　$tinystatus目录/tinystatus \u0026gt; $网页目录/index.html 又或者可以直接整合进脚本里。\n","date":"2025-03-29T12:26:33+08:00","permalink":"https://blog.tama.guru/record/tinystatus.html","title":"使用tinystatus构建一个轻量化的状态监测站"},{"content":"为什么要用umami 在此之前，本站及相关网站服务需要用到统计的地方，都用的是自建的matomo，这是个非常强大的网页统计服务，强大到有些臃肿，这次大搬家我就在想，我真的有必要耗费有限的服务器资源来实现到头来可能一次都用不到的功能吗？答案当然是不，经过一番对比，最终我决定换用ackee或者umami。这两个统计工具都支持无服务器部署，但我还是选择了umami。以下是umami和matomo的一些区别：\n对比项目 matomo umami 项目大小 26MB（5.3.1） 1.83MB（github仓库） JS文件大小 67460 bytes 2,713 bytes 支持serverless 理论上支持 支持 支持2FA 是 否 可定制化JS名称 否 是 使用数据库 mysql mysql/PostgreSQL API丰富程度 非常丰富 无 从文件大小上来看umami真的是轻量化了很多，对网站速度都有很大优化。不支持2FA是个扣分项，但服务和数据库都在云端，不需要登录服务器使用，算是没太大影响。数据库这方面使用neon提供的免费Postgre套餐可以满足项目使用需求，所以理论上是不需要投入任何费用的。至于API，仅有官方服务的会提供，自建的版本是没有的。\nvercel部署和neon数据库 先去neon使用github或者google账号登录，首次登录会要求新建项目(Create Project)，只需要输入项目名称(Project Name)、数据库名称(Database name)并选择地域(Region)，前两项根据自己需求填写，地域根据vercel分配一般选择AWS US三个中的一个即可。\n新建完先要点进项目，左侧Project下有个Branches，点击Primary compute下方的蓝字，默认是0.25-2CU，点进去把Configure the autoscaling range拖动到只有0.25，并点击SAVE。之所以要这么做，是因为neon的免费套餐包含0.5G的存储、0.5G的每月数据传输、10个项目和每个项目10个分支、10000的最大并发数，190的计算时长。这里的计算时长(compute hours)关联的是运行的CPU数据、服务器运行时长，比如CU是2，每天运行24小时，一个月的计算时长=2x24x30=1440，这对190来说显然是超出太多了，而调整成0.25则=0.25x24*30=180，正好够用。虽然他支持0.25-2之间的动态调整，谁知道什么情况下突然拉起来，这个情况下数据库就被停了，所以最好调整下。\n然后回到项目页面，找到Connect，点进去把左下角的Show Passowrd点开，然后复制Connect to your database的内容备用。\n注册vercel账号并使用github登录，按照官方文档官方文档直接把项目仓库Fork到自己的github并登录vercel导入这个仓库，或者直接一键Deploy。在New Project页面输入Private Repository Name，随意即可，再点Create。\n然后配置环境变量，一般只需要三个：\n变量名称 含义 必须 DATABASE_URL 数据库地址，即上面使用neon拿到的Connect to your database的内容。如果是mysql格式为:mysql://username:mypassword@localhost:3306/数据库名称 是 HASH_SALT 一串随机字符串 否 TRACKER_SCRIPT_NAME 追踪JS文件的名称，不设置默认是umami.js 否 再点击Deploy，等待2~3分钟即完成部署。\n因为vercel提供的vercel.app域名在国内无法解析，部署完成后点进项目的Settings下的Domains，选择Add，在Domain输入你自己的域名，点Add Domain保存。至于域名从哪来，可以去一些提供免费二级域名的服务商获取。然后去服务商CNAME解析域名到cname.vercel-dns.com保存，一两分钟后会自动申请好SSL证书，就可以通过自己的域名访问了。\numami设置 umami部署后默认的用户名密码是admin/umami，登录进去在个人资料可以修改语言成中文，在设置下的用户可以修改和添加用户名和密码。\n在网站页面点击添加网站，输入名称和域名，完成后点击域名的设置，在跟踪代码下可以找到那串script，放到网页的****之前即可。\n完成之后刷新一下访问统计就出来了。\n感觉 因为直接使用vercel的cdn，访问速度真的很快，而且也没有什么多余的东西。使用matomo的时候不知道是不是我的配置问题访问来源一直出不来，现在也能显示了。虽然没有独立app，直接使用网页访问也是非常顺滑的，而且他没有办法显示访客的具体机型、浏览器版本、系统版本等信息，比如matomo下会显示为Xiaomi 15, Chrome 117.xx.xx, Android 15，umami就只有Android, Chrome这种信息，对我来说意义不大。\n","date":"2025-03-26T12:23:06+08:00","permalink":"https://blog.tama.guru/record/umami.html","title":"使用vercel+neon方案搭建无需服务器的umami统计服务"},{"content":"我这个树莓派4买了好多年，基本上是吃灰的状态。因为自从我买了一套pikvm外设装上去之后，基本上就只能跑pikvm的那个魔改archlinux，我就是感觉各种别扭。一方面32位的arm系统并不能发挥PI4的性能，很多软件（包括一些容器）最低也需要aarch；另一方面，pikvm软件源在国内的访问速度简直就是一坨**，就算是挂了梯子都不一定能连的上，更不用说更新软件了。\n今天偶然发现fruity-pikvm这个项目（https://github.com/jacobbar/fruity-pikvm），看介绍能够\u0026quot;将 PiKVM 安装移植到其他 SBC，如 OrangePi、BananaPi、MangoPi 等。且已在已在 OrangePi Zero 2 上进行了测试，目前，此脚本支持架构 arm64/aarch64 和 armhf/armv7l，并且应该适用于任何基于 Debian 的发行版，例如 Ubuntu、Debian、Armbian 等\u0026hellip;\u0026hellip;\u0026quot;\n哦？\n我直接跑回家下了坨2024-11-19的raspios刷上去，配置完环境之后直接按照步骤执行fruity-pikvm安装:\ntamakyi@akarinbot:~ $ sudo apt install -y git tamakyi@akarinbot:~ $ git clone https://kkgithub.com/jacobbar/fruity-pikvm tamakyi@akarinbot:~ $ cd fruity-pikvm tamakyi@akarinbot:~/fruity-pikvm $ sudo ./install.sh 安装过程只需要按一下y，其他都是在编译、安装和测试过程。但是最后安装fruity-pikvm时出现了错误：\n--\u0026gt;\u0026gt; installing fruity-pikvm Selecting previously unselected package fruity-pikvm. dpkg: regarding fruity-pikvm_0.2_arm64.deb containing fruity-pikvm, pre-dependency problem: fruity-pikvm pre-depends on iptables iptables is not installed. dpkg: error processing archive fruity-pikvm_0.2_arm64.deb (--install): pre-dependency problem - not installing fruity-pikvm Errors were encountered while processing: fruity-pikvm_0.2_arm64.deb sudo: kvmd: command not found reboot and enjoy 他依赖iptables，但是raspiso默认没有，那装一个完了再重新安装fruity-pikvm就是了：\ntamakyi@akarinbot:~/fruity-pikvm $ wget https://github.com/jacobbar/fruity-pikvm/releases/download/debfile/fruity-pikvm_0.2_arm64.deb tamakyi@akarinbot:~/fruity-pikvm $ sudo dpkg -i fruity-pikvm_0.2_arm64.deb 接着继续报错，但是整体是能安装了：\ntamakyi@akarinbot:~/fruity-pikvm $ sudo dpkg -i fruity-pikvm_0.2_arm64.deb (Reading database ... 133479 files and directories currently installed.) Preparing to unpack fruity-pikvm_0.2_arm64.deb ... Unpacking fruity-pikvm (0.2) ... Setting up fruity-pikvm (0.2) ... ==\u0026gt; Ensuring KVMD users and groups ... Creating group \u0026#39;kvmd\u0026#39; with GID 991. Creating group \u0026#39;kvmd-pst\u0026#39; with GID 990. Creating group \u0026#39;kvmd-ipmi\u0026#39; with GID 989. Creating group \u0026#39;kvmd-vnc\u0026#39; with GID 988. Creating group \u0026#39;kvmd-nginx\u0026#39; with GID 987. Creating group \u0026#39;kvmd-janus\u0026#39; with GID 986. Creating group \u0026#39;kvmd-certbot\u0026#39; with GID 985. Creating user \u0026#39;kvmd\u0026#39; (PiKVM - The main daemon) with UID 991 and GID 991. Creating user \u0026#39;kvmd-pst\u0026#39; (PiKVM - Persistent storage) with UID 990 and GID 990. Creating user \u0026#39;kvmd-ipmi\u0026#39; (PiKVM - IPMI to KVMD proxy) with UID 989 and GID 989. Creating user \u0026#39;kvmd-vnc\u0026#39; (PiKVM - VNC to KVMD/Streamer proxy) with UID 988 and GID 988. Creating user \u0026#39;kvmd-nginx\u0026#39; (PiKVM - HTTP entrypoint) with UID 987 and GID 987. Creating user \u0026#39;kvmd-janus\u0026#39; (PiKVM - Janus WebRTC Gateway) with UID 986 and GID 986. Creating user \u0026#39;kvmd-certbot\u0026#39; (PiKVM - Certbot-Renew for KVMD-Nginx) with UID 985 and GID 985. ==\u0026gt; Generating KVMD-Nginx certificate ... + mkdir -p /etc/kvmd/nginx/ssl + rm -f \u0026#39;/etc/kvmd/nginx/ssl/*\u0026#39; + cd /etc/kvmd/nginx/ssl + openssl ecparam -out server.key -name prime256v1 -genkey + openssl req -new -x509 -sha256 -nodes -key server.key -out server.crt -days 3650 -subj /C=RU/ST=Moscow/L=Moscow/O=PiKVM/OU=PiKVM/CN=localhost + chown root:kvmd-nginx /etc/kvmd/nginx/ssl/server.crt /etc/kvmd/nginx/ssl/server.key + chmod 440 /etc/kvmd/nginx/ssl/server.key + chmod 444 /etc/kvmd/nginx/ssl/server.crt + chmod 755 /etc/kvmd/nginx/ssl ==\u0026gt; Generating KVMD-VNC certificate ... + mkdir -p /etc/kvmd/vnc/ssl + rm -f \u0026#39;/etc/kvmd/vnc/ssl/*\u0026#39; + cd /etc/kvmd/vnc/ssl + openssl ecparam -out server.key -name prime256v1 -genkey + openssl req -new -x509 -sha256 -nodes -key server.key -out server.crt -days 3650 -subj /C=RU/ST=Moscow/L=Moscow/O=PiKVM/OU=PiKVM/CN=localhost + chown root:kvmd-vnc /etc/kvmd/vnc/ssl/server.crt /etc/kvmd/vnc/ssl/server.key + chmod 440 /etc/kvmd/vnc/ssl/server.key + chmod 444 /etc/kvmd/vnc/ssl/server.crt + chmod 755 /etc/kvmd/vnc/ssl ==\u0026gt; Disabling nginx service, so that we can use kvmd-nginx instead Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable nginx Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/nginx.service\u0026#34;. ==\u0026gt; Disabling janus service Synchronizing state of janus.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable janus Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/janus.service\u0026#34;. ==\u0026gt; Ensuring KVMD-Webterm users and groups ... Creating group \u0026#39;kvmd-webterm\u0026#39; with GID 984. Creating user \u0026#39;kvmd-webterm\u0026#39; (Pi-KVM - Web terminal) with UID 984 and GID 984. ==\u0026gt; Making tesseract data link ==\u0026gt; Creating symlinks for use with kvmd python scripts ==\u0026gt; Adding path to python for KVMD /var/lib/dpkg/info/fruity-pikvm.postinst: line 76: /usr/local/lib/python3.10/dist-packages/site-packages.pth: No such file or directory ==\u0026gt; Fixing armbian otg takeover ==\u0026gt; Enabling kvmd-nginx kvmd-webterm kvmd-otg and kvmd services, but do not start them. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-nginx.service → /lib/systemd/system/kvmd-nginx.service. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-webterm.service → /lib/systemd/system/kvmd-webterm.service. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-otg.service → /lib/systemd/system/kvmd-otg.service. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd.service → /lib/systemd/system/kvmd.service. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-fix.service → /lib/systemd/system/kvmd-fix.service. 这里报错的/usr/local/lib/python3.10/dist-packages/site-packages.pth: No such file or directory在项目的issus中有类似表述：（Use a release with preinstalled python 3.10 for easier installation · Issue #5 · jacobbar/fruity-pikvm），也就是python库默认没有添加kvmd-packages这个问题，检测是否真的出现可以使用kvmd -m命令测试，通常会提示No module named 'kvmd'。解决办法就是手动添加路径到默认库：\ntamakyi@akarinbot:~ $ sudo nano /usr/local/lib/python3.10/site-packages/kvmd.pth #写入内容： /usr/local/lib/python3.10/kvmd-packages #保存 tamakyi@akarinbot:~ $ sudo nano /usr/local/lib/python3.10/dist-packages/site-packages.pth #写入内容： /usr/local/lib/python3.10/kvmd-packages #保存 /usr/local/lib/python3.10/dist-packages/这个路径可能不存在，可以手动创建。\n完成之后重启PI，使用IP访问，发现提示500 ISE，检查kvmd-nginx进程发现丢失kvmd.sock\ntamakyi@akarinbot:~ $ sudo systemctl status kvmd-nginx.service ... connect() to unix:/run/kvmd/kvmd.sock failed (2: No such file or directory) while connecting to upstream, client: *.0.0.*, server: localhost, request: \u0026#34;GET / HTTP/2.0\u0026#34;, subrequest: \u0026#34;/auth_check\u0026#34; ... 这个问题在上面的issus上也有提到，但是只说了python库默认没有添加kvmd-packages这个问题如何解决，500报错并没有解决。然后我继续检查日志：\ntamakyi@akarinbot:~ $ sudo journalctl -u kvmd ... kvmd[2180]: Traceback (most recent call last): 2月 07 14:53:39 akarinbot kvmd[2180]: File \u0026#34;/usr/bin/kvmd\u0026#34;, line 9, in \u0026lt;module\u0026gt; 2月 07 14:53:39 akarinbot kvmd[2180]: main() 2月 07 14:53:39 akarinbot kvmd[2180]: File \u0026#34;/usr/local/lib/python3.10/kvmd-packages/kvmd/apps/kvmd/__init__.py\u0026#34;, line 75, in main 2月 07 14:53:39 akarinbot kvmd[2180]: KvmdServer( 2月 07 14:53:39 akarinbot kvmd[2180]: File \u0026#34;/usr/local/lib/python3.10/kvmd-packages/kvmd/apps/kvmd/server.py\u0026#34;, line 263, in run 2月 07 14:53:39 akarinbot kvmd[2180]: comp.sysprep() 2月 07 14:53:39 akarinbot kvmd[2180]: File \u0026#34;/usr/local/lib/python3.10/kvmd-packages/kvmd/plugins/hid/otg/__init__.py\u0026#34;, line 114, in sysprep 2月 07 14:53:39 akarinbot kvmd[2180]: udc = usb.find_udc(self.__udc) 2月 07 14:53:39 akarinbot kvmd[2180]: File \u0026#34;/usr/local/lib/python3.10/kvmd-packages/kvmd/usb.py\u0026#34;, line 34, in find_udc 2月 07 14:53:39 akarinbot kvmd[2180]: raise RuntimeError(\u0026#34;Can\u0026#39;t find any UDC\u0026#34;) 2月 07 14:53:39 akarinbot kvmd[2180]: RuntimeError: Can\u0026#39;t find any UDC ... 这里抛出一个Can't find any UDC的错误，UDC我查了下应该指的是USB Device Controller，检查是否有相关设备：lsmod | grep usb发现返回确实是空值。搜了下这个关键词，在Fix KVMD not starting after updating piKVM - Technicus这篇文章中发现有人提到在PI4上也出现了这个问题，然后我按照他在文章说的修改config.txt配置文件：\ntamakyi@akarinbot:~ $ sudo nano /boot/firmware/config.txt #添加以下内容到最后 dtoverlay=tc358743 dtoverlay=disable-bt dtoverlay=dwc2,dr_mode=peripheral #结束 然后再执行lsmod | grep usb，发现能检测到设备了。作者应该是对照了pikvm官方系统的配置文件和raspios的配置文件发现差异。\n在这个issus下也有相关讨论：RuntimeError：找不到任何 UDC ·问题 #1 ·原型/pikvm 容器，这里的操作是：\ntamakyi@akarinbot:~ $ sudo /usr/sbin/modprobe libcomposite tamakyi@akarinbot:~ $ sudo nano /etc/modules-load.d/kvmd.conf #添加以下内容 dwc2 libcomposite #保存 这个方法选择不动config.txt配置文件，看上去也更安全，但是我用的是第一种方法，第二种并没有效果。\n到这里的时候网页端已经能够使用admin/admin访问了，但是进入kvm页面发现无法显示，然后检查日志的时候发现疯狂报错：\ntamakyi@akarinbot:~ $ sudo journalctl -u kvmd ... kvmd.apps.kvmd.streamer ERROR --- Unexpected streamer error: pid=2793 Traceback (most recent call last): File \u0026#34;/usr/local/lib/python3.10/kvmd-packages/kvmd/apps/kvmd/streamer.py\u0026#34;, line 428, in __streamer_task_loop raise RuntimeError(\u0026#34;Streamer unexpectedly died\u0026#34;) RuntimeError: Streamer unexpectedly died kvmd.apps.kvmd.info.system ERROR --- Can\u0026#39;t parse streamer features Traceback (most recent call last): File \u0026#34;/usr/local/lib/python3.10/kvmd-packages/kvmd/apps/kvmd/info/system.py\u0026#34;, line 69, in __get_streamer_info (status, name) = map(str.strip, line.split(\u0026#34; \u0026#34;)) ValueError: not enough values to unpack (expected 2, got 1) kvmd.apps.kvmd.streamer INFO --- Started streamer pid=2835: /usr/bin/ustreamer --device=/dev/kvmd-video --persistent --format=mjpeg --resolution=1920x1080 --desired-fps=40 --drop-same-frames=30 --last-as-blank=0 --unix=/run/kvmd/ustreamer.sock --unix-rm --unix-mode=0660 --exit-on-parent-death --process-name-prefix=kvmd/streamer --notify-parent --no-log-colors --sink=kvmd::ustreamer::jpeg --sink-mode=0660 kvmd.apps.kvmd.streamer INFO --- =\u0026gt; /usr/bin/ustreamer: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory kvmd.apps.kvmd.streamer ERROR --- Unexpected streamer error: pid=2835 ... 他要libjpeg.so.8这个东西，但很明显我没有：\ntamakyi@akarinbot:~ $ sudo find / -name libjpeg* ... /usr/lib/aarch64-linux-gnu/libjpeg.so.62 /usr/lib/aarch64-linux-gnu/libjpegxr.so.1.2 /usr/lib/aarch64-linux-gnu/libjpeg.so.62.3.0 ... 在https://github.com/jacobbar/fruity-pikvm/issues/5中，他简单粗暴的从5.4的镜像里面提取出libjpeg.so.8和libjpeg.so.8.2.2两个文件扔到系统的/usr/lib/aarch64-linux-gnu里。现在版本都飞到6.6.74了，肯定是没5.4，那只能自己编译个：\ntamakyi@akarinbot:~ $ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.290.tar.xz tamakyi@akarinbot:~/kernel $ tar xvf linux-5.4.290.tar.xz tamakyi@akarinbot:~/kernel $ cd linux-5.4.290 tamakyi@akarinbot:~/kernel $ cp /boot/config-$(uname -r) .config tamakyi@akarinbot:~/kernel $ nano .config #把 #CONFIG_TRUSTED_KEYS is not set 修改为 CONFIG_TRUSTED_KEYS=\u0026#34;\u0026#34; tamakyi@akarinbot:~/kernel/linux-5.4.290 $ make menuconfig #需要调整配置用 tamakyi@akarinbot:~/kernel $ make -j4 #四线程编译 如果怕跑到半掉了可以开个screen。\n但是！我发现另一台不记得是香蕉还是香橙的PI的docker内居然找到了这玩意，反正一样是aarch，直接狠狠替换。\n(base) tamakyi@akarinbot-arm64:~$ sudo find / -name libjpeg* [sudo] tamakyi 的密码： ... /var/lib/docker/overlay2/001ccded49667e443e6b0d924d49a33745a8cf2634056ada168e84a81aeae3ac/diff/usr/lib/libjpeg.so.8.2.2 /var/lib/docker/overlay2/001ccded49667e443e6b0d924d49a33745a8cf2634056ada168e84a81aeae3ac/diff/usr/lib/libjpeg.so.8 ... 还是不行，再看一下日志：\ntamakyi@akarinbot:~ $ sudo journalctl -u kvmd ... 2月 07 16:44:06 akarinbot kvmd[986]: RuntimeError: Streamer unexpectedly died 2月 07 16:44:07 akarinbot kvmd[986]: kvmd.apps.kvmd.streamer INFO --- Started streamer pid=2914: /usr/bin/ustreamer --device=/dev/kvmd-video --persistent --format=mjpeg --resolution=1920x1080 --desired-fps=40 --drop-same-frames=30 --last-as-blank=0 --unix=/run/kvmd/ustreamer.sock --unix-rm --unix-mode=0660\u0026gt; 2月 07 16:44:07 akarinbot kvmd[986]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; /usr/bin/ustreamer: error while loading shared libraries: libc.musl-aarch64.so.1: cannot open shared object file: No such file or directory 2月 07 16:44:07 akarinbot kvmd[986]: kvmd.apps.kvmd.streamer ERROR --- Unexpected streamer error: pid=2914 2月 07 16:44:07 akarinbot kvmd[986]: Traceback (most recent call last): 2月 07 16:44:07 akarinbot kvmd[986]: File \u0026#34;/usr/local/lib/python3.10/kvmd-packages/kvmd/apps/kvmd/streamer.py\u0026#34;, line 428, in __streamer_task_loop 2月 07 16:44:07 akarinbot kvmd[986]: raise RuntimeError(\u0026#34;Streamer unexpectedly died\u0026#34;) ... 又缺个libc.musl-aarch64.so.1，去网上找了下，没有提到这个文件的信息，但是有libc.musl-x86_64.so.1，换汤不换药嘛，那就\ntamakyi@akarinbot:~ $ sudo apt install musl musl-dev tamakyi@akarinbot:~ $ sudo ln -s /usr/lib/aarch64-linux-musl/libc.so /lib/libc.musl-aarch64.so.1 tamakyi@akarinbot:~ $ sudo systemctl restart kvmd 现在登陆进去没异常了，但是提示No Singal，再看看日志文件：\ntamakyi@akarinbot:~ $ sudo journalctl -u kvmd 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- Starting streamer ... 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- Started streamer pid=8263: /usr/bin/ustreamer --device=/dev/kvmd-video --persistent --format=mjpeg --resolution=1920x1080 --desired-fps=40 --drop-same-frames=30 --last-\u0026gt; 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.203 main] -- Starting PiKVM uStreamer 5.37 ... 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.204 main] -- Using internal blank placeholder 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.204 main] -- Using JPEG-sink: kvmd::ustreamer::jpeg 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.204 main] -- Listening HTTP on UNIX socket \u0026#39;/run/kvmd/ustreamer.sock\u0026#39; 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.204 stream] -- Using V4L2 device: /dev/kvmd-video 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.204 stream] -- Using desired FPS: 40 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; ================================================================================ 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- ERROR [1037.205 stream] -- Can\u0026#39;t access device: No such file or directory 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.205 stream] -- Waiting for the device access ... 2月 07 17:13:30 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1037.206 http] -- Starting HTTP eventloop ... 2月 07 17:13:31 akarinbot kvmd[7433]: aiohttp.access INFO --- [admin (token) / -] \u0026#39;GET /auth/check HTTP/1.0\u0026#39; =\u0026gt; 200; size=194 --- referer=\u0026#39;https://*.*.*.*/kvm/\u0026#39;; user_agent=\u0026#39;Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537\u0026gt; 2月 07 17:13:31 akarinbot kvmd[7433]: kvmd.apps.kvmd.streamer INFO --- =\u0026gt; -- INFO [1038.367 http] -- HTTP: NEW client (now=1): [100.74.203.35]:0, id=bad9da595991fbbf 基本上正常了，但还有一个Can't access device: No such file or directory，总之先保证能跑起来了，真是心累。\n","date":"2025-02-08T11:35:42+08:00","permalink":"https://blog.tama.guru/record/fruity-pikvm.html","title":"使用fruity-pikvm实现在64位raspios上运行pikvm"},{"content":"本脚本主要针对梅林固件部分版本偶发的断网问题，实现自动重启以尝试解决该问题。\n前置条件： 开启JFFS和软件中心。\n开启SSH登录。\n具体步骤： ssh登录路由器后台，进入/jffs/script目录新建init-start和wan-check.sh文件，其中init-start用于启用开机自动运行脚本功能，wan-check.sh则是实现断网自动重启的脚本，内容如下：\ninit-start\n#!/bin/sh /bin/sh /jffs/scripts/wan-check.sh \u0026amp; wan-check.sh\n#!/bin/sh TARGET_IP=\u0026#34;114.114.114.114\u0026#34; #通过间歇性PING 114.114.114.114判断是否断网 MAX_FAILS=5 #N次PING失败后将重启 fail_count=0 while true; do if ! ping -c 1 \u0026#34;$TARGET_IP\u0026#34; \u0026gt; /dev/null; then fail_count=$((fail_count + 1)) if [ \u0026#34;$fail_count\u0026#34; -ge \u0026#34;$MAX_FAILS\u0026#34; ]; then /sbin/reboot fi else fail_count=0 #没断网时初始化计数 fi sleep 60 #下次执行时间间隔 done 注意事项： 实际写入时应把中文注释删掉。\n","date":"2025-02-07T12:15:09+08:00","permalink":"https://blog.tama.guru/script/merlin-autoreboot.html","title":"梅林固件实现断网自动重启"},{"content":" 是的，又搭怪东西了，这次上线的是日记。 搭这玩意完全是因为昨晚上准备睡觉前突发奇想，我要不要记一下每天的生活和杂事，省得哪天突然会忘记什么重要的事情。但是日记这东西属于是比较隐私的东西，肯定不能直接往博客里扔，一是时间一长不打理后台会变得乱糟糟的，另一方面我不可能每次都要给文章上密码，就为了写几个字，那样太费劲了。我也曾想过去应用商店找一些APP，但很多都只提供云端备份服务，没办法本地导出，这意味着我需要注册一个账号，提供邮箱甚至手机号等信息，然后还要把我那些屁话上传，反正我是有点精神洁癖，不希望我比较隐私的数据不被自己管控。当然，最重要的一点是鸿蒙Next用户没那么多选择。所以，我的需求就成了：\n多平台。 数据不依赖云端，要么就是能自己管控。 按这个要求最佳的选择自然就是使用浏览器的开源程序了，服务直接放在自己的服务器上自己也放心，而且浏览器就不会有什么客户端的限制了，也非常符合我能用网页绝对不多安装个程序的原则。 一开始我找到的是侠客日记，看上去功能很强大，但是去看了下源码居然是用.NET的，直接就放弃了，最后选择的是标题日记。前端vue3+ts+vite，后端nodejs，运行起来占用非常小，非常适合我这种买不起大鸡的小站长:\n(base) root@*:~# ps aux | grep npm root 2057203 0.0 1.7 720260 64948 pts/5 Sl+ 16:53 0:00 npm run serve root 2068496 0.0 0.0 6240 648 pts/0 S+ 21:38 0:00 grep npm 搭建很简单，前后端都有很详细的文档，如果有需要建议直接去项目下面一步一步跟着做。 功能基本上能满足我的要求：\n日记撰写 默认提供了很多分类和时间天气等信息的记录，而且支持MD格式写作。 虽然不支持直接上传图片，但是借助第三方图床工具也能实现图片显示。 附属功能 附属功能目前包含四个\n银行卡信息记录功能 记账单 待办事项记录 经期记录 第一个功能先不说了，谁会把这东西放到网上啊\u0026hellip;姑且也写一下用法，就直接生成一个名为我的银行卡列表的文章，内容按照下面的格式记录，就能得到银行卡信息界面：\n银行：民生银行 卡号：6*** **** **** **** 类别：储蓄卡 开户行：山东济南办卡 刷卡次数：5 银行：民生银行 卡号：6*** **** **** **** 类别：信用卡 开户行：山东济南办卡 额度：20000 验证码：123/4 到期日：2029-08-10 第二个倒是挺实用，直接在账单分类下按这样的格式记录信息，就能形成日账单记录：\n买菜 -330 吃饭 -120 敲诈勒索 +200 第三个功能也差不多，类似这样的格式:\n- 阿巴阿巴 = 买大疆 Mavic Classic 3 #￥9000 = 坐飞机 即可获得这样的效果： 第四个，经期记录，我看了测试站，貌似是在备忘下生成一个经期记录的标题，内容是:\n2024-12-20, 2024-12-26 2024-11-22, 2024-11-28 即可在日历界面生成不安全的日子： 其他还有一些小功能，比如：\n配置好所在城市后会自动填写当天的天气（根据和风天气API获取） 前台显示、隐藏文章内容 支持csv、json、txt、sql格式数据导出和账户注销 单篇日记内容分享 当然，这半天的使用我也发现了一些小问题，比如：\n后台总会有奇奇怪怪的报错，这个后续再研究 支持上传头像，但是只支持七牛云，而七牛云不备案域名是没办法开启HTTPS的，而且临时域名会在30天后过期，对于常年全站HTTPS的站长真的折磨。 ","date":"2024-12-30T22:29:00+08:00","permalink":"https://blog.tama.guru/record/dairy.html","title":"狼的日记本 上线了"},{"content":"昨天，有消息称Next的应用商店上架了出境易，用过华子的都知道这玩意可以用过某些不可告人的方式来实现对某些国外应用的安装和使用，所以这次上架就有意思了,因为这上面的几乎所有应用目前基本上不会为Next做适配，那就说明它会通过某种方法来兼容安卓应用来实现运行如上应用的能力。\n出境易 安装过程就不介绍了，首次运行的时候需要下载将近600M的数据并且重启系统，一开始我也以为是个虚拟机，但后面tg上有人放出一张截图，疑似是通过lxc来跑安卓容器实现的。 出境易内置了一个microG套件，G家软件基本上都可以使用了，如果是市场里没有的应用可以从GPlay检索获取，但是有一些不是很正规的应用很明显是没办法直接在市场里面找到的。 市场内可以找到edge浏览器，安装后基本上能够正常使用（存在一些小问题，比如掉帧和莫名的黑屏），然后我去找到个clash的安装包，edge下载之后会调用出境易安装，居然成功了\u0026hellip; 然后我再试着安装其他应用，却显示\u0026quot;该应用未与出境易达成合作，暂不支持安装\u0026quot; 看来正如网上说，出境易是有一套应用白名单的，匹配到的应用才会允许安装。但我尝试去telegram官网下载安装，一样会提示\u0026quot;该应用未与出境易达成合作，暂不支持安装\u0026quot;，而出境易市场内的telegram却能正常安装，我暂且蒙在鼓里。\n卓易通 安装出境易之后还带了另一个叫卓易通的应用，这东西默认是隐藏的，需要手动启用。 具体操作是使用出境易下载程序管理类应用来手动启用。 比如我是出境易日区的市场，可以找到一个设备信息的应用： 安装之后切换到应用程序页面的系统菜单项，找到卓易通和文件共享，点开之后点开右上角的小齿轮，选择启用即可。 然后我们回到Device Info，找到文件共享这个应用，点开选择发动，就会进入一个类似文件管理器的界面，再这个地方可以选择下载好的apk调用卓易通安装了。 如果上面的界面无法显示应用，也没有弹窗申请授权获取应用列表的话，需要手动到出境易里面找到Device Info授权。 卓易通可以安装大部分的应用，但不是全部，因为卓易通和出境易恰恰相反，卓易通采用的是黑名单机制，在黑名单上的应用都无法安装，除此之外一些盗版应用和涩涩应用也无法安装，比如eh\u0026hellip; 总结 上架出境易这个应用无疑是能缓解目前Next应用不足且质量参差不齐的情况，这也是鸿蒙生态目前最大的问题，但这次改变会让我留在Next吗？不会，原因如下：\n操作繁琐。上面使用卓易通安装需要每次都要从Device Info进入文件共享。 别扭。总感觉后台多了个容器，耗电会有所增加。而且每次切到后台再切回去有大概率应用会重启，后台驻留能力超弱\u0026hellip; BUG多。目前我碰到的问题包括但不限于：Edge切换页面时的短暂黑屏、视频类应用顶部的大白边、无法调用系统相册（即使授权了）等。 搞不来涩涩。 ","date":"2024-12-03T23:03:56+08:00","permalink":"https://blog.tama.guru/record/android-on-harmony.html","title":"鸿蒙Next居然兼容安卓了？"},{"content":"前言 其实想买个打印机好久了，但一直没下定决心，一方面是现实里事务繁忙，无心去细细了解，另一方面则是这类东西价格都挺高的，动不动大几千。虽然某鱼上几百块的DIY打印机倒是很多，我是不想初体验就花大量时间去调这调那，影响体验。于是在今年双十一前夕某天在对照了猫狗多三个平台之后，以4199的价格购入拓竹P1SC。（其实开始是想直接买A1的，然后感觉买都买了为什么不彩打，就去看了A1SC，又看到A1SC是开放式结构，打印某些耗材需要封箱，而且稳定性也不好，看着看着就看到P1SC去了\u0026hellip;而且事后刷贴吧发现有人在叠加政府补贴之后只需要三千六七就拿到了，那叫一个恨呐\u0026hellip;）\n我写的地址是公司，所以一开始的时候看商品参数是说尺寸389x389x458mm，重量12.95kg的时候，还觉得不过如此，一个手推车轻轻松松拿回家，直到看到SF的收寄信息显示重量22kg，心凉了半截，难不成还打木箱？拿到货的时候本来计划是一个咩子拉回家，实际上放上去之后我根本没地方坐\u0026hellip;只能叫taxi拉回去。\n打印前准备 开箱和组装其实蛮简单的，箱子里面就一个打印机主机，AMS固定放置在打印机内部，还送了三卷官方PLA耗材（透明、橙色、绿色），一个替换热端和散热硅脂等等七七八八的东西。按说明书（这个说明书有好多地方其实说的不是很清楚，需要自己上网找视频对照来做）把AMS从箱内拆出来，接上线，把耗材放AMS里，然后开机配置网络等信息，进行初次校准，最后把底部的泡沫拿出来，就可以准备打印了。\n初次打印时APP总是提示耗材从工具头退回AMS失败，去看了官方WIKI也看不出什么问题，最后把耗材拔出来重新接AMS里面就能打印了\u0026hellip;\n官方是自带一个创意工坊，有很多人会在上面共享模型，在PC上可以下载模型并调整或者二创再上传，内容覆盖面也挺广，可爱的不可爱的，健全的和看上去能让你进橘子的都有。\n打印过程中 打印可以通过手机APP或者PC来控制，两者都支持远程控制，但是PC端能够设置的项目会多很多。比如说耗材这一项，如果使用的是第三方耗材，通常会用不同的参数来调教，否则打印时可能会堵头或者拉丝，这些参数配置只能在PC上调整，但是调整好之后参数会同步到APP端，后面APP端打印时也可以调用这个参数。\n为保证打印出来的成品良好，建议每次打印都把自动调平打开。打印时如果耗材和预设颜色、材质不匹配的话可以逐项替换，但是注意要选择对应的打印配置，而且不应该把多种材料混着打（因为涉及的参数不一样，如果直接混用可能会造成堵头和拉丝），选择好模型和材料之后就可以上传到打印机了。\n我初次打印的是clannad的团子，因为手头耗材颜色不够，弄了个橙色+绿色的搭配，打出来的成品奇丑无比\u0026hellip;\n打印后 打印成功后可以把板子取出，如果刚打印完机箱内部还很热，需要放置一段时间，大概50℃左右就可以取出了。取出之后打印件是站在底板上面的，如果没办法取下来，可以放在室温下一段时间等自动冷却，或是找一些类似刀片的物体慢慢刮下来。打印完之后应做好板子的清洁工作，不然下次打印的时候表面坑坑洼洼的很容易出问题。\n感想 作为第一次实际上手打印的机器，拓竹P1SC无疑是对小白很友好的，接上耗材，导入模型，选择耗材，开始打印，基本上没有什么复杂的环节。而且操作过程中自带的低帧机内摄像头可以实时检查箱内情况，并生成延时视频（这里吐槽一下生成的视频格式是avi，剪辑的时候需要转码，直接用mp4不好吗），进一步提高了可玩性。目前最大的槽点应该就是耗材的价格吧，一卷PLA第三方也要三四十，官方耗材更是不敢想象，只能搞点二十几块的PETG过日子。还有就是AMS打印的废料，多色打印的时候每换一个颜色就会把耗材挤出来一部分排到后面的废料箱，如果一个平面有多个颜色，打起来是真的很浪费，而且挤出废料的时候会出现废料没有老老实实顺着后面掉下去而是弹到打印板上的情况，如果掉落的区域正好是打印的落点，轻者这块打印件就废了，严重情况下如果打印面板间隙不是很大有可能就把热端给顶歪了\u0026hellip;\n刚开始的时候还是很喜欢去创意工坊找别人做的模型来打着玩，目前打了平面、团子、锉刀、龙、狐狸、花盆，接下来还想打印点大件，等到后面有想法了再学学建模吧！\n注意事项汇总 打印前 检查耗材是否充足，打印板是否清洁，箱内是否有异物，热端是否有堵头，AMS箱中耗材是否受潮 打印配置是否与耗材一致 是否有把多种耗材混着打 打印中 AMS是否有绞线，是否有废料跳到打印板上 温度、散热是否合适，如果有拉丝要适当调整 打印后 温度下降后再取出打印板 做好热端和箱内的清洁 耗材参数 以下是一些我购买过的耗材和对应的配置参数，经过实验之后打印效果较好，在此记录。\n品牌 基础参数 型号 热床温度 喷嘴温度 回抽长度 回抽速度 风扇速度 拓竹 Bambu PLA-S/PLA PLA-S/PLA 默认 默认 默认 默认 默认 JAYO Bambu PETG basic PETG 70 230 1.2 50 60% ","date":"2024-10-28T17:53:30+08:00","permalink":"https://blog.tama.guru/record/p1sc.html","title":"3D打印初体验 - 拓竹P1SC"},{"content":"grep 命令全名 global regular expression print（全局正则表达式打印），可以搜索一个或多个（输入）文件，以查找与「给定模式」相匹配的行，并将每个匹配行写入标准输出，这在Linux下是一个非常常用的命令。无论是筛选文件还是命令输出，基本上都是一个grep搞定。\n但是Windows下就没有这么好用的东西（至少自带程序里面没有），只能通过装第三方软件实现，以下推荐几个我在使用的替代品：\nGNU Grep 官网 Grep Windows 版 (sourceforge.net)\n使用方法 到官网下载文件后安装，需要配置环境变量引导到Grep安装目录，然后即可在cmd或powershell中使用：\ngrep --help Usage: grep [OPTION]... PATTERN [FILE]... Search for PATTERN in each FILE or standard input. PATTERN is, by default, a basic regular expression (BRE). Example: grep -i \u0026#39;hello world\u0026#39; menu.h main.c Regexp selection and interpretation: -E, --extended-regexp PATTERN is an extended regular expression (ERE) -F, --fixed-strings PATTERN is a set of newline-separated fixed strings -G, --basic-regexp PATTERN is a basic regular expression (BRE) -P, --perl-regexp PATTERN is a Perl regular expression -e, --regexp=PATTERN use PATTERN for matching -f, --file=FILE obtain PATTERN from FILE -i, --ignore-case ignore case distinctions -w, --word-regexp force PATTERN to match only whole words -x, --line-regexp force PATTERN to match only whole lines -z, --null-data a data line ends in 0 byte, not newline Miscellaneous: -s, --no-messages suppress error messages -v, --invert-match select non-matching lines -V, --version print version information and exit --help display this help and exit --mmap use memory-mapped input if possible Output control: -m, --max-count=NUM stop after NUM matches -b, --byte-offset print the byte offset with output lines -n, --line-number print line number with output lines --line-buffered flush output on every line -H, --with-filename print the filename for each match -h, --no-filename suppress the prefixing filename on output --label=LABEL print LABEL as filename for standard input -o, --only-matching show only the part of a line matching PATTERN -q, --quiet, --silent suppress all normal output --binary-files=TYPE assume that binary files are TYPE; TYPE is `binary\u0026#39;, `text\u0026#39;, or `without-match\u0026#39; -a, --text equivalent to --binary-files=text -I equivalent to --binary-files=without-match -d, --directories=ACTION how to handle directories; ACTION is `read\u0026#39;, `recurse\u0026#39;, or `skip\u0026#39; -D, --devices=ACTION how to handle devices, FIFOs and sockets; ACTION is `read\u0026#39; or `skip\u0026#39; -R, -r, --recursive equivalent to --directories=recurse --include=FILE_PATTERN search only files that match FILE_PATTERN --exclude=FILE_PATTERN skip files and directories matching FILE_PATTERN --exclude-from=FILE skip files matching any file pattern from FILE --exclude-dir=PATTERN directories that match PATTERN will be skipped. -L, --files-without-match print only names of FILEs containing no match -l, --files-with-matches print only names of FILEs containing matches -c, --count print only a count of matching lines per FILE -T, --initial-tab make tabs line up (if needed) -Z, --null print 0 byte after FILE name Context control: -B, --before-context=NUM print NUM lines of leading context -A, --after-context=NUM print NUM lines of trailing context -C, --context=NUM print NUM lines of output context -NUM same as --context=NUM --color[=WHEN], --colour[=WHEN] use markers to highlight the matching strings; WHEN is `always\u0026#39;, `never\u0026#39;, or `auto\u0026#39; -U, --binary do not strip CR characters at EOL (MSDOS) -u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS) `egrep\u0026#39; means `grep -E\u0026#39;. `fgrep\u0026#39; means `grep -F\u0026#39;. Direct invocation as either `egrep\u0026#39; or `fgrep\u0026#39; is deprecated. With no FILE, or when FILE is -, read standard input. If less than two FILEs are given, assume -h. Exit status is 0 if any line was selected, 1 otherwise; if any error occurs and -q was not given, the exit status is 2. Report bugs to: bug-grep@gnu.org GNU Grep home page: \u0026lt;http://www.gnu.org/software/grep/\u0026gt; General help using GNU software: \u0026lt;http://www.gnu.org/gethelp/\u0026gt; netstat -a | grep localhost #通管筛选命令执行结果 TCP 127.0.0.1:5354 localhost:49718 ESTABLISHED TCP 127.0.0.1:5354 localhost:49722 ESTABLISHED ... grep -rin question * #遍历目录查询关键词位置 cmd/nekobox.go:19: app.Description = \u0026#34;Anonymous question box\u0026#34; internal/cmd/censor.go:19: Usage: \u0026#34;Censor the questions\u0026#34;, internal/cmd/censor.go:37: // Check all the unprocessed questions. ... 优点 使用方法基本和Linux下一致\n缺点 需要配置环境变量位置才能使用 最后一次更新已经是2009年了。 dnGrep 官网：dnGrep – 适用于 Windows 的强大搜索功能\n这是一个GUI化的grep，能够实现使用文本、正则表达式、XPath等查询搜索文本文件、Word 和 Excel 文档、PDF 和存档。dnGrep 包括搜索和替换、整个文件预览、文件资源管理器中的右键单击搜索等等。\n使用方法：到Github项目页面下载对应版本的安装包安装即可，项目自带中文，安装完成后可以到设置里面配置。使用方法也很简单，无非就是选择查找范围，选择搜索方式和搜索条件，搜索结果会高亮展现：\n优点 图形化操作，更直观 搜索方式多样化 缺点 能搜文件，但只能搜文件。\n对原生爱好者不友好。\nGit-scm 其实这玩意就是个mingw64工具集，本来是用于git的，但是我看到他带bash和grep，安装使用也方便，就一直用了。\n官网 Git - Downloads (git-scm.com)\n使用方法 下载安装对应版本即可，也提供了便携版(PortableGit)，解压即用。安装之后右键菜单会多出一个git bash，在指定目录下点开会进入一个bash终端，在这里就直接能执行grep了。\n除了grep外，附带的其他命令可以在usr/bin/下看到。\n优点 最真实的linux终端体验\n缺点 如果只为了用grep的话有点为了这碗醋包饺子的感觉。\n","date":"2024-09-11T21:51:00+08:00","permalink":"https://blog.tama.guru/software/grep-on-windows.html","title":"[软件推荐]Windows下grep命令的替代品"},{"content":"因为本站使用的R2资源比较少，整个桶不过50M，一个月下来B类访问量也不足4W，之前基本上没考虑过什么盗刷的问题，昨天在文章下面有用户提到他的资源访问量比较大，一天下来就有我的数量级了，这种情况下一不小心可能就有机会给Cloudflare打钱。之前本站大部分资源都是仍在OSS上的，从上个月开始访问速度就非常不正常，试着把东西都扔到R2上整体访问速度居然还提升了\u0026hellip;阿里云的防盗刷配置还是比较简单的，R2就没那么直观，可以从以下几个方面入手：\n缓存 对于资源的缓存配置好可以避免直接访问到桶里的数据，我看了下能配置的入口有两个： 一是在存储桶内的设置项配置CORS策略，主要是添加\u0026quot;MaxAgeSeconds\u0026quot;: 43200这一项，在官方文档里的解释是：指定允许浏览器缓存 CORS 预检响应的时间（以秒为单位），最大值是43200，此举可能有一定帮助但不是很确定。 二是利用Cloudflare的页面规则功能，为R2域名添加缓存设置项： 因为我的资源都放在r2.****.***下，所以我配置的域名是r2.****.***/*，缓存基本都拉到最大值，经过测试开启后确实也是从本地读取资源了。 另外缓存配置下也有个Cache Rules，不知道和上面有没有冲突，我是一并配置了。\n防盗链（可选） 防盗链一般使用的是安全性下的WAF-自定义功能，配置的规则方式为：字段：引用方 不包含 允许的域名1 Or 引用方 不包含 允许的域名2\u0026hellip; And 主机名 包含 r2地址 时采取 阻止 的措施，比如我图中的配置： 这样就是当不包含blog.tama.guru或tama.host的引用方去访问我的r2域名时，进行阻止，此时直接访问桶内资源已经是提示被ban了。这里的https://可以不要。 其他事项 启用如图所示的防盗链规则的话有可能会出现配置允许的域名但是也无法访问的情况，因此建议考虑是否开启，我个人觉得有缓存这一级保护就差不多了。 启动规则之后在安全性-事件下会显示访问信息记录，包括IP 国家/区域 试图访问的链接等。我刚配置好就碰到个笨蛋扫我后台\u0026hellip;难崩\u0026hellip; ","date":"2024-08-20T02:36:00+08:00","permalink":"https://blog.tama.guru/post/r2_waf_rules.html.html","title":"r2的安全性配置（主要是缓存）"},{"content":"最近雀魂日服开了客户端，试着下下来玩了玩，数据能下载，但是登录的时候总是登不上，（我在路由器已经设置了规则转发，咕噜咕噜登录是正常的。）那看样子就是客户端这边搞的鬼，需要手动配置代理才能访问。解决方法也很多，一是直接全局代理，但是这样会影响到其他正常软件的使用；二是找出访问出现问题的链接添加到规则列表里，这样虽然能解决但是每碰到一个应用就要去查它的路由，不是很方便；第三就是找其他第三方应用来配置指定应用代理，也就是本次主要说的方法。 软件官网：www.proxifier.com 软件支持安卓、MAC、WIN三端，其中安卓目前只有GPlay这么一个渠道，免费试用三天，之后实行订阅制，年付2220JPY，月付440JPY。MAC因为没有设备没试过，这里主要讲WIN端。 WIN端分为安装版和便携版，软件直接到官网下载即可，有一个月的试用期，可以使用以下激活码进行激活：\nL6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C（WIN便携版） 5EZ8G-C3WL5-B56YG-SCXM9-6QZAP（WIN标准版，即安装版） P427L-9Y552-5433E-8DSR3-58Z68（MAC版） 软件是好软件，有能力的话还是支持正版吧。 打开之后点开菜单的Profile下的Proxy Servers进行代理服务器的配置： 输入好地址 IP 协议 认证等参数即可。 也可以先点击这个Proxy Checker检查代理服务器联通是否正常。 测试无误后，我们进入这个Proxification Rules配置代理规则： 点击Add之后会跳出配置界面，Applications即要代理的软件，支持xx.exe C:\\*.exe xx*.exe *.exe等方式，即对应着单个exe、某目录下的所有exe、名字带xx的exe及所有exe等多种匹配方式。Target hosts和Target ports即代理的目标IP和端口。如果前面配置好了Proxy Servers直接在下面的Action选择即可。 此时Proxification Rules配置框会新增一个配置项，注意要把Default的Action改成Direct，不然他会默认选择使用代理服务器全局访问。 保存好之后现在直接打开应用可以看到指定软件已经走代理了。 ","date":"2024-07-07T15:49:04+08:00","permalink":"https://blog.tama.guru/software/Proxifier.html","title":"[好软推荐]多端指定应用代理软件"},{"content":"老早就计划考个证了，设备提前买了小半年，期间一直都在守听，PTT一直没能按下去。今年年中碰上市内组织考试，顺利通过。在此分享以下考试和领证过程。\n考前准备 其实考A证并不难，总题库也就三百多，建议就是先把所有题目先过一遍，看自己不懂的题目主要分布在哪些地方，再重点记忆就行了。当然，如果你是真的希望去了解无线电相关知识，可以去购买一些相关书籍。这篇文章记录了A证考试的主要知识点，也可以针对性的记忆。 然后就是刷题了，推荐使用智谱，该应用在各大应用商店都有提供，除了刷题，还能用来报名考试、使用一些自带的小工具等等。刷题只要按模拟实战的模式多刷几遍再重点记忆错题就没啥问题了。 报名考试 可以到智谱app关注考试报名模块下的考试信息是否有所在地或就近城市的报名通知，如果选择其他城市要注意看考试通知可能会有“限定常驻地考生”的要求。 手机端报名可以在智谱内的对应考试通知下点击报名即可，需要提前准备：\n本人近期证件照。（分辨率大于1024768,小于40963072,jpg格式） 身份证正反面图片，要求同上。 然后再按要求填写信息即可。 电脑端可以登录业余无线电台操作技术能力验证报名系统进行操作，需要准备的材料相同，要求相同。 需要注意的是，此处上传的证件照将作为最终操作证上的大头照，建议慎重选择。 提交完成后，会提示审核中的字样，一般等待两到三天会变成审核已通过，然后会提供一张png格式的准考证，记得打印出来。 报名通知内一般会留有一个微信群二维码，用于公布考试相关的通知，可加可不加。 参加考试 带上打印好的准考证、本人身份证，如果是笔试还需带签字笔和2B铅笔（其实不带2B铅笔也行，考官一般会允许使用签字笔填答题卡）。考试一般5-10分钟就开始有人交卷了，时间充裕可以多检查几次。\n领取操作证 一般过3-5天之后，如果已经考过了，app上会显示“已有证书号”，再等两天地方工信厅网站会公式考试成绩。如果事前没有加考试报名的微信群的，考试地无管局相关人员会通知你领取证书，可以选择到无管局自取或者邮寄到付。\n获取执照 只有操作证是还不能进行通联的，你需要去申领一份执照，需要准备好以下材料：\n两表 有有效核准代码的设备 先和无管局工作人员获取两表，即业余无线电台设置（变更）申请表和业余无线电台技术资料申报表，填写相关内容即可，如果不会填可以和工作人员沟通，或者填报好后让工作人员帮忙审核是否有误。 无论使用的是手台、固定台，固定台天线馈电点海拔高度这个都是必填选项，填写住处大致海拔高度和经纬度信息即可。 确认信息无误后到网上搜索所在省/直辖市/自治区工信厅网站，找到无线电台（站）设置、使用许可办事指南，我这边会在新设业余无线电台的子模块内，根据要求准备的材料除了以上两表之外，还需要一个申请人基本情况，这里只需要提供身份证正反面扫描图片、待核验机器的正反面图片（要能看得到核准代码）放到一个文档内就行了。 可以选择网办或者预约线下办理，我选择的是网办，事前准备好材料之后按要求提交到指定位置再提交就行了。事项的办结时限是20天，各地实际承诺的办理实现会有所不同，我这里显示承诺8个工作日办结，但其实材料提交当天预审就结束了，进入受理环节，再过两天我上去看的时候显示已办结了\u0026hellip; 他提供的办结材料是一个PDF格式的执照，打开可以看到自己的呼号\u0026hellip;最后我只能自己打印出来再去淘宝上买个壳子装起来了，仪式感总是要有的。 到这里你已经获得了按下PTT的权利，遵守法规，开始通联吧！ QA Q1.花钱吗？ A1.考试和获取执照全程不需要花钱。\nQ2.题目难吗？ A2.都是随机的题目，只要多刷题就没啥问题的。\n最后，这里是**BG7QLR**，期待在电波里与您相遇。\n","date":"2024-06-15T12:03:00+08:00","permalink":"https://blog.tama.guru/amateur-radio/ham-licence.html","title":"记一次A证操作证考取和执照申领的过程"},{"content":"在了解到目前使用的两个域名到期后续费的金额后，我决定停止tama.guru和i-tama.website的续费并于近期切换到tma.moe，作出这一决定是出于原则性考虑（大雾）。后续本站域名将更改为https://blog.tma.moe，一段时间内将对旧域名做跳转。\n以下是迁移计划和完成进度：\n模块 进度 备注 API - - 图床 - 已添加授权 公告板 - - 提问箱 反代 - 导航页 部分迁移 - index √ 部分域名未完成迁移 R2 - 未配置自定义域 STATUS - - ","date":"2024-06-01T01:58:00+08:00","permalink":"https://blog.tama.guru/record/tma-moe.html","title":"本站即将迁移至tma.moe"},{"content":"前几天闲的没事查一下目前几个域名的续费价格，发现动不动都是几百一年\u0026hellip;如果现有的优惠到期之后我多半是不会再继续用了，趁此机会我购入了一个新的域名，够短，也挺有个性\u0026ndash;\u0026gt;tma.moe\u0026lt;\u0026ndash; 不要无端联想某视频番号。因为迁移需要一定时间，目前我打算套个CF用。但是很早之前partner就已经用不了了\u0026hellip;(虽然我还有个域名能用，但是那玩意到期之后也很贵）\n目前网上的方法基本上是使用SaaS这个功能来实现的，通过这个方式套在一些对国内有特殊优化的网站来借用它们的服务进行解析。我尝试了下确实能用，但目前还找不到一个好的域名能套，目前国内还是一片红\u0026hellip;\n前期准备 准备两个域名，一个是我们对外提供访问服务的网站，假设为a.com，a.com把DNS解析到DNSPOD上。以及一个解析在Cloudflare上并完成解析的b.com。 Cloudflare绑定了外币卡并开通SaaS服务，具体流程自己百度。 Cloudflare准备 先在Cloudflare的DNS上新增一个A记录，这个域名将作为我们的回源域名，记录值是真实的服务器IP，可以用二级域名，也可以直接用一级，假设我这里留下的back.b.com，解析到真实服务器IP114.51.4.191。 然后在左侧的SSL/TLS下的自定义主机名下新增一个回退源，回退源即为刚才我们配置的back.b.com，保存之后等待回退源状态显示为：有效。 然后点击添加自定义主机名，自定义主机名内容为我们需要外部访问的a.com及其二级域名，假设我这里需要外部访问的域名为new.a.com，就将这个网站填入自定义主机名，其他配置保留原样，然后点击添加自定义主机名。此时会生成一个TXT主机记录和TXT记录值，假如主机记录是_cf-custom-hostname.new.a.com，记录值是11233444-eeee-ffff-gggg-3rcfffsdsd，记住这两个值，至此CF配置完成。 DNSPOD准备 首先在a.com下的记录管理添加一个TXT记录，记录名为_cf-custom-hostname.new注意这里只填写前面部分，记录值为11233444-eeee-ffff-gggg-3rcfffsdsd，等待该记录生效。 接下来就是实现优选IP的最重要一步：在a.com下的记录管理添加一或两个记录，可以是A，也可以是CNAME，两个主机记录都是new，一个线路是境内，一个线路放境外（如果只加一个这里留默认就行了，主要是针对不同线路有不同优化需求的，如果还希望针对不同运营商进行优化，这里还可以细化）。境外随便一个CF的IP基本上都能正常访问，建议放个1.0.0.5。 境内这里就要留心了，这里优选域名/ip选不好就很容易一片红。自用线路建议使用[CloudflareST][2]测试速度最优的IP，也可以用CF优选IP这样的网站查看一些CF域名/IP的运营商访问速度。 我们可以使用CNAME套在这些域名上来实现“借用”他们的解析来优化我们的访问。 我们可以使用ping.cn来测试速度： 看起来还行。 总结 这样做说实话确实挺麻烦的，首先是每次添加域名都需要在CF上设置一次SaaS添加自定义主机名，然后再在DNSPOD上添加TXT、配置优选解析，而且免费SaaS有上限，虽然那个上限一般人也达不到就是了。而且这样做可以直接使用CF的SSL证书，不用担心免费证书过期的事了。\n","date":"2024-05-31T23:59:00+08:00","permalink":"https://blog.tama.guru/record/Cloudflare_SaaS.html","title":"使用Cloudflare的SaaS实现自选IP"},{"content":"从今年3-4月起，国内主流的域名平台都开始把原来一年期的免费证书调整成三个月（参见：免费版SSL证书升级指南），但是阿里另外给了个解决方案，单域名一年缴68元可以获得原来一样的一年证书。\n尊敬的阿里云用户： 接收到厂商关于免费证书服务收费策略调整的通知，我们将在2023年11月14号开始生效厂商策略。在策略生效后，免费证书规则如下： 对于免费领取的SSL证书，签发后的证书有效期统一变更为3个月。如果您希望继续使用12个月有效期的免费证书，则需收取相关服务费，费用为68元/张/年。\n对于我们这些白嫖用户来说这就非常难搞了，证书时间大幅缩短意味着一年要申请四次，而且如果域名很多的话每个还需要单独申请，想想都很酸爽\u0026hellip;但是花钱是不可能的，单个证书68对我们来说也是一笔不小的开销，对我们这种小站站长确实不值得。\n那么现在摆在我们面前的有两条路： 1.关站跑路 2.想办法做自动化申请替换。\n比较常见的方法就是acme.sh，这是个可以申请签发、部署管理、ssl证书的脚本，操作起来也比较方便，甚至可以通过corntab之类的工具实现自动续期，算是当前状况下一个解决方案了。\n而证书提供商我推荐使用zerossl，最主要的是它能提供免费的范域名甚至是IP证书，虽然只有三个月，但是结合acme.sh就能实现自动续签，相当于无限续期。\n正常操作流程 首先肯定是先去zerossl申请一个账号，这个不多说了。 接下来安装acme.sh 如果服务器在国外的，直接使用官方的 curl https://get.acme.sh | sh 即可，如果服务器在国内的，考虑到直连github可能会抽风，建议使用 curl https://gitee.com/acmesh-offical/acme.sh/raw/master/acme.sh | sh -s email=your@zerosslaccount.com 其中your@zerosslaccount.com换成自己申请zerossl账号用的邮箱。 然后使环境生效： source ~/.bashrc 使用第一种方法会安装到~/.acme.sh/下，不执行环境变量生效的可以手动在文件夹内执行脚本。 然后把zerossl配置为默认的ca服务： acme.sh \u0026ndash;set-default-ca \u0026ndash;server zerossl 因为当前我使用的是DNSPOD的解析，需要先去DNSPOD Token页面生成一组密钥，生成之后页面会生成一个ID和TOKEN，假设： ID=XXXXXX TOKEN=QWERTYUIOPASADFGHJKL 那么需要配置以下内容到环境变量： export DP_Id=\u0026ldquo;XXXXXX\u0026rdquo; export DP_Key=\u0026ldquo;QWERTYUIOPASADFGHJKL\u0026rdquo; 这里的DP指的是DNSPOD，如果使用的是其他服务商可以参考dnsapi文档和acme.sh wiki。 然后配置zerossl的账号信息到acme.sh: acme.sh \u0026ndash;register-account -m your@zerosslaccount.com \u0026ndash;server zerossl 这里会生成一个ACCOUNT_THUMBPRINT，一般用不到，可以忽略。 到此就可以进行证书申请操作了： 比如我要申请的证书域名是*.tama.guru，那么需要执行： acme.sh \u0026ndash;dns dns_dp \u0026ndash;issue -d *.tama.guru -d tama.guru 如果执行过程中报错可以执行： acme.sh \u0026ndash;dns dns_dp \u0026ndash;issue -d *.tama.guru -d tama.guru \u0026ndash;debug 来检查是什么步骤报错。 如果没有任何错误，目录结构应该如下：\n-********- 8 root root 187 May 20 17:17 . -********- 24 root root 4096 May 20 20:28 .. -********- 1 root root 433 May 20 16:56 account.conf -********- 1 root root 223427 May 20 16:29 acme.sh -********- 1 root root 78 May 20 16:29 acme.sh.env -********- 3 root root 30 May 20 16:48 ca -********- 2 root root 4096 May 20 16:29 deploy -********- 2 root root 8192 May 20 16:29 dnsapi -********- 1 root root 221 May 20 17:17 fetch.sh -********- 1 root root 393 May 20 16:56 http.header -********- 2 root root 4096 May 20 16:29 notify -********- 2 root root 162 May 20 16:56 '*.tama.guru_ecc' 我们的证书就保存在'*.tama.guru_ecc'内，配置*.tama.guru.key和fullchain.cer到nginx/apache上即可。\n自动化 根据上面的步骤基本上就知道自动化脚本怎么写了: # nano /root/.acme.sh/autocert.sh\n#!/bin/bash cd /root/.acme.sh #根据acme安装路径选择 export DP_Id=\u0026quot;XXXXXX\u0026quot; export DP_Key=\u0026quot;QWERTYUIOPASADFGHJKL\u0026quot; #./acme.sh --register-account -m your@zerosslaccount.com --server zerossl ./acme.sh --dns dns_dp --issue -d *.tama.guru -d tama.guru 然后添加到crontab: 0 23 1 * * sh nano /root/.acme.sh/autocert.sh #每月1号的23点执行以上脚本 如果acme.sh所在机器就是网站服务器，可以参照Using acme.sh with nginx把应用证书的工作也交给服务器自动完成，更简单的方法就是先指定输出文件位置然后直接在nginx的配置文件里面修改: #导出文件 acme.sh \u0026ndash;install-cert -d tama.guru \u0026ndash;key-file /path/to/keyfile/tama.guru.pem \u0026ndash;fullchain-file /path/to/fullchain/tama.guru.cer \u0026ndash;reloadcmd \u0026ldquo;service nginx force-reload\u0026rdquo; #修改nginx配置文件 ssl_certificate /path/to/fullchain/tama.guru.cer; ssl_certificate_key /path/to/keyfile/tama.guru.pem;\n其他 Q：我不想敲一堆命令，有更直观的方法吗？ A：可以使用开源工具certd，该工具提供了一个网页前端供用户配置自动化流水线申请证书。 Q：那你为什么不用？ A：它只支持Let\u0026rsquo;s encrypt证书。\n","date":"2024-05-20T21:04:00+08:00","permalink":"https://blog.tama.guru/record/acme-sh_zerossl.html","title":"使用acme.sh申请通配ssl证书"},{"content":"前言 发现这个软件的契机也是意外，之前装移动宽带的时候送了个摄像头，型号是中国移动V8A，这玩意必须要用和家亲这个APP绑定，摄像头素质是不错，夜拍清晰，声音洪亮，还有免费的7天事件上传，但是这玩意有一个大问题就是运维人员默认绑定到我所在的小区并共享，我就说吗惹法克？这玩意我扔家里用的难道在家里穿个裤衩子也要被全小区直播？好在关掉很容易，设置里点一下就关掉了，仔细一想很多人都是送了之后直接装上没管，甚至是都不知道这个APP的存在，有点细思极恐\u0026hellip;\n这APP应该是想打造成和米家那类一样的智能家庭中枢，但是背靠移动，国企作风，无论是审美还是功能都给你塞得满满的，着实臃肿\u0026hellip; 但也就是这样的APP，我发现了它一个奇特的地方：它支持免费给手机游戏加速。\n使用方法 这个功能位于服务\u0026ndash;宽带服务\u0026ndash;家宽优选这个位置下的电竞宽带，点进去之后会进入一个手机游戏加速的页面，建议这个地方右上角三个点添加快捷方式到桌面，省得每次都要点进去这么深的地方。点击“添加游戏”，然后切换到外服，这里有一个搜索，常见的手游这里都能找得到（就连nikke这种奇怪的游戏都能加速），添加之后回到主界面点开始加速就可以了。测试了下使用还是挺稳定的，但是下载速度不到1MB，如果要把这个当做下载加速需要慎重考虑。 有时候点击开始加速时会提示你需要开通VIP获得更好体验，其实这个时候只要把窗口关掉再点击加速就能进去了，有点呃呃\u0026hellip; 总的来说，这种奇奇怪怪的加速器肯定比不上UU之类的付费加速器，但聊胜于无，我用快两年期间只有其中一个月可能是业务维护的原因临时下线了这个服务。\nQA Q：非移动用户可以用吗？ A：登都登不上去。 Q：没开通过宽带的也能用吗？ A：实测我一个主号几个副号都能登录，并没有任何问题，所以我现在安卓一个号，苹果一个号。 Q：电脑和路由能用吗？ A：看样子只有手机端加速是免费的，PC有办法绑定但是需要开通会员。至于路由器，我看了下它的支持列表，挺杂的，估计我是没希望实验了。\n","date":"2024-04-28T15:26:57+08:00","permalink":"https://blog.tama.guru/software/hejiaqin.html","title":"[好软推荐]不是很正经的手游加速器：和家亲"},{"content":"有些app的广告实在是太多了，而且关掉的地方都隐藏的很深以至于我需要专门拿个文章记录一下，后续每找一种方法都会在这里更新，并根据不同的软件类型进行分类，以便快速查找。 按设想会分为系统类，第三方软件类，在各个大类下再进行细分。\n系统类 PC端 AOSP HarmonyOS 4.X 系统版本4.2.0.120，仅针对我常用的软件，一些从来没点过的就不写了。 1、文件管理：我的\u0026ndash;设置\u0026ndash;个性化\u0026ndash;关闭个性化广告。 2、设置\u0026ndash;华为账号\u0026ndash;隐私中心\u0026ndash;管理您的个人偏好\u0026ndash;广告偏好设置，关掉华为智慧助手·今天和华为浏览器的勾选项。 3、设置-智慧助手-右上角体验增强与改进\u0026ndash;个性化推荐服务和个性化广告，关掉个性化广告功能。 4、设置\u0026ndash;HMS Core\u0026ndash;分析服务\u0026ndash;勾选限制三方共享信息。 5、设置\u0026ndash;隐私\u0026ndash;底部的华为广告\u0026ndash;关闭智能推荐服务。 6、负一屏\u0026ndash;今天（点击头像）\u0026ndash;设置\u0026ndash;关闭搜索热词、个性化推荐所有选项、消息通知、今天改进计划、发现 7、应用市场\u0026ndash;我的\u0026ndash;设置\u0026ndash;消息通知管理（关闭总开关）数据与隐私（关闭游戏服务内开关、内容推荐服务的个性化推荐）。 8、华为钱包\u0026ndash;我的\u0026ndash;设置\u0026ndash;更多设置\u0026ndash;关闭个性化推荐和个性化广告。 9、会员中心\u0026ndash;我的\u0026ndash;设置\u0026ndash;关闭接收系统消息、众测辅助功能、位置信息授权、消息推送社会设置内的所有选项。 10、设置\u0026ndash;华为账号\u0026ndash;云空间\u0026ndash;右上角更多设置\u0026ndash;个性化\u0026ndash;个性化广告关闭。（如果需要关闭任务中心也可以在更多设置这一级设置，就是那个让你下几个app送你一个月会员的） 11、主题\u0026ndash;我的\u0026ndash;设置\u0026ndash;内容推荐服务（关闭主题内容推荐服务、音乐内容推荐服务）、广告（关闭个性化广告）、关闭首页显示甄选主题栏目、关闭接受推送通知、消息设置内的相关选项。 12、我的华为\u0026ndash;我的\u0026ndash;设置\u0026ndash;关闭接收短信和邮件、关闭接收消息、关闭个性化推荐服务底部的个性化推荐、关闭用户体验改进计划和推广信息显示。\niOS端 第三方软件类 社交支付类 支付宝 关闭首页推荐广告 版本号：10.5.66 路径：设置\u0026ndash;通用\u0026ndash;管理主页\u0026ndash;推荐卡片\u0026ndash;把所有的选项关闭。 效果：首页底部不再显示相关内容，取而代之的是一段话“上拉进入休闲空间”。 其实设置\u0026ndash;通用这个路径下还有“管理视频页”、“管理信息页”、“管理我的页面”几个选项，里面可以把相关内容选择性关闭。\n关闭垃圾消息推送 版本号：10.5.66 路径：设置\u0026ndash;新消息通知\u0026ndash;关闭服务通知和活动通知，朋友消息提醒看有无社交需求，没有的也可以关闭。 效果：通知栏不再显示相关信息推送。\n隐私设置建议 版本号：10.5.66 路径： （1）设置\u0026ndash;隐私\u0026ndash;系统权限管理：这里可以配置整个APP是否能获取系统的位置、相机等权限，不需要的权限可以设置“拒绝访问”。 （2）设置\u0026ndash;隐私\u0026ndash;个人信息授权管理：这里会展示授权其他平台获取支付宝账号信息，可以在这里解除授权。 （3）设置\u0026ndash;隐私\u0026ndash;常用隐私设置：可以设置查找/添加/展示真实姓名的相关设置。 （4）设置\u0026ndash;隐私\u0026ndash;个性化广告、推荐设置：这里可以设置广告推荐类型，注意只是类型，开启设置后只会减少推荐相关性，并不能减少广告。\n影音类 网易云音乐 简化页面内容 版本号：9.0.40.181620 路径：设置\u0026ndash;关闭直播内容推荐和个性化广告推荐，底部导航设置仅保留发现、我的和关注。 效果:减少首页底部和直播等垃圾功能。\n减少垃圾消息 版本号：9.0.40.181620 路径：设置\u0026ndash;消息和隐私设置\u0026ndash;关闭第三方推送服务开关、关闭提醒设置两个选项和隐私设置按需关闭。 效果:减少横幅广告和应用内广告弹出、无用消息推送。\n什么？你说开屏广告？这东西开会员都去不掉。\n","date":"2024-04-28T11:26:00+08:00","permalink":"https://blog.tama.guru/record/app-anti-ad.html","title":"一些系统及应用的去广告和隐私选项推荐(持续更新)"},{"content":"有时候我会需要在远程计算机上使用浏览器进行一些操作，但是存在一些问题。一是远程计算机本身空间容量/配置较低，预装的是core系统，因为使用个浏览器去安装整个桌面环境有点浪费了，也不利于系统稳定；二是软件可能会破坏原有的依赖，轻则软件报错，重则无法启动，这个就很难绷了。 好在docker能实现把远程的浏览器套到本地浏览器运行，看样子是一个webvnc，但是只能打开浏览器。项目是https://github.com/jlesage/firefox，方法也很简单，直接执行：\ndocker run -d \\ --name=firefox \\ -p 5800:5800 \\ -v /home/tamakyi/firefox/config:/config:rw \\ jlesage/firefox 然后到ip:5800端口就能打开远端的火狐浏览器了。但是这样仅能保证运行，会发现中文字体全部都变成方块了，因此需要调整成：\ndocker run -d \\ --name=firefox \\ -p 5800:5800 \\ -v /home/tamakyi/firefox/config:/config:rw \\ -e TZ=Asia/Hong_Kong \\ -e KEEP_APP_RUNNING=1 \\ -e ENABLE_CJK_FONT=1 \\ jlesage/firefox 其中/home/tamakyi/firefox/config为宿主机的配置文件目录，需要自行修改，KEEP_APP_RUNNING=1标明关掉本地浏览器页面保持远端浏览器运行，ENABLE_CJK_FONT=1标明开启中文字体支持。 到这里其实已经能够正常运行了，完整的配置可以参考:\ndocker run -d \\ --name=firefox \\ -p 5800:5800 \\ -v /home/tamakyi/firefox/config:/config:rw \\ -e TZ=Asia/Hong_Kong \\ -e KEEP_APP_RUNNING=1 \\ -e ENABLE_CJK_FONT=1 \\ -e DISPLAY_WIDTH=1920 \\ -e DISPLAY_HEIGHT=1080 \\ -e SECURE_CONNECTION=1 \\ --shm-size 2g \\ jlesage/firefox 其他可选性包括： DISPLAY_WIDTH和DISPLAY_HEIGHT：生成浏览器的分辨率，如果配置不高的机器建议不要太高。 SECURE_CONNECTION：开启https shm-size：配置容器内存使用上限。 执行之后并不会像项目下的源码下能直接访问，会报错，原因可以通过查询docker的运行日志找到：\n[init ] container is starting... [cont-env ] loading container environment variables... ... [cont-init ] 15-cjk-font.sh: installing CJK font... [cont-init ] 15-cjk-font.sh: fetch https://dl-cdn.alpinelinux.org/alpine/edge/community/aarch64/APKINDEX.tar.gz [cont-init ] 15-cjk-font.sh: fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/aarch64/APKINDEX.tar.gz [cont-init ] 15-cjk-font.sh: fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/aarch64/APKINDEX.tar.gz [cont-init ] 15-cjk-font.sh: (1/1) Installing font-wqy-zenhei (0.9.45-r3) ... ╭――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――╮ │ │ │ Application: Firefox │ │ Application Version: 124.0.1-r0 │ │ Docker Image Version: 24.04.1 │ │ Docker Image Platform: linux/arm64 │ │ │ ╰――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――╯ ... [app ] Mozilla Firefox 124.0.1 [supervisor ] all services started. 一般会在15-cjk-font.sh这个步骤停留一段时间，需要下载挺多的数据，具体与网络有关。等到提示all services started此时才能正常访问。\n注意：如果你部署在公网服务器上，此时是可以直接通过ip+端口的方式访问的，及其不安全，且默认iptables防火墙无法配置该端口的访问权限\u0026hellip;（网上说的方法都试过了，没用）。因此，我建议再套一层firewall-cmd：\napt install firewalld 安装完记得配置常用端口的开启：\nfirewall-cmd --zone=public --add-port=YOUR_PORT/tcp --permanent firewall-cmd --reload 这样虽然麻烦了点，但是安全性显著提高了。但是有一个问题，就是docker容器无法联网了，估计是什么地方冲突，后面再检查。 最后还是即开即用，用完就关。\n","date":"2024-04-26T15:53:00+08:00","permalink":"https://blog.tama.guru/record/firefox-on-docker.html","title":"在docker里运行火狐浏览器"},{"content":"这东西我主要是放在家里给老人用的，最开始是他们手机碰上七七八八的问题找我解决，然后点开一个个浏览器和应用，卧槽，这能用的下去？横幅的横幅，弹窗的弹窗，真的看不下去，正好家里整了一个24小时开机的J1900双网口软路由，于是想了想在上面安装个插件算了，怎样都比原来好。\nPiHole on Docker 安装之前 首先需要打开主机的ssh，执行 ip link set eth0 promisc on 打开网卡混杂模式，这个步骤是必须的，不然不能接收到域名解析请求。 然后新建一个网络，网段和网关要和主机所在的网段一致。比如说宿主机的IP是192.168.101.232，那么新建的网络子网则为192.168.101.0/24，网关为192.168.101.1，还需要把驱动器切换成MAC VLAN，基设备修改成br-lan，其它可以不变，IPV6打不打开都可以，打开之后需要配置和宿主机同级的IPV6的网段和网关。 创建好网络之后下一步就是下载镜像和新建容器，镜像直接拉取pihole/pihole，最新的。 然后在主机上随便一个目标下新建config和data文件夹，用于存储pihole的相关数据。比如/opt/pihole/data和/opt/pihole/config。 接下来新建容器，选择pihole的镜像和前面新建的网络，分配一个网段内不冲突的地址，比如192.168.101.102，并添加如下绑定挂载：\n/opt/pihole/config:/etc/pihole /opt/pihole/data:/etc/dnsmasq.d 然后提交并启动。 点击容器后面的编辑-\u0026gt;控制台-\u0026gt;连接，输入\nsudo pihole -a -p 给pihole配置密码，然后访问192.168.101.103/admin看看是否能访问。\n配置Pi-Hole 一般情况下这里要做的就是三件事：\n修改上游DNS 位于settings/dns下的Upstream DNS Servers Custom 1 (IPv4)和Custom 2 (IPv4)，一般填写光猫获取到的运营商DNS，也可以写8.8.8.8这类，只要访问快就行，改完记得滑到底部点击save。\n添加拦截规则 位于adlists下，直接把拦截规则放进address下点击add即可。一般推荐\nhttps://anti-ad.net/domains.txt https://raw.githubusercontents.com/StevenBlack/hosts/master/hosts 这两个，第二个是pihole自带的，但是github部分地区无法访问，建议删掉原来的，再把上面这个镜像地址添加进去。添加完之后不会自动下载，需要到tools/update gravity下点击update手动更新一次。\n导入解析 如果是单个设备，直接到对应的连接选项从DHCP改成静态再把下面把DNS改成192.168.101.103即可。 如果是路由器（我的网络是光猫-软路由-硬路由），我用的是梅林，直接在内部网络(lan)下的\t基本设置改成静态IP，配置好IP地址和网关，DNS服务器则修改成192.168.101.103保存即可。 如果成功了，Dashboard和Query Log应该能看到解析记录。\n这样做有什么好处 docker环境相对于直接在硬路由/软路由上搭建最大的好处就是不用担心53端口冲突，这点就够了\nPi-hole Hardware 安装之前 我的测试环境是安装过宝塔php8.1+8.2的64位树莓派raspios。如果是全新安装的可能有些步骤是不必要的。 安装前一定要确保机器能够访问到Github，如果不能请配置好代理。例如我在192.168.118.214上搭建了3proxy建议代理服务，端口分别是： 1079: http/https 1080:socks5，因此需要配置临时代理：\nexport https_proxy=http://192.168.118.214:1079 http_proxy=http://192.168.118.214:1079 all_proxy=socks5://192.168.118.214:1080 然后就可以执行安装了：\ncurl -sSL https://install.pi-hole.net | sudo bash 脚本执行时会安装一系列的依赖，需要注意像php这类的软件包部分源只提供了最新版本，比如原来我只安装有8.1，结果在安装：\n[i] Checking for php8.1-common (will be installed) [i] Checking for php8.1-cgi (will be installed) [i] Checking for php8.1-sqlite3 (will be installed) [i] Checking for php8.1-xml (will be installed) [i] Checking for php8.1-intl (will be installed) 的时候全部都找不到，然后脚本就退出了\u0026hellip;执行\nsudo apt search php8.* 可以看到很多都是8.2的包了\u0026hellip;灰溜溜的去宝塔重新编译安装一个再重新执行脚本：\nphp8.2/stable,stable,stable-security,stable-security 8.2.7-1~deb12u1 all server-side, HTML-embedded scripting language (metapackage) php8.2-amqp/stable 1.11.0-5 arm64 AMQP extension for PHP php8.2-apcu/stable 5.1.22+4.0.11-2 arm64 APC User Cache for PHP ... 安装过程有个简单的交互，无非就是问你是不是真的要安装，使用哪个网卡，使用哪个DNS，要不要装个lighthttp实现网页端管理这类的，基本上全部选是就对了。安装完成后会提示管理网页地址和默认密码，可以使用pihole -a -p命令更改：\n[i] Pi-hole blocking will be enabled [i] Enabling blocking [✓] Reloading DNS lists [✓] Pi-hole Enabled [i] Web Interface password: CPlutkpL [i] This can be changed using 'pihole -a -p' [i] View the web interface at http://pi.hole/admin or http://192.168.118.164/admin [i] You may now configure your devices to use the Pi-hole as their DNS server [i] Pi-hole DNS (IPv4): 192.168.118.164 [i] Pi-hole DNS (IPv6): 2***********34 [i] If you have not done so already, the above IP should be set to static. [i] The install log is located at: /etc/pihole/install.log [✓] Installation complete! 到这里就算安装完成了。\n一些问题 一般情况下现在就可以直接访问pihole了，但是你可能会发现管理页面报错404，如果你有安装过lnmp环境，这可能是80端口冲突导致lighthttp无法启动：\nroot@akarinbot:~# systemctl status lighttpd.service × lighttpd.service - Lighttpd Daemon Loaded: loaded (/lib/systemd/system/lighttpd.service; enabled; preset: enabled) Active: failed (Result: exit-code) since Mon 2024-04-15 23:09:25 CST; 5min ago Duration: 476ms Process: 173339 ExecStartPre=/usr/sbin/lighttpd -tt -f /etc/lighttpd/lighttpd.conf (code=exited, status=0/SUCCESS) Process: 173342 ExecStart=/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf (code=exited, status=255/EXCEPTION) Main PID: 173342 (code=exited, status=255/EXCEPTION) CPU: 886ms 4月 15 23:09:25 akarinbot systemd[1]: lighttpd.service: Scheduled restart job, restart counter is at 7. 4月 15 23:09:25 akarinbot systemd[1]: Stopped lighttpd.service - Lighttpd Daemon. 4月 15 23:09:25 akarinbot systemd[1]: lighttpd.service: Start request repeated too quickly. 4月 15 23:09:25 akarinbot systemd[1]: lighttpd.service: Failed with result 'exit-code'. 4月 15 23:09:25 akarinbot systemd[1]: Failed to start lighttpd.service - Lighttpd Daemon. 所以我们需要手动修改lighthttp的配置文件： root@akarinbot:~# nano /etc/lighttpd/lighttpd.conf \u0026hellip; #server.port = 80 server.port = 88 #这里改成80外的其他端口 \u0026hellip;\n然后重启lighthttp服务：\nroot@akarinbot:~# systemctl restart lighttpd.service 检查服务状态：\nroot@akarinbot:~# systemctl status lighttpd.service 如果提示active (running)此时应该就完成了。如果timeout了，建议检查防火墙配置，要注意53端口的TCP/UDP都要打开哦。\nAdGuardHome on Hardware 安装之前 需要注意的是，这个方法适用于使用openwrt的系统，并且支持安装luci软件包。 下载：\nhttps://github.com/rufengsuixing/luci-app-adguardhome/releases/download/1.8-11/luci-app-adguardhome_1.8-11_all.ipk 到本地，在openwrt内的系统-软件包下选择上传该软件包，无视警告并安装，然后刷新页面。 到：\nhttps://github.com/AdguardTeam/AdGuardHome/releases 下载适合自己系统版本的软件包。比如X86架构linux的：\nhttps://github.com/AdguardTeam/AdGuardHome/releases/download/v0.107.48/AdGuardHome_linux_amd64.tar.gz 下载后解压到任意目录，解压并增加相关工作目录：\ncd ~ wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.107.48/AdGuardHome_linux_amd64.tar.gz tar zxvf AdGuardHome_linux_amd64.tar.gz mkdir conf \u0026amp;\u0026amp; mkdir data 此时Adguard的路径应该为/root/AdGuardHome。\n配置AdguardHome luci和AdguardHome 管理界面下的服务-AdGuard Home，把以下项目修改：\n6060重定向--\u0026gt;作为dnsmasq的上游服务器 执行文件路径-\u0026gt;/root/AdGuardHome/AdGuardHome 配置文件路径-\u0026gt;/root/AdGuardHome/conf/AdGuardHome.yaml 工作目录-\u0026gt;/root/AdGuardHome 运行日志-\u0026gt;/root/AdGuardHome/data 然后保存并应用，再勾选启用，再次保存，进入路由器IP:3000，配置AdGuardHome。 需要注意的是一般情况下53端口是被占用了，建议修改成5553。 进入AdGuardHome之后在设置-DNS设置下面把上游DNS服务器修改成：\nhttps://dns.alidns.com/dns-query tls://dns.alidns.com 223.5.5.5 以上都是阿里云的DNS，实测我的网络解析速度还行。 Bootstrap DNS 服务器则修改为：\n223.5.5.5 223.6.6.6 114.114.114.114 8.8.8.8 保存之后再去过滤器-DNS黑名单下启用需要的规则就行了，自带的几个都不错，打勾就能下载。\n导入解析 此步骤和使用PiHole一模一样。\n","date":"2024-04-13T23:37:00+08:00","permalink":"https://blog.tama.guru/record/ad-plugin.html","title":"在局域网内安装去广告插件的几种方法(pihole和adguardhome)"},{"content":"换了华子之后，平时我需要用到的那些G系软件基本上都是通过Gspace这类的软件去实现的，但是有一些特殊的软件就无法使用了\u0026hellip;比如litchi这个第三方无人机飞控软件，如果使用gspace去安装，手机在连接遥控器的时候就不会跳转到litchi，图像也没有，结果就是我没提前发现这个问题，某次飞行前东西都准备好了，然后我也崩溃了\u0026hellip;\n[scode type=\u0026ldquo;red\u0026rdquo;]经测试，安装了GMS之后Litchi依旧无法正常运行，甚至用官方的DJI Fly都无法正常连接，症状为不弹出USB调试提示窗/不启动APP/启动APP后无法连接到遥控器。[/scode]\n本文的教程主要参考：https://toalan.com/archives/36/。该教程提供了一个adb+手机联动安装的方式，看评论成功率还挺高的。以下根据文中的步骤一步步去执行并记录差异。\n-1.其他准备工作 安装了最新鸿蒙4.0的Mate60Pro一台（版本号4.2.110，nolog的beta通道）。 稳定的网络环境（指能连接外面的世界）。 下载好文中所需的文件。 安装好adb套件并事前做好认证。 0.事前准备 \u0026ldquo;设置-系统和更新-系统导航方式-更多-悬浮导航\u0026rdquo;:关闭悬浮导航 \u0026ldquo;设置-系统和更新-纯净模式\u0026rdquo;:关闭增强防护 \u0026ldquo;设置-隐私-隐私空间\u0026rdquo;:关闭隐私空间 \u0026ldquo;设置-应用和服务-应用分身\u0026rdquo;:关闭应用分身 以上功能我均没有使用，因此跳过了。\n解压压缩包,将Backup文件夹复制到手机存储空间里的/Huawei 的目录里,压缩包里目录里的软件对应接下来的步骤,按步骤安装! 1. 清除谷歌应用数据 清除以下app的数据：\nGoogle Play商店 Google通讯录同步 Google Play服务 Google服务框架 Google账户管理程序 com.google.android.gms.policy_sidecar_aps SharedLibrary 谷歌服务助手\n打开”设置”-“应用和服务”-“应用管理”,点击右上角四个点,点击显示系统程序,然后搜索手机里是否有以上软件,若有则删除. 因为我之前没有安装过，此步骤省略。\n2. 修改系统时间到2019年12月7日 “设置”-“系统和更新”-“日期和时间”\n将自动设置关闭,并修改日期到2019年12月7日\n3. 打开备份,从内部存储恢复 “设置”-“系统和更新”-“备份和恢复”\n右上角四个点选择”从内部存储恢复”,选择 toalan.com 备份,输入密码恢复(如果没有,就是backup导入没有成功)\n如果这里没有”从内部存储恢复”，点击从“外部存储”，然后把权限全部打开。返回重新进入，就会有了。 符合预期\n4. 激活谷歌服务助手 “设置”-“系统和更新”-“日期和时间”-将自动设置打开 从桌面打开谷歌服务助手,点击激活,并给权限 激活后不需要点击”开始下载”,直接返回桌面\n🚨如果打开提示“当前设备不支持”，那就可以放弃治疗了\n注意：此时我已经连接到了国际互联网，并且为了保证稳定，我使用的是移动网络+V*N的方式，而不是在路由搭建全局网络。\n5. 安装MicroG,且登录谷歌账号（此处对应文件夹的“第五步”） 安装MicroG,打开后点击”Account”,点击右下角”sign in”,登录自己的谷歌账号(此过程可能会闪退一两次, 重试即可) 注意：安装完要立即打开，因为这东西不知道为什么不显示在我的桌面上。若是闪退了可以在设置\u0026gt;应用和服务\u0026gt;应用管理找到MicroG点开之后强行停止上方有个小齿轮，点开就进应用了。如果登录过程中一直停留在Just a sec...，建议换用其它网络和科学软件或者强行停止MicroG并重新进入。\n6. 安装多个谷歌软件 安装1,2,3,4 再安装5-1,安装完打开后,点击上面的系统,可以看见兼容的安卓版本 若是Android10及以下,则安装5-2,若是Android12及以上,则安装5-3 符合预期\n7. 卸载MicroG、安装Drvice ID 设置-应用和服务-应用管理-搜索 microG 卸载 安装第七步 Device ID 符合预期\n8. 安装Play服务 安装Play服务,安装完之后,十秒左右状态栏便会报错(\u0026ldquo;此设备未获得Play保护机制认证\u0026rdquo;),不用管.（如果不弹窗，请检查网络是否正常，这个很重要！） 符合预期\n9. 下载Edge浏览器、设备注册 华为应用商店搜索 Edge ，下载并安装。 不要用 华为浏览器 、夸克 、QQ浏览器、UC浏览器 等其他毒瘤浏览器，会导致不跳转。 打开 Device ID 复制\u0026quot;Google Service Framework(GSF)\u0026ldquo;下面的数据 打开 Edge 进入 https://www.google.com/android/uncertified/ 网站，登录自己Google账号，将数据粘贴进去-注册！ 符合预期\n10. 通过ADB停用GSF【重要步骤！】 注：此处我直接用cmd调用adb命令了 1.准备一台PC电脑（win系统）和数据线。 2.下载adb工具套件。 3.手机端操作： 3.1打开 开发者模式（设置-关于手机-连点7次HarmonyOS版本-输入密码) 3.2开启 USB调试 和 \u0026ldquo;仅充电\u0026quot;模式下允许ADB调试 （设置-系统和更新-开发者人员选项） 3.3手机通过数据线到电脑，允许与电脑链接（不弹窗可忽略） 3.4下滑通知栏，点击 正在通过USB充电,选择 传输文件模式 其实仅充电也可以的。 4电脑端操作: 4.1.1解压adb套件压缩包到任意目录并添加到环境变量。 4.1.2打开cmd，输入adb device在手机上授权。 4.2如果一切正常，打开这个界面。（如果你连接有问题， 界面都不会弹出，怎么解决链接问题看弹窗提示帮助或者点击这里跳转） 5.注意！下面的操作是很关键的，请仔细阅读。！！！重要！！！请阅读完剩余步骤，理解后再操作。 5.1ADB终端内输入命令：adb shell pm disable-user \u0026ndash;user 0 com.google.android.gsf 注意！不要回车执行操作！只是粘贴上去好准备。 5.2手机安装第八步的 8.play商店 。 5.3安装完打开后,会提示\u0026quot;我们正在为您更新Google Play\u0026rdquo;,当跳出可以前往google商店的选项后，直接前往商店，取消更新。 5.4如果商店可以正常打开加载数据，关闭play商店后台运行。注意，在教程没有结束之前，不要通过play下载任何应用。 5.5禁用GSF并且留住FCM功能操作。 5.5.1手机复制链接 https://play.google.com/store/apps/details?id=com.google.android.gms 到 Edge 打开。 5.5.2下方提示 外部应用打开，打开paly商店开应用详情页。 5.5.3点击更新，要注意下载的进度条，当进度条超过50%以后，立马用 搞机工具箱 禁用。忽略提示信息，继续卸载。（注意：如果下载卡在等待中，建议去应用管理把Google Play服务和Play Store后台进程都杀掉，然后换用其它梯子，重新回到5.5.1，又或者直接把梯子关了等一段时间再打开，然后重新下载即可。） 更新完成后，play服务弹窗就会消失，消失后关掉play商店后台，重新打开，随便下载一个应用，正常下载继续11步。 符合预期\n11.检查FCM是否开启 确保网络畅通可访问谷歌 打开 电话，输入 *#*#426#*#* 跳转到FCM日志 提示 Connected 表示已连接，即成功。\nServer:Connected Host:mtalk.google.com/28.0.0.5 Port:5228 Time Connected:00:01 如果Host和Port有数据，而Server提示No Connected，请重启手机 如Play商店不能正常加载数据和使用FCM，从第八部开始重新操作。 符合预期\n后附 按照该教程，基本上可以实现正常使用且不会弹窗（至少目前不会），以上经测试商店相关的功能都没问题，后续如果有什么变数再更新。 再次感谢原作者。\n","date":"2024-04-12T00:06:00+08:00","permalink":"https://blog.tama.guru/record/homo4-0-gms.html","title":"记录一次在鸿蒙4.0安装GMS套件的过程"},{"content":"最近想考个Ham证，转载一下作为材料记录。能不能过靠你了！\n本文GitHub地址是https://github.com/jks-liu/zhihu/blob/master/ham-license-type-a.md。\n本文力求用最简单的语言，详细介绍你需要掌握的所有内容。让你既知其然，又知其所以然。\n最后更新时间：2022年3月8日\n注意新版题库v20211022已经更新，本文会稍后更新到新版，敬请期待。题库下载地址http://www.crac.org.cn/News/List?type=6\u0026y=，你也可以在下面提到了「智谱APP」中练习。\n版本日志：\n2020年某月某日：初版 2021年4月21日：修订版 2022年3月8日：提示更新到新版题库。 2023年10月21日：根据最新版题库（v20211022）更新，题库具体的变更内容我在GitHub做了详细的整理。 简介 本人这个月13号考试，下图是我的准考证。由于本人接触这个领域也不久，下文有何不妥之处，还望指出。最新消息，考试已过。虽然没有具体的分数，但应该是满分。所以我相信，每一个把这个教程看两遍（实指）的人都可以高分通过。\n现在几乎所有地区都可以手机APP报名。APP的名字叫“智谱”。APP中点击下面的“特别入口”，选择“业余无线电”-“业余无线电爱好者”，点“进入”再选择“考试报名”就可以了。\n简单来说，想要合法地操作业余无线电设备，需要以下几个步骤：\n通过考试（也就是本文所覆盖的内容） 购买或自制设备，当然你也可以先买设备再考试\n淘宝剁手之前注意先到中国无线电管理网站查询即将购买的设备有没有有效期内的核准代码，注意是针对业余业务的核准码。 携带设备去指定机构验机。如果你的机器是购买的并且有上条所说的针对业余业务的核准码，可以免检，跳过此步。 申请无线电台许可 申请识别码（呼号），和步骤四同时进行 考试介绍 考试分多个等级，新人只能考A类。\nA类考试共30道单选题，时间40分钟，对25道（含）以上合格。开考十五分钟可以交卷，一半此时大部分人都会交卷。考完试一般十天内会公布结果。\n题目从题库中随机抽取，题库可从这里下载。所以题目的第一个选项是正确答案，当然，真正考试的时候会打乱选项。A类题库共361题。\n各种资料链接（最后更新于2020年12月1日）：\n题库以及考试大纲，这是我们复习的重点 这里可以下载到各种法律法规相关文件 业余无线电台管理办法（工业和信息化部22号令） 这一部最重要的一部法规，因为几乎里面的每一条都揉到了下面的题库里。建议每个人都读一读。 关于实施《业余无线电台管理办法》若干事项的通知（工信部无[2013]43号） 《关于进一步明确和规范业余无线电台管理有关工作的通知》(工无函[2014]24号) 业余无线电台操作技术能力验证暂行办法（国无协[2013]1号） 关于业余无线电台操作技术能力考核有关事项的通知（国无协[2013]2号） 《来访者业余无线电台临时操作证书》申请办法（国无协[2013]3号） 关于修订各类别业余无线电台操作技术能力验证考核暂行标准的通知（国无协〔2018〕13号） 《中华人民共和国无线电频率划分规定》（工业和信息化部46号令） 这部法规定义了很多无线电相关的术语，以及很多技术相关的内容。由于很长，也没必要全看，适合做参考。 这是一个可以帮你刷题/模拟考试的网站，这样，你就不用去读无聊的题库文件。 教程安排 这里直接按照考试大纲的顺序编写本教程。所以本教程是针对本考试最系统的教程。\n凡是题库中出现的知识点（意味着可能会考到），我会着重强调，或将对应的文字加粗。注意，这些强调的内容都是题库中的，考试可能会考的内容。不求你会背诵，至少看到选项的时候你会选。\n由于这是一个考试指南，所以里面我也会夹杂一些记忆技巧，助你通过考试。\n想了解业余无线电其它知识的朋友，推荐童效勇、陈方的《业余无线电手册》，最新版本是第五版。这可能是大部分人的启蒙书籍吧。\nA.1． 无线电管理相关法规 法律法规粗看比较难记，但其有内在的逻辑。运用你的常识和经验，多看几遍，应该不难。\n业余无线电的上位是无线电。\n无线电管理的最高法律文件是《中华人民共和国无线电管理条例》。其立法机关是国务院和中央军委。\n记忆要点：无线电关系国家安全，所以需要军委共同管辖。\n无线电的主管部门是各级无线电管理机构。\nA.1.1 业余电台管理体制和政策 业余无线电管理的最高法律文件是《业余无线电台管理办法》，其立法机关是大名鼎鼎的工信部（工业和信息化部）。注意：考试的时候看清楚题干中问的是无线电还是业余无线电。\n注：若无特别说明，引用的法条默认出自《业余无线电台管理办法》。再次强调，我加粗的，都是考试可能考的。\n第三条 国家无线电管理机构和省、自治区、直辖市无线电管理机构（以下简称地方无线电管理机构）依法对业余无线电台实施监督管理。 国家无线电管理机构和地方无线电管理机构统称无线电管理机构。\n考试会问你业余无线电的监管部门，当然你可以说是各级无线电管理机构。题库的答案是国家无线电管理机构和地方无线电管理机构，当然啦，是一个意思。对于一个问题，答案经常会有各种不同的说法，我尽量将题库中的答案选项直接呈现给你，以求混个眼熟，毕竟通过考试是我们很重要的一个目的。考试还会问你地方无线电管理机构指的是什么，显然从上面法条可知是省、自治区、直辖市无线电管理机构。\n第四条（第三款） 依法设置的业余无线电台受国家法律保护。\nA.1.2 业余无线电的相关定义 我国对无线电管理术语 “业余业务”、“卫星业余业务”和“业余无线电台” 做出具体定义的法规文件是《中华人民共和国无线电频率划分规定》。\n- 业余业务 amateur service：供业余无线电爱好者进行自我训练、相互通信和技术研究的无线电通信业务。业余无线电爱好者系指经正式批准的、对无线电技术有兴趣的人，其兴趣纯系个人爱好而不涉及谋取利润。 - 卫星业余业务 amateur-satellite service：利用地球卫星上的空间电台开展与业余业务相同目的的无线电通信业务。 - 业余电台 amateur station：用于业余业务的电台。 强调业余无线电爱好者系指经正式批准（有证） 的、对无线电技术有兴趣的人，其兴趣纯系个人爱好而不涉及谋取利润。\nA.1.3 无线电管制 无线电管制是指在特定时间和特定区域内依法采取的对无线电波的发射、辐射和传播实施的强制性管理。管理措施包括：\n限制或者禁止业余无线电台（站）的使用 对特定的无线电频率实施技术阻断 决定实施无线电管制的机构为\n在全国范围内或者跨省、自治区、直辖市实施，由国务院和中央军事委员会决定 在省、自治区、直辖市范围内实施，由省、自治区、直辖市人民政府和相关军区决定 违反无线电管制命令和无线电管制指令的由国家无线电管理机构或者省、自治区、直辖市无线电管理机构；违反治安管理规定者由公安机关处罚。处罚包括（需要记忆）：\n责令改正；拒不改正的，关闭、查封、暂扣或者拆除相关设备；情节严重的，吊销电台执照；违反治安管理规定的，由公安机关处罚 警告、查封或者没收设备、没收非法所得；情节严重的，可以并处一千元以上，五千元以下的罚款 责令限期改正，可以处警告或者三万元以下的罚款 注意：关于处罚的只有上面三个是正确选项。具体的对应关系如下，只为应付考试的话可不用记忆：\n责令改正；拒不改正的，关闭、查封、暂扣或者拆除相关设备；情节严重的，吊销电台执照；违反治安管理规定的，由公安机关处罚 业余电台违反无线电管制命令和无线电管制指令的 警告、查封或者没收设备、没收非法所得；情节严重的，可以并处一千元以上，五千元以下的罚款 对擅自设置、使用业余无线电台的单位或个人 业余电台干扰无线电业务的 业余电台随意变更核定项目、发送和接收与业余无线电无关的信号的 责令限期改正，可以处警告或者三万元以下的罚款 超出核定范围使用频率或者有其他违反频率管理有关规定的行为的 对涂改、仿制、伪造、倒卖、出租、出借业余无线电台执照，或者以其他形式非法转让业余无线电台执照的 对盗用、出租、出借、转让、私自编制或者违法使用业余无线电台呼号的 对以不正当手段取得业余无线电台执照的 对向负责监督检查的无线电管理机构隐瞒有关情况、提供虚假材料或者拒绝提供反映其活动情况的真实材料的 对违法使用业余无线电台造成严重后果的 A.1.4 业余电台的分类管理 不同类别业余无线电台的主要区别在于允许发射的频率范围和最大发射功率。\nA类业余无线电台允许发射的发射频率为30-3000MHz范围内的各业余业务和卫星业余业务频段。 A类业余无线电台允许发射的最大发射功率为不大于25瓦。 业余无线电台专用无线电发射设备的重要特征是发射频率不得超出业余频段。\nA.1.5 设置业余电台应具备的条件 第六条 申请设置业余无线电台，应当具备下列条件：\n（一）熟悉无线电管理规定； （二）具备国家无线电管理机构规定的操作技术能力； （三）无线电发射设备符合国家相关技术标准； （四）法律、行政法规规定的其他条件。 单位申请设置业余无线电台的，其业余无线电台负责人应当具备前款第一项规定的条件，技术负责人应当具备前款第一项和第二项规定的条件。 个人申请设置具有发信功能的业余无线电台的，应当年满十八周岁。 申请设置业余无线电台应当具备的条件有：\n熟悉无线电管理规定 具备国家规定的操作技术能力\n注意这个能力标准是国家设定的，不是考试机构设定的\n具备能力的标志为：取得《业余无线电台操作证书》，即想要设台，自己得是业余无线电爱好者（有证），但可以是正在起步的（有证）初学者 发射设备符合国家技术标准 法律和行政法规规定的其他条件\n其它机构（包括当地无线电管理机构委托的受理机构）不得设置其它条件 不需要加入指定协会。 个人申请设置具有发信功能的业余无线电台的年龄条件是年满十八周岁。具备《业余无线电台操作证书》者操作业余无线电台不受年龄限制。\n这意味着（不满十八周岁的）中小学生可以考取《业余无线电台操作证书》并独立操作具有发信功能业余无线电台，但不能申请设置属于自己的电台，只能使用别人的。\nA.1.6 使用业余电台应具备的条件 个人申请设置具有发信功能的业余无线电台的年龄条件是年满十八周岁。具备《业余无线电台操作证书》者操作业余无线电台不受年龄限制。熟悉无线电管理规定、具备国家规定的操作技术能力并取得相应操作技术能力证明就可以使用业余无线电台。\nA.1.7 业余电台操作证书 国家无线电管理机构和地方无线电管理机构（或其委托单位） 负责组织A类和B类业余无线电台所需操作技术能力的验证。\n注意“业余无线电台操作证书”的颁发机构是中国无线电协会，不是中国无线电运动协会，也不是地方无线电协会。\nA.1.8 设置业余电台的申请流程 第四条（第一款） 设置业余无线电台，应当按照本办法的规定办理审批手续，取得业余无线电台执照。\n第四条规定了设置业余电台的必要步骤。\n按照《业余电台管理办法》规定，申请设置使用配备有多台业余无线电发射设备的业余无线电台，应该视为一个业余电台，指配一个电台呼号，但所有设备均应经过核定并将参数载入电台执照。\n个人申请设置业余无线电台应当提交的书面材料为：\n两种表格（具体的表格名称可以不记） （一）《业余无线电台设置（变更）申请表》； （二）《业余无线电台技术资料申报表》； 身份证和操作证书的原件、复印件 申请设置中继台、信标台、空间台和技术参数需要超出管理办法规定的特殊业余电台时，在《业余无线电台设置（变更）申请表》 的“台站种类”应选择 “特殊” 类。申请设置此类特殊业余电台由地方无线电管理机构受理和初审后交国家无线电管理机构审批。\n负责受理设置业余无线电台申请的机构为设台地地方无线电管理机构或其正式委托的代理受理服务机构。审批机构为\n设置在省、自治区、直辖市范围内通信的业余无线电台，审批机构为设台地的地方无线电管理机构； 设置通信范围涉及两个以上的省、自治区、直辖市或者涉及境外的一般业余无线电台，审批机构为国家无线电管理机构或其委托的设台地的地方无线电管理机构。 A.1.9 业余电台执照核定项目的变更、业余电台的注销 按照在省、自治区、直辖市范围内通信所申请设置的业余无线电台，如想要将通信范围扩大至涉及两个以上的省、自治区、直辖市或者涉及境外，或者要到设台地以外进行异地发射操作，须办理下列手续：事先向核发执照的无线电管理机构申请办理变更手续，按相关流程经国家无线电管理机构或其委托的设台地的地方无线电管理机构批准后，换发业余无线电台执照。\n业余无线电台执照有效期届满后需要继续使用的，应当在有效期届满一个月前内向核发执照的无线电管理机构申请办理延续手续。注意，上面这个说法是不对的，只是题库里是这么写的，所以为了考试的目的我记在这里。这个问题题库里还有另一个选项：有效期届满一个月之内，我看不出来这两个说法有什么不同。这里我列出法律原文《业余无线电台管理办法》\n第十三条　业余无线电台执照由国家无线电管理机构统一印制。 业余无线电台执照的有效期不超过五年。业余无线电台执照有效期届满后需要继续使用的，应当在有效期届满前三十日以前向核发执照的无线电管理机构申请办理延续手续。 从这里可以看到有两个问题：\n一个是届满，一个是届满前，意义完全不同 三十日和一个月，算是不严谨吧 所以，比如你的执照是五月五号到期，那你应该在四月五号前办理延续手续。\n因改进或调整业余发射设备使业余无线电台的技术参数超出其业余无线电台执照所核定的范围时应及时向核发执照的无线电管理机构申请办理变更手续，换发业余无线电台执照。\n终止使用业余无线电台的，应当向核发业余无线电台执照的无线电管理机构申请注销执照。\n经地方无线电管理机构批准设置的业余无线电台，设台地迁入其他省、自治区或者直辖市时，应当先到原核发执照的无线电管理机构办理申请注销原业余无线电台，再到迁入地的地方无线电管理机构办理申请设置业余无线电台的手续。 经国家无线电管理机构批准设置的业余无线电台，设台地迁入其他省、自治区或者直辖市时，应当先到原核发执照的无线电管理机构申请办理注销手续，缴回原电台执照，领取国家无线电管理机构已批准设台的证明，凭证明到迁入地的地方无线电管理机构完成申请变更手续，领取新电台执照。 A.1.10 关于业余电台发射设备的规定 业余无线电发射设备的频率容限和杂散域发射功率/杂散发射最大允许功率电平必须符合国家的相关规定。具体要求见《中华人民共和国无线电频率划分规定》的附录1和2。一般用百万分之几或者赫兹表示，注意是百万。杂散域发射功率通常使用下述单位表示：绝对功率dBm、低于载波发射功率的分贝值dBc、低于PEP发射功率的相对值dB。\n分贝毫瓦 dBm （decibel relative to one milliwatt）是以一毫瓦为基准的功率绝对值\n如果功率为P毫瓦（mW），转换成dBm为：\n$$x=10\\log_{{10}}(P/(1\\ {\\mathrm {mW}}))$$\n反过来，如果功率是x dBm，则 $$P=(1\\ {\\mathrm {mW}})10^{{(x/10)}}\\,$$ dBc和dBm是类似的，只不过基准不是1 mW，而是载波（Carrier）功率，所以是一个相对值单位。 “PEP”是指供给天线传输线的峰包功率，使用单位：W。（《中华人民共和国无线电频率划分规定》，《杂散域的无用发射》）。那低于PEP发射功率的相对值dB就很好理解了。 记得分贝毫瓦（dBm）依次类推还有dBμ，考试是会考的，当然不考公式，会给你一个值，让你转换另一个值。\n0.1 mW = -10 dBm 1 mW = 0 dBm 10 mW = 10 dBm 100 mW = 20 dBm 1W = 30 dBm 10W = 40 dBm 灵活运用上面的公式。比如，问你5W是多少，显然应该是30到40之间的一个数，就选那个就行。\n对于dBμ，就是以1 μW为标准的功率绝对值。如果你搞不懂上面的公式，就记住下面一点： $$x\\ dBm = (x+30)\\ dBμ$$ 比如 $$10\\ dBm = 40\\ dBμ$$ 然后看到dBμ，就先转换为dBm在进行计算。\n比如，0.25W，换算成dBm，应该是20到30间的一个数。那换算成dBμ，就加上30，应该是50到60间的一个数。\n有时候有两个选项符合要求，需要计算。如果你不想计算，记得不要选择结尾是5的那个选项，什么25、35、45都不要选，剩下的那个就是正确答案。\n依次类推还有dBW，如果你不想计算，记得一点，题库里的dBW都不是正确答案。 $$x\\ dBm = (x-30)\\ dBW$$ 指配频率 assigned frequency\n指配给一个电台的频段的中心频率。\n频率容限 frequency tolerance\n发射所占频段的中心频率偏离指配频率，或发射的特征频率偏离参考频率的最大容许偏差。\n杂散发射 spurious emission\n必要带宽之外的一个或多个频率的发射，其发射电平可降低而不致影响相应信息的传输。杂散发射包括谐波发射、寄生发射、互调产物及变频产物，但带外发射除外。\n带外发射 out-of-band emission\n由于调制过程而产生的、刚超出必要带宽的一个或多个频率的发射，但杂散发射除外。\n无用发射 unwanted emissions\n包括杂散发射和带外发射。\n（发射的）带外域 out-of-band domain（of an emission）\n是指刚超出必要带宽而未进入杂散域的频率范围，在此频率范围内带外发射为其主要发射产物。基于产生的源而定义的带外发射，主要产生在此带外域中，也会在杂散域中延伸一小部分。同样地，主要产生在杂散域中的杂散发射也可能在带外域中产生。\n（发射的）杂散域 spurious domain（of an emission）\n带外域以外的频率范围，在此频率范围内杂散发射为其主要发射产物。\n杂散域发射功率通常用发射机连接天馈线的输出端的杂散发射频率的峰包功率或平均功率表示，其参考测量带宽主要取决于发射机的无线业务种类。杂散域发射功率也可以用电场强度或地球表面功率通量密度（pfd）等效表示。\n图片来自聂杏春的无线电设备杂散发射技术要求和测量方法，版权归原作者所有。\n比如一台发射机，工作频率为145.000MHz，但在435.000MHz的频率上也有发射，显然从上图可知属于杂散发射。\n业余无线电台使用的发射设备必须符合下列条件\n商品设备应当具备《无线电发射设备型号核准证》\n型号核准的法律依据为 《无线电频率划分规定》中有关无线电发射设备技术指标的规定 自制、改装、拼装设备应通过国家相关技术标准的检测 业余无线电台专用无线电发射设备的发射频率必须满足发射频率不能超越业余业务或者卫星业余业务频段，不需要包含所有业余业务或者卫星业余业务频段。\n所以总结一下对发射设备的要求：\n频率容限不超过限值 杂散辐射不超过限值 发射频率不超出国家规定的业余频率 A.1.11 无线电频率的管理 A类业余无线电台允许发射的发射频率为30-3000MHz范围内的各业余业务和卫星业余业务频段。\nHF（高频） 3-30MHz VHF（甚高频） 30-300MHz UHF（特高频） 300-3000MHz 家用微波炉一般工作在这个频带 《中华人民共和国无线电频率划分规定》 规定了业余无线电台使用的频率。《中华人民共和国民法典》将于2021年正式生效，《物权法》将同时废止。《中华人民共和国民法典》 第二百五十二条：无线电频谱资源属于国家所有。\n注意上表中的单位。\n//: # Mark\n专用的频段（需要记忆），即上表粉色 Mark\n7MHz 14MHz 21MHz 28MHz 47GHz （这个上表中没有） 我国分配给业余业务和卫星业余业务与其他业务共用、并且业余业务和卫星业余业务作为主要业务的频段（上表黄色）有（考试只要记得以下VHF和UHF的频段，实际上只有VHF频段）：Mark\n50MHz，6米业余波段，50-54MHz 144MHz，2米业余波段，下面几个细节也要记得哟 144-146MHz为唯一主要业务 146-148MHz为与其他业务共同作为主要业务 电台在144MHz频段进行本地联络时应避免占用144-144.035MHz和145.8-146MHz 145.8MHz至146MHz业余频段留给业余卫星通信使用，话音及其他通信方式不应占用 144-144.035MHz频段我没有找到相关法律法规的明确规定。根据这份BAND PLAN，这个频段被用于月球面反射通信（EME，Earth–Moon–Earth communication）。\n//: # Mark TODO\n分配给业余业务和卫星业余业务与其他业务共用、并且业余业务和卫星业余业务作为唯一主要业务的频段的个数为3个。在3GHz以下的该类频段为144-146MHz。\n//: # Mark TODO\n我国分配给业余业务和卫星业余业务与其他业务共用、并且业余业务和卫星业余业务作为次要业务的1200MHz以下频段有（需要记忆），上表绿色\n135.7kHz（这个上表中没有） 10.1MHz 430MHz，0.7米业余波段，430-440MHz，次要业务 这个频段中我国分配的主要业务是“无线电定位和航空无线电导航”。 在430MHz频段进行本地联络时应避免占用431.9-432.240MHz和435-438MHz 435MHz至438MHz业余频段留给业余卫星通信使用，话音及其他通信方式不应占用 431.9-432.240MHz频段，根据这份India National Spectrum Plan (INSP) for Amateur Radio Service，也是用于EME通信。\n业余无线电台在业余业务、卫星业余业务作为次要业务使用的频率或者与其他主要业务共同使用的频率上发射操作时，应当遵守无线电管理机构对该频率的使用规定。业余无线电台在无线电管理机构核准其使用的频段内，享有平等的频率使用权。\n划分、分配、指配，请熟记下列定义\n（频段的）划分：allocation（of a frequency band）\n由国家将某个特定的频带列入频率划分表，规定该频带可在指定的条件下供业余业余业务或者卫星业余业务使用 （无线电频率或无线电频道的）分配：allotment（of a radio frequency or radio frequency channel）\n将无线电频率或频道规定由一个或多个部门，在指定的区域内供地面或空间无线电通信业务在指定条件下使用 （无线电频率或无线电频道的）指配：assignment（of a radio frequency or radio frequency channel）\n将无线电频率或频道批准给具体的业余无线电台在规定条件下使用 上面几个概念有点绕，准确注意对象可帮助记忆\n划分业务（频率） 分配（频率）给地区、国家或部门 指配（频率）给电台 在频率划分表中，一个频带被标明划分给多种业务时，这些业务被分为主要业务和次要业务。\n《中华人民共和国无线电频率划分规定》3.2.1（3）规定：（下面三条需要记忆） 次要业务台站\na) 不得对业经指配或将来可能指配频率的主要业务电台产生有害干扰；\nb) 不得对来自业经指配或将来可能指配频率的主要业务电台的有害干扰提出保护要求；\nc) 可要求保护不受来自将来可能指配频率的同一业务或其他次要业务电台的有害干扰。todo typo\nA.1.12 业余电台呼号的管理 A.1.12.1业余电台呼号的分配和指配 无线电管理机构核发业余无线电台执照时，同时指配业余无线电台呼号。如业余无线电爱好者对业已指配给自己的电台呼号不满意，不可以申请另行指配业余无线电台呼号。核发业余无线电台执照的无线电管理机构已经为申请人指配业余无线电台呼号的，不另行指配其他业余无线电台呼号。\n各地业余无线电台呼号前缀字母和后缀字符的可用范围由国家无线电管理机构编制和分配。\n业余无线电爱好者不可以要求设台地所在地方无线电管理机构给予指配超出业已分配给该地方的前缀字母和后缀字符可用范围的业余无线电台呼号\n设台地迁入其他省、自治区或者直辖市时，设台人可从下面方法中二选一：\n方法一，注销原电台呼号，指配迁入地的新电台呼号 方法二，申请在迁入地继续指配原来的电台呼号\n先到原核发执照的无线电管理机构申请办理注销手续，缴回原电台执照，取得由迁入地指配原业余无线电台呼号的书面同意，再到迁入地的地方无线电管理机构办理相应的手续、重新指配原电台呼号，领取新的电台执照 A.1.12.2 业余电台呼号的使用规则 《业余无线电台管理办法》规定业余无线电台按以下办法（需要记忆）设置、正确使用业余无线电台呼号\n业余无线电台应当在每次通信建立及结束时，主动报出本台呼号 在发射过程中至少每十分钟报出本台呼号一次 对于通信对方，也应使用对方电台的呼号加以标识 这里呼号指完整的电台呼号，如在设台地以外的地点进行异地发射操作，还应在前面加上字母B、操作地分区号和符号“/”。 在实际通信中，不可以把本台呼号的地区号码加后缀视作《业余电台管理办法》所说的“本台呼号”。TODO 分区 业余无线电台分区表（考试应该不考）\n第1区：北京\n第2区：黑龙江 吉林 辽宁\n第3区：河北 内蒙古 山西 天津\n第4区：江苏 山东 上海\n第5区：福建 江西 浙江\n第6区：安徽 河南 湖北\n第7区：广东 广西 海南 湖南\n第8区：贵州 四川 云南 重庆\n第9区：甘肃 宁夏 青海 陕西\n第0区：西藏 新疆\n例LK0079：由国家无线电管理机构批准设台的北京火腿的电台呼号为BH1AAA，把电台带到西安去使用，则本台呼号应该为B9/BH1AAA。这种操作称为异地发射操作。\n例LK0084：某业余无线电爱好者，自己所设置的业余无线电台呼号为BH1ZZZ。现该爱好者到业余无线电台BH9YYY做客并在该台进行发射操作。应当使用的呼号BH9YYY或者B9/BH1ZZZ。这种操作称为客席发射操作。\n例LK0093：BH1ZZZ由北京迁入河北省，并办妥了由河北无线电管理机构指配使用原电台呼号的全部手续，领取了新的业余无线电台执照。该台在日常通信时应使用呼号B3/BH1ZZZ。\nA.1.12.3 业余电台迁移时的管理流程及其呼号指配 A.1.12.4 业余电台操作人员客席操作及其呼号使用 A.1.12.5 业余电台移动和异地操作及其呼号使用 A.1.13 业余电台的使用规定 A.1.13.1 关于业余电台一般通信的规定 业余电台的法定用途为业余无线电爱好者进行自我训练、相互通信和技术研究，严禁用于以下目的\n娱乐、闲聊、消遣等 机动车辆行车服务性通信 普通活动（包括公益活动）的通信工具 与个人生活事务有关的通信 第四条（第二款） 国家鼓励和支持业余无线电通信技术的研究、普及和突发重大自然灾害等紧急情况下的应急无线电通信活动。\n业余无线电台的通信对象应当限于业余无线电台，所以以下行为是错误的： 某业余电台操作者听到业余专用频率上出现某种显然出自非业余电台的人为干扰发射，于是按下话筒向该发射者宣传无线电管理法规知识 在业余无线电台中转发广播电台、互联网聊天、电话通话、其他电台的联络信号 业余电台在通信中为其他人或者单位、组织转达信息 与公众对讲机通信 未经核发业余无线电台执照的无线电管理机构批准，业余无线电台不得以任何方式进行广播或者发射通播性质的信号，所以以下行为是错误的： 某业余无线电协会在发射操作中向其会员播发公益性通知和技术训练讲座，但未得到相应无线电管理机构的批准 不得发送与业余业务和卫星业余业务无关的信号。 严禁利用业余无线电台从事从事商业或者其他营利活动，所以以下行为是错误的 出租车安装业余电台并用来传递有关载客的信息 利用业余无线电台通信来促销业余无线电产品或者推动与业余无线电活动有关的其他商业性活动 严禁阻碍其他无线电台通信 当我说一个行为时错误的，意味着这个行为是被禁止的，是违法的。\n任何时候都应当使用明语及业余无线电领域公认的缩略语和简语。\n业余无线电台实验新的编码、调制方式、数字通信协议或者交换尚未公开格式的数据文件时，应事先尽可能采取各种办法向信号可能覆盖范围内的业余无线电爱好者公开有关技术细节，并提交给核发其业余无线电台执照的地方无线电管理机构。\n由国家无线电管理机构审批的业余无线电台在设台地以外的地点进行异地发射操作时，既要符合业余电台执照所核定的各项参数约束，又要遵守操作所在地的地方无线电管理机构的相关规定。\n具备国家无线电管理机构规定的操作技术能力并具有法律规定有效证明文件、但还没有获准设置自己的业余电台的人可以到业余电台进行发射操作。使用所操作业余电台的呼号，由该业余电台的设台人对操作不妥而造成的有害干负责。\n尚未考得《业余电台操作证书》的人在接受业余电台培训中实习发射操作必须已接受法规等基础培训、必须由电台负责人现场辅导、必须在执照核定范围以及国家规定的操作权限内、进行短时间体验性发射操作实习。\n业余无线电台设置人应当确保其无线电发射设备处于正常工作状态，避免对其他无线电业务造成有害干扰。\n业余无线电爱好者不得接收与业余业务和卫星业余业务无关的信号。无意接收到非业余业务和卫星业余业务的信息时不得传播、公布。\n国家禁止利用业余无线电台从事发布、传播违反法律或者公共道德的信息的行为。\n国际电联规定的确定发射电台辐射功率的原则为发射电台只应辐射为保证满意服务所必要的功率。\n业余电台通信受到违法电台或者不明电台的有害干扰时，应不予理睬，收集有关信息并向无线电管理机构举报。\nA.1.13.2 关于业余无线电应急通信的规定 在突发重大自然灾害等紧急情况下，业余无线电台才可以和非业余无线电台进行规定内容的通信。内容限于与抢险救灾直接相关的紧急事务或者应急救援相关部门交办的任务。\nA.1.13.3 业余无线电中继台管理规定和使用规范 业余中继台的设置和技术参数等应符合国家以及设台地的地方无线电管理机构的规定。\n业余中继台必须\n设专人负责监控和管理工作，配备有效的遥控手段，保证造成有害干扰时及时停止发射。 向其覆盖区域内的所有业余无线电台提供平等的服务，并将使用业余中继台所需的各项技术参数公开 选择144MHz或430MHz业余模拟调频中继台同频段收发频差的原则是采用业余无线电标准频差，即144MHz频段600kHz，430MHz频段5MHz。\n业余中继台的使用原则是除必要的短暂通信外，应保持业余中继台具有足够的空闲时间，以便随时响应突发灾害应急呼叫。\n如果你知道另一个电台的呼号，想要在中继上呼叫他，你应该呼叫对方的呼号，并报出自己的呼号。\nA.1.13.4 业余电台通联卡片及电台日志 法规和国际业余无线电惯例要求业余电台日志记载的必要基本内容是（英文缩写也要记忆）:\n通信时间 DATE、TIME\n通信频率 FREQ\n通信模式 MODE\n对方呼号 CALL（对方）\n双方信号报告 RST（双方）\n迫切需要方卡回寄卡片时，应直接向对方地址邮寄卡片并附加SASE（self-addressed stamped envelope） TODO\n不是作为联络或收听证明而交换QSL卡片时，应填上“Eye ball QSO”等有关说明，不应赠送空白卡片 TODO\nA.1.14 业余电台管理执法检查和违法处罚 A.1.14.1 业余电台管理执法检查 业余无线电台设置、使用人应当接受无线电管理机构或者其委托单位的监督检查。\nA.1.14.2 业余电台的违法处罚 《中华人民共和国刑法》第二百八十八条 违反国家规定，擅自设置、使用无线电台（站），或者擅自占用频率，经责令停止使用后拒不停止使用，干扰无线电通讯正常进行，造成严重后果的，处三年以下有期徒刑、拘役或者管制，并处或者单处罚金。\nA.2. 无线电通信程序、方法 A.2.1业余无线电频率的使用规范 任何核准的业余电台对频率享有平等的频率使用权。\n例：某俱乐部约定了一个成员业余电台之间交流技术的网络频率，当遇有其他业余电台按通信惯例要求参加通信时，应无条件欢迎加入。\n业余电台在发射调试信号进行发射功率和天线驻波比等检查时必须先将频率设置到无人使用的空闲频率、偏离常用的热点频率。\nA.2.2 业余电台通信程序 业余电台在发起呼叫前应先守听一段时间，确保没有其他电台正在使用频率。通过守听，没有听到信号还不足以确认频率空闲，因为有时听不到通信双方中的另一方，贸然呼叫会对已有的通信造成干扰。为避免这种情况，应该：先询问“有人使用频率吗”？确认没有应答方能发起呼叫。英语表达示例（需要记忆）：\nIs the frequency in use？ Is any body in the frequency？ Any body here？ 业余电台（以BH1ZZZ为例）用话音发起CQ呼叫的正确格式为：CQ、CQ、CQ。BH1ZZZ呼叫。Bravo Hotel One Zulu Zulu Zulu呼叫，BH1ZZZ呼叫。听到请回答。或英文CQ CQ CQ.This is BH1ZZZ. Bravo Hotel One Zulu Zulu Zulu, BH1ZZZ is calling. I’m standing by.。\n业余电台BH1ZZZ用话音呼叫BH8YYY的正确格式为BH8YYY、BH8YYY、BH8YYY。BH1ZZZ呼叫。Bravo Hotel One Zulu Zulu Zulu，BH1ZZZ呼叫。听到请回答。。英文为Bravo Hotel Eight Yankee Yankee Yankee, Bravo Hotel Eight Yankee Yankee Yankee, Bravo Hotel Eight Yankee Yankee Yankee.This is Bravo Hotel One Zulu Zulu Zulu. Bravo Hotel One Zulu Zulu Zulu, Bravo Hotel One Zulu Zulu Zulu is calling. I’m standing by.。\nBH1ZZZ希望加入两个电台正在通信中的谈话，正确的方法为：在双方对话的间隙，短暂发射一次“Break in！”或“插入！”，如得到响应，再说明本台呼号 “BH1ZZZ请求插入”，等对方正式表示邀请后，方能加入。以请求插入的方式加入两个电台正在通信中的谈话，应确认自己的加入不会影响原通信双方的乐趣。\n业余电台之间进行通信，必须相互正确发送和接收的信息为（记忆）：\n本台呼号 对方呼号 信号报告 当一部电台在呼叫CQ时，他的意思是非特指地呼叫任何一部电台。\n回答一个CQ呼叫时先报出对方的呼号，再报出自己的呼号。\n如果其他电台报告你在2米波段的信号刚才非常强，但是突然变弱或不可辨，这时你应当稍稍移动一下自己的位置，有时信号无规律反射造成的多径效应可能导致失真。\n将一个频率作为一个频道存储在电台中可以让你快速切换到一个你经常使用的频率。\nA.2.3 业余电台通信常用的缩语和简语 Q简语是一种标准化的三字母通信简略语，因短语开头字母均为“Q”而得名。（加粗的为考试可能会考的，需重点记忆）\nQ简语 问句含义 答句含义 TODO mark QRA 你的电台名称是？ 我的电台名称是\u0026hellip; QRB 你台离我台多远？ 我们相距约为\u0026hellip; QRG 我的准确频率是多少？ 你的准确频率是\u0026hellip; QRI 我的音调如何？ 你的音调是(T1-T9) QRJ 我的信号小吗？ 你的信号小 QRK 我的信号可辨度是多少？ 你的信号可辨度是(R1-R5) QRL 你忙吗？ 我正忙 QRM 你受到他台干扰吗？ 我正受到他台干扰 1.无 2.稍有 3.中等 4.严重 5.极端 QRN 你受到天电干扰吗？ 我正受到天电干扰 1.无 2.稍有 3.中等 4.严重 5.极端 QRO 要我增加发信功率吗？ 请增加发信功率 QRP 要我减低发信功率吗？ 请减低发信功率 QRQ 要我发得快些吗？ 请发快些 QRS 要我发得慢些吗？ 请发慢些 QRT 要我停止拍发吗？ 请停止拍发 QRU 你有事吗？ 无事 QRV 你准备好了吗？ 我已准备好了 QRW 需要我转告吗？ 请转告 QRX 要我等多长时间？ 请等待\u0026hellip; \u0026hellip;分钟 QRZ 谁在呼叫我？ \u0026hellip;KHz/MHz正在呼叫你 QSA 我的信号强度是多少？ 你的信号强度是\u0026hellip; QSB 我的信号有衰落吗？ 你的信号强度是，1.几乎不能抄收 2.弱 3.还好 4.好 5.很好 QSD 我的信号不完整吗? 你的信号不完整 QSL 你确认收妥／QSL卡片吗？ 我确认收妥／QSL卡片 QSO 你能否和\u0026hellip;直接（或转接）通信？ 你能和\u0026hellip;直接（或转接）通信？ QSP 你能中转到\u0026hellip;吗？ 我能中转到\u0026hellip; QSU 能在这个频率(或某个频率)回复吗？ 我将在此频率(或某频率)回复 QSV 有天电干扰要我在此频率发一串 V 字吗？ 请在此频率发一串 V 字 QSW 你将在此频率(或某频率)发吗？ 我将在此频率(或某频率)发 QSX 你将在某频率收听吗？ 我将在某频率收听 QSY 要我改用其他频率拍发吗？ 请改用\u0026hellip;KHz/MHz拍发 QSZ 要我每组发两遍吗？ 请每组发两遍 QTB 要我查对组数吗？ 请查对组数 QTC 你有几份报要发？ 我有\u0026hellip;份报要发 QTH 你的地理位置是？ 我的地理位置是\u0026hellip; QTR 你的标准时间是？ 我的标准时间是\u0026hellip; 业余无线电常用缩略语（加粗的为考试可能会考的，需重点记忆），根据题库又补充了很多 mark\n缩略语 原语 含义 AA ALL AFTER 在后 LSN LISTEN 收听 *AB ALL BEFORE 在前 N NO 不 *ABT ABOUT 关于、大约 NA NORTH AMERICA 北美洲 ADD ADDITION 增加 NCS NET CONTROL STATION 网络控制电台 ADR ADDRESS 地址 ND NOTHING DOING 无事 AF AFRICA 非洲 NR NUMBER 数目 AHR ANOTHER 其他、另外 *NW NOW 现在 AGN AGAIN 再、再一次 OB OLD BOY 老弟 AM AMPLITUDE MODULATION 调幅 OC OLD CHAP,OCEANIA 老伙计，大洋洲 ANS ANSWER 回答 OM OLD MAN 老“火腿” ANT ANTENNA 天线 OP OPERATOR 操作员、报务员 AS ASIA 亚洲 OSCAR ORBITING SATELLITE CARRYING AMATEUR RADIO 业余卫星 BCI BROADCAST INTERFERENCE 广播干扰 OT OLD TIME 老前辈、老资格 BCNU BE SEEING YOU 见到你 POBOX POST OFFICE BOX 邮政信箱 BGN BEGIN 开始 PSE PLEASE 请 BUG SEMI-AUTOMATIC KEY 半自动电键 PWR POWER 功率 BURO BUREAU 管理局 *R ROGER、RECEIVED 收到了 CD CRD 卡片 RX、RCVR RECEIVER 接收机 *CFM CONFIRM 确认、认为 RF RADIO FREQUENCY （各种类型的）无线电波 RFI RADIO FREQUENCY INTERFERENCE 无线电干扰 CLBK CALL BOOK 呼号手册 RIG STATION EQUPMENT 电台设备 mark CQ CALL ANY STATION 普遍呼叫 RPRT REPORT 报告 CRT CORRECTION 改正 RTTY RADIO TELETYPE 无线电传打字 *CUAGN SEE YOU AGAIN 再见到你 SA SOUTH AMERICA 南美洲 *CUL SEE YOU LATER 再会 SK END 结束符号 *CW CONTINUOUS WAVE 等幅报 SKED SCKEDULE 表格 CY COPY 抄收 SN SOON 立即、不久 *DE FROM 从 SOS SAVE OUR SOULD 呼救信号 *DF DIRECTION FINDING 测向 ARDF Amateur radio direction finding 业余无线电测向 SRI SORRY 抱歉 *DR DEAR 亲爱的 SSB SINGLE SIDE BAND 单边带 DX LONG DISTANCE 远距离 SSTV SLOW-SCAN TELEVISION 慢扫描电视 EL、ELE ANTENNA ELEMENT 天线单元 STN STATION 电台 ES AND 和 SW SHORT WAVE、SWITCH 短波、开关 EU EUROPE 欧洲 SWL SHORT WAVE LISTENER 短波收听台 FB FINE BUSINESS 良好的 TEMP TEMPERATRE 温度 FM FREQUENCY MODULATION 调频 TMW TOMORROW 明天 FREQ、FQ FREQUENCY 频率 TNX、TKS THANKS 谢谢 GA GOOD AFTERNOON、GO AHEAD 下午好、往下发 T/R TRANSMIT/RECEIVE 收发信 GB GOOD BYE 再见 TU THANKS YOU 谢谢你 GE GOOD EVENING 晚上好 TX、XMTR TRANSMITTER 发射机 GL GOOD LUCK 好运 U YOU 你 GLD GLAD 高兴 UR YOUR，YOUR ARE 你的、你是 GM GOOD MORNING 早上好 UTC UNIVERSAL COORDINATED TIME 世界协调时 GN GOOD NIGHT 晚安 VFO VARIABLE FREQUENCY OSEILLATOR 可变频率振荡器 HAM AMATEUR TRANSMITTER 业余无线电爱好者 VY VERY 很 HR HERE 这里 WW WORLD WIDE 全世界 HPE HOPE 希望 WX WEATHER 天气 HW HOW 如何 XCVR TRANSCEIVER 收发信机 IARU INTERNATIONAL AMATEUR RADIO UNIN 国际业余无线电联盟 XMAS CHRISTMAS 圣诞节 ITU INTERNATIONAL TELECOMMUNICATION UNIN 国际电讯联盟 XTAL ORYSTAL 晶体 K、KU GO AHEAD 请回答 XYL WIFE 妻子 KNW KNOW 知道 YL YOUNG LADY 小姐、女报务员 LG LONG 长 YM YOUNGMAN 青年人（男） LIS LICENSE 执照 73 BEST REGARDS 祝愿，致意 LOG LOG BOOK 电台日记 88 LOVE AND KISSES 爱与接吻 GND ground 地线，地面 LED light-emitting diode 发光二极管 LCD Liquid Crystal Display 液晶显示器 注：带“*”的为普通通信常用缩语\n天线缩写（需要记忆）TODO mark\nDP 偶极天线 GP 垂直接地天线 BEAM 定向天线 YAGI 八木天线 VER 垂直天线 A.2.4 业余电台通信常用的地理常识 中国在东八区（UTC+8），以为这比UTC时间快8小时。UTC时间时1点，那么北京时间就是9点；北京时间是1点，UTC时间就是前一天的下午5点。\n//: #TODO mark\n我国所属的CQ分区是23、24、27。\n“ITU分区”是IARU的活动计算通信成绩的基础。我国所属的“ITU分区”有：33、42、43、44、50。\n业余无线电通信梅登海德网格定位系统（Maidenhead Grid Square Locator）是一种：根据经纬度坐标对地球表面进行网格划分和命名，用以标示地理位置的系统。其格式为\n2个字母和2位数字，或 2个字母和2位数字再加2个字母\n两者网格大小不同，4字符网格为经度2度和纬度1度，6字符网格为经度5分和纬度2.5分。 A.3.无线电系统原理 A.3.1 一般常识 辐射（radiation）是指任何源的能量流以无线电波的形式向外发出，包括闪电产生的电磁波。不包括导线中的各种信号/干扰，电场，磁场。\n发射（emission）是指：由无线电发信电台产生的辐射或辐射产物。发射必须是无线电台，其它的电子设备，闪电等等都不能发射。\n电流的单位是安（培）、A。电压的单位是伏（特）、V。电阻的单位是欧（姆）、Ω。功率（电能消耗的速率）的单位是瓦（特）、W。\n国际单位制词头的符号（加粗的是可能考的，全都是粗的，😂）\nT $10^{12}$ G $10^{9}$ M $10^{6}$ k $10^{3}$ m $10^{-3}$ µ $10^{-6}$ n $10^{-9}$ p $10^{-12}$ 注意上面大写的M和小写的m是不一样的。\n音频所指的频率范围大致是16Hz - 20kHz。\nA.3.2 直流电路 只向一个方向流动的电流叫做直流。\n电源两端电压的方向为从电源的正极到负极。电源（或信号源）内阻使其实际输出电压降低。\n直流电路欧姆定律是说流过电阻的电流I，与两端的电压U成正比，与阻值R成反比。 $$I = \\frac{U}{R}$$A.3.3 交流电路 如上图所示的正弦交流电\n峰值 Peak, also amplitude 峰-峰值 Peak-to-peak 有效值 Effective value\n约为峰值的70.7%\n平常我们说的220V就是有效值 周期 Period 正弦交流电的平均值为0.\n交流电频率为其每秒改变方向的次数，值为$\\frac{1}{Period}$。\n相位差通常用来描述两个或多个同频率正弦信号之间的时间滞后或超前关系。\nA.3.4 电子元件及单元电路常识 电阻元件的“额定功率”参数是指该元件正常工作时所能承受的最大功率。\n一般金属是导体，玻璃，木材，橡胶是绝缘体。\nA.3.5 无线电信号的调制、解调和频谱 用通常的调频方式进行话音通信，必要带宽约为6.25kHz。\nA.3.6 数字信号处理基础常识 简单正弦波只包含一个频率分量。 $$x = sin(\\omega{}t+\\phi)$$单个无限窄脉冲（数学上我们称其为狄拉克δ函数）在整个频谱内具有连续的均匀频率分量（其频谱也称为均匀谱或白色谱）。这个理解不了也没关系，记住我标粗的地方就行。 $$\\delta(x) = \\begin{cases} +\\infty, \u0026 x = 0 \\\\ 0, \u0026 x \\ne 0 \\end{cases}且\\int_{-\\infty}^\\infty \\delta(x) \\, dx = 1$$包含多个频率分量的信号通过滤波器会发生频率失真。\nA.3.7 业余无线电发射和接收设备原理和实用知识 符合国家或国际上规定的干扰允许值和共用标准的干扰不属于有害干扰。\n可以组成完整无线电接收系统的功能部件组合是接收天线、解调器、输出部件。可以组成完整无线电发信系统的功能部件组合是射频振荡器、调制器、发射天线。\n调制是以原始信号控制射频信号的幅度（Amplitude）、频率（Frequency）或相位参数（Phase）。我们分别称其为幅度调制（调幅AM）、频率调制（调频FM）、相位调制（调相PM），缩写需要记忆。\n一个FM话音信号在频谱仪上显示为一条固定的垂直线，左右伴随一组对称的随语音出现和变化的垂直线。下面的gif是我录制的某电台频谱。特点是对称。\n所以，频谱图最容易用来表达和解释模拟FM调制原理。对调频信号进行解调的过程称为鉴频。\n下面介绍FM的两个概念，带宽和频偏\n对于给定的FM发射设备，所传输信号的最高频率越高、幅度越大，射频输出占用带宽越宽。 频偏只取决于被调制信号的幅度。 选择性表述了接收机区分不同信号的能力。\n接收机“过载”通常是指输入信号过于强大，以致导致机内产生附加干扰。\nSSB常被用于长距离弱信号的VHF或UHF联络。 FM被VHF和UHF业余电台本地通信广泛使用。 常用的电源有两种，一种是开关电源（DC-DC），一种是线性稳压电源（LDO）。开关电源可以做得比变压器直接降压整流的线性电源轻巧是因为开关电源中变压器的工作频率高得多，可以缩小磁性材料截面和减少线圈匝数。关键词：工作频率。\nA.3.8 业余无线电常用的功率计算及分贝转换 无线电发射机的效率是指输出到天线系统的信号功率与发射机所消耗的电源功率之比。业余无线电发射机的效率总是明显低于1。所损耗的那部分能量绝大部分转化为热量，极小部分转化为无用信号的电磁辐射。\n接收灵敏度是指无线设备正常工作所需的天线口最小信号接收功率。因此灵敏度指标数值越小，接收最小信号的能力越强。\n衰减是指信号通过信道或电路后功率减少，衰落是指信号通过信道或电路后发生幅度随时间而起伏。\n载波功率是指无线电发信机在无调制情况下，在一个射频周期内供给天线馈线的平均功率。\nCTCSS（连续音频编码静噪系统，Continuous Tone-Coded Squelch System）是指调频发射机在发射的语音信号上附加一个人耳听不到的低频音频，用来打开接收机的静噪。记住前面的缩写。其属于模拟亚音频。当然有模拟亚音频，就有数字亚音频，这里就不展开了。 静噪灵敏度是指能够使静噪电路退出静噪状态的射频信号最小输入电平。\nA.3.9 业余电台的天馈线系统 A.3.9.1 天线的基础知识 发射天线的作用是把无线电发射机输出的射频信号电流转换为空间的电磁波。接收天线系统的作用是把空间的有用电磁波转换为射频电压电流信号。\n保证业余无线电通信接收机优良接收能力的主要因素是\n良好的抗干扰能力 足够高的灵敏度 尽量低的本机噪声和信号失真 由半波长偶极天线和馈电电缆构成的天馈系统，理想的工作状态是天线上只有驻波，馈线上只有行波。\n在零仰角附近具有主辐射瓣的垂直接地天线，其振子的长度应为1/4波长的奇数倍。\n通常把垂直偶极天线或者垂直接地天线称为“全向天线”，是因为它们在水平方向没有指向性，但在立体空间有方向性。振子电气长度为1/4波长的垂直接地天线的最大辐射方向为在水平方向没有指向性，在垂直方向指向水平面。垂直接地天线（GP）的构造为电气长度为1/4波长的垂直振子加一个“接地”反射体，因其简单而被大量应用于手持和车载业余电台，但这种天线的实际工作情况往往与理论值相差较大，尤其在频率较低的频段。最常见的原因是缺乏有效的接地反射体。改善办法是GP天线必须有足够大的接地反射体来形成振子镜像，否则谐振频率和阻抗都将与理论值有显著偏差，应尽量用大面积金属体与天线的接地端直接连接。\n在电缆外面套铁氧体磁环（磁珠）可以减少在音频同轴电缆屏蔽层外皮中的感应射频电流。 左图作者是英语维基百科的Stwalkerster，本文件采用知识共享署名-相同方式共享 3.0 未本地化版本许可协议授权。 右图作者是Karl-Martin Skontorp，本文件采用知识共享署名 2.0 通用许可协议授权。 天线分析仪可以用来测定天线当前的谐振频率。\n直立天线发射的电磁波电场垂直于地面。\n就大多数手持电台随机附送的“橡皮天线”来说，它的劣势是相对于全尺寸天线，它的发射和接收效率较低。\nA.3.9.2 天线的增益 天线增益是指天线在最大辐射方向上的辐射功率密度与相同条件下基准天线的辐射功率密度之比。不同基准天线的选择，就有了不同的增益单位。题库里也有以下说法，天线的增益是相对于参考天线，在某一方向上信号强度的增加，这里主要强调的是天线的无源现象，由于能量守恒，有一个方向信号增强了，必然就有另一个方向信号减弱了。\n各种增益单位：\ndBi：“相对于无方向性点源天线的增益”，即最大辐射方向上的辐射功率密度与理想点源天线的辐射功率密度之比 dBd：“相对于半波长偶极子天线的增益”，即最大辐射方向上的辐射功率密度与半波长偶极振子的最大辐射功率密度之比。从这个描述中我们不难推测，dBd是一个比dBi更大的单位。 dB：这种表达没有说清楚计算增益所采用的比较基准，缺乏实际意义。它只能用于计算中表示相对大小，比如你可以说甲信号比乙信号强0.8dB。 由于dB已经是log后的值，所以他们的计算是简单的加减法。dBi与dBd的关系是（下面的公式要背得哟） $$0\\ dBd = 2.15\\ dBi$$例LK0932：比较4.5 dBd和5.85 dBi。解\n$4.5\\ dBd = 0\\ dBd + 4.5\\ dB = 2.15\\ dBi + 4.5\\ dB = 6.65\\ dBi$ $6.65\\ dBi - 5.85\\ dBi = 0.8\\ dB$ 所以4.5 dBd比5.85 dBi强0.8 dB 例LK0933：比较2.9dBd和5.85dBi。5.85dBi比2.9dBd强0.8dB，计算留给读者做练习。\nA.3.9.3 天线的极化 A.3.9.4 馈线基础知识 在为业余电台选购射频电缆作为天线馈线时，最重要的两项电气参数是：\n特性阻抗 工作频率下单位长度的传输功率损耗 射频同轴电缆在业余电台中的主要用处是将无线电信号从发射机传送到天线。\n在业余无线电通信中，“驻波比”通常用来衡量负载与传输线的匹配质量。天线与馈线完美匹配时，在驻波表中显示的驻波比是1:1。天线与馈线的连接头接触不良时，可能导致驻波比不稳定读数。\n馈线中的功率损耗会变成热量。\n使用同轴电缆连接天线时，最好有一个较低的驻波比，因为低驻波比使能量更有效率地传送，减少损耗。\n因为同轴电缆使用方便，与周围环境之间的相互影响小，所以在业余无线电界的使用相对于其他馈线来说更多。\n通过同轴电缆的信号频率越高，通常损耗越高。\n对于400MHz以上的信号，通常会使用的同轴电缆连接器N型连接器。\n导致同轴电缆损害的最常见的原因是什么电缆受潮。因为紫外线能破坏电缆的外皮，使水分渗入，所以要求同轴电缆的外皮能抵挡紫外线。和固体电介质同轴电缆相比，空气电介质同轴电缆的劣势是要采取特别的手段来防止水分进入电缆。但空气介质同轴硬电缆在VHF和UHF频段的损耗最小。\nA.3.9.5 天馈系统的平衡-不平衡转换 A.3.9.6 天馈系统的阻抗匹配 业余无线电普遍使用的同轴电缆的特性阻抗是50欧姆。\nA.3.10 无线电波及其传播 A.3.10.1 无线电波的基本性质和描述参数 无线电波在真空中的速度（即光速）299 792 458 米/秒，我们用字母，由于长度单位米时用光速，所以上面的值没有小数点。约为3x10^8米/秒。电波在天线导线中的传播速度大约是真空波速的0.95倍。常用业余频段的电波在同轴电缆中的传播速度大约是真空波速的0.65倍。\nA.3.10.2 无线电波的传播规律、简单计算和常见现象 无线电波按传播方式可主要分为地面波、天波、空间波、散射波等。注意虚线上面的实线和下面的实线都是空间波，一个是发射天线直接传给接受天线，一个是经地面反射。而地波（虚线）是沿着地球表面传播，也称地表波。 图片来自高频电子技术 第 1 章，版权归原作者所有。\n地波的衰减因子取决于电波频率、地面导电率和传播距离。\n决定超短波视距传播距离极限的主要因素发射天线和接收天线离地面的相对高度值。\n多径传播对UHF波段或VHF波段数据通信的影响是可能使误码率增大。\n无线电波在自由空间中的传播路径损耗与距离的平方成正比，与频率的平方成正比。\n在一个周期内，电磁波走过一定的距离，这个距离叫做波长。\n无线电波是一种电磁波，所以其两个组成部分是电场和磁场。一般我们把在空间中传播的电磁波叫做无线电波。\n$$c = fλ$$ 其中c是光速，f是频率，λ是波长。显然频率和波长成反比。如果我们选择兆赫数（MHz），波长选择单位米，则它们的数量关系近似是 $$波长 = \\frac{300}{频率}$$如果你收到了一个从上千公里以外的距离传播过来的VHF信号，最可能的原因是信号被突发E电离层反射过来。\nA.3.11 业余无线电工程实践常识 假负载的主要作用是在测试设备时不让无线电信号真正地发射出去。\n收发信机面板上或设置菜单中的符号VOX代表发信机声控，接入后将根据对话筒有无语音输入的判别自动控制收发转换\n收发信机中的PTT是指按键发射，有信号（一般为对地接通）时发射机由等待转为发射\n收发信机中的静噪控制的目的是在没有信号的情况下，关闭音频输出，使其不会输出噪音\n收发信机面板上或设置菜单中的符号SQL代表静噪控制，检测到接收信号低于一定电平时关断音频输出\n有些调频接收机的参数设置菜单有NFM和WFM两种选择。它们的含义是\nNFM为窄带调频方式，适用于信道带宽25kHz/12.5kHz的通信信号 WFM为宽带调频方式，适用于接收信道带宽180kHz左右的广播信号 在WFM方式的对讲机接收NFM信号，可以正常听到信号，但声音比较小 用设置在NFM方式的对讲机接收WFM信号，可以听到信号，但当调制信号幅度较大、音调较高时会发生明显非线性失真 一些VHF/UHF业余无线电调频手持对讲机或车载台的设置菜单中有“全频偏”和“半频偏”的选择，分别表示信道间隔为25kHz或者12.5kHz\n某些对讲机具有发送DTMF码的功能。缩写DTMF指的是双音多频编码，由8个音调频率中的两个频率组合成的控制信号，代表16种状态之一，用于遥控和传输数字等简单字符\n某些对讲机具有发送CTCSS码的功能。缩写CTCSS指的是亚音调静噪，即从67-250.3Hz的38个亚音调频率中选取一个作为选通信号，代表38种状态之一，接收机没有收到特定的选通信号时自动关闭音频输出\n不能在FM话音通信时单凭接收机听到对方语音的音量大小来准确判断对方信号的强弱，因为鉴频输出大小只取决于射频信号的频偏，而且正常信号的幅度会被限幅电路切齐到同样大小。\n调频接收机没有接收到信号时，会输出强烈的噪声。关于这种噪声由天线背景噪声和机内电路噪声的随机频率变化经鉴频形成，其大小与天线接收到的背景噪声幅度无关，这里的重点是与天线接收到的背景噪声幅度无关\n如果业余中继台发射机被断断续续的干扰信号所启动，夹杂着不清楚的语音，根据覆盖区内其他业余电台的监听，确定中继台上行频率并没有电台工作。则可能是中继台附近的两个其他发射机的强信号在中继台上行频率造成了互调干扰\n必须反对业余电台在进行业余卫星通信时使用超过常规要求的发射功率，因为过强的上行信号会使卫星转发器压低对其他信道的转发功率\n直射和经地面反射等多条路径到达的电波相位不同，互相叠加或抵消造成衰落（多径效应），因此即使在空旷平地，接收到的本地VHF/UHF信号强度也可能会随着接收位置的移动而发生变化。甚至在相距不远的两点接收同一个远方信号，多径干扰也会造成信号强度发生很大差别，且差别随两点间距离的增大呈周期性变化。\n如果对方报告你的调频电台发射的信号听起来失真严重、可辨度差，可能的原因是\n电台的电源电压不足 电台所处的位置不好 电台的发射频率不准确 我们经常使用万用表测量\n电压 电阻 万用电表的电压挡可大致判断一个干电池是否已经失效\n一个新的干电池的标称电压是1.5伏 用电压表检查一节干电池两端电压，未使用时测得1.5伏左右，用旧后测得1.2伏左右。但是，旧干电池的电动势仍然为1.5伏，只是由于内阻变大导致测量的电压变小。 万用电表的电阻挡可测量一个元件是否短路，显然短路时电阻为0\n在电阻挡试图测量电压有可能损坏万用表\n电压表应并联至电路中\n电流表应串联至电路中\n劣质开关电源的开关电路的谐波辐射会造成对无线电接收机的电磁干扰。\n移动车载电台通常使用的电源电压是约12伏特。\n熔断器可以在电路电流严重过载时保护电路不受损坏 整流器可以把交变电流变成变化的直流 变压器经常被用来把220伏的市电转换成更低电压交流电 LED能够当做指示灯使用 欧姆表被用来测量电阻 保险丝可在过载时切断电路 在需要安装5安培保险丝的地方安装一个20安培的保险丝是不可取的，因为过大的电流可能导致火灾 防止设备外壳带电危险的措施包括\n将所有的交流供电设备全部连接至一个安全地线\n安装漏电保护断路器\n所有使用交流供电的设备的电源线都使用带有单独保护地线端的三线插头\n可充电电池\n镍镉电池 铅酸电池 锂离子电池 不可充电电池（需要记住）\n碱性电池 将蓄电池连接与汽车的蓄电池并联，并且发动汽车可以在电网停电的状况下给一个12伏的铅酸蓄电池充电。\n铅酸蓄电池的充电和放电进行得过快，电池可能会过热，甚至释放出可燃气体，甚至可能爆炸；所以如果通风不良，会有有爆炸风险的气体聚集的潜在危险\n移动车载台的直流电源负极应当接在电池的负极或发动机的接地带。\n无线电测向可以用来定位无线电噪音源或者恶意干扰源。\nA.4. 与业余无线电台有关的安全防护技术； A.4.1 用电安全 安全电压是指不致使人直接致死或致残的电压。标准国家标准GB3805－83《安全电压》，一般环境条件下允许持续接触的“安全特低电压”为24V。\n上图来自Electric Hazards and the Human Body，版权归原作者所有。\n上图是交流电对人体危害与频率的关系。上面的绿线表示触电电流，下面的红线表示有感觉时的电流。可以看到，当频率在70Hz左右的时候，人体对其最敏感，也就是说最危险；而在高频（包括HF，VHF，UHF）时，危险反而更小。所以，在相同电压有效值时，我们把它们按危险程度由高到低排列是工频（50 Hz）\u0026gt; 直流 \u0026gt; HF射频 \u0026gt; VHF射频 \u0026gt; UHF射频。可以这样理解（网上是这么说的，我不保证是对的），工频（50 Hz）由于和心脏的频率比较接近，所以最危险；高频电流直接从人体表面流过，所以伤害较小（但绝不是没有伤害），但皮肤容易灼伤。\n如遇设备、电线或者电源引起失火，正确的处置为立即切断电源，使用二氧化碳灭火器灭火，这里强调二氧化碳灭火器。\n必须带电检修由市电供电的无线电设备时，应做到双脚与地绝缘，单手操作，另一只手不触摸机壳等任何与电路设备有关的金属物品，这里强调双手不能形成回路。\n设备电源拔掉电源线以后充满高电压的电容器依然可能造成电击。\n自制一台由220伏交流供电的设备，推荐在交流电源入口火线端串联安装保险丝。\nA.4.2 防雷知识 防雷装置的作用是防止雷电危害。传统防雷装置的主要组成部分是\n接闪器（避雷针） 单支避雷针的保护范围大致以避雷针为顶点的45度圆锥体以内空间 引下线 接地体 防雷接地的作用是把接闪器引入的雷击电流有效地泄入大地。 对防雷接地基本要求是要有单独的接地体，接地电阻要小，接闪器到接地体之间的引下线应尽量短而粗 在为同轴电缆馈线安装避雷器时应当注意将所有避雷器的地线接到同一个金属板上，然后将这个金属板接到室外的接地极。\nA.5. 电磁兼容技术以及射频干扰的预防和消除 A.5.1 电磁辐射防护规定 VHF和UHF信号属于非电离辐射。\n我国业余电台应该遵守的关于电磁辐射污染的具体管理规定文件为国家标准GB/T 51391《通信工程建设环境保护技术标准》。其规定等效辐射功率在0.1-3MHz不大于300W、在3MHz-300GHz不大于100瓦的无线通信设施（设备）向没有屏蔽空间发射电磁场可以免于管理。《我国国家标准《电磁环境控制限值》规定公众暴露控制限值中，对环境电磁辐射场强任意连续6分钟内的方均根值要求最严格的频率范围为30MHz- 3GHz。由于人体会对某些特定频率的电磁波吸收量更大，因此电磁辐射防护规定国家标准中的照射限值随着频率的变化而不同。\nA.5.2 射频干扰的预防和消除 假设中继台的收、发信机共用天线，上下行频率分别为F1和F2。要防止中继台发射机对接收机产生干扰，应在发信机与天线间串联中心频率为F1的带阻滤波器，在收信机与天线间串接中心频率为F2的带阻滤波器。这里强调对于中继台而言，上行频率是收信频率（F1），所以收信机要屏蔽发信机的频率（F2）就要串联一个F2的带阻滤波器。\n要防止业余HF发射机的杂散发射干扰天线附近的电话机，应该在电话机和电话线之间之间串联截止频率不高于1MHz的低通滤波器。这强调要滤除高频（HF）干扰，需要使用低通滤波器。\n对天线感兴趣的朋友推荐一本来自美国业余无线电协会的《天线手册》，最新的中文版应该是第二十二版。这是部大块头，适合当参考书，据说90%的人买了后就没看过，谨慎购买。\n对讲机的话UV-5R算一代神机，但注意这是部模拟机，好多地方现在都是数字中继，比如上海，买了可能会用不了。大家买对讲机之前最好问问当地的同伴，不用盲目购买。\nMMDVM可以方便大家通过网络交流，动手能力强的推荐自己动手做。\n","date":"2024-03-23T21:25:00+08:00","permalink":"https://blog.tama.guru/reproduced/ham-a.html","title":"业余无线电（HAM）A类操作证考试教程(转载记录用）"},{"content":"NAS换成2U服务器之后机箱空间剩了好多，本来想旧物利用，把从哥布林手里抢回来的失明女骑士P106接上去玩点AI作图，或者是把百来块整的DG1接上做转码卡。结果根本装不进去\u0026hellip;而且DG1的兼容性问题很奇怪，只有第一次装驱动的时候会出现，后面就再也没出现过了\u0026hellip; 考虑到现在硬盘的价格和后续有转码的需求，于是去某鱼上搞了一张蓝戟半高A380（或者叫DG2）。\n[scode type=\u0026ldquo;yellow\u0026rdquo;]请注意，在蓝戟官网并没有半高这个版本。[/scode] [scode type=\u0026ldquo;red\u0026rdquo;]无论是蓝戟官网驱动还是蓝厂官方驱动，安装完后均无法打开面板，貌似是通病。而且在安装后期程序会卡死，如果直接关掉会发现安装程序会还占着几十的CPU。[/scode] 20240331更新：使用最新版DDU卸载原驱动并安装Intel官方提供的最新驱动，目前已经能安装成功了。如果使用的是Windows自带的安全软件，DDU卸载过程中Antimalware Service Executable会持续占用CPU并造成卸载过程卡住，需要到安全中心把病毒和威胁防护设置下的实时保护等全部关闭，等待卸载完成后再手动开启。驱动安装过程也是如此，全部关闭了之后貌似没有再出现什么问题。 [scode type=\u0026ldquo;yellow\u0026rdquo;]面板在点击最大化按钮时会闪退，目前不清楚时系统问题还是ARK软件问题。[/scode]\n贴一下A380的常规版本参数：\n频率：核心/显存 GPU频率: 2250 MHz 显存频率: 15.5 Gbps Graphics 6GB 96-bit GDDR6 DirectX® 12 Ultimate PCI® Express4.0 支持 1 x 8針 电源接头 3 x DisplayPort™ 2.0 with DSC / 1 x HDMI™ 2.0b 条纹轴流扇 0dB静酷技术 超合金显卡技术 8K分辨率支持\n在GPU-Z下的信息： 值得注意的是它提示能在84下运行，但只工作在83。 因为这张卡基本上是转码用的，后续测试也基本上只在转码环境下。至于跑分，我觉得这种卡就没必要了，性能就在那，买卡的应该都是为了转码性能吧。\nNEAV1E 这玩意无论使用什么转码方式都不能调用显卡，全程CPU编码（而且CPU都跑不满），很奇怪。\nHandBrake 使用AV1（Intel QSV）编码，大概是10400的UHD630编码265的4-5倍\u0026hellip;，相同码率下导出的视频是原视频大小的1/2到1/3。但是还是很奇怪，CPU会跑到80-90的占用率，A380只跑了50-60的占用率\u0026hellip; 其他的后面再测试。\n","date":"2024-03-21T23:32:00+08:00","permalink":"https://blog.tama.guru/default/a380-evaluation.html","title":"简评A380（显卡 不是飞机）"},{"content":"Waline是什么 一款从 Valine 衍生的带后端评论系统。可以将 Waline 等价成 With backend Valine.\n简单来说，Waline可以引入到任意网站上，比如hugo等搭建的静态博客系统。\n为什么要用Waline 看到这个的第一眼我就心想：卧槽，我也要整一个！\n![文章反应功能][1] 于是现在已经加入到提问箱首页了：[狼的提问箱][2]。 怎么搭建呢？ 直接参考官网即可，文档较为完善。推荐使用vercel+LeanCloud，可以实现无服务器搭建，当然访问速度有一些慢。\n需要注意什么？ Waline主要分为三个部分进行配置：\nvercel环境变量 配置地址:https://vercel.com/%username%s-projects/%project_name%/settings/environment-variables 配置文档:https://waline.js.org/reference/server/env.html 描述：一些全局性的配置 具体可配置项目如下：\n环境变量名称 默认值 备注 LEAN_ID - LeanCloud 应用的 App ID LEAN_KEY - LeanCloud 应用的 App Key LEAN_MASTER_KEY - LeanCloud 应用的 Master Key 用于后台修改数据 LEAN_SERVER - LeanCloud 服务地址，国内版用户需要配置此项 SITE_NAME 博客名称 SITE_URL 博客地址 LOGIN 当设置为 LOGIN=force 时会要求登录才能评论 DISABLE_USERAGENT false 是否隐藏评论者的 UA，默认为否 DISABLE_REGION false 是否隐藏评论者的归属地 DISABLE_AUTHOR_NOTIFY false 是否禁止新评论通知 AVATAR_PROXY https://avatar.75cdn.workers.dev 头像的代理地址，设置 false 关闭代理 GRAVATAR_STR https://seccdn.libravatar.org/avatar/{{mail\\md5}} Gravatar 头像的地址，基于 nunjucks 语法 LEVELS 设置后会根据评论数为每个用户提供等级标签 IPQPS 60 基于 IP 的评论发布频率限制，单位为秒。设置为 0 不限制 SECURE_DOMAINS 安全域名配置，支持逗号分隔配置多个域名 AKISMET_KEY 70542d86693e Akismet 反垃圾评论服务 Key (默认开启，不用请设置为 false) COMMENT_AUDIT false 评论发布审核开关。开启后评论需要经过管理员审核后才能显示，所以建议在评论框默认文字上提供提示 RECAPTCHA_V3_KEY reCAPTCHA V3 key，须与客户端同时配置 RECAPTCHA_V3_SECRET reCAPTCHA V3 secret，服务端使用，不可泄漏 TURNSTILE_KEY Turnstile key，须与客户端同时配置 TURNSTILE_SECRET Turnstile secret，服务端使用，不可泄漏 MARKDOWN_CONFIG {} MarkdownIt 配置 MARKDOWN_HIGHLIGHT true 是否启用高亮 MARKDOWN_EMOJI true 是否启用 Emoji 缩写支持 MARKDOWN_SUB true 是否启用下角标支持 MARKDOWN_SUP true 是否启用上角标支持 MARKDOWN_TEX mathjax 解析 TeX 的服务，支持 mathjax、katex、false MARKDOWN_MATHJAX {} MathJax 选项 MARKDOWN_KATEX {} KaTeX 选项 SMTP_SERVICE SMTP 邮件发送服务提供商 SMTP_HOST SMTP 服务器地址 SMTP_PORT SMTP 服务器端口。 SMTP_USER SMTP 用户名 SMTP_PASS SMTP 密码 SMTP_SECURE 是否使用 SSL 连接 SMTP SENDER_NAME 自定义发送邮件的发件人 SENDER_EMAIL 自定义发送邮件的发件地址 MONGO_DB MongoDB 数据库名称 MONGO_USER MongoDB 服务的用户名 MONGO_PASSWORD MongoDB 服务的密码 MONGO_HOST 127.0.0.1 MongoDB 服务的地址，支持数组格式 MONGO_PORT 27017 MongoDB 服务的端口，支持数组格式 MONGO_REPLICASET MongoDB 集群 MONGO_AUTHSOURCE MongoDB 认证源 MONGO_OPT_SSL FALSE 是否使用 SSL 进行连接 MYSQL_DB MySQL 数据库库名 MYSQL_USER MySQL 数据库的用户名 MYSQL_PASSWORD MySQL 数据库的密码 MYSQL_HOST 127.0.0.1 MySQL 服务的地址 MYSQL_PORT 3306 MySQL 服务的端口 MYSQL_PREFIX wl_ MySQL 数据表的表前缀 MYSQL_CHARSET utf8mb4 MySQL 数据表的字符集 MYSQL_SSL FALSE 是否使用 SSL MYSQL 连接数据库 TIDB_DB TiDB 数据库库名 TIDB_USER TiDB 数据库的用户名 TIDB_PASSWORD TiDB 数据库的密码 TIDB_HOST 127.0.0.1 TiDB 服务的地址 TIDB_PORT 4000 TiDB 服务的端口 TIDB_PREFIX wl_ TiDB 数据表的表前缀 TIDB_CHARSET utf8mb4 TiDB 数据表的字符集 SQLITE_PATH SQLite 数据库文件的路径，该路径不包含文件名本身 JWT_TOKEN 用户登录密钥，随机字符串即可 SQLITE_DB waline SQLite 数据库文件名，若文件名变化需要修改该字段值 SQLITE_PREFIX wl_ SQLite 数据表的表前缀 PG_DB PostgreSQL 数据库库名 PG_USER PostgreSQL 数据库的用户名 PG_PASSWORD PostgreSQL 数据库的密码 PG_HOST 127.0.0.1 PostgreSQL 服务的地址 PG_PORT 3211 PostgreSQL 服务的端口 PG_PREFIX wl_ PostgreSQL 数据表的表前缀 PG_SSL FALSE 是否使用 SSL 连接 PostgreSQL 数据库 POSTGRES_DATABASE 同 PG_DB POSTGRES_USER 同 PG_USER POSTGRES_PASSWORD 同 PG_PASSWORD POSTGRES_HOST 127.0.0.1 同 PG_HOST POSTGRES_PORT 3211 同 PG_PORT POSTGRES_PREFIX wl_ 同 PG_PREFIX POSTGRES_SSL FALSE 同 POSTGRES_SSL TCB_ENV 腾讯云开发环境 ID TCB_ID 腾讯云 API 密钥 ID TCB_KEY 腾讯云 API 密钥 Key JWT_TOKEN 用户登录密钥，如果没有配任何环境变量的话需要配置此变量，随机字符串即可 GITHUB_TOKEN Personal access tokensopen in new window GITHUB_REPO 仓库名称，例如 walinejs/waline GITHUB_PATH 数据存储目录，例如 data 表示存储在 data 目录下，默认存在仓库根目录下 DETA_PROJECT_KEY Deta 项目密钥 OAUTH_URL https://oauth.lithub.cc OAuth 第三方登录服务地址，可以 自建 authopen in new window 这是能让用户使用 GitHub, Twitter, Facebook, Google, 微博等第三方账户登录最简单的方式。 WEBHOOK 评论成功后会向 WEBHOOK 配置的地址发送一条 POST 请求 WALINE_ADMIN_MODULE_ASSET_URL //unpkg.com/@waline/admin Waline admin 地址 IP2REGION_DB 自定义 IP 查询库路径 index.js（服务端）配置 配置地址:https://github.com/%username%/%repositorie%/blob/main/index.js 配置文档:https://waline.js.org/reference/server/config.html 描述：该文件位于github私有仓库内，其中一些项目与vercel环境变量效果一致。在这里修改过的文件会自动在vercel内重新build。 可配置的项目：\n名称 参考 说明 plugins plugins: [HelloWorldPlugin], 插件系统 secureDomains secureDomains: \u0026lsquo;waline.js.org\u0026rsquo;, 安全域名 forbiddenWords forbiddenWords: [\u0026lsquo;违禁词A\u0026rsquo;, \u0026lsquo;违禁词B\u0026rsquo;], 违禁词 disallowIPList disallowIPList: [\u0026lsquo;8.8.8.8\u0026rsquo;, \u0026lsquo;4.4.4.4\u0026rsquo;], IP 黑名单 mailSubject 评论回复邮件标题自定义，等同于环境变量 MAIL_SUBJECT mailTemplate 评论回复邮件内容自定义，等同于环境变量 MAIL_TEMPLATE mailSubjectAdmin 新评论通知邮件标题自定义，等同于环境变量 MAIL_SUBJECT_ADMIN mailTemplateAdmin 新评论通知邮件内容自定义，等同于环境变量 MAIL_TEMPLATE_ADMIN QQTemplate QQ 评论通知模板，等同于环境变量 QQ_TEMPLATE TGTemplate Telegram 评论通知模板，等同于环境变量 TG_TEMPLATE SCTemplate Server酱 评论通知模板，等同于环境变量 SC_TEMPLATE model 自定义数据库服务（见https://waline.js.org/cookbook/customize/database.html） encryptPassword 自定义用户系统（见https://waline.js.org/cookbook/customize/userdb.html） 评论 Hooks 包含一些自定义HOOK，详情见文档。 修改过的index.js文件参考如下： const Application = require(\u0026#39;@waline/vercel\u0026#39;); module.exports = Application({ plugins: [], //secureDomains: \u0026#39;*.tama.guru\u0026#39;, COMMENT_AUDIT: true, forbiddenWords: [\u0026#39;***\u0026#39;, \u0026#39;***\u0026#39;], }); 前端(html内)配置 配置地址:https://%yoursite%/%sitename%.html 配置文档:https://waline.netlify.app/client/basic.html 描述：每个html都可以独立配置以达到不同的显示效果 注意：以下配置针对v2版本生效，v3未知 可配置的项目：\n名称 类型 说明 el string Waline 的初始化挂载器。必须是一个有效的 CSS 选择器。 serverURL string Waline 的服务端地址。 wordLimit number \\ [number, number] 评论字数限制。填入单个数字时为最大字数限制。设置为 0 时无限制。 path string 当前 文章页 路径，用于区分不同的 文章页，以保证正确读取该 文章页 下的评论列表。默认为window.location.pathname，可选为window.location.href或其他。 avatar string Gravatar 头像展示方式。见文档。 meta string[] 评论者相关属性。可选值: \u0026rsquo;nick\u0026rsquo;, \u0026lsquo;mail\u0026rsquo;, \u0026rsquo;link\u0026rsquo; pageSize number 评论列表分页，每页条数。 lang string 多语言支持。可自定义，见文档。 visitor boolean 开启文章访问量统计。 dark string 暗黑模式适配。详情见文档。 highlight boolean 代码高亮，默认开启。 avatarCDN string 设置 Gravatar 头像 CDN 地址。默认值是https://sdn.geekzu.org/avatar/ avatarForce boolean 每次访问是否强制拉取最新的评论列表头像 emoji (string \\ EmojiInfo)[] 表情设置，详见文档。 requiredMeta string[] 设置必填项，默认匿名，可填[\u0026rsquo;nick\u0026rsquo;, \u0026lsquo;mail\u0026rsquo;]等 uploadImage Function 自定义图片上传方法，方便更好的存储图片。方法执行时会将图片对象传入。 login string 登录模式状态，分为\u0026rsquo;enable\u0026rsquo;: 启用登录 (默认) \u0026lsquo;disable\u0026rsquo;: 禁用登录，用户只能填写信息评论 \u0026lsquo;force\u0026rsquo;: 强制登录，用户必须注册并登录才可发布评论 copyright boolean 是否显示页脚版权信息。 修改过的html文件参考如下： \u0026lt;script src=\u0026#34;/waline.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;link href=\u0026#39;/waline.css\u0026#39; rel=\u0026#39;stylesheet\u0026#39; /\u0026gt; \u0026lt;div id=\u0026#34;waline\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script\u0026gt; const waline = Waline.init({ el: \u0026#39;#waline\u0026#39;, serverURL: \u0026#39;https://%yourwalineserversite%\u0026#39;, reaction: ture, meta: [\u0026#39;nick\u0026#39;,\u0026#39;mail\u0026#39;], requiredMeta: [\u0026#39;mail\u0026#39;], pageview: true, search: false, comment: false, login: \u0026#39;disable\u0026#39;, wordLimit: 50, pageSize: 5, avatar: \u0026#39;monsterid\u0026#39;, emoji: [ \u0026#39;https://unpkg.com/@waline/emojis@1.2.0/tieba\u0026#39;, ], //禁止图片上传按钮 imageUploader: false, //不显示版权标志 copyright: false, }); \u0026lt;/script\u0026gt; 再次提醒，我引用最新的v3版本会报错，建议用v2。\n","date":"2024-03-10T01:24:00+08:00","permalink":"https://blog.tama.guru/record/waline-on-html.html","title":"在静态网站上使用waline评论系统"},{"content":"有时候在github上搜索，总会搜出一些不是很友好的东西（至于是什么自己随便搜一下就知道了），这些人通常会在readme里面添加一些常用的关键词，然后经常性的更新，让项目看起来“很热门”。但其实那是什么东西懂的都懂。 你们不玩zz会死我不管，别污染别人眼睛。\n可以使用以下这个项目PurifyGithubSearchPage，安装油猴之后直接新建一个脚本，把https://raw.githubusercontent.com/wilson7yz/PurifyGithubSearchPage/main/fuckDinner.js的内容复制进去保存再刷新就好了。 或者到油猴上Github搜索净化直接点击安装，效果一样。 如果要新增屏蔽的用户名，直接把在源码的这个地方新增就行了。\nconst dinnerNames = [\u0026#34;xxx\u0026#34;]; 效果图： 使用前： 使用后： ","date":"2024-02-17T21:46:00+08:00","permalink":"https://blog.tama.guru/software/PurifyGithubSearchPage.html","title":"[插件推荐]github项目屏蔽插件"},{"content":"为什么不用vnc？一是需要另外装个软件，不方便，而且配置麻烦，总是能碰到七七八八的问题，而用xrdp基本上用巨硬自带的软件就能实现远程连接。\n安装并配置xrdp 注：我是kde桌面环境\nsudo pacman -S xorg-xinit sudo pacman -S base-devel yay -S xrdp 以上是基础软件包，下面根据平台选择安装：\nyay -S xortxrdp-glamor #适用于I家和A家核显解码 yay -S xorgxrdp #使用CPU编码 yay -S xordxrdp-nvidia #使用英伟达独显解码 修改/etc/X11/Xwrapper.config（无此文件自行新建），添加如下内容：\nallowed_users=anybody needs_root_rights=no 复制一个.xinitrc到用户主目录并编辑其中内容:\ncp /etc/X11/xinit/xinitrc /home/$USERNAME/.xinitrc 注释掉最后的几行\n#twm \u0026amp; #xclock -geometry 50x50-1+1 \u0026amp; #xterm -geometry 80x50+494+51 \u0026amp; #xterm -geometry 80x20+494-0 \u0026amp; #exec xterm -geometry 80x66+0+0 -name login export DESKTOP_SESSION=plasma /usr/lib/plasma-dbus-run-session-if-needed startplasma-x11 最后两行根据桌面环境替换： i3w / dwm:\nexec i3w gnome\nunset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec dbus-launch gnome-shell --x11 xfce4\nunset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec dbus-launch startxfce4 启动xrdp服务：\nsudo systemctl enable xrdp sudo systemctl start xrdp 一些小问题： 安装以后，黑屏、闪退 可以尝试修改/etc/xrdp/xrdp.ini，把allow_channels=true改成allow_channels=false 使用ps -elf|grep vnc查询是否有多个进程同时运行，如果有，直接kill -9 $pid（为避免出现这种问题建议每次都注销而不是直接叉掉rdp窗口） 权限（输入密码）弹窗不出来 新增/etc/polkit-1/rules.d/49-nopasswd_global.rules文件，并添加以下内容：\n/* Allow members of the wheel group to execute any actions * without password authentication, similar to \u0026#34;sudo NOPASSWD:\u0026#34; */ polkit.addRule(function(action, subject) { if (( action.id == \u0026#34;org.freedesktop.policykit.exec\u0026#34; || action.id == \u0026#34;org.fedoraproject.FirewallD1.all\u0026#34; || action.id == \u0026#34;org.fedoraproject.FirewallD1.config\u0026#34; || action.id == \u0026#34;org.freedesktop.NetworkManager.settings.modify.system\u0026#34;) \u0026amp;\u0026amp; subject.isInGroup(\u0026#34;wheel\u0026#34;)) { return polkit.Result.YES; } }); 修改后会默认允许所有授权，可能存在一定风险。\n修改3389端口 修改配置文件/etc/xrdp/xrdp.ini中port=3389字段即可，如果有开防火墙记得开放端口。\n","date":"2024-02-05T23:58:41+08:00","permalink":"https://blog.tama.guru/record/archlinux_xrdp.html","title":"在archlinux正确的使用xrdp以及碰到的问题"},{"content":"在基本上尝试了各类Windows系统我得出一个结论，那就是没有完美的Windows系统，除了Win7、Win10 LTSC、Win Server 2022这几个屁事比较少之外，其他总能碰到奇奇怪怪的事情，在此做个文章记录发生过的问题以及记录一些尝试解决处理过程中碰到的事情，免得后面又忘了又翻一遍材料。\n系统更新类 0x80070643 - 0x8024200B 在什么系统出现：Windows 10 企业版 LTSC（21H2，19044.3930） 什么时候出现：系统更新 提示什么：安装失败: Windows 安装下列更新失败，错误为 0x8024200B: 2024-01 适用于 Windows 10 Version 21H2 安全更新，适合基于 x64 的系统 (KB5034441)。 是否解决：未知 怎么解决：\n尝试1：手工打补丁：到https://catalog.update.microsoft.com/查找补丁号KB5034441，结果为We did not find any results for \u0026quot;KB5034441\u0026quot;，不成功。 尝试2：查找官网信息：到MS官网查找关于KB5034441的信息，找到前面的这条记录提到如下内容： IMPORTANT\nThis update requires 250 MB of free space in the recovery partition to install successfully. If the recovery partition does not have sufficient free space, this update will fail. In this case, you will receive the following error message:\n0x80070643 - ERROR_INSTALL_FAILURE\nTo avoid this error or recover from this failure, please follow the Instructions to manually resize your partition to install the WinRE update and then try installing this update.\n看起来需要先保证必须在恢复分区中具有 250 MB 的可用空间才能成功应用此更新。\n用DG看了下我的分区结构，发现根本没有Winre这个分区，笑死。 但上面也有提到：\n如果 PC 没有恢复分区，则不需要此更新。在这种情况下，可以安全地忽略该错误。\n那就只能当这个问题不存在了。\n内部错误状态类 10013 在什么系统出现：Windows Server 2022 什么时候出现：正常使用时出现 提示什么：创建 TLS 客户端 凭据时发生严重错误。内部错误状态为 10013。 是否解决：否 怎么解决：打开运行，输入inetcpl.cpl后进入Internet选项，点击高级选项卡，找到使用SSL 3.0，取消勾选保存并重启，之后错误数量明显减少。 出现原因：系统已经不支持SSL3.0及之前版本的安全协议，系统默认是没有勾选这一项的，但是可能是安装了某些软件把该选项打开了导致报错。\n","date":"2024-01-31T09:51:00+08:00","permalink":"https://blog.tama.guru/record/windows-error-fix.html","title":"记录windows各类错误及尝试进行解决的流程"},{"content":"前言 由于某讯对第三方QQ机器人的大力追杀，原有的机器人框架（miraiqq和go-cqhttp）等基本上都无法使用了，登录会直接代码45封号。在此之后发展出shamrock等项目，此类项目的特点是需要虚拟机或实机进行操作，意味着至少需要一个桌面环境或者一台闲置手机，开销相比之前1c512m都能跑的时候高太多。在网上冲浪的时候发现了可以将安卓的Dalvik/ART移植到Linux桌面环境，借此运行安卓APK程序，因此需要用到redroid这个软件。\nredroid即Remote anDroid，是一个架设云手机的方案，可以透过docker在linux系统上跑安卓系统容器。相比于虚拟机方案，其优势在于：\n开源\n支持GPU加速+arm转X86转译器\n与宿主机公用内核等相关资源\n支持使用scrcpy进行连接\n给内核添加相关模块 首先需要查询系统内核是否支持binder和ashmem两个功能，此功能为使用redroid必须的。查询可以通过执行：\nlsmod | grep -e ashmem_linux -e binder_linux 进行查询，如果有输出可以略过此步骤。如果没有任何输出则表示内核没有配置好这两个模块，需要重新编译内核。对于Ubuntu系统，官方提供了比较简单的流程，对于其他系统则需要手工维护。\n首先去下载当前使用内核版本的源码：\napt install linux-source-$(uname-r) 下载完的源码位于/usr/src，格式是.xz，进去之后解压源码包并进入解压的文件夹，然后执行\nmake menuconfig 在弹出界面的勾选：\nDevice Drivers--Android--Android Drivers--Binder Ipc Driver。 #binder Device Drivers--Android--Android Drivers--Binder filesystem。 #binder Device Drivers--Android--Staging Drivers--Android--Enable the Anonumous Shared Memory Subsystem #ashmem General Setup--CPU/Task time and stats accounting--Pressure stall infomation tracking 后按save保存。\n或者进去之后直接选择exit并选择save config。目录下会生成一个.config的文件，编辑该文件在最后添加以下内容:\nCONFIG_ASHMEM=y CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_BINDERFS=y CONFIG_ANDROID_BINDER_DEVICES=\u0026#34;binder,hwbinder,vndbinder,binderfs\u0026#34; CONFIG_ANDROID_BINDER_IPC_SELFTEST=y 保存后执行make ，建议不要加j让他慢慢编译，经尝试这样会导致报错。\n注意：可能会报错：CONFIG_DEBUG_INFO_BTF\n这种情况就去.config文件里面添加以下内容：\nCONFIG_DEBUG_INFO_DWARF5=n CONFIG_DEBUG_INFO_BTF=n #原值为y 跑完后在目录下执行modules_install和make install，执行完成后检查内核是否安装到grub了：\n(base) root@DevBot:/boot# cat /boot/grub/grub.cfg | grep menuentry if [ x\u0026#34;${feature_menuentry_id}\u0026#34; = xy ]; then menuentry_id_option=\u0026#34;--id\u0026#34; menuentry_id_option=\u0026#34;\u0026#34; export menuentry_id_option menuentry \u0026#39;Debian GNU/Linux\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-simple-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { submenu \u0026#39;Advanced options for Debian GNU/Linux\u0026#39; $menuentry_id_option \u0026#39;gnulinux-advanced-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.5.10android\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.5.10android-advanced-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.5.10android (recovery mode)\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.5.10android-recovery-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.5.0-0.deb12.4-amd64\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.5.0-0.deb12.4-amd64-advanced-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.5.0-0.deb12.4-amd64 (recovery mode)\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.5.0-0.deb12.4-amd64-recovery-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.1.0-17-amd64\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.1.0-17-amd64-advanced-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.1.0-17-amd64 (recovery mode)\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.1.0-17-amd64-recovery-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.1.0-15-amd64\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.1.0-15-amd64-advanced-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;Debian GNU/Linux, with Linux 6.1.0-15-amd64 (recovery mode)\u0026#39; --class debian --class gnu-linux --class gnu --class os $menuentry_id_option \u0026#39;gnulinux-6.1.0-15-amd64-recovery-9aba24c5-ec53-4108-b461-4bcc67d1d0dc\u0026#39; { menuentry \u0026#39;UEFI Firmware Settings\u0026#39; $menuentry_id_option \u0026#39;uefi-firmware\u0026#39; { 可以看到Debian GNU/Linux, with Linux 6.5.10android已经配置进去了。\n然后我们需要修改内核启动顺序：\n#nano /etc/default/grub GRUB_DEFAULT=\u0026#34;1 \u0026gt;0\u0026#34; GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`lsb_release -i -s 2\u0026gt; /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet splash\u0026#34; GRUB_CMDLINE_LINUX=\u0026#34;\u0026#34; GRUB_DISABLE_OS_PROBER=false GRUB_DEFAULT为按menuentry顺序排序设置默认启动项，第一项为0，我这里对应的是Debian GNU/Linux，Debian GNU/Linux, with Linux 6.5.10android是子菜单Advanced options for Debian GNU/Linux下的第一项，所以这里应该设置为1 \u0026gt;0.注意\u0026quot;1\u0026quot;和\u0026quot;\u0026gt;\u0026ldquo;之间有一个空格。\n然后更新保存grub：\nupdate-grub 查看是否配置正确：\ncat /proc/cmdline 重启。然后直接一个uname -a\n(base) tamakyi@DevBot:~$ uname -a Linux AkarinDevBot 6.5.10android #2 SMP PREEMPT_DYNAMIC Wed Jan 24 00:43:00 HKT 2024 x86_64 GNU/Linux 如果还是不行（提示缺少ashmem）的话，去克隆这个仓库并执行安装加载：\ngit clone https://github.com/choff/anbox-modules cd anbox-modules sh ./INSTALL.sh 再检查是否启用完成：\n(base) tamakyi@DevBot:~$ grep binder /proc/filesystems nodev binder (base) tamakyi@DevBot:~$ grep ashmem /proc/misc 124 ashmem 有输出就表示正常启用模块了。如果如果还是用不了，那可能是你需要手动挂载binderfs：\nmkdir /dev/binderfs mount -t binder none /dev/binderfs/ 然后重启再验证，至此redroid的内核依赖模块安装完成。\n安装redroid 安装过docker的直接运行:\n(base) root@DevBot:~# docker run -itd --rm --privileged \\ --pull always \\ -v ~/data:/data \\ -p 35555:5555 \\ redroid/redroid:13.0.0-latest 其中官方支持的版本如下：（截止20240124）\nAndroid 14 (redroid/redroid:14.0.0-latest) Android 14 64bit only (redroid/redroid:14.0.0_64only-latest) Android 13 (redroid/redroid:13.0.0-latest) Android 13 64bit only (redroid/redroid:13.0.0_64only-latest) Android 12 (redroid/redroid:12.0.0-latest) Android 12 64bit only (redroid/redroid:12.0.0_64only-latest) Android 11 (redroid/redroid:11.0.0-latest) Android 10 (redroid/redroid:10.0.0-latest) Android 9 (redroid/redroid:9.0.0-latest) Android 8.1 (redroid/redroid:8.1.0-latest) 版本并不是越高越好，越高占用内存越多，且限制更多，此处我选择安卓10，跑个shamrock足矣。 经测试在安卓10内部打开设置会导致宿主机死机，并且重启后docker容器会消失，慎用\n检查是否正常使用：\n# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d51457fc4561 redroid/redroid:10.0.0-latest \u0026#34;/init androidboot.h…\u0026#34; 3 minutes ago Up 3 minutes 0.0.0.0:35555-\u0026gt;5555/tcp, :::35555-\u0026gt;5555/tcp sweet_vaughan 下载adb套件：\nwget https://dl.google.com/android/repository/platform-tools_r34.0.5-linux.zip #不一定是这个版本，具体以官网为准 unzip platform-tools_r34.0.5-linux.zip cp platform-tools_r34.0.5-linux/adb /usr/bin chmod +x /usr/bin/adb 连接进redroid：\n(base) root@DevBot:~/platform-tools# adb connect localhost:35555 #前面把docker的5555端口映射到宿主的35555端口 connected to localhost:35555 (base) root@DevBot:~/platform-tools# adb devices List of devices attached localhost:35555 device (base) root@DevBot:~/platform-tools# adb -s localhost:35555 shell #实际上我这里有多个设备连接 所以需要指定设备 redroid_x86_64:/ $ redroid_x86_64:/ $ free -h total used free shared buffers Mem: 14G 5.3G 8.2G 12M 82M -/+ buffers/cache: 5.2G 8.2G Swap: 976M 0 976M redroid_x86_64:/ $ df -h Filesystem Size Used Avail Use% Mounted on overlay 218G 65G 141G 32% / tmpfs 64M 592K 63M 1% /dev shm 64M 0 64M 0% /dev/shm /dev/sdb2 218G 65G 141G 32% /data tmpfs 6.7G 0 6.7G 0% /mnt tmpfs 6.7G 0 6.7G 0% /apex /dev/fuse 218G 65G 141G 32% /storage/emulated redroid_x86_64:/ $ uname -a Linux localhost 6.5.10android #2 SMP PREEMPT_DYNAMIC Wed Jan 24 00:43:00 HKT 2024 x86_64 redroid_x86_64:/ $ 查询下build.prop：\n1|redroid_x86_64:/ $ su 1|redroid_x86_64:/ # cat /system/build.prop # begin common build properties # autogenerated by build/make/tools/buildinfo_common.sh ro.system.build.date=Mon Oct 16 08:28:31 UTC 2023 ro.system.build.date.utc=1697444911 ro.system.build.fingerprint=redroid/redroid_x86_64/redroid_x86_64:10/QP1A.190711.019/frank10160828:userdebug/test-keys ro.system.build.id=QP1A.190711.019 ro.system.build.tags=test-keys ro.system.build.type=userdebug ro.system.build.version.incremental=eng.frank.20231016.082901 ro.system.build.version.release=10 ro.system.build.version.sdk=29 ro.product.system.brand=redroid ro.product.system.device=redroid_x86_64 ro.product.system.manufacturer=redroid ro.product.system.model=redroid10_x86_64 ro.product.system.name=redroid_x86_64 # end common build properties # begin build properties # autogenerated by buildinfo.sh ro.build.id=QP1A.190711.019 ro.build.display.id=redroid_x86_64-userdebug 10 QP1A.190711.019 eng.frank.20231016.082901 test-keys ro.build.version.incremental=eng.frank.20231016.082901 ro.build.version.sdk=29 ro.build.version.preview_sdk=0 ro.build.version.preview_sdk_fingerprint=REL ro.build.version.codename=REL ro.build.version.all_codenames=REL ro.build.version.release=10 ro.build.version.security_patch=2019-09-05 ro.build.version.base_os= ro.build.version.min_supported_target_sdk=23 ro.build.date=Mon Oct 16 08:28:31 UTC 2023 ro.build.date.utc=1697444911 ro.build.type=userdebug ro.build.user=frank ro.build.host=redroid-builder ro.build.tags=test-keys ro.build.flavor=redroid_x86_64-userdebug ro.build.ab_update=true # ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete, # use ro.product.cpu.abilist instead. ro.product.cpu.abi=x86_64 ro.product.cpu.abilist=x86_64,x86 ro.product.cpu.abilist32=x86 ro.product.cpu.abilist64=x86_64 ro.product.locale=en-US ro.wifi.channels= # ro.build.product is obsolete; use ro.product.device ro.build.product=redroid_x86_64 # Do not try to parse description or thumbprint ro.build.description=redroid_x86_64-userdebug 10 QP1A.190711.019 eng.frank.20231016.082901 test-keys # end build properties # # from build/make/target/board/gsi_system.prop # # GSI always generate dex pre-opt in system image ro.cp_system_other_odex=0 # GSI always disables adb authentication ro.adb.secure=0 # GSI disables non-AOSP nnapi extensions on product partition ro.nnapi.extensions.deny_on_product=true # TODO(b/120679683): disable RescueParty before all problem apps solved persist.sys.disable_rescue=true # TODO(b/78105955): disable privapp_permissions checking before the bug solved ro.control_privapp_permissions=disable # TODO(b/136212765): the default for LMK ro.lmk.kill_heaviest_task=true ro.lmk.kill_timeout_ms=100 ro.lmk.use_minfree_levels=true # end of build/make/target/board/gsi_system.prop # # ADDITIONAL_BUILD_PROPERTIES # ro.bionic.ld.warning=1 ro.treble.enabled=true persist.debug.dalvik.vm.core_platform_api_policy=just-warn dalvik.vm.lockprof.threshold=500 net.bt.name=Android 说明已经正常安装redroid并使用了。\n配置安装shamrock 首先要把相关的东西准备好（此步骤我在windows远程操作了）： 下载: https://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win64-v2.3.1.zip https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_9.0.15_64.apk https://github.com/LSPosed/LSPatch/releases/download/v0.6/manager-v0.6-398-release.apk https://github.com/RikkaApps/Shizuku/releases/download/v13.5.3/shizuku-v13.5.3.r1036.fff3f87-release.apk 以及Shamrock安装包，因为使用的是Action版本，需要登陆Github下载，此处不放链接 ，解压scrcpy-win64-v2.3.1.zip并把QQ、LSPatch、shizuku、Shamrock放在同一目录，打开powershell，执行：\n./adb.exe connect 100.64.0.16:35555 #100.64.0.16为我的debian宿主机远程访问IP。 ./adb.exe devices List of devices attached 100.64.0.16:35555 device ./adb push Android_9.0.15_64.apk /sdcard/ ./adb install LSPatch.apk ./adb install shizuku-v13.5.3.r1040.1fc3a2d-release.apk ./adb install Shamrock-v1.0.7.r260.64b7b00-all.apk 然后使用scrcpy：\nscrcpy 会进到安卓界面，先打开shizuku，会提示要启用，我们回退到adb窗口，执行：\n./adb shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh 然后shizuku提示shizuku is running。然后把Authorized 0 applications点开，勾选LSPatch，再打开LSPatch，到Manager\u0026ndash;Apps点击加号，选择New Patch-Select apk(s) from storage 找到QQ安装包，点击start patch 等待打补丁完成，然后点击Install。 安装完成后点击LSPatch里的QQ，找到module scope，把Shamrock打勾，即允许Shamrock对QQ生效。 然后启动QQ，QQ就闪退了\u0026hellip; 因为LSPatch目前已停止更新，后续是否会支持新版QQ尚未能明确，此文暂停更新。\n参考文章 QQ-bot 框架部署记录\n一次云服务器内核升级之旅 - 知乎 (zhihu.com)\n","date":"2024-01-24T12:01:00+08:00","permalink":"https://blog.tama.guru/record/redroid.html","title":"在debian安装配置redroid并安装shamrock的记录"},{"content":"本来我是要把导航页所有的文件搬到Github上并试图通过jsdelivr加速访问，但是我发现国内移动网络根本无法直连jsdelivr\u0026hellip;在多次反馈网页无法打开之后，最后还是退一步选择迁移到R2上了。但是R2的网页端管理真的是做得一团糟，上传经常半路失败不说，一次还只能上传100个文件，更恶心的是文件夹无法删除，对于我来说是体验真的不好了。\n既然兼容AWS S3，那就用S3的方法去管理他。 需要用到S3Browser这个软件，只有英文，但是不妨碍使用。 安装完成之后选择Add new account。 Display Name任意填写即可，Account type选择S3 Compatible Storage，即兼容S3存储。REST Endpotin对应的是S3 API的值，但是不能整个填写进去。比如网页端显示的S3 API为：\nhttps://xxxxxxxxxxxxxxxxxxx.r2.cloudflarestorage.com/tamabox 那这里要填写的是\nxxxxxxxxxxxxxxxxxxx.r2.cloudflarestorage.com AK和SK是创建桶的时候提供的，如果忘记了就没救了，重新弄个桶吧。 Encrypt Access Keys with a password和Use secure transfer(SSL/TSL)选项保留默认即可。 配置完之后要点开左下角的advanced settings。 Signature version选择Signature V4. Addressing model选择Virtual hosted style. 其他选项保留初始值不用动，点close再save changes即可。 ![add account info 2][3] 这时候应该是能连接进R2内部了，就当作一个文件管理器操作就行了。 ![setting complete][4] \u0026lt;br/\u0026gt; 如果只用来做图床的话可以用Pic-Go`这个软件，操作方法也类似。\n","date":"2024-01-13T22:53:02+08:00","permalink":"https://blog.tama.guru/record/s3browser_r2_manager.html","title":"使用S3 Browser管理Cloudflare R2存储桶"},{"content":"什么是R2，为什么用R2 R2是由Cloudflare推出的对象存储，接口兼容AWS S3且有免费套餐，套餐内容如下：\n类别 永远免费 按月收费 存储 10GB/月 0.015 美元/GB 存储 A类操作:状态改变 100 万次/月 4.50 美元/百万次 B类操作:读取状态 1000 万次/月 0.36 美元/百万次 根据文档，各类操作包括：\nA类操作 操作名称 操作含义 ListBuckets 列出的存储桶及其所有者 PutBucket 创建存储桶 ListObjects 返回存储桶中的对象 PutObject 创建对象 CopyObject 复制对象 CompleteMultipartUpload 完成分片上传 CreateMultipartUpload 创建分片上传任务 ListMultipartUploads 列出分片上传（进度） UploadPart 分片上传 UploadPartCopy 从一个已存在的Object中拷贝数据来上传一个分片 ListParts 列出分片 PutBucketEncryption 存储桶加密 PutBucketCors 为指定的存储桶设置跨域资源共享CORS规则 PutBucketLifecycleConfiguration 设置对象生命周期规则 B类操作 | 操作名称 | 操作含义 | |:-------------------------------:|:--------------------------------------------:| | HeadBucket | 确定是否存在存储桶以及是否有访问权限 | | HeadObject | 确定是否存在对象以及是否有访问权限 | | GetObject | 获取（下载）对象 | | UsageSummary | 使用情况摘要 | | GetBucketEncryption | 获取（下载）加密存储桶 | | GetBucketLocation | 获取（下载）加存储桶位置 | | GetBucketCors | 获取存储桶设置跨域资源共享CORS规则 | | GetBucketLifecycleConfiguration | 获取对象生命周期规则 | 免费操作 | 操作名称 | 操作含义 | |:-------------------------------:|:--------------------------------------------:| | DeleteObject | 删除对象 | | DeleteBucket | 删除桶 | | DeleteMultipartUpload | 中止分片上传 | 也就是说R2只对存储和状态修改产生费用，下载不计费，对于小网站来说足够了。 注意:看一下这篇文章[https://machbbs.com/hostloc/640526][1]，避免被坑美刀。 有什么不足 Cloudflare祝您新的一年红红火火。\n如何接入 Cloudflare网页端配置 配置之前需要把一个域名接入Cloudflare并设置好解析。比如我的域名i-tama.website分配一个二级域名r2.i-tama.website用于自定义访问域名，解析内容任意即可，因为后面接入的时候会自动修改成CNAME接入。\n首先进入Cloudflare仪表盘的R2，点击创建存储桶：\n存储桶名称：填写3-63个不含特殊字符，比如我使用的tamabox。\n位置：选择自动，提供位置提示默认是无的情况下会根据位置自动选择，如果是针对中国的网站那最好是修改为亚太地区(APAC)。（注：记住这个APAC，后面会用到）\n然后点击创建，创建完成之后进入设置，设置界面有几个需要注意的地方：\n名称和S3 API：这两个后面连接需要用得到，可以保存下来。\n自定义域：这里就是配置自定义域名的位置，点击连接域，填写需要自定义访问的域名（不加https），例如r2.i-tama.website，并继续，然后会提示现有DNS记录将变更成CNAME解析，点击连接域之后等待初始化完成，约1-2分钟即可。成功后该域的状态应为有效，且访问存储桶为已允许。\nR2.dev子域：这里配置允许会生成一个r2.dev结尾的二级域名用于公共访问，使用这个方式访问可能会有速度限制，但我没尝试过。配置也很简单，点击允许之后输入allow即可。\nCORS策略：实际使用时可能会碰到跨域错误在这里配置即可，此处不做修改。\n以上配置完成后回退到R2仪表盘，进入账户详细信息下的管理R2 API令牌并选择创建API令牌：\n令牌名称：任意填写 记得就行。\n权限：因为我们是用来做图床的，涉及到文件读写，建议直接配置成管理员读和写。\n指定存储桶：建议一个桶一个API，所以我选择仅应用于特定存储桶，并选择刚才创建的桶。\nTTL:永久。\n客户端IP地址筛选：留空即可。\n最后创建API令牌，此时会得到令牌值、访问秘钥ID和机密访问密钥三个值，需要妥善保存好，因为确认之后就不会再出现这些数据了。\n至此，Cloudflare网页端配置完成。\n图床端配置 登录管理员账号进入系统设置 \u0026gt; 存储策略，选择新建一个存储策略。\n角色组根据自己的选择去配置即可。\n名称和简介自行设置好即可。\n存储策略选择AWS S3。\n访问域名填写在Cloudflare设置的自定义域，比如我的是https://r2.i-tama.website/tamabox。\n注意，这里的格式是自定义域名+桶名称，如果只填写域名，后面上传的时候会发现我们上传的图片a.png会被上传到https://r2.i-tama.website/tamabox/%year%/%month%/%day%/a.png，但图床中显示的链接是https://r2.i-tama.website/%year%/%month%/%day%/a.png，结果就是404了。\nAccessKeyId和SecretAccessKey即前面提到的访问秘钥ID以及机密访问秘钥。\n连接地址填写S3 API。\n区域就是前面我们配置位置信息的简码，如果我们选择亚太这里就是填apac。\n储存桶名称即桶名称。\n是否使用路径样式不要勾选，因为勾选之后上传到R2会再多一层路径。比如原来上传的位置是https://r2.i-tama.website/tamabox/%year%/%month%/%day%/a.png，勾选之后就变成https://r2.i-tama.website/tamabox/tamabox/%year%/%month%/%day%/a.png了。\n是否在文件上设置公开ACL，这里打开，保存之后随意上传个文件测试是否能上传成功，一般按这个步骤是不会有问题的。\n体验如何 我没开代理的情况下上传大概是200-300kb/s，下载差不多也是这个速度，只能说基本够用。\n","date":"2024-01-08T16:00:00+08:00","permalink":"https://blog.tama.guru/record/r2_on_lskypro.html","title":"在兰空图床配置并使用Cloudflare R2 存储桶"},{"content":"结论是：能。\n花了一百块买了张P106-100，七彩虹的，几个螺丝都锈得不成样子了，看得出来是锻炼了很长时间\u0026hellip;背板也是全锈的\u0026hellip; ![背板][1] 因为我用的10400不带f，且一直正常运行，我就没去bios调什么默认集显输出了，直接插pcie上电。 上电之后等了差不多2分钟才听到磁盘寻道声，在此期间主板的debug灯一直在闪，然后就正常启动了。 进系统之后显示适配器会提示感叹号，直接到[此处][2]下载魔改驱动包和注册表文件。 ![注册表和驱动包][3] 先把cyxRootCA.reg导进系统，然后就直接运行win11_NVIDIA_546.33_Setup.exe（实际不一定是这个版本号，看作者更新，而且Win10可以使用前缀为Win11的魔改包）。需要注意的是我在实际安装中并没有进安全模式，也没有把签名验证关掉，就一波平推过去，结果是安装正常，也能正常显示。 ![安装正常][4] 关于魔改安全性：服务器上开的SEP，主机用的卡巴，并没有报毒。 关于跑分：我装的鲁大师单文件版，能识别卡，但是跑分只在10万分左右，比起网上能跑20万的整整少了一半\u0026hellip;而且在跑的过程中全程不超过30fps，不知道是不是配置问题。 关于Furmark：会提示OpenGL版本过低。按网上的说法需要重装集显驱动，我装了，没用。 关于3DMark：根本没跑。 有空再试试跑画图软件吧。 20240126更新：换了LTSC之后再跑分已经能够接近20W了\u0026hellip;系统的问题看起来真的很严重。 ![20W][5]\n如果换上或者拔掉显卡之后无法启动，可以试着把电源拔掉并把BIOS电池抠出来一段时间再开机试试。 [1]: https://r2.337845818.best/oss-to-r2/2024/01/01/65929b6d4c39b.png [2]: https://www.aliyundrive.com/s/LXKQfxTX4Ra [3]: https://r2.337845818.best/oss-to-r2/2024/01/01/65929c7ce51cd.png [4]: https://r2.337845818.best/oss-to-r2/2024/01/01/65929d96717d2.png [5]: http://\n","date":"2024-01-01T21:10:00+08:00","permalink":"https://blog.tama.guru/record/p106-on-winserver.html","title":"P106能在server系统上运行吗"},{"content":"站内UP弄的丂渐云，今天看到有台CN2，8C8G一年才370不到，马上下单试了下.\n测试脚本： 测试结果：\n---------------------------------------------------------------------- CPU Model : Intel(R) Xeon(R) Gold 6133 CPU @ 2.50GHz CPU Cores : 8 Cores 2494.138 MHz x86_64 CPU Cache : 28160 KB OS : Debian GNU/Linux 12 (64 Bit) KVM Kernel : 6.1.0-10-amd64 Total Space : 3.8 GB / 100.0 GB Total RAM : 343 MB / 7940 MB (276 MB Buff) Total SWAP : 0 MB / 0 MB Uptime : 0 days 0 hour 4 min Load Average : 0.07, 0.02, 0.00 TCP CC : cubic ASN \u0026amp; ISP : AS400619, Cogent Communications Organization : PEG Tech Inc Location : San Jose, United States / US Region : California ---------------------------------------------------------------------- I/O Speed( 1.0GB ) : 380 MB/s I/O Speed( 1.0GB ) : 344 MB/s I/O Speed( 1.0GB ) : 287 MB/s Average I/O Speed : 337.0 MB/s ---------------------------------------------------------------------- Node Name Upload Speed Download Speed Latency Speedtest.net 45.93 Mbit/s 47.79 Mbit/s 1.07 ms Fast.com 0.00 Mbit/s 48.5 Mbit/s - Nanjing 5G CT 30.87 Mbit/s 47.36 Mbit/s 146.24 ms Hefei 5G CT 36.89 Mbit/s 47.84 Mbit/s 142.05 ms Shanghai 5G CU 47.77 Mbit/s 48.47 Mbit/s 170.50 ms ---------------------------------------------------------------------- ","date":"2024-01-01T13:28:44+08:00","permalink":"https://blog.tama.guru/record/idc-rbt.html","title":"丂渐云性能测试"},{"content":"影响SSH登录安全性的因素不外乎：禁用密码登录、密钥强度、修改默认端口、仅指定IP登录，但是如果每次登录的时候能够及时的发一封邮件提醒，可以更好的管控服务器登录状态，也能更安心些。\n需要用到msmtp和mutt两个软件。\n安装所需软件： 对于Centos： yum install msmtp mutt 对于debian系： apt install msmtp mutt 对于arch系用户： pacman -S msmtp mutt\n配置msmtp 其实msmtp就是一个支持服务器配置文件的轻型SMTP客户端，配合mutt可以达到邮件发送的效果。 对于debian系统，可以在 /usr/share/doc/msmtp/examples/ 下找到默认配置文件。其中msmtprc-system.example代表全局配置，msmtprc-user.example代表用户配置。如果需要所有用户都使用这个配置，则可以执行 cat /usr/share/doc/msmtp/examples/ \u0026gt; /etc/msmtprc 然后修改/etc/msmtprc文件： 注意，实际使用时不要吧中文注释也复制进去\n# Example for a system wide configuration file # A system wide configuration file is optional. # If it exists, it usually defines a default account. # This allows msmtp to be used like /usr/sbin/sendmail. account default # The SMTP smarthost host smtp.qq.com #SMTP域名，例如QQ邮箱为smtp.qq.com # Use TLS on port 465 port 465 #465为默认smtp tls端口，如果选择不加密一般改成25 tls on #是否开启TLS tls_starttls off # STARTTLS是对纯文本通讯协议的扩展。它提供一种方式将纯文本链接升级为加密链接（TLS或SSL），而不是另外使用一个端口做加密通讯。我在使用过程中发现开启时大概率发送失败，可能和qq的smtp服务器有关，因此保持默认关闭即可。 # Construct envelope-from addresses of the form \u0026#34;user@oursite.example\u0026#34; from xxx@qq.com #发送邮件的地址，以qq邮箱为例 auth on #启用验证 user xxx@qq.com #用户名，以qq邮箱为例 password xxxxxxxx #这里填授权码或密码 # Syslog logging with facility LOG_MAIL instead of the default LOG_USER syslog LOG_MAIL 保存文件后可以执行\necho \u0026#34;this is a test\u0026#34;|msmtp -v 收件邮箱@qq.com 然后会看到服务器执行邮件发送的操作：\n... \u0026lt;-- 220 smtp.qq.com MX Tencent Server --\u0026gt; EHLO localhost \u0026lt;-- 250-smtp.qq.com \u0026lt;-- 250-8BITMIME \u0026lt;-- 250-AUTH=PLAIN LOGIN XALIOAUTH \u0026lt;-- 250-AUTH PLAIN LOGIN XALIOAUTH \u0026lt;-- 250-PIPELINING \u0026lt;-- 250 DSN --\u0026gt; AUTH PLAIN ******************************* \u0026lt;-- 235 Authentication successful --\u0026gt; MAIL FROM:\u0026lt;xxx@qq.com\u0026gt; --\u0026gt; RCPT TO:\u0026lt;收件邮箱@qq.com\u0026gt; --\u0026gt; DATA \u0026lt;-- 250 Mail Ok \u0026lt;-- 250 Rcpt Ok \u0026lt;-- 354 End data with \u0026lt;CR\u0026gt;\u0026lt;LF\u0026gt;.\u0026lt;CR\u0026gt;\u0026lt;LF\u0026gt; --\u0026gt; From: xxx@qq.com --\u0026gt; Date: Tue, 26 Dec 2023 21:10:21 +0800 --\u0026gt; test infomation --\u0026gt; . \u0026lt;-- 250 Data Ok: queued as freedom --\u0026gt; QUIT \u0026lt;-- 221 Bye 得到类似以上的信息，可以判定配置配置无误了。如果收件箱并没有看到邮件，需要到寄件邮箱查询是否被当成垃圾邮件拒收了。当然这并不影响后续使用，因为这本身就是一封只有英文标题无任何内容的邮件，很容易被ban掉。 最后，我们还需要修改/etc/Muttrc，在最后面加上：\nset sendmail=\u0026#34;/usr/bin/msmtp\u0026#34; set use_from=yes set realname=\u0026#34;你想要显示的发送名称\u0026#34; set from=xxx@qq.com 生成配置文件 在/etc/ssh下生成并编辑ssh_alarm.sh\nnano /etc/ssh/ssh_alarm.sh 文件内容如下：\n#!/bin/bash if [ -z \u0026#34;${SSH_CONNECTION}\u0026#34; ];then echo \u0026#39;$SSH_CONNECTION:not exists\u0026#39; exit 1 fi #定义变量 from_ip=`echo ${SSH_CONNECTION} | awk \u0026#39;{print$1}\u0026#39;` from_port=`echo ${SSH_CONNECTION} | awk \u0026#39;{print$2}\u0026#39;` server_ip=`echo ${SSH_CONNECTION} | awk \u0026#39;{print$3}\u0026#39;` user=`echo ${LOGNAME}` hostname_1=`echo ${HOSTNAME} \u0026#34;(\u0026#34; $server_ip \u0026#34;)\u0026#34;` server_time=`echo $(date +\u0026#34;%Y-%m-%d %R\u0026#34;)` e_mail=收件地址@qq.com #IP白名单，192.168.1.1这个IP登录时不提示 ip_exit=`echo ${from_ip}|cut -d \u0026#34;.\u0026#34; -f 1,2,3` if [ \u0026#34;${ip_exit}\u0026#34; == \u0026#34;192.168.1.1\u0026#34; ];then exit 1 fi #用户登录白名单，username这个用户登录时不提示 if [ \u0026#34;${user}\u0026#34; == \u0026#34;username\u0026#34; ];then exit 1 fi #Send mail echo -e \u0026#34; **********SSH登录警告**********\\n 登录主机:${hostname_1}\\n 登录用户:${user}\\n 登录时间:${server_time}\\n 登录IP:${from_ip}\\n 登录IP端口:${from_port}\\n 请注意核查是否可信登录，如非可信，请立即更换密匙和密码。 ******************************\u0026#34;|mutt -s \u0026#34;服务器SSH登录警告\u0026#34; ${e_mail} 保存后执行：\nbash /etc/ssh/ssh_alarm.sh 执行完毕不会有任何回显，但是收件端收件地址@qq.com应该会收到邮件： 最后需要配置一个sshrc文件，这个文件的作用是当连接ssh时自动执行文件内的脚本：\nnano /etc/ssh/sshrc 文件内容如下：\nbash /etc/ssh/ssh_alarm.sh 保存之后再次登录ssh服务器，就会自动执行ssh_alarm.sh脚本发送邮件了。\n","date":"2023-12-26T22:09:04+08:00","permalink":"https://blog.tama.guru/record/ssh_login_mail.html","title":"给SSH添加邮件登录提醒"},{"content":"最近把编译用的主机换个发行版，最开始用的是debian，结果现在桌面环境进不去了（而且是一引导完成就所有输入、输入都没反应，但是ssh能登陆，很奇怪），懒得去查原因就选择换个环境。本来用的almalinux，无奈真的不喜欢gnome，自己装了kde之后ibus无论怎样都打不出中文，最后还是上了arch。 无论是宝塔还是lnmp.org都没有对arch系进行适配，网上也有很多一步步排错安装的教程，但是看着一步步的报错再去核查原因着实难受，最后还是选择自己装最基础的nginx+php+mysql。\n安装nginx archlinux软件包里面有nginx和nginx-mainline（当前最新是1.25.3)两个版本，nginx版本较老且两个版本之间有冲突，故安装nginx-mainline。\npacman -S nginx-mainline 安装完成后执行systemctl status nginx可能会提示\n11月 30 10:04:16 bot nginx[17674]: 2023/11/30 10:04:16 [warn] 17674#17674: could not build optimal types_hash, you should increase either types_hash_max_size: 1024 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size 需要修改/etc/nginx/nginx.conf，并在http块下添加types_hash_max_size 4096;，例如：\nhttp { ... types_hash_max_size 4096; #gzip on; ... 然后重启nginx：\nsystemctl retstart nginx 就不会报错了，访问也没问题。 安装php 执行\npacman -S php-fpm 安装最新的php模块，当前最新版本是8.2.13-1。安装php-fpm会自动把php一并安装好。 然后把php-fpm和nginx对接，修改/etc/nginx/nginx.conf： 把：\n#location ~ \\.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} 修改为：\nlocation ~ \\.php$ { root /usr/share/nginx/html; fastcgi_pass unix:/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;; include fastcgi_params; } 然后测试配置文件是否正常：\nnginx -t 并将相应服务启动/重启：\nsystemctl enable php-fpm systemctl start php-fpm systemctl restart nginx #或nginx -s reload 然后到网站root目录/usr/share/nginx/html下放一个探针:\ncd /usr/share/nginx/html wget https://raw.githubusercontent.com/582033/monitor/master/monitor.php 然后访问ip/monitor.php： 如果显示得出来说明nginx和php-fpm已经对接上了。\n安装mysql 先启动php下mysql的相关拓展： 修改/etc/php/php.ini ;extension=mysqli ;extension=odbc ;zend_extension=opcache ;extension=pdo_dblib ;extension=pdo_mysql 修改成\nextension=mysqli ;extension=odbc ;zend_extension=opcache ;extension=pdo_dblib extension=pdo_mysql 安装mariadb：\npacman -S mariadb 初始化mysqldb的数据目录：\nmysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql 启动mysql服务：\nsystemctl enable mysqld systemctl start mysqld 运行安全脚本配置：\nmysql_secure_installation 各项内容根据实际修改：\n/usr/bin/mysql_secure_installation: Deprecated program name. It will be removed in a future release, use \u0026#39;mariadb-secure-installation\u0026#39; instead NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we\u0026#39;ll need the current password for the root user. If you\u0026#39;ve just installed MariaDB, and haven\u0026#39;t set the root password yet, you should just press enter here. Enter current password for root (enter for none): #输入mysql root密码 默认是空，直接回车 OK, successfully used password, moving on... Setting the root password or using the unix_socket ensures that nobody can log into the MariaDB root user without the proper authorisation. You already have your root account protected, so you can safely answer \u0026#39;n\u0026#39;. Switch to unix_socket authentication [Y/n] #是否切人到unix_socket认证，默认是，直接回车。 Enabled successfully! Reloading privilege tables.. ... Success! You already have your root account protected, so you can safely answer \u0026#39;n\u0026#39;. Change the root password? [Y/n] #是否修改root密码，默认是，直接回车。 New password: #输入新的root密码 Re-enter new password: #再次输入新的root密码 Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] #是否删除匿名用户，默认是 ... Success! Normally, root should only be allowed to connect from \u0026#39;localhost\u0026#39;. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] n #是否禁用远程登陆，我有需求，这里填否 ... skipping. By default, MariaDB comes with a database named \u0026#39;test\u0026#39; that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] #是否移除测试数据库，默认是 - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] #是否刷新权限，默认是 ... Success! Cleaning up... All done! If you\u0026#39;ve completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! 输入新的root密码测试登陆mysql：\n# mysql -u root -p mysql: Deprecated program name. It will be removed in a future release, use \u0026#39;/usr/bin/mariadb\u0026#39; instead Enter password: Welcome to the MariaDB monitor. Commands end with ; or \\g. Your MariaDB connection id is 12 Server version: 11.2.2-MariaDB Arch Linux Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type \u0026#39;help;\u0026#39; or \u0026#39;\\h\u0026#39; for help. Type \u0026#39;\\c\u0026#39; to clear the current input statement. MariaDB [(none)]\u0026gt; quit; Bye 确认一切正常，最后重启所有相关服务：\nsystemctl restart mysqld systemctl restart php-fpm systemctl restart nginx 至此所有步骤均完成。\n优化配置（可选） 1、对于/etc/nginx/nginx.conf: 在http块下新增：\nclient_max_body_size 10m; 2、对于/etc/php/php.ini： 修改\nupload_max_filesize = 2M 成\nupload_max_filesize = 20M 3、安装phpmyadmin： 去phpmyadmin官网下载最新版安装包，目前是5.2.1：\ncd /usr/share/nginx/hmtl wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip unzip phpMyAdmin-5.2.1-all-languages.zip mv phpMyAdmin-5.2.1-all-languages phpmyadmin cd phpmyadmin cp config.sample.inc.php config.inc.php 然后修改配置文件config.inc.php:\n$cfg[\u0026#39;blowfish_secret\u0026#39;] = \u0026#39;任意字符串\u0026#39;; $cfg[\u0026#39;Servers\u0026#39;][$i][\u0026#39;host\u0026#39;] = \u0026#39;127.0.0.1\u0026#39;; 修改nginx的配置/usr/nginx/nginx.conf，添加以下内容：\nlocation /phpmyadmin { alias /usr/share/nginx/html/phpmyadmin; index index.php; } location ~ /phpmyadmin/.+\\.php$ { if ($fastcgi_script_name ~ /phpmyadmin/(.+\\.php.*)$) { set $valid_fastcgi_script_name $1; } include fastcgi_params; fastcgi_pass unix:/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/phpmyadmin/$valid_fastcgi_script_name; } 然后重启nginx和php\nsystemctl restart nginx systemctl restart php-fpm 可能会提示”缺少 mysqli 扩展“，请检查拓展的位置是否配置正确了。\n# find / -name mysqli* /usr/lib/php/modules/mysqli.so 可以看到拓展实际上位于/usr/lib/php/modules/这个位置下，那就把/etc/php/php.ini中的\nextension=mysqli 修改成\nextension=/usr/lib/php/modules/mysqli.so 重启php-fpm服务即可正常运行。\n","date":"2023-11-30T11:07:00+08:00","permalink":"https://blog.tama.guru/record/archlinux_lnmp.html","title":"Archlinux下安装并配置lnmp环境"},{"content":"我在远端有一台服务器，因为某些原因需要用这台服务器作为流量出口，当然可以通过搭建某些软件配置成V*N访问，但是那不是我想要的（因为远端的服务器配置太低了）。除了传统的ss类软件，我找到了3proxy这个小东西。\n软件是支持Windows和linux的，我在本地搭建了个debian虚拟机，根据我的配置安装软件：\n# wget https://github.com/3proxy/3proxy/releases/download/0.9.4/3proxy-0.9.4.x86_64.deb # dpkg -i 3proxy-0.9.4.x86_64.deb 3proxy installed. Failed to stop bin-systemctl.mount: Unit bin-systemctl.mount not loaded. Failed to stop start.service: Unit start.service not loaded. Failed to stop echo.service: Unit echo.service not loaded. Failed to stop use.service: Unit use.service not loaded. systemctl start 3proxy.service to start proxy systemctl stop 3proxy.service to stop proxy /usr/local/3proxy/conf/add3proxyuser.sh to add users Default config uses Google\u0026#39;s DNS. It\u0026#39;s recommended to use provider supplied DNS or install local recursor, e.g. pdns-recursor. Configure preferred DNS in /usr/local/3proxy/conf/3proxy.cfg. run \u0026#39;/usr/local/3proxy/conf/add3proxyuser.sh admin password\u0026#39; to configure \u0026#39;admin\u0026#39; user Processing triggers for man-db (2.11.2-2) ... 然后去/etc/3proxy下修改3proxy.conf添加如下内容：\n# 超时的时间值 timeouts 1 5 30 60 180 1800 15 60 # 内部IP地址，不可使用127.0.0.1，要具体地址，这里填你的电脑ip地址 internal 192.168.XX.XX #无认证 auth none flush # 允许所有你配置的用户连接 allow * # 这里手动指定端口1080 socks -p1080 然后执行命令重启服务：\nsystemctl restart 3proxy.service 最后在本地配置代理地址就行了。 比如我的虚拟机ip是192.168.50.50，那代理信息应该配置为：\nIP:192.168.50.50 PORT:1080 USERNAME: PASSWORD: 如果配置完执行systemctl status 3proxy提示：\nDec 28 21:30:04 ProxyServer 3proxy[343005]: Failed to open pid file /var/run/3proxy/3proxy.pid Dec 28 21:30:04 ProxyServer 3proxy[343005]: Command: \u0026#39;pidfile\u0026#39; failed with code 1, line 3 则新建该文件\ntouch /var/run/3proxy/3proxy.pid 然后可能会提示：\nProxyServer 3proxy[2616]: /conf/passwd: No such file or directory 但是这个文件是实际存在的，在/etc/3proxy/conf/3proxy.conf中被配置为：\nusers $/conf/passwd 直接把这里修改成：\nusers /etc/3proxy/conf/passwd 然后重启程序即可。\n如果无法连接到该端口，建议看一下是否打开了防火墙并有放行端口。\n更新：在https://bgithub.xyz/3proxy/3proxy/issues/374中有提到：\u0026ldquo;Remove pidfile /var/run/3proxy/3proxy.pid it\u0026rsquo;s not required with systemd, current master fixes it already.\u0026ldquo;也就是说3proxy.pid对于systemd并不是必须的，所以如果提示：\nFailed to open pid file /var/run/3proxy/3proxy.pid 可以尝试删掉或注释掉/etc/3proxy/3proxy.conf内的:\npidfile /var/run/3proxy/3proxy.pid 这一行。修改后的3proxy.conf应该像：\n#!/bin/3proxy #daemon #pidfile /var/run/3proxy/3proxy.pid chroot /usr/local/3proxy proxy proxy include /conf/3proxy.cfg 然后重启3proxy服务：\nsystemctl restart 3proxy 此时程序应该能够正常运行了：\n[root@shell conf]# systemctl status 3proxy ● 3proxy.service - 3proxy tiny proxy server Loaded: loaded (/usr/lib/systemd/system/3proxy.service; enabled; preset: disabled) Active: active (running) since Wed 2026-03-04 11:05:40 CST; 6s ago Docs: man:3proxy(1) Main PID: 2591424 (3proxy) Tasks: 5 (limit: 2271) Memory: 3.1M (peak: 3.4M) CPU: 7ms CGroup: /system.slice/3proxy.service └─2591424 /bin/3proxy /etc/3proxy/3proxy.cfg Mar 04 11:05:40 VM-0-11-opencloudos systemd[1]: Started 3proxy.service - 3proxy tiny proxy server. ","date":"2023-11-27T11:10:00+08:00","permalink":"https://blog.tama.guru/software/3proxy.html","title":"[软件推荐]搭建简易代理服务器"},{"content":"卧槽牛皮，这东西牛啊！通过这个教程已经成功弄出了安卓端apk并正常使用！ 本站安卓客户端：https://share.tama.guru/d/App/Android/latest_release.apk 本站自签证iOS端：https://share.tama.guru/d/App/iOS/%E7%8B%BC%E7%9A%84%E5%85%AC%E5%91%8A%E6%9D%BF.mobileconfig\n介绍 RuleApi，基于typecho正式版数据库，使用JAVA语言Springboot框架，整合redis缓存数据库，COS、OSS对象存储，是目前typecho程序功能最全，接口最完善，用户体验最好，且性能最佳的API程序。集成了用户模块（登陆，注册，邮箱验证，用户查询，用户修改），文章模块，评论模块，分类模块，和上传模块（三合一上传方式，OSS，COS，本地上传均可），在安装完成后，可以进一步扩展typecho网站的功能，并实现更强大的性能，更全面的应用范围。\n截图 搭建教程 以下均为安卓端app的配置，ios端个人能力有限不使用。\nAPI端 基本上可以参考官方项目的说明，官方提供centos使用的一键脚本，因为我用的debian，用的是手动安装。以下操作也是基础手动安装。\n安装依赖环境 首先是JAVA，官方建议安装8u311版本，可以去网上找，也可以使用我下载下来的文件。下载之后解压到/opt并命名为jdk1.8，整个路径看起来应该像：\n# ls /opt/jdk1.8/ bin COPYRIGHT\tinclude javafx-src.zip jmc.txt jre legal lib LICENSE man README.html release src.zip\tTHIRDPARTYLICENSEREADME-JAVAFX.txt THIRDPARTYLICENSEREADME.txt 然后配置环境，修改/etc/profile，添加下面的语句到最后：\nexport JAVA_HOME=/opt/jdk1.8 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=$PATH:${JAVA_HOME}/bin 并执行source /etc/profile使其生效。 其他还需要安装Redis、Mysql和Nginx，如果安装过宝塔的直接在面板上安装，基本上没有版本限制所以此处不写过程了。 最后还需要安装screen用于维持ruleapi后台运行。\n下载所需文件 在/opt新建一个文件夹，比如ruleapi，把以下文件都下载下来。\nwget -c http://shell.ruletree.club/RuleApi.jar wget -c http://shell.ruletree.club/application.properties wget -c http://shell.ruletree.club/apiResult.php 整个路径看起来应该像：\n#ls /opt/ruleapi apiResult.php application.properties RuleApi.jar 然后需要把`apiResult.php`复制到typecho的根目录。 相关文件也已经上传云盘:[https://share.tama.guru/%E8%BF%9C%E7%A8%8B%E4%B8%8B%E8%BD%BD%EF%BC%88%E4%BB%93%E5%BA%93%EF%BC%89/ruleproject][7] 修改ruleapi配置 修改application.properties，主要修改以下几项：\nserver.port=8080 #ruleapi运行的端口，如果8080被占用了就手动改。 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/\u0026lt;typecho数据库名\u0026gt;?characterEncoding=UTF-8 spring.datasource.username=\u0026lt;typecho数据库用户名\u0026gt; spring.datasource.password=\u0026lt;typecho数据库密码\u0026gt; mybatis.configuration.variables.prefix=\u0026lt;typecho数据表前缀\u0026gt; spring.redis.password=\u0026lt;redis密码，默认为空，如果配置了其他密码自己手动修改\u0026gt; spring.mail.host=\u0026lt;smtp服务器\u0026gt; spring.mail.username=\u0026lt;smtp登录名\u0026gt; #spring.mail.from不支持中文，需要中文，看mail.properties spring.mail.password=\u0026lt;smtp密码\u0026gt; spring.mail.properties.mail.smtp.port:\u0026lt;smtp登录端口\u0026gt; spring.mail.properties.mail.smtp.ssl.enable: true \u0026lt;smtp是否需要ssl\u0026gt; spring.mail.default-encoding=UTF-8 \u0026lt;编码格式\u0026gt; webinfo.key=\u0026lt;登录网页控制台的key\u0026gt; 运行程序并保持在后台运行 #screen -S ruleapi #java -jar RuleApi.jar . ____ _ __ _ _ /\\\\ / ___\u0026#39;_ __ _ _(_)_ __ __ _ \\ \\ \\ \\ ( ( )\\___ | \u0026#39;_ | \u0026#39;_| | \u0026#39;_ \\/ _` | \\ \\ \\ \\ \\\\/ ___)| |_)| | | | | || (_| | ) ) ) ) \u0026#39; |____| .__|_| |_|_| |_\\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.2.11.RELEASE) 2023-11-17 18:42:00 INFO 966545 --- [ main] com.RuleApi.Application 55 : Starting Application v1.3.4 on xxxxxxxxx with PID 966545 /opt/ruleapi/RuleApi.jar started by root in /opt/ruleapi 2023-11-17 18:42:00 INFO 966545 --- [ main] com.RuleApi.Application 651 : No active profile set, falling back to default profiles: default 2023-11-17 18:42:01 INFO 966545 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate 249 : Multiple Spring Data modules found, entering strict repository configuration mode! 2023-11-17 18:42:01 INFO 966545 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate 127 : Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2023-11-17 18:42:01 INFO 966545 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate 187 : Finished Spring Data repository scanning in 43ms. Found 0 Redis repository interfaces. 2023-11-17 18:42:03 INFO 966545 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer 91 : Tomcat initialized with port(s): yourport (http) 2023-11-17 18:42:03 INFO 966545 --- [ main] o.a.coyote.http11.Http11NioProtocol 173 : Initializing ProtocolHandler [\u0026#34;http-nio-yourport\u0026#34;] 2023-11-17 18:42:03 INFO 966545 --- [ main] o.apache.catalina.core.StandardService 173 : Starting service [Tomcat] 2023-11-17 18:42:03 INFO 966545 --- [ main] org.apache.catalina.core.StandardEngine 173 : Starting Servlet engine: [Apache Tomcat/9.0.58] 2023-11-17 18:42:03 INFO 966545 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] 173 : Initializing Spring embedded WebApplicationContext 2023-11-17 18:42:03 INFO 966545 --- [ main] w.s.c.ServletWebServerApplicationContext 283 : Root WebApplicationContext: initialization completed in 2660 ms 2023-11-17 18:42:05 INFO 966545 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor 181 : Initializing ExecutorService \u0026#39;applicationTaskExecutor\u0026#39; 2023-11-17 18:42:05 INFO 966545 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping 54 : Adding welcome page: class path resource [static/index.html] 2023-11-17 18:42:05 INFO 966545 --- [ main] o.a.coyote.http11.Http11NioProtocol 173 : Starting ProtocolHandler [\u0026#34;http-nio-yourport\u0026#34;] 2023-11-17 18:42:05 INFO 966545 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer 203 : Tomcat started on port(s): yourport(http) with context path \u0026#39;\u0026#39; 2023-11-17 18:42:05 INFO 966545 --- [ main] com.RuleApi.Application 61 : Started Application in 6.022 seconds (JVM running for 6.495) 2023-11-17 18:42:14 INFO 966545 --- [nio-yourport-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] 173 : Initializing Spring DispatcherServlet \u0026#39;dispatcherServlet\u0026#39; 2023-11-17 18:42:14 INFO 966545 --- [nio-yourport-exec-1] o.s.web.servlet.DispatcherServlet 525 : Initializing Servlet \u0026#39;dispatcherServlet\u0026#39; 2023-11-17 18:42:14 INFO 966545 --- [nio-yourport-exec-1] o.s.web.servlet.DispatcherServlet 547 : Completed initialization in 8 ms 2023-11-17 18:42:15 INFO 966545 --- [nio-yourport-exec-8] io.lettuce.core.EpollProvider 68 : Starting without optional epoll library 如果有上述提示则表示程序正常启动了，可以按Ctrl+A D保持后台运行。\n配置二级域名 因为使用IP+端口访问并不安全，需要配置一个二级域名用以访问。比如二级域名为https://rule.tama.host，生成并解析后需要添加伪静态规则：\nlocation ^~ /images/ { alias /opt/ruleapi/static/; try_files $uri $uri/ =404; } location ^~ / { add_header \u0026#39;Access-Control-Allow-Origin\u0026#39; \u0026#39;*\u0026#39;; add_header \u0026#39;Access-Control-Allow-Methods\u0026#39; \u0026#39;GET, POST, OPTIONS, PUT, DELETE\u0026#39;; add_header \u0026#39;Access-Control-Allow-Credentials\u0026#39; \u0026#39;true\u0026#39;; add_header \u0026#39;Access-Control-Allow-Headers\u0026#39; \u0026#39;Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token\u0026#39;; if ( $request_method = \u0026#39;OPTIONS\u0026#39; ) { return 200; } proxy_pass http://127.0.0.1:\u0026lt;你的ruleapi端口\u0026gt;; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } 注意修改端口。之后访问https://rule.tama.host可以进入可视化管理页面。 首次进去先点击安装及更新，每次更新之后都要点这个。此处需要填写webinfo.key中配置的key。更新完成后关闭界面可以进入管理中心。 管理中心配置 这里的参数很多，我的修改只为了保证程序的运行，其他细项可以自行修改。 安全设置建议打开机器人限制模式。 应用模块-应用管理是重要的步骤，内容可以按自己的设置添加修改： 之后会得到一个应用key。 之后还需要到存储模块设置一个上传文件/视频的方式，可以选择OSS/COS/FTP/本地上传。如果使用本地上传，需要把本地\u0026amp;FTP图片访问地址修改为：https://rule.tama.host/images/，rule.tama.host修改成你ruleapi的地址。（来自：https://www.ijkxs.com/9955.html） 至此api端算是配置完成了。\nAPP端 注册和配置dcloud 先需要注册一个dcloud账号并登录，绑定好手机号。然后到dcloud下载HBulder X。\n下载源码到本地并导入HBulderX Gitee:https://gitee.com/ruletree/RuleApp Github:https://github.com/buxia97/RuleApp 假设下载的目录是C:\\Files\\RuleApp，打开HBulderX，并执行文件\u0026gt;导入\u0026gt;从本地目录导入 修改配置项目 首先是utils\\api.js，这里主要填写对接到ruleapi的数据，主要修改以下内容：\nvar API_URL = \u0026#39;\u0026lt;ruleapi网址\u0026gt;\u0026#39;; var appKey = \u0026#34;\u0026lt;应用key\u0026gt;\u0026#34;; //web网站地址 var GroupUrl = \u0026#39;\u0026lt;qq群链接\u0026gt;\u0026#39;; var GithubUrl = \u0026#39;\u0026lt;gayhub链接\u0026gt;\u0026#39;; 其他可以根据注释修改。 然后修改manifest.json，这里是图形界面的，可以根据提示直接修改，需要注意： 1.uni-app需要重新获取，这里会提示登录dcloud账号。 2.应用版本号和应用版本名称应高于前一次配置的值，首次配置可以写1。 3.app模块配置中根据需要选择Oauth如果没有配置的话把勾取消掉。 如果不选择Push的话，每次启动app都会有弹窗提示，建议配置，配置需要到https://dev.dcloud.net.cn/pages/app/detail中我的应用\u0026gt; 应用名称\u0026gt;Android云端证书中查看证书详情，并记录sha1 sha256和md5值。 然后到各平台信息中填写对应值，包名也要一并填写。 然后把数值填写到uniPush\u0026gt;1.0\u0026gt;应用信息选择APPID，填写应用名称和包名、选择平台并选择Android应用签名。 保存成功后进入uniPush\u0026gt;1.0\u0026gt;消息推送\u0026gt;配置管理\u0026gt;应用配置下，把Appid Appkey MasterSectrt值填写到ruleapi的通知模块\u0026gt;UniPush配置中。 调试 到HBulderX的运行中选择运行到浏览器，等几分钟会跳转到浏览器并打开页面，可以查看是否有误。 编译 执行HBulderX的的发行\u0026gt;原生App-云打包。 填写包名并选择使用云端证书，点击打包，会提示下载相关依赖，下载完成后会自动启动打包，如果没有配置错误一般三到五分钟后就能生成apk包。 [HBuilder] 23:02:08.640 项目 \u0026#39;RuleApp-master\u0026#39; 开始编译... [HBuilder] 23:02:10.336 3.96 [HBuilder] 23:02:10.336 正在编译中... [HBuilder] 23:02:10.337 ​已开启 uni统计1.0 版本​ [HBuilder] 23:02:40.332 项目 \u0026#39;RuleApp-master\u0026#39; 编译成功。 [HBuilder] 23:02:51.222 打包成功后会自动返回下载链接。 [HBuilder] 23:02:51.222 打包过程查询请点菜单发行-查看云打包状态。 [HBuilder] 23:02:51.222 周五傍晚等高峰期打包排队较长，请耐心等待。 [HBuilder] 23:02:51.222 如果是为了三方SDK调试，请使用自定义调试基座（菜单运行-手机或模拟器-制作自定义调试基座），不要反复打包。 [HBuilder] 23:02:51.222 项目 RuleApp-master [__UNI__xxxxxxx]已成功提交到云端，正在获取打包状态... 23:02:52.421 [HBuilder] 23:02:52.423 项目 RuleApp-master [__UNI__xxxxxxx]的打包状态： [HBuilder] 23:02:52.423 时间: 2023-11-17 23:02:50 类型: Android云端证书 准备打包 23:02:52.903 [HBuilder] 23:02:52.903 项目 RuleApp-master [__UNI__xxxxxxx]的打包状态： [HBuilder] 23:02:52.903 时间: 2023-11-17 23:02:50 类型: Android云端证书 准备打包 23:03:49.917 [HBuilder] 23:03:49.917 项目 RuleApp-master [__UNI__xxxxxxx]的打包状态： [HBuilder] 23:03:49.917 时间: 2023-11-17 23:02:50 类型: Android云端证书 正在云端打包 [HBuilder] 23:03:49.917 预计2-5分钟完成打包。如项目使用了App原生插件，打包时间可能会更长，请耐心等待。 23:04:58.053 [HBuilder] 23:04:58.054 项目 RuleApp-master [__UNI__xxxxxxx]的打包状态： [HBuilder] 23:04:58.054 时间: 2023-11-17 23:02:50 类型: Android云端证书 正在本地生成安装包(请勿关闭HBuilderX) 23:05:27.519 [HBuilder] 23:05:27.519 项目 RuleApp-master [__UNI__xxxxxxx]的打包状态： [HBuilder] 23:05:27.519 时间: 2023-11-17 23:02:50 类型: Android云端证书 打包成功 安装包位置：xxxxxxxxxxxxxxxxxxxx/apk/__UNI__xxxxx__20231117230250.apk 打包好的文件根据提示可以找到。\n注意事项 阿里云OSS防盗链 需要在防盗链白名单中添加\u0026quot;-\u0026quot;，否则app端资源无法显示。\n添加表情包 资源位于RuleApp-master\\unpackage\\dist\\dev\\app-plus\\static\\app-plus\\owo、RuleApp-master\\static\\app-plus\\owo以及C:\\Users\\Tamakyi Gekka\\Downloads\\RuleApp-master\\RuleApp-master\\static\\h5\\owo下。需要修改OwO.js并根据路径添加对应资源。\n","date":"2023-11-17T23:12:00+08:00","permalink":"https://blog.tama.guru/record/ruleproject.html","title":"使用ruleproject搭建自己的typecho程序客户端"},{"content":"20250507注：建议直接用盖世游戏，相对更友好，详见 盖世游戏-意外好用的windows游戏模拟器\n从安卓4.x时代开始我便开始想着能不能在手机上运行一些电脑上的游戏，比如红色警戒还有某些Galgame，但是受制于当时的硬件机能，exgear这类的软件运行起来效果并不好，最直观的体现就是卡顿，或者就是直接跑不起来。网上流传的exgear版本非常多，就算放到现在实际体验下来也经常碰到这样那样的毛病。在体验了几天Winlator之后，感觉相对于exgear更稳定一些，偶尔有闪退（我用的鸿蒙4.0，不知道有没有这方面的关系），但还是挺不错的，出门在外想推点小游戏也不用带笨重的掌机了。\n项目地址 winlator\n项目介绍 Winlator 是一款 Android 应用程序，可让您使用 Wine 和 Box86/Box64 运行 Windows（x86_64）应用程序。\n安装方法 直接到Github下载最新版本的安装包和对应数据包，如最新版本的是2.0，对应的数据包是main.2.com.winlator.obb，如果下载速度太慢，可以到狼的共享盘下载。（原版是英文的，但是不影响使用） 20240819更新7.1汉化整合包：AliShare 先安装Winlator2.0-UPDATED_f26.apk，安装完成后打开程序，会闪退并提示：\u0026ldquo;obb数据包不存在\u0026rdquo;，然后需要安装Solid Explorer这个文件管理器（很多文件管理器在安卓13之后就无法访问Android文件夹了，这会影响后续的操作），进入内部存储器\u0026gt;ANDROID\u0026gt;OBB\u0026gt;COM.WINLATOR文件夹，把下载下来的main.2.com.winlator.obb复制到这里（过程中会提示是否允许授予允许管理所有文件的权限，这里选允许）。 重新打开Winlator程序，这时会提示正在安装正在安装obb映像，通常一分钟左右就完成了。 配置方法 1.在容器管理页面右上角点击加号进入创建新容器页面； 2.容器名称随意设置； 3.分辨率根据自己的手机选择，如果手机分辨率19201080的话建议使用1280720分辨率，不然字体很小； 4.Wine版本一般选择默认即可，如果后续运行程序出问题可以使用其他版本试试，或者自己安装其他Wine版本，此处不详细说明。 5.显卡驱动分为LLVMpipe(Software) Turnip+Zink和VirGL三种，按网上的说法Vrigl版兼容性更好，Turnip+Zink版速度快（但是turnip只支持部分高通gpu6的手机），LLVMpipe使用软件编解码，貌似占用资源更高，新手机建议用Vrigl减少兼容性问题。 6.Box版本保留默认即可。 7.处理器核心开关根据自己的手机选择，麒麟9000s默认只开CPU4-7，我保留这个配置使用无异常。 8.WINE注册表项和DX组件基本上只需要保留默认。 9.环境变量这里如果游戏乱码可以设置LC_all这一项，也可以在容器内设置，其他保留默认即可。 10.盘符默认把存储器下的Download文件夹（即下载默认目录）设置成D:，建议新建个文件夹来专门放置游戏并配置盘符。 11.高级设置也只需要保持默认即可。 配置完成后点击右下角的✔，返回到主界面找到刚刚生成的容器，选择右边的三个点点击运行容器就跑起来了。\n注意事项 建议配置完成后安装常见运行库包以及中文字体补丁，安装运行库需要10分钟左右时间，安装中文字体补丁时可能会提示需要安装Wine Geckc，按要求点击安装即可，如果WiFi下载慢建议用流量下载。 使用截图 ","date":"2023-11-12T13:51:00+08:00","permalink":"https://blog.tama.guru/software/Winlator.html","title":"[好软推荐]Winlator 在安卓上运行exe程序的更好方案"},{"content":"10月29日，Github用户notmarek发布了一个仓库LanguageBreak，内容是版本号\u0026lt;=5.16.2.1.1的kindle设备的越狱（截至10月30日官网最新版本号为5.16.4），而在此之前仅5.14.2及以下的版本才有机会越狱。\n作者对此项目的介绍在：https://www.mobileread.com/forums/showthread.php?t=356872。该漏洞相关信息：https://www.mobileread.com/forums/showthread.php?t=356766，内容如下：\nLooking at the differences between 5.16.2 and 5.16.3, I think I found a smoking gun of a change.\nThere is small difference the versions of \u0026ldquo;usr/lib/blanket/langpicker.so.1.0\u0026rdquo; In the function: module_langpicker_utilDeleteExtraDictionaries\nBefore: Code: __sprintf_chk(acStack_238,1,0x206,\u0026ldquo;rm -rf %s/%s\u0026rdquo;,\u0026quot;/mnt/us/documents/dictionaries\u0026quot;,pcVar2); pcVar6 = (char *)system(acStack_238); after: Code: __sprintf_chk(acStack_830,1,0x200,\u0026quot;%s/%s\u0026quot;,\u0026quot;/mnt/us/documents/dictionaries\u0026quot;,pcVar2); pcVar6 = (char *)lab126_rmdir(acStack_830); This was passing strings to \u0026ldquo;system()\u0026rdquo; which is a glaring problem.\nExpanding out a bit: Code: __dirp = opendir(\u0026quot;/mnt/us/documents/dictionaries\u0026quot;); if (__dirp == (DIR *)0x0) { if (iVar1 == 0) { return; } } else { LAB_000134d4: pdVar4 = readdir(__dirp); if (pdVar4 != (dirent *)0x0) { pcVar2 = pdVar4-\u0026gt;d_name; iVar5 = strcmp(pcVar2,\u0026quot;.\u0026quot;); if (((iVar5 != 0) \u0026amp;\u0026amp; (iVar5 = strcmp(pcVar2,\u0026quot;..\u0026quot;), iVar5 != 0)) \u0026amp;\u0026amp; (pcVar6 = strchr(pcVar2,0x2e), pcVar6 == (char *)0x0)) { puVar7 = (undefined4 *)g_list_find_custom(iVar1,pcVar2,\u0026amp;LAB_00012534); if (puVar7 == (undefined4 *)0x0) { __sprintf_chk(acStack_238,1,0x206,\u0026ldquo;rm -rf %s/%s\u0026rdquo;,\u0026quot;/mnt/us/documents/dictionaries\u0026quot;,pcVar2); pcVar6 = (char *)system(acStack_238); if ((pcVar6 == (char *)0x0) || ((g_blanket_llog_mask \u0026amp; 0x2000000) == 0)) goto LAB_000134d4; pcVar2 = \u0026ldquo;E langpicker:DELETE_DICTIONARIES_FAILED:returnCode=%d:Error deleting unneeded dictionary directory\u0026rdquo; It looks like this code walks through \u0026ldquo;/mnt/us/documents/dictionaries\u0026rdquo; (which is on the exposed file system!)\nFor each filename it finds, if it isn\u0026rsquo;t in the list, it will append that filename to a string and pass it to system.\nUsing Shell escapes such as Code: someprogram or Code: $(some program) should be valid filenames. However, slashes are NOT normally allowed (is that why there was a mention of corrupting the VFAT file system?)\nLooking at the calling function, it appears to be: \u0026lsquo;changeLocale\u0026rsquo;\nThis is called from the startup script \u0026ldquo;etc/upstart/langpicker.conf\u0026rdquo; Code: # send the event to langpicker module to install the language lipc-send-event com.lab126.blanket.langpicker changeLocale -s \u0026ldquo;en-US\u0026rdquo; and from \u0026ldquo;langPicker\u0026rdquo; (\u0026ldquo;language_picker.js\u0026rdquo;) Code: setTimeout(function() { nativeBridge.sendLipcEvent(LIPC_PILLOW_SOURCE, \u0026ldquo;changeLocale\u0026rdquo;, changeLocaleParams); actionsInactive = false; }, SPLASH_EVENT_TIME_OUT); It does NOT appear to be called when changing the language in the GUI - but that uses Java (settings booklet) and not Javascript (language_picker.js).\nSo, the exploit path seems to be: Create a file in documents/dictionaries with Shell injection to run something Use \u0026lsquo;mesquito\u0026rsquo; to call the LIPC function changeLocale\n在原文下面有很多用户表示通过这个方法已经成功实现越狱了。 包括但不限于： Kindle 第 10 代（5.14.3.2） KPW4和KPW5 （5.16.2.1和5.16.2） KPW2（5.12.2.2） 但也有很多人表示操作过程中遇到问题，因为项目是刚发布的，后续应该会有修复。\n越狱的相关说明（机翻）：\n越狱部分：\n1.在 Kindle 搜索栏中输入 ;enter_demo 2.重新启动设备 3.进入演示模式后，跳过 wifi 设置，输入随机值进行商店注册 4.跳过搜索演示有效载荷 5.选择 \u0026ldquo;标准 \u0026ldquo;演示类型 6.在提示符下按 \u0026ldquo;完成\u0026rdquo;，以侧载内容。 7.演示设置完成后，做 \u0026ldquo;秘密手势\u0026rdquo;（双指轻点屏幕右下角，然后向左滑动） 8.在搜索栏中输入 ;demo 进入演示配置菜单 9.选择 \u0026ldquo;侧载内容 \u0026ldquo;选项 10.将 LanguageBreak 文件夹的内容复制到 Kindle - 合并并替换所有文件 11.拔下 Kindle 插头，返回演示菜单 12.选择 \u0026ldquo;转售设备 \u0026ldquo;选项 13.然后按 \u0026ldquo;是/转售 14.现在等待按下电源按钮启动 15.一旦出现，将你的 kindle 插回电脑，再次将 LanguageBreak 文件夹的内容复制到电脑中，覆盖文件，然后安全弹出。 16.按照屏幕上的指示按住电源按钮 17.几秒钟后，你将进入语言选择菜单 18.选择 \u0026ldquo;中文\u0026rdquo;（在 \u0026ldquo;奇特的伪托语言 \u0026ldquo;上面的那个）。 19.你的 kindle 应该会重启，屏幕上会出现一些日志信息.\n越狱后的操作：\n1.设备重启后，在搜索栏中输入 ;uzb 2.将设备连接到 PC，然后将 update_hotfix_languagebreak.bin 复制到 Kindle 存储根目录下。 3.弹出设备，输入 ;dsts 或向下滑动并选择设置图标，进入设备设置菜单 4.选择 \u0026ldquo;更新你的 Kindle\u0026rdquo;，安装自定义修复程序 5.这将使您的设备退出演示模式，并清理不需要的越狱文件。\n过段时间我拿自己的KPW3试试（反正我有TTL线，随时跑路）\n","date":"2023-10-30T11:56:00+08:00","permalink":"https://blog.tama.guru/record/LanguageBreak.html","title":"一个新的kindle越狱方案（适用于5.16.2.1.1以下）"},{"content":"导航站的地址不变，依旧是https://tama.host/，只不过原来的版本就只有一个搜索框（其实右侧可以打开导航列表，但是不明显），而且当时脑子一抽用了黄黑做网站logo，我在外面打开自己的网站都脸红！ 而新的导航页基于webstack-go项目，界面简洁干净，且可以选择后台添加内容（纯静态版本就需要手动修改html，上班时间我是打开一个小小的窗口一点点的改，里面天量的div一不小心就错删）。 现在我所做的修改包括：\n把部分静态资源文件扔到OSS上。目前主要是CSS和JS文件以及部分的图片，字体因为阿里云跨域问题保留使用fontawesome和lineicons，至于图标，等以后添加得差不多了再上传。 原来本站的匿名提问箱使用的部分资源位于tama.host下，更换之后这部分无法访问（具体就是10月26日晚至27日中午访问提问箱会出现首页弹窗报错，部分内容不显示），现已新增二级域名并迁移。 把我edge浏览器上杂七杂八的标签整理汇总并分享，后续有好东西会慢慢增加。 ","date":"2023-10-28T01:03:08+08:00","permalink":"https://blog.tama.guru/default/tama-host-remake.html","title":"更换了tama.host的模板，现在更像个导航页了"},{"content":"因为有时候需要部署一些静态网站，但是自己的服务器上网站实在太乱了，部署在github便是我最好的选择。 默认情况下是只能部署一个网站的，如果需要部署多个就需要自己动手操作一下。\n操作的大前提是已经部署好自己用户名的网站仓库，例如我的就是tamakyi.github.io。 之后再创建一个repository，此处的名称就会是之后的二级域名，例如我的Repository name是index，之后这个网站的地址就是https://tamakyi.github.io/index。除了Repository name之外，其他都可以保留默认，然后选择Create repository. 然后要做的就是把本地的网页文件部署上去，因为在Windows环境ixa，为了直观的体现，此处我安装了Github Desktop，在创建完repository之后点击Set up in Desktop跳转到Github Desktop。 然后Locale path选择要clone到本地的目录，例如C:/wwwroot/。 之后该目录下会形成一个index文件夹，然后把静态网站所有文件全部扔上去（注意如果有引用文件记得修改），一定要确保该目录下有index.html文件，能且仅能用html格式。 此处我只放了一个index.html文件，然后在Github Desktop上选择Commit to main并点击Publish branch。 然后在网页端打开仓库，进入setting。 在Pages页面把Branch的None切换到main，然后点击save。 等待几分钟，然后Pages页面就出现网址了。 也能正常打开了。 ","date":"2023-10-25T23:16:29+08:00","permalink":"https://blog.tama.guru/record/github_muti_pages.html","title":"使用github部署多个静态网站"},{"content":"什么是headscale An open source, self-hosted implementation of the Tailscale control server 要说headscale肯定就要先说tailscale，这是一项VPN服务，可让您拥有的设备和应用程序在世界任何地方安全，轻松地访问。它支持使用开源 WireGuard 协议进行加密的点对点连接，这意味着只有专用网络上的设备才能相互通信。 也就意味着，在任意设备上安装tailscale之后，即可组建一个VPN网络，非常方便的达到内网穿透以及达成一些不可告人的目的。\n为什么要安装headscale tailscale是闭源的商业软件，客户端有上限（虽然一般人也用不到它的上限），而且服务器是定死的，国内连接的时候偶尔会有很大的延迟（基本都是200+，但是如果部署在国外就好一些，比如下面是我在南亚的服务器：\nBangalore: 17.85 ms Singapore: 61.31 ms Dubai: 77.91 ms Hong Kong: 98.53 ms Paris: 114.17 ms Madrid: 116.31 ms Frankfurt: 121.60 ms Amsterdam: 121.80 ms Tokyo: 124.99 ms Warsaw: 126.75 ms London: 135.55 ms Sydney: 149.78 ms Miami: 219.59 ms Los Angeles: 220.80 ms Denver: 225.65 ms Seattle: 230.58 ms Chicago: 238.62 ms San Francisco: 242.12 ms New York City: 246.40 ms Dallas: 246.59 ms Toronto: 251.18 ms Nairobi: 280.36 ms Honolulu: 292.43 ms Johannesburg: 294.61 ms São Paulo: 295.29 ms 而headscale则是tailscale的开源解决方案，这意味着所有的流量都只通过你的服务器，功能也任由你选择。 但是headscale有一点不好，它没有图形界面，这意味着需要全程在终端进行操作。\n#####如何安装 ######1.下载并配置 以debian为例，去https://github.com/juanfont/headscale/releases下载适合自己发行版和架构的版本（我没用deb包），下载到/usr/local/bin/并重命名为headscale。 当前最新版是0.22.3，即： wget --output-document=/usr/local/bin/headscale https://github.com/juanfont/headscale/releases/download/v0.22.3/headscale_0.22.3_linux_amd64 之后再加上运行权限： chmod +x /usr/local/bin/headscale 创建目录用来存储数据与证书： mkdir -p /var/lib/headscale 创建空的 SQLite 数据库文件： touch /var/lib/headscale/db.sqlite 创建配置目录并下载配置文件：\nmkdir -p /etc/headscale \u0026amp;\u0026amp; cd /etc/headscale wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml 然后修改配置文件\nnano /etc/headscale/config.yaml 主要修改几个地方：\nserver_url: http://SERVERIP #SERVERIP改为公网IP地址 注意，此处直接修改为http://SERVERIP:PORT1便不会出现404问题 listen_addr: 0.0.0.0:PORT1 #PORT1默认8080，可改为连接的端口，之后连接会通过0.0.0.0:PORT1`进行，如果安装了防火墙记得放行端口 metrics_listen_addr: 0.0.0.0:PORT2 #PORT2默认9090，可改为连接的端口，之后连接会通过0.0.0.0:PORT2`进行，如果安装了防火墙记得放行端口 grpc_listen_addr: 0.0.0.0:50443 magic_dns： false #关闭magic_dns功能 ip_prefixes: - fd7a:115c:a1e0::/48 #自定义IPV6网段，如果用不到可以屏蔽此行 - 10.64.0.0/16 #自定义IPV4网段 创建systemd守护程序\nnano /etc/systemd/system/headscale.service 修改内容为：\n[Unit] Description=headscale controller After=syslog.target After=network.target [Service] Type=simple User=headscale Group=headscale ExecStart=/usr/local/bin/headscale serve Restart=always RestartSec=5 # Optional security enhancements NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=yes ReadWritePaths=/var/lib/headscale /var/run/headscale AmbientCapabilities=CAP_NET_BIND_SERVICE RuntimeDirectory=headscale [Install] WantedBy=multi-user.target 创建 headscale 用户：\nuseradd headscale -d /home/headscale -m 修改 /var/lib/headscale 目录的所有者：\nchown -R headscale:headscale /var/lib/headscale Reload SystemD 以加载新的配置文件：\nsystemctl daemon-reload 启动 Headscale 服务并设置开机自启：\nsystemctl enable --now headscale tailscale 中有一个概念叫 tailnet，你可以理解成租户，租户与租户之间是相互隔离的，具体看参考 Tailscale 的官方文档：What is a tailnet。Headscale 也有类似的实现叫 namespace，即命名空间。我们需要先创建一个 namespace，以便后续客户端接入，例如：\nheadscale namespaces create default #此处命名空间为default 到此服务端部分基本配置完毕。 ######2.接入headscale 对于已经安装了tailscale的linux系统，可以直接执行\ntailscale up --login-server=http://SERVERIP:PORT1 --accept-routes=true --accept-dns=false 如果之前已经接入过tailscale，需要执行：\ntailscale up --login-server=http://SERVERIP:PORT1 --accept-routes=true --accept-dns=false --force-reauth Windows操作其实也类似，按官网说法我们需要修改注册表，但其实我们只要进入软件的安装目录并右键启动Powershell，执行如下命令:\n.\\tailscale.exe up --accept-dns=false --accept-routes --login-server=http://SERVERIP:PORT1 --unattended 之后会提示：\nTo authenticate, visit: http://SERVERIP:PORT1/register/nodekey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 把其中的\nheadscale nodes register --user USERNAME --key nodekey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 复制到服务器终端中，并修改USERNAME为命名空间，比如上面我们设置的是default。 执行之后服务器提示：\nMachine xxx registered 客户端提示：\nSuccess. 在服务器执行 headscale nodes list 可以看到客户端分配到的IP地址为100.64.0.1：\nID | Hostname | Name | MachineKey | NodeKey | User | IP addresses | Ephemeral | Last seen | Expiration | Online | Expired 1 | xxx | xxx | [xxx] | [xxx] | default | 100.64.0.1, | false | 2023-09-13 15:47:03 | 0001-01-01 00:00:00 | online | no 相同的方法再添加第二个服务器，分配到ip:100.64.0.2 用进行互PING已经通了：\n# ping 100.64.0.2 PING 100.64.0.2 (100.64.0.2) 56(84) bytes of data. 64 bytes from 100.64.0.2: icmp_seq=1 ttl=64 time=0.041 ms 64 bytes from 100.64.0.2: icmp_seq=2 ttl=64 time=0.042 ms 64 bytes from 100.64.0.2: icmp_seq=3 ttl=64 time=0.043 ms 64 bytes from 100.64.0.2: icmp_seq=4 ttl=64 time=0.046 ms ^C --- 100.64.0.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3057ms rtt min/avg/max/mdev = 0.041/0.043/0.046/0.002 ms 延迟很低，很好。 ######3.支持了哪些平台？ 截至9月14日，基本已经实现了全平台支持，详情见https://github.com/juanfont/headscale。 官方tailscale在1.30.0之后的版本基本都实现了自定义url。 以安卓为例，打开应用程序后，必须反复打开和关闭右侧顶部栏上的烤肉串菜单图标（三个点），直到菜单中出现“更改服务器”选项。 可以在此处输入http://SERVERIP:PORT1。保存返回上一步，然后选择Sign in with other 然后就一如既往的404了，使用浏览器打开这个网页，添加端口到IP后面再访问。 然后按照上面把那窜命令修改后复制到服务端执行，显示成功后安卓端杀掉tailscale进程，再重新进去之后就可以正常使用了。 ######4.打通局域网 需求:假设本地里面有一台设备,headscale ip为10.64.0.5，内网ip为192.168.50.79，但是我不想内网每台设备都接入headscale，希望通过10.64.0.5来打通局域网。 客户端（10.64.0.5）配置: 1.开启ipv4和ipv6转发\necho \u0026#39;net.ipv4.ip_forward = 1\u0026#39; | tee /etc/sysctl.d/ipforwarding.conf echo \u0026#39;net.ipv6.conf.all.forwarding = 1\u0026#39; | tee -a /etc/sysctl.d/ipforwarding.conf sysctl -p /etc/sysctl.d/ipforwarding.conf 2.修改tailscale启动配置\ntailscale up --login-server=http://SERVERIP:PORT1 --accept-routes=true --accept-dns=false --advertise-routes=192.168.50.0/24 其中http://SERVERIP:PORT1为上面的headscale服务器地址和ip，192.168.50.0/24是客户端的内网网段。 服务端（headscale服务器） 查看10.64.0.5的id\n# headscale nodes list ID | Hostname | Name | MachineKey | NodeKey | User | IP addresses | Ephemeral | Last seen | Expiration | Online | Expired 5 | akarinbot | akarinbot | [WEJPM] | [ETS1a] | tamaroot | 100.64.0.5, fd7a:115c:a1e0::1 | false | 2023-09-14 03:58:37 | 0001-01-01 00:00:00 | online | no 可以看到此处id为5。接下来查看该服务下的路由:\nheadscale routes list -i 5 # headscale routes list -i 1 ID | Machine | Prefix | Advertised | Enabled | Primary 7 | akarinbot | 192.168.50.0/24 | true | false | true 这里路由id为7，且Enabled状态为false。接下来开启这个路由\n# headscale routes enable -r 7 此时Enabled状态为true。 现在在任意客户端访问192.168.50.0/24网段的ip都能联通了。 #####5.其他事项 如果deb包下载很慢，可以用其他软件下载:\nhttps://pkgs.tailscale.com/stable/tailscale_{版本号}_{架构}.deb 例如：\nhttps://pkgs.tailscale.com/stable/tailscale_1.56.1_amd64.deb ","date":"2023-09-14T00:36:00+08:00","permalink":"https://blog.tama.guru/record/headscale.html","title":"在debian下安装headscale的记录"},{"content":"HACS即Home Assistant Community Store，整合了很多homeassistant的第三方集成，比如说米家的相关设备，如果使用官方自带的集成，一般只能识别出几个传感器，而且无法控制，如果想要把米家的设备完全接入就需要安装HACS下面的Xiaomi Miot Auto这个集成，安装之后效果如图所示，基本上能实现HASS管理全部米家设备的想法。 安装HACS难的地方在于需要homeassistant supervised版本，要么在物理机上安装hassos，要么弄个虚拟机给hass，还有一种方法是在debian系的系统上通过docker实现，因为前面两种方法影响太大，我选择第三个。 需要注意的是最好使用原版debian系统，我现在用的是debian 12.1，正好适合。\n####首先肯定是先安装docker\napt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates #安装必要组件 curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor \u0026gt; /usr/share/keyrings/docker-ce.gpg echo \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -sc) stable\u0026#34; \u0026gt; /etc/apt/sources.list.d/docker.list #添加源和证书 ####安装OS-AGENT和supervised\nwget https://github.com/home-assistant/os-agent/releases/download/1.5.1/os-agent_1.5.1_linux_x86_64.deb dpkg -i os-agent_1.5.1_linux_x86_64.deb wget https://github.com/home-assistant/supervised-installer/releases/download/1.5.0/homeassistant-supervised.deb dpkg -i homeassistant-supervised.deb 安装supervised包时可能会报错，需要安装以下依赖包：\napt install libmicrohttpd12 systemd-journal-remote systemd-resolved libnss-resolve jq supervised包安装好后要重启一次机器，不然有可能会遇到解析checkonline.home-assistant.io错误的情况。 重启之后在终端里执行\ndocker ps 可以看到出现了很多进程。\n~ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80d950683f05 ghcr.io/home-assistant/amd64-hassio-multicast:2023.06.2 \u0026#34;/init\u0026#34; 3 hours ago Up 3 hours hassio_multicast e2c45b161283 ghcr.io/home-assistant/amd64-hassio-audio:2023.06.0 \u0026#34;/init\u0026#34; 3 hours ago Up 3 hours hassio_audio 61df701e5ca7 ghcr.io/home-assistant/amd64-hassio-dns:2023.06.2 \u0026#34;/init\u0026#34; 3 hours ago Up 3 hours hassio_dns a6d8e3385086 ghcr.io/home-assistant/amd64-hassio-cli:2023.06.0 \u0026#34;/init\u0026#34; 3 hours ago Up 3 hours hassio_cli 9c80287b1474 ghcr.io/home-assistant/qemux86-64-homeassistant:2023.8.4 \u0026#34;/init\u0026#34; 3 hours ago Up 36 minutes homeassistant 7f3cb9ef899e ghcr.io/home-assistant/amd64-hassio-observer:2023.06.0 \u0026#34;/usr/bin/observer\u0026#34; 3 hours ago Up 3 hours 0.0.0.0:4357-\u0026gt;80/tcp, :::4357-\u0026gt;80/tcp hassio_observer 1e946ecbdc4d ghcr.io/home-assistant/amd64-hassio-supervisor:latest \u0026#34;/init\u0026#34; 3 hours ago Up 3 hours hassio_supervisor 这个过程可能需要几分钟，如果可行的话建议还要挂上梯子。几分钟后浏览器访问http://IP:8123可以到达hass界面，如果访问不了的建议检查防火墙是否放行8123端口。 ####安装HACS并配置Xiaomi Miot Auto 安装HACS只需要在终端里执行\nwget -O - https://get.hacs.xyz | bash - 会自动安装到hass的第三方目录下，安装完成后重启HASS。 然后在HACS下的集成选择浏览并下载存储库，在其中找到Xiaomi Miot Auto，选择安装。 安装完成之后在配置-设备与服务-添加集成-选择Xiaomi Miot Auto，然后输入小米账号ID 密码 服务器选择CN，保存之后所有设备就都出来。\n","date":"2023-08-25T11:58:39+08:00","permalink":"https://blog.tama.guru/record/homeassistant-hacs-debian12.html","title":"Debian12下通过docker安装homeassistant-hacs"},{"content":"Anaconda 是一个用于科学计算的 Python 发行版，支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。Miniconda 是一个 Anaconda 的轻量级替代，默认只包含了 python 和 conda，但是可以通过 pip 和 conda 来安装所需要的包。通常情况下安装Miniconda构建虚拟环境是很方便的，但是安装过程中会碰到一些奇怪的问题导致使用时一直报错，这里记录一下一个成功的安装方法。\n####下载并执行安装脚本\nchmod +x Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh 然后一路yes,到最后一步是否conda init一定要选no，不然大概率出问题。 ####修改.zshrc 文件位于用户名根目录下，打开后在最后一行添加\neval \u0026#34;$(/root/miniconda3/bin/conda shell.zsh hook)\u0026#34; 因为我安装位置在/root下，如果不是这个路径自行修改。 然后使文件生效：\nsource ~/.zshrc ####修改为国内源 首先执行：\nconda config --write-default 然后用户目录下会有一个.condarc的文件，打开，在最后输入\nchannels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/ # channel_priority: flexible channel_priority: strict # pip_interop_enabled: false pip_interop_enabled: true # safety_checks: warn safety_checks: enabled # auto_activate_base: true auto_activate_base: false # report_errors: report_errors: false 保存，然后执行\nconda update --all 可以看到现在更新很快了。\n","date":"2023-08-25T01:04:56+08:00","permalink":"https://blog.tama.guru/record/miniconda.html","title":"zsh下miniconda的正确安装方法及换源方法"},{"content":"通过cloudflare zero trush可以非常快速且方便的搭建内网穿透，而且速度一般情况下可以接受，最重要的是成本很低，你只需要：\n一个cloudflare账号 一个托管到cloudflare的域名 以上内容百度到处都是，不再赘述，以下仅记录搭建webssh的过程。\n####1、安装并配置tunnel 需要在ssh服务器上执行如下命令：\n#安装cloudflared，我用的arch，其他平台自己替换。 sudo pacman -S cloudflared #这一步执行后会得到一个链接，复制到浏览器打开，然后选择一个托管到cloudflare的域名，确认之后会将对应的pem证书推到你服务器的.cloudflare目录下。 cloudflared tunnel login #创建一个tunnel，其中$tunnel-name自行配置 cloudflared tunnel create $tunnel-name #查看tunnel列表 cloudflared tunnel list 此时在输出的列表中找到刚才创建的tunnel名为$tunnel-name对应的ID，一般格式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。 ####2.创建配置文件。 进入用户目录下的.cloudflared文件夹，创建名为config.yam的文件，内容如下：\ntunnel: $ID credentials-file: /home/$username/.cloudflared/$ID.json ingress: # ssh - hostname: ssh.example.com service: ssh://localhost # vnc远程桌面，端口5900 - hostname: vnc.example.com service: tcp://localhost:5900 # 其他http服务 - hostname: file.example.com service: http://localhost:9527 - hostname: speed-test.example.com service: http://localhost:9898 # 如果都没有匹配，则返回404，这句不能少 - service: http_status:404 其中$ID替换为上面的ID，$username为你服务器本地用户名，hostname字段对应外网访问的网址，service字段对应内网网址，如果是带端口的在后面增加即可。 ####3.写一个脚本，自动更新DNS以及运行tunnel vim ~/tunnel-sh.sh 内容如下：\n# update cloudflare DNS record /usr/bin/cloudflared tunnel route dns $tunnel-name ssh.example.com /usr/bin/cloudflared tunnel route dns $tunnel-name vnc.example.com /usr/bin/cloudflared tunnel route dns $tunnel-name file.example.com /usr/bin/cloudflared tunnel route dns $tunnel-name speed-test.example.com # run tunnel /usr/bin/cloudflared tunnel run $tunnel-name 注意把$tunnel-name和网址换成自己的。 ####4.开机自启 新建一个service， sudo vim /etc/systemd/system/cloudflared-tunnel.service 内容如下：\n[Unit] Description=cloudflared tunnel Wants=network-online.target After=network-online.target [Service] User=$username ExecStart=sh /home/$username/tunnel-sh.sh [Install] WantedBy=default.target 注意把$username换成自己的。 ####5.启动\u0026amp;开机自启\nsudo systemctl start cloudflared-tunnel.service sudo systemctl enable cloudflared-tunnel.service ####6.配置application ssh是无法直接访问的，但是cloudflare提供了application套件，配置位于cloudflare的zerotrush下的access目录。 进去之后选择add an application，类型选self hosted Application Configuration配置如下： Application name(Required):app名称，随意设定 Session Duration(Required):会话时长，设置一次会话多久超时，一般默认24即可。 Application domain:我们在服务器上的配置中ssh访问链接为ssh.example.com，因此这里填ssh Domain(Required):域名，我们在服务器上的配置中ssh访问链接为ssh.example.com，因此这里填example.com 然后点击next。 Policy配置与安全性相关：，规则名称 Policy name：随意设定 Action:选择这个规则下的内容允许还是拒绝 Session duration：一次会话多久过期 Configure rules配置如下： Selector:规则认证方式，以email为例，会要求每次进入网页验证邮箱PIN码 Value：规则，与Selector相关。 然后点击next。 在Additional settings下的Browser rendering切换为SSH，最后点击add application即可web访问到ssh了。\n","date":"2023-08-18T14:23:00+08:00","permalink":"https://blog.tama.guru/record/cloudflare_webssh_zerotrush.html","title":"通过Cloudflare零信任(cloudflare zero trush)给内网服务器做穿透并搭建webssh的小记"},{"content":"来自：https://www.mivm.cn/archlinux-installation-guide-simple\n###硬盘分区 如果你需要 Linux + Windows 双系统，建议使用两个物理硬盘安装，以下分区方式不适用于单硬盘双系统。如果你想要单硬盘双系统，可以加入 QQ 群向我询问。\n执行fdisk -l查看硬盘以及分区列表，确定你要用于安装系统的硬盘路径，比如这里我用的是/dev/sda。loop 设备是光驱等虚拟设备，不是真实的硬盘，不能用于安装系统。\n确认硬盘\n如果你有多块硬盘，第一块硬盘一般为/dev/sda 或/dev/nvme0n1 (NVME)，第二块硬盘一般为/dev/sdb 或/dev/nvme0n2 (NVME)，以此类推。U 盘或移动硬盘也会被列出，注意不要搞错。\n如果你的硬盘没有被列出，可能是在 BIOS 开启了 RAID 模式（部分笔记本会默认开启），前往 BIOS 将硬盘模式改为 AHCI 模式即可，更改后可能会导致现有的 Windows 无法启动。\n下述分区操作将清空目标硬盘数据，请在操作前做好数据备份。\n务必将下列命令中的${diskPath}替换为你的硬盘路径。示例：sgdisk /dev/sda\n擦除分区表：sgdisk -Z ${diskPath}\n创建大小为 260M 的 ESP 分区 （UEFI 引导必要分区）：sgdisk -n=0:0:+260M -t=0:ef00 ${diskPath}\n使用剩余空间创建系统分区：sgdisk -N=0 ${diskPath}\n显示分区信息：fdisk -l ${diskPath}，对比你的分区信息是否与下列信息相似，重点是分区类型 (Type)。\nDisk ${diskPath}: *** GiB, *** bytes, *** sectors Disk model: *** Units: sectors of 1 * *** = *** bytes Sector size (logical/physical): *** bytes / *** bytes I/O size (minimum/optimal): ** bytes / *** bytes Disklabel type: gpt Disk identifier: *** Device Start End Sectors Size Type ${diskPath}1 *** *** *** 260M EFI System ${diskPath}2 *** *** *** ***G Linux filesystem PS：给 ESP 分区分配 260M 空间是为了兼容不同硬盘，不同的 UEFI 固件，以及存放系统内核和 initramfs。对于某些早期或者有缺陷的 UEFI 实现，可能至少需要分配 512M。\n某些教程的分区步骤会创建一个额外的 SWAP（交换空间）分区，这里并不推荐创建，具体原因参考下面的【设置交换空间】章节\n如果你的硬盘空间较大，或者想把系统和数据分别存放在不同的分区，想要多个分区也可以。\n格式化并挂载分区 格式化 ESP 分区为 FAT32：mkfs.fat -F 32 ${part1Path}，把${part1Path}替换为第一个分区的路径，示例：mkfs.fat -F 32 /dev/sda1\n注意：如果你在格式化 ESP 分区的时候提示：WARNING: Not enough clusters for a 32 bit FAT!，请尝试使用mkfs.fat -s 2 -F 32 ${part1Path}或mkfs.fat -s 1 -F 32 ${part1Path}命令来格式化 ESP 分区，否则 UEFI 固件可能会无法读取 ESP 分区。\n格式化系统分区为 EXT4：mkfs.ext4 -m 5 ${part2Path}，把${part2Path}替换为第二个分区路径，示例：mkfs.ext4 -m 5 /dev/sda2\nPS：-m是指定保留块所占百分比，默认值为 5，用作保留快的空间不能被使用。你可以减小这个值增加分区的可用空间，或者增大这个值提升固态硬盘的性能。\n如果你想要更好的性能和更现代的功能，可以在系统分区尝试使用 XFS 文件系统：mkfs.xfs ${part2Path}\nXFS 可能需要手动维护，参考：https://wiki.archlinux.org/title/XFS\nPS：XFS 分区大小目前只支持扩容，不支持缩小。\n当然你也可以在系统分区使用其他文件系统，比如 Btrfs、JFS、F2FS 等，你可以前往 ArchWiki 查看这些文件系统的对应文档。\n挂载系统分区：mount ${part2Path} /mnt，把${part2Path}替换为第二个分区路径，示例：mount /dev/sda2 /mnt\n创建 ESP 分区挂载路径：mkdir /mnt/boot\n挂载 ESP 分区：mount -o umask=0077 ${part1Path} /mnt/boot，把${part1Path}替换为第一个分区路径，示例：mount -o umask=0077 /dev/sda1 /mnt/boot\n检查分区是否挂载成功：df，如果输出包含类似以下行，则代表挂载成功。\nFilesystem Size Used Avail Use% Mounted on ${part2Path} *** *** *** ***% /mnt ${part1Path} *** *** *** ***% /mnt/boot ###设置中国镜像源（推荐） 安装环境默认启用了所有的软件镜像源，为了使安装更顺利，建议只使用位于中国的镜像，如果你不在中国或者对自己的网络有信心可以忽略此操作。\n下载中国镜像列表：curl -L -o /etc/pacman.d/mirrorlist \u0026quot;https://archlinux.org/mirrorlist/?country=CN\u0026quot;\n执行nano /etc/pacman.d/mirrorlist编辑镜像列表文件，删除#Server = 前面的#以启用镜像，不需要全部启用，一般 3 个就够了。某些镜像同时支持 HTTP 和 HTTPS 协议，只需要删除 HTTPS 协议行的#。\nPS：镜像列表默认按照字母排序，推荐安装完系统后选择一个速度较快的镜像，并把它放在其他镜像前面。阿里云、华为云、腾讯云 等云服务商也有 ArchLinux 软件源镜像，但是还没有加入官方镜像列表，大家可以手动添加使用。\nPPS：不同的镜像更新间隔有些许不同，而 Arch 又是一个以滚动发布著称的发行版，软件更新频率较快。如果你对更新频率有较高的要求，建议选择更新间隔较短的镜像。\n###安装系统 设置本地化环境：export LANG=C\n安装所需软件包到系统分区：pacstrap /mnt base linux linux-firmware bash-completion e2fsprogs nano networkmanager pacman-contrib sudo amd-ucode intel-ucode sof-firmware\n软件包介绍 base: ArchLinux 运行所需的基础软件包集合\nlinux: Linux 内核\nlinux-firmware: Linux 设备驱动集合，包含了绝大多数设备的驱动（固件）。\nbash-completion: Bash 补全支持\ne2fsprogs: EXT4 文件系统实用工具\nnano: 文本编辑器\nnetworkmanager: 网络管理器\npacman-contrib: pacman 相关实用脚本\nsudo: 用于普通用户获取 root 权限\namd-ucode intel-ucode: AMD 和 Intel 的 CPU 微码更新，用于修补 CPU 漏洞。\nsof-firmware: Open Sound 固件\n虚拟机用户不需要安装amd-ucode intel-ucode，物理机用户也可以只安装适用于你电脑的 CPU 的微码包，比如 AMD CPU 用户就不需要安装intel-ucode。\n如果你使用了 XFS 文件系统，将e2fsprogs替换为xfsprogs，或者替换为你的文件系统的工具包。\n如果你的设备不是笔记本可以不安装sof-firmware，也可以等到稍后设备没声音时再安装它尝试修复。\n可以趁安装的这段时间喝口水，它并不需要很久。\n成功安装完成后执行genfstab -U /mnt \u0026gt; /mnt/etc/fstab生成 fstab 文件\n最后执行arch-chroot /mnt进入新系统环境\n###系统初始化设置 ####设置时区为中国：ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime，你也可以设置为所在的时区，完整的时区列表：https://twiki.org/cgi-bin/xtra/tzdatepick.html\n####同步硬件时钟：hwclock --systohc\n务必将下列命令中的${hostname}替换为你的主机名（例如：kanto）。主机名建议使用小写字母组成，最多 64 个字符，你可以使用下面的输入框验证主机名是否符合规则。\n请输入主机名 ####设置系统主机名： echo ${hostname} \u0026gt; /etc/hostname\n执行nano /etc/hosts编辑 hosts 文件并添加以下行：\n127.0.0.1 localhost 127.0.0.1 ${hostname} ::1 ip6-localhost ip6-loopback ::1 ${hostname} 执行nano /etc/locale.gen编辑本地化配置文件，删除以下行前面的#，可以使用Page Up和Page Down健来快速翻页上下滚动。\n#en_US.UTF-8 UTF-8 #zh_CN.UTF-8 UTF-8 #zh_TW.UTF-8 UTF-8 如果你需要其他本地化，删除其他行前的#，行末尾务必是 UTF-8。最后保存退出，执行locale-gen生成本地化环境。\n设置默认本地化环境：echo LANG=en_US.UTF-8 \u0026gt; /etc/locale.conf，为了确保兼容性，默认本地化环境最好是英语。\n执行SUDO_EDITOR=nano visudo编辑 sudo 配置文件，删除# %wheel ALL=(ALL) ALL行前面的#以便让 wheel 用户组可以使用sudo获取 root 权限。\n务必将下列命令中的${username}替换为你的用户名（例如：pikachu）。用户名建议使用小写字母组成（不能包含大写字母、不能以数字开头），最多 32 个字符，你可以使用下面的输入框验证用户名是否符合规则。\n请输入用户名 创建一个新用户并加入 wheel 用户组：useradd -m -G wheel -s /bin/bash ${username}\n设置新用户密码：passwd ${username}\nPS：输入密码时不会显示\n安装引导管理程序（重要）： 安装 GRUB 软件包：pacman -S grub\n安装 GRUB 至 ESP 分区：grub-install --removable --target=x86_64-efi --efi-directory=/boot，提示Installation finished. No error reported.字样表示安装成功。\n生成 GRUB 配置文件：grub-mkconfig -o /boot/grub/grub.cfg\nPS: 如果你电脑的 UEFI 固件不支持 64 位 UEFI 文件，则需要安装 32 位 UEFI 文件才能成功引导：grub-install --removable --target=i386-efi --efi-directory=/boot\n如果你不喜欢 GRUB，或者喜欢简单的引导管理程序，可以尝试下 systemd-boot。\n退出新系统环境：exit\n执行umount -R /mnt卸载分区，如果没有错误，拔掉 ArchLinux 安装盘并执行reboot重启系统。\n没有意外的话，应该成功启动至新系统并看到以下界面，login 前面显示的是主机名，输入刚刚创建的新用户名和密码登陆系统。\n成功启动\nPS：如果你有多个系统，可能并不会重启至 ArchLinux，需要你手动选择 ArchLinux 启动。\n进阶设置 root 权限小贴士 sudo 是临时获取 root 权限的工具，如果需要 root 权限执行某个命令，可以使用 sudo 执行它。sudo 提供了细粒化的控制，使它更加的安全。\n虽然su也可以获取 root 权限，但是正常情况下你不应该使用它，相较 sudo，它太暴力了。如果没有设置 root 密码，su也将无法工作。\n一些命令内置了独立的提权实现，比如systemctl命令，当这些命令需要 root 权限，但是没有以 root 身份允许时，它们就会使用自己的提权实现进行提权操作。\n可以使用sudo -i临时登陆到 root 用户的 Shell。\nroot 虽好，但不要滥用，使用之前应该先了解当前命令的操作是否真的需要 root 权限，滥用 root 权限轻则会导致一些程序无法正常工作，重则会危及系统安全。\nPS：ArchLinux 的 root 用户默认处于无密码锁定状态，除非你清楚自己在做什么，否则不建议解锁或设置密码。\n启用网络管理器（注意大小写）：sudo systemctl enable --now NetworkManager\n如果是无线网络，执行nmtui使用图形界面进行配置，选择「Activate a connection」连接无线网络。\n如果你还想继续使用 SSH 远程控制，执行sudo pacman -S openssh安装 OpenSSH，然后执行sudo systemctl start sshd启动 SSH 服务器。\n不过此时就不能使用 root 用户登陆 SSH 了，需要使用刚刚创建的新用户。\n禁用网络管理器的连接等待（注意大小写）：sudo systemctl disable NetworkManager-wait-online，禁用后可以加快系统启动，不会有副作用，除非某些自动启动的服务需要互联网。\n启用从网络同步系统时间：sudo timedatectl set-ntp true\n启用本地 DNS 解析器（可选，建议启用）：sudo systemctl enable --now systemd-resolved\n创建 DNS 解析文件软链接（依赖上一个操作）：sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf\n启用每周自动清理不需要的 Pacman 软件包缓存（可选，建议启用）：sudo systemctl enable paccache.timer\n如果你使用的硬盘支持 TRIM 特性（大多数固态硬盘都支持），建议启用定时执行 TRIM：sudo systemctl enable fstrim.timer\n如果你需要使用 Wine、Steam 或其他的 32 位程序，执行sudo nano /etc/pacman.conf编辑 Pacman 配置文件，删除以下行前面的#以启用 32 位系统库支持。\n#[multilib] #Include = /etc/pacman.d/mirrorlist 保存后执行sudo pacman -Sy更新软件数据库\n添加 ArchLinuxCN 存储库（推荐）： Arch Linux 中文社区仓库是由 Arch Linux 中文社区驱动的非官方软件仓库，包含许多官方仓库未提供的额外的软件包，以及已有软件的 git 版本等变种。一部分软件包的打包脚本来源于 AUR，但也有许多包与 AUR 不一样。（关于 AUR 的介绍请见下面的章节）\nArchLinuxCN 依靠镜像加速可以在国内提供比 AUR 更好的体验，而且还省去了部分软件的编译过程。如果你的网络环境导致无法顺利从 AUR 安装某些软件包，推荐添加。\n执行sudo nano /etc/pacman.conf编辑 Pacman 配置文件，在底部添加以下行。\n[archlinuxcn] Server = https://opentuna.cn/archlinuxcn/$arch 保存后执行sudo pacman -Sy archlinuxcn-keyring更新软件数据库并安装 ArchLinuxCN GPG 密钥，如果安装命令出现error: archlinuxcn-keyring: Signature from \u0026quot;Jiachen YANG (Arch Linux Packager Signing Key) \u0026quot; is marginal trust这样的错误，执行命令sudo pacman-key --lsign-key \u0026quot;farseerfc@archlinux.org\u0026quot;修复，然后再重新执行安装命令。\n安装防火墙支持（可选）： 如果你需要在非信任的网络下使用设备，推荐使用防火墙增强你的设备网络安全性，如果你只在你信任的网络下使用设备，那么可以不安装。\n防火墙有很多选择，ArchLinux 的基础包默认已经包含了 iptables 实用工具，用于配置 Linux 内核实现的防火墙，不过由于它并不易用，我推荐最好是使用易用的 iptables 前端。\n我推荐大家安装 Firewalld，它简单易用，并且我们待会安装的桌面环境可以很好的集成它，便于使用图形界面管理。其他 iptables 前端可参考：https://wiki.archlinux.org/title/Iptables#Front-ends\n安装防火墙：sudo pacman -S firewalld\n启用防火墙：sudo systemctl enable --now firewalld\nFirewalld 更多信息：https://wiki.archlinux.org/title/Firewalld\n###安装显卡驱动、Vulkan 和硬件加速支持： 如果不知道该装那个，可以加入 QQ 群向我询问。\n小山只实际测试过 AMD 和 Intel 的显卡驱动安装，Nvidia 显卡驱动安装尚未测试。\nVulkan 是跨平台图形接口，目前主要用途是在 Linux 下运行 Windows 游戏以及部分 Linux 游戏（详见：Linux 运行 Windows 游戏指南），但并不是所有显卡都支持它，你可以前往 https://vulkan.gpuinfo.org/listreports.php?platform=linux 查询你的显卡是否支持 Vulkan。\nOpenCL 是可选的，推荐需要时再安装。\n如果你没有启用 32 位系统库支持，执行下列命令时务必删除lib32开头的软件包。\n####AMD #####图形加速库 sudo pacman -S mesa\n#####硬件视频加速 sudo pacman -S mesa-vdpau libva-mesa-driver lib32-mesa lib32-mesa-vdpau lib32-libva-mesa-driver lib32-opencl-clover-mesa 注：原文 lib32-opencl-mesa已不适用,换用ib32-opencl-clover-mesa\n#####Vulkan： sudo pacman -S vulkan-icd-loader vulkan-radeon lib32-vulkan-icd-loader lib32-vulkan-radeon\n#####OpenCL sudo pacman -S ocl-icd 注：原文opencl-mesa已不适用，废除。\nandvlk 是由 AMD 开源的 AMD GPU Vulkan 实现，这个实现比 Mesa 的 RADV 在某些场景下性能要好一些，并且系统允许安装多个 Vulkan 实现并让软件进行选择，推荐游戏玩家安装。\n####Intel #####图形加速库 sudo pacman -S mesa\n硬件视频加速：如果你的 Intel CPU 架构是 Broadwell 或以上（包括 Intel Arc 显卡）的安装intel-media-driver，反之则安装libva-intel-driver。\n#####Vulkan sudo pacman -S vulkan-icd-loader vulkan-intel lib32-mesa lib32-vulkan-icd-loader lib32-vulkan-intel\nOpenCL：如果你的 Intel CPU 架构是 Broadwell 或以上（包括 Intel Arc 显卡）的安装intel-compute-runtime ocl-icd，反之则安装beignet ocl-icd，beignet 需要通过 AUR 安装。\n####Nvidia 前往 https://www.nvidia.com/en-us/drivers/unix/legacy-gpu/ 查看 Nvidia 私有驱动最新版本不支持的显卡列表，如果你的显卡不在这个列表里，那么你可以使用最新的 Nvidia 私有驱动，反之则需要使用开源驱动或旧版私有驱动（通过 AUR 安装）。\n#####Nvidia 私有驱动 sudo pacman -S nvidia nvidia-settings cuda xorg-server-devel lib32-nvidia-utils\n#####Nvidia 开源驱动 (RTX 3000 系列或更高) sudo pacman -S nvidia-open nvidia-settings cuda xorg-server-devel lib32-nvidia-utils\n#####OpenCL sudo pacman -S opencl-nvidia ocl-icd lib32-opencl-nvidia\nNouveau 是 Linux 内核的 Nvidia 显卡开源驱动，由于 Nvidia 新显卡需要签名固件，所以它无法支持一些较新系列的显卡，推荐 GTX 700 或以下系列使用。\n#####Nouveau 图形加速库 sudo pacman -S mesa\n#####Nouveau 硬件视频加速 sudo pacman -S mesa-vdpau libva-mesa-driver lib32-mesa lib32-mesa-vdpau lib32-libva-mesa-driver\nPS：如果是双显卡的笔记本，运行软件时可以选择使用的显卡（默认是集成显卡）。参见：https://wiki.archlinux.org/title/PRIME\n如果你不需要桌面环境，那么你的安装到这里就可以结束了，也可以看看下面的 AUR 介绍和推荐阅读。 安装显示管理器和桌面环境： 本指南以 KDE Plasma 桌面环境 + SDDM 显示管理器为例\nPlasma 是功能全面且对新手友好的桌面环境，具有高度可定制性，并且它在最近的更新中，性能提升了很多。\nSDDM 显示管理器是 Plasma 推荐的显示管理器\n如果你想使用其他桌面环境或显示管理器，建议前往其他桌面环境或显示管理器的 ArchWiki 页面详细了解\n桌面环境列表：https://wiki.archlinux.org/title/Desktop_environment#List_of_desktop_environments\n显示管理器列表：https://wiki.archlinux.org/title/Display_manager#List_of_display_managers\n#####安装桌面环境、显示管理器、终端（Konsole）以及 Noto 字体集 sudo pacman -S --noconfirm plasma sddm konsole noto-fonts noto-fonts-cjk noto-fonts-emoji\n#####安装 Plasma 可选依赖（使其更好的工作） sudo pacman -S --asdeps gst-plugins-good packagekit-qt5 xsettingsd\n如果你是笔记本用户，推荐安装fwupd以便通过 LVFS 接受来自厂商的固件更新（需要厂商支持），以及安装power-profiles-daemon获取电源配置文件支持（需要设备支持）。\n可能无用的软件包 plasma 是个软件包组，里面可能会有一些用不上的软件包。\n以下软件包根据需求决定是否需要卸载\ndrkonqi: KDE 崩溃处理程序\nkgamma5: 调整显示器的伽玛设置（已不存在）\nksshaskpass: ssh-add 密码助手\nplasma-firewall: 防火墙管理界面\nplasma-sdk: Plasma 开发工具包\nplasma-thunderbolt: Thunderbolt（雷电）设备管理界面\nplasma-vault: 创建加密的保险库（需要额外的可选依赖）\nplasma-workspace-wallpapers: Plasma 桌面的额外壁纸\n卸载以上列出的软件包：sudo pacman -Rns drkonqi ksshaskpass plasma-firewall plasma-sdk plasma-thunderbolt plasma-vault plasma-workspace-wallpapers\n#####安装蓝牙支持（可选）： 安装：sudo pacman -S bluedevil\n安装可选依赖（蓝牙音频支持）：sudo pacman -S \u0026ndash;asdeps pulseaudio-bluetooth\n启用：sudo systemctl enable bluetooth\n设置交换空间（可选） 交换空间（Swap）是硬盘上的一块区域，通俗的讲就是虚拟内存，跟 Windows 下的虚拟内存（分页文件）是一样的，当物理内存不够用时内核会把部分物理内存数据转移到交换空间，从而使需要更多内存的程序可以运行。\n交换空间是可选的，如果你的物理内存不够大，那么你可以使用交换空间使内存利用更高效，如果你的物理内存足够使用，也可以不需要使用交换空间。\n由于交换空间是使用硬盘作为存储介质，所以它无法达到像物理内存的速度，特别是在机械硬盘或 SATA 固态硬盘上面，如果硬盘速度太慢，会使交换空间弊大于利。\n可能某些人会告诉你虚拟内存的大小务必是物理内存的两倍，无论是 Windows 还是 Linux，这种说法是完全错误的，虚拟内存的大小完全根据需求决定（Windows 默认会自动管理虚拟内存大小）。\n如果要使用交换空间，你也可以尝试一下 Zswap 和 ZRAM，两者皆在物理内存中提供压缩的交换空间，从而使物理内存可以容纳更多的数据，减少硬盘上的交换空间的 I/O 操作，有效延长固态硬盘寿命，代价是使用更多的 CPU。\n注意：当你启用了交换空间，部分桌面的电源菜单会出现「休眠」选项，但是它并不会工作，因为休眠需要配置内核参数以及 initramfs hook。参见：https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate#Hibernation\n交换分区 VS 交换文件： 交换空间用硬盘上的一块区域作为虚拟内存，这块区域既可以是一个文件，也可以是一个完整的分区。\n以前 Linux 安装会建议为交换空间创建一个单独的分区，以确保交换空间的最佳性能。这种做法是因为在当时大多数电脑还是机械硬盘，机械硬盘起始扇区的速度可能会更快，完整的分区还可以避免碎片等问题。但是缺点也很明显，一旦建立分区，调整大小会非常麻烦，自由度较低。\n现在的电脑大多数都使用固态硬盘，没有了机械硬盘的一些限制，所以更推荐使用交换文件，可以使交换空间更加灵活。\n推荐使用 systemd-swap 来管理交换空间、Zswap 或 ZRAM，它可以根据当前内存和交换空间的使用情况自动创建新的交换空间，同时也可以比较方便的管理 Zswap 和 ZRAM。不过由它创建的交换文件并不能用于系统休眠，如果你有系统休眠需求，建议手动创建。\n更多关于交换空间请参考：https://wiki.archlinux.org/title/Swap\n更改显示管理器（SSDM）本地化环境（可选）： 如果要让 SDDM 的本地化环境为非英文，可以执行以下更改。\nPS：本地化环境除了影响语言显示，还有时间格式。\n执行sudo SYSTEMD_EDITOR=nano systemctl edit sddm编辑 SDDM 服务单元，在文件第 3 行添加：\n[Service] Environment=LANG=zh_CN.UTF-8 如果是其他语言用户，可以把zh_CN替换为你需要的本地化。\n执行sudo systemctl enable sddm启用 SDDM\n执行sudo reboot重启系统，重启后应该会看到如下图所示的界面，输入密码登陆桌面环境。\n如果没有看到如下图所示的界面，可能是显卡驱动的安装有问题。\nSSDM\n###Plasma 桌面环境配置 点击屏幕左下角的按钮打开应用启动器，点击「System Settings」打开系统设置。\n点击「Regional Setting」，点击系统设置界面右下角的「Add languages\u0026hellip;」添加简体中文和繁体中文，并把英文排到最后，简繁排第一和第二，然后点击右下角的「Apply」。点击左侧的「Formats」，选择「Regional」为「中国 - 简体中文 (zh_CN)」，或者选择你所在的区域，然后点击右下角的「Apply」。\nPS：简繁的优先级顺序取决于个人，因为有些程序可能没有简体或繁体翻译，简繁同时存在可以在没有其中一种翻译的情况下使用另一种翻译，如果两个都没有再使用英文。\n按下Ctrl + Alt + Delete，选择「Log Out」注销会话并重新登录使其生效。\n注：如果注销后发现图形界面为半中半英的，可以把~/.config/plasma-localerc中Formats的zh_CN修改为zh_CN.UTF-8.并注销桌面。\n在应用启动器里找到「Konsole」，也可以通过快捷键Ctrl + Alt + T打开，这是 Plasma 桌面下的终端。\n安装输入法、浏览器和其他实用软件 你也可以完全按照偏好去选择其他软件，或者不安装，下面有每个软件包的介绍。\n安装：sudo pacman -S --noconfirm dolphin ark kwrite gwenview fcitx5-im fcitx5-chinese-addons fcitx5-pinyin-zhwiki firefox firefox-i18n-zh-cn firefox-i18n-zh-tw\n安装 dolphin 可选依赖（视频缩略图支持）：sudo pacman -S --asdeps ffmpegthumbs\n安装 ark 可选依赖（更多压缩包格式支持）：sudo pacman -S --asdeps lrzip lzop p7zip unrar\n安装 gwenview 可选依赖（更多图片格式支持）：sudo pacman -S --asdeps qt5-imageformats\n软件包介绍 dolphin = 文件管理器、ark = 压缩工具、kwrite = 文本编辑器、gwenview = 图片浏览器，这些软件都属于 KDE 家族，搭配 KDE Plasma 桌面使用更佳。\nfcitx5-im: Fcitx5 输入法框架的软件包组（或许你喜欢 IBus？）\nfcitx5-chinese-addons: Fcitx5 中文插件集合，包含拼音输入法等插件。\nfcitx5-pinyin-zhwiki: 来自 zh.wikipedia.org 的 Fcitx5 拼音输入法字典\n更多基于 Fcitx5 的中文输入法：https://wiki.archlinux.org/title/Fcitx5#Chinese\nfirefox: FireFox 浏览器\nfirefox-i18n-zh-cn firefox-i18n-zh-tw: FireFox 的简繁中文语言包，你也可以只安装需要的语言包。\n如果你更偏爱使用 Chromium / Google Chrome 浏览器，可以安装chromium软件包。\nPS：Chromium 是开源版的 Google Chrome，它们的区别参见 https://en.wikipedia.org/wiki/Chromium_(web_browser)#Differences_from_Google_Chrome。Google Chrome 可以通过 AUR 或 ArchLinuxCN 安装。\nPPS：2021年3月15日起 Chromium 不再支持与 Google API 相关的功能，包括 Google 账户登陆和同步等。如果你需要使用这些功能，最佳方法是安装 Google Chrome，还有一种方法可以使 Chromium 恢复这些功能支持，你可以前往 ArchWiki 了解或加入 QQ 群向我询问。\n更多 KDE 家族应用：apps.kde.org\n执行nano ~/.bash_profile配置输入法环境变量，添加以下行：\nexport GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export SDL_IM_MODULE=fcitx PS：输入法需要重启系统或重新登录才会生效\n输入法默认激活快捷键：Ctrl + 空格\n输入法的设置可以在 「系统设置」→「区域设置」→「输入法」修改，你可以点击「添加输入法」来添加拼音或其他输入法。\nPlasma 设置优化 外观 → 字体：除了等宽字体，其余字体修改为 [Sans Serif]（无衬线）。如果你觉得字体看起来不正常（对比下图），可以加入 QQ 群与我交流。\n开机和关机 → 登陆屏幕 (SDDM)： 主题更改为「微风」\nDiscover 可以用于安装/更新/卸载系统软件包和 Plasma 插件/主题，还有来自 LVFS 的固件更新。\n删除安装过程中下载的软件包：sudo pacman -Scc --noconfirm\n重启系统开启你的 ArchLinux 之旅\nArchLinux For Plamsa\n安装 AUR 软件包管理器（可选） 什么是 AUR？\nAUR 全称是 Arch User Repository（Arch 用户软件仓库），AUR 软件包由来自社区的用户进行维护，他们上传编写好的软件包构建脚本，其他用户可以使用这些构建脚本自动生成软件包并安装。\n官方仓库没有的软件包，或者是官方仓库软件包的开发或过时版本，基本上都可以在 AUR 找到，所以 ArchLinux 安装第三方软件包非常方便。\nAUR: aur.archlinux.org\nArchWiki 的 AUR 页面：https://wiki.archlinux.org/title/Arch_User_Repository\nPS：AUR 的软件包大多数都没有经过测试，使用风险需要自己承担。\nAUR 软件包的安装和更新默认需要手动操作，并不能像使用 pacman 那样方便的安装和更新，不过一些优秀的 AUR 包管理工具可以让你像使用 pacman 安装存储库包那样安装 AUR 包。\n我推荐使用 yay 作为 AUR 包的管理工具，因为它的使用方法和 pacman 基本一致，可以大幅度降低学习成本。\n不过还是推荐大家学习如何手动安装 AUR 软件包，以备不时之需，下面安装 yay 的操作就是安装大多数 AUR 软件包的步骤。\n如果是第一次安装 AUR 软件包，需要安装所需依赖：sudo pacman -S \u0026ndash;noconfirm \u0026ndash;needed base-devel git\n安装 yay 步骤：\n前往 AUR 的 yay 页面查看 「Git Clone URL」：https://aur.archlinux.org/packages/yay\n使用 git 克隆存储库：git clone https://aur.archlinux.org/yay.git ~/aur-yay-repo\n转到存储库目录：cd ~/aur-yay-repo\n构建软件包并安装：makepkg -i -r -s\n清理工作：cd ~ \u0026amp;\u0026amp; rm -rf ~/aur-yay-repo\n现在可以使用 yay 来管理存储库软件包和 AUR 软件包了，如果已添加的存储库不存在对应的包，yay 会自动在 AUR 中搜索，如果找到的话就开始安装操作。\n用法：\n如果不加任何参数执行 yay，它默认执行更新所有软件包操作：yay\n安装软件包：yay -S \u0026lt;package_name\u0026gt; or yay -S \u0026ndash;aur \u0026lt;package_name\u0026gt; # 只从 AUR 获取包\n更新所有软件包：yay -Syu\n只更新 AUR 软件包：yay -Su \u0026ndash;aur\n只更新存储库软件包：yay -Syu \u0026ndash;repo\nyay 更多用法参考：https://github.com/Jguer/yay#readme\nPS：如果你添加了 ArchLinuxCN 软件存储库，因为它包含了一些 AUR 软件包，所以你可以使用 pacman 安装某些 AUR 软件包。或者，你也可以使用\u0026ndash;aur参数让 yay 只从 AUR 获取包，相反你也可以使用\u0026ndash;repo参数让 yay 只从存储库获取包。\n注意：不要使用 root 权限执行 yay 或任何 AUR 相关的命令，它们会在需要 root 权限时使用 sudo。\n关于多系统启动 如果你的系统分别安装在不同的硬盘，那么只需要在电脑启动的时候引导不同的硬盘就可以了。\n你也可以通过安装os-prober使 GRUB 自动检测已安装的其他系统，并将其添加到 GRUB 启动菜单。安装完成后，添加GRUB_DISABLE_OS_PROBER=false到/etc/default/grub，重新生成 GRUB 配置文件：grub-mkconfig -o /boot/grub/grub.cfg。如果你又安装了其他系统，则需要再次重新生成 GRUB 配置文件。\n关于 os-prober 更多用法以及注意事项：https://wiki.archlinux.org/title/GRUB#Detecting_other_operating_systems\n安装Xrdp（需要yay或paru) yay -S xrdp yay -S xorgxrdp-glamor #针对amd和intel集显的调用 pacman -S xorg-xinit 修改/etc/X11/Xwrapper.config添加如下内容：\nallowed_users=anybody needs_root_rights=no 再接下来，复制xinit配置文件到用户根目录：cp /etc/X11/xinit/xinitrc ~/.xinitrc ，并修改最后几行为：\n#twm \u0026amp; #xclock -geometry 50x50-1+1 \u0026amp; #xterm -geometry 80x50+494+51 \u0026amp; #xterm -geometry 80x20+494-0 \u0026amp; #exec xterm -geometry 80x66+0+0 -name login # 声音 PULSE_SCRIPT=/etc/xrdp/pulse/default.pa pulseaudio --daemonize=no pulseaudio \u0026amp; # kde-plasma桌面 export DESKTOP_SESSION=plasma /usr/lib/plasma-dbus-run-session-if-needed startplasma-x11 启用相关服务并重启系统：\nsudo systemctl enable xrdp.service sudo systemctl enable xrdp-sesman.service sudo reboot 如果xrdp无法弹出授权框，可以修改/etc/polkit-1/rules.d/49-nopasswd_global.rules为：\n/* Allow members of the wheel group to execute any actions * without password authentication, similar to \u0026#34;sudo NOPASSWD:\u0026#34; */ polkit.addRule(function(action, subject) { if (subject.isInGroup(\u0026#34;wheel\u0026#34;)) { return polkit.Result.YES; } }); 来允许所有请求。\n建议阅读 建议阅读以下 Wiki 以便更好的使用 ArchLinux：\n应用程序列表：https://wiki.archlinux.org/title/List_of_applications，你可以在这里按照用途类型找到可用软件。\n一般建议：https://wiki.archlinux.org/title/General_recommendations\n系统维护：https://wiki.archlinux.org/title/System_maintenance\nsystemctl 基本用法：https://wiki.archlinux.org/title/Systemd#Basic_systemctl_usage\npacman 软件包管理器：https://wiki.archlinux.org/title/Pacman，安装/卸载/更新软件全靠它。\nCPU 调频：https://wiki.archlinux.org/title/CPU_frequency_scaling\n蓝牙：https://wiki.archlinux.org/title/Bluetooth\nSynaptics 触摸板：https://wiki.archlinux.org/title/Touchpad_Synaptics，建议 Synaptics 触摸板的笔记本用户阅读。\nBash：https://wiki.archlinux.org/title/Bash\n腾讯 QQ：https://wiki.archlinux.org/title/Tencent_QQ\n中国大陆用户的推荐解决方案：https://wiki.archlinux.org/title/General_recommendations#中国大陆用户的推荐解决方案\n","date":"2023-08-16T22:35:00+08:00","permalink":"https://blog.tama.guru/record/archlinux_install_guide.html","title":"【转载】一个简单的archlinux安装教程（亲测能用）"},{"content":"这玩意的内容是真的多\u0026hellip;光是帮助就好长，看都看不过来，这里做个汇总。\n###帮助内容整合： ####1、我要修仙:进入修仙模式 ####2、我的修仙信息:获取修仙数据 ####3、修仙签到:获取灵石及修为 ####4、重入仙途:重置灵根数据,每次108880灵石 ####5、风控帮助:发送\u0026quot;风控帮助\u0026quot;获取 ####6、改名xx:修改你的道号 ####7、突破:修为足够后,可突破境界(一定几率失败) ####8、闭关、出关、灵石出关、灵石修炼、双修:修炼增加修为,挂机功能 ####9、送灵石180@xxx,偷灵石@xxx,抢灵石@xxx ####10、排行榜:修仙排行榜,灵石排行榜,战力排行榜,宗门排行榜 ####11、悬赏令 #####11.1、悬赏令:获取对应实力的悬赏令 #####11.2、悬赏令刷新:刷新当前悬赏令,每日免费{count}次 ####实力支持：江湖好手|搬血境|洞天境|化灵境|铭纹境|列阵境|尊者境|神火境|真一境|圣祭境|天神境|虚道境 #####11.3、悬赏令终止:终止当前悬赏令任务 #####11.4、悬赏令结算:结算悬赏奖励 #####11.5、悬赏令接取+编号：接取对应的悬赏令 #####11.6、最后的悬赏令:用于接了悬赏令却境界突破导致卡住的道友使用\u0026quot; ####12、我的状态:查看当前HP,我的功法:查看当前技能 ####13、宗门系统:发送\u0026quot;宗门帮助\u0026quot;获取 #####13.1我的宗门:查看当前所处宗门信息 #####13.2、创建宗门:创建宗门，需求：灵石，需求境界 #####13.3、加入宗门:加入一个宗门 #####13.4、宗门职位变更:宗主可以改变宗门成员的职位等级【0 1 2 3 4】分别对应【宗主 长老 亲传 内门 外门】外门弟子无法获得宗门修炼资源 #####13.5、宗门捐献:建设宗门，提高宗门建设度，每{config[\u0026ldquo;\u0026ldquo;等级建设度\u0026rdquo;\u0026rdquo;]}建设度会提高1级攻击修炼等级上限 #####13.6、退出宗门:退出当前宗门 #####13.7、踢出宗门:踢出对应宗门成员,需要输入正确的qq号或at对方 #####13.8、宗主传位:宗主可以传位宗门成员 #####13.9、升级攻击修炼:升级道友的攻击修炼等级,每级修炼等级提升4%攻击力 #####13.10、宗门列表:查看所有宗门列表 #####13.11、宗门任务接取、我的宗门任务:接取宗门任务，可以增加宗门建设度和资材，每日上限：{config[\u0026ldquo;\u0026ldquo;每日宗门任务次上限\u0026rdquo;\u0026rdquo;]}次 #####13.12、宗门任务完成:完成所接取的宗门任务，完成间隔时间：{config[\u0026ldquo;\u0026ldquo;宗门任务完成cd\u0026rdquo;\u0026rdquo;]}秒 #####13.13、宗门任务刷新:刷新当前所接取的宗门任务，刷新间隔时间：{config[\u0026ldquo;\u0026ldquo;宗门任务刷新cd\u0026rdquo;\u0026rdquo;]}秒 #####13.14、宗门功法、神通搜寻:宗主可消耗宗门资材和宗门灵石搜寻功法或者神通 #####13.15、学习宗门功法、神通:宗门成员可消耗宗门资材来学习宗门功法或者神通，后接功法名称 #####13.16、宗门功法查看:查看当前宗门已有的功法 #####13.17、宗门成员查看、查看宗门成员:查看所在宗门的成员信息 #####13.18、宗门丹房建设、建设宗门丹房:建设宗门丹房，可以让每个宗门成员每日领取丹药 #####13.19、宗门丹药领取、领取宗门丹药领取:领取宗门丹药\u0026quot; ####15、世界BOSS:发送\u0026quot;世界boss帮助\u0026quot;获取 #####15.1、生成世界boss:生成一只随机大境界的世界Boss,超管权限 #####15.2、查询世界boss:查询本群全部世界Boss,可加Boss编号查询对应Boss信息 #####15.3、世界boss开启、关闭:开启后才可以生成世界Boss,管理员权限 #####15.4、讨伐boss、讨伐世界boss:讨伐世界Boss,必须加Boss编号 #####15.5、世界boss帮助、世界boss:获取世界Boss帮助信息 #####15.6、天罚boss、天罚世界boss:删除世界Boss,必须加Boss编号,管理员权限 #####15.7、世界积分查看:查看自己的世界积分,和世界积分兑换商品 #####15.8、世界积分兑换+编号：兑换对应的商品\u0026quot; ####16、功法/灵田:发送“功法帮助/灵田帮助”查看,当前获取途径看“宗门帮 #####16.1、我的功法:查看自身功法信息 #####16.2、切磋:at对应人员,不会消耗气血 #####16.3、洞天福地购买:购买洞天福地 #####16.4、洞天福地查看:查看自己的洞天福地 #####16.5、洞天福地改名+名字：修改自己洞天福地的名字 #####16.6、灵田开垦:提升灵田的等级,提高灵田结算的药材数量 #####16.7、抑制黑暗动乱:清除修为浮点数 #####16.8、我的双修次数:查看剩余双修次数\u0026quot; ####17、背包/交友:发送\u0026quot;背包帮助\u0026quot;获取 #####17.1、我的背包、我的物品:查看自身背包前98个物品的信息 #####17.2、使用+物品名字：使用物品,丹药可批量使用 #####17.3、换装+装备名字：卸载目标装备 #####17.4、坊市购买+物品编号:购买坊市内的物品 #####17.5、坊市查看、查看坊市:查询坊市在售物品 #####17.6、坊市上架:坊市上架 物品 金额 数量，上架背包内的物品,最低金额50w #####17.7、系统坊市上架:系统坊市上架 物品 金额 数量，上架任意存在的物品，超管权限 #####17.8、坊市下架+物品编号：下架坊市内的物品，管理员和群主可以下架任意编号的物品！ #####17.9、群交流会开启、关闭:开启交友行功能，管理员指令，注意：会在机器人所在的全部已开启此功能的群内通报交友消息 #####17.10、交友+金额：对本次交友会的物品进行交友 #####17.11、炼金+物品名字：将物品炼化为灵石,支持批量炼金和绑定丹药炼金 #####17.12、背包帮助:获取背包帮助指令 #####17.13、查看修仙界物品:支持类型【功法|神通|丹药|合成丹药|法器|防具】 #####17.14、清空坊市:清空本群坊市,管理员权限 #####非指令： #####a、定时生成交友会,每天{auction_time_config[\u0026lsquo;hours\u0026rsquo;]}点每整点生成一场交友会\u0026quot; ####18、秘境系统:发送\u0026quot;秘境帮助\u0026quot;获取 #####18.1、群秘境开启、关闭:开启本群的秘境生成，管理员权限 #####18.2、生成秘境:生成一个随机秘境，超管权限 #####18.3、探索秘境:探索秘境获取随机奖励 #####18.4、秘境结算、结算秘境:结算秘境奖励 #####18.5、秘境探索终止、终止探索秘境:终止秘境事件 #####18.6、秘境帮助:获取秘境帮助信息 #####非指令： ####18.a、每日18点30分生成一个随机等级的秘境\u0026quot; ####19、炼丹帮助:炼丹功能 #####19.1、炼丹:会检测背包内的药材,自动生成配方【一次最多匹配25种药材】 #####19.2、配方:发送配方领取丹药【配方主药\u0026hellip;..】 #####19.3、炼丹配方帮助:获取炼丹配方帮助 #####19.4、灵田收取、灵田结算:收取洞天福地里灵田的药材 #####19.5、我的炼丹信息:查询自己的炼丹信息 #####19.6、升级收取等级:每一个等级会增加灵田收取的数量 #####19.7、升级丹药控火:每一个等级会增加炼丹的产出数量 #####备注：炼丹配方信息 ######1、炼丹需要主药、药引、辅药 ######2、主药和药引控制炼丹时的冷热调和,冷热失和则炼不出丹药 ######3、草药的类型控制产出丹药的类型 ######4、工具网址 https://huggingface.co/spaces/chewing/liandan ####20、传承系统:发送\u0026quot;传承帮助/虚神界帮助\u0026quot;获取 #####20.1、传承抽卡:花费10颗思恋结晶获取一次传承卡片 #####20.2、传承信息:获取传承主要信息 #####20.3、传承背包:获取传承全部信息 #####20.4、加载传承数据:重新从卡片中加载所有传承属性(数据显示有误时可用) #####20.5、传承卡图:加上卡片名字获取传承卡牌原画 ######思恋结晶获取方式:虚神界对决【俄罗斯轮盘修仙版】 ######双方共6次机会,6次中必有一次暴毙 ######获胜者将获取10颗思恋结晶并不消耗虚神界对决次数 ######失败者将获取5颗思恋结晶并且消耗一次虚神界对决次数 ######每天有三次虚神界对决次数 #####20.a.1、投影虚神界:将自己的分身投影到虚神界,将可被所有地域的道友挑战 #####20.a.2、虚神界列表:查找虚神界里所有的投影 #####20.a.3、虚神界对决:输入虚神界人物编号即可与对方对决,不输入编号将会与{NICKNAME}进行对决 #####20.a.4、虚神界修炼:加入对应的修炼时间,即可在虚神界修炼\u0026quot; ####21、修仙适配:将1的境界适配到2 ####22、启用/禁用修仙功能:当前群开启或关闭修仙功能 ####23、更新记录:获取插件最新内容\n","date":"2023-08-15T00:28:41+08:00","permalink":"https://blog.tama.guru/record/xiuxian2-0.html","title":"[nonebot插件]修仙2.0框架的帮助合辑"},{"content":"这个方法需要一个叫做\u0026quot;arpl\u0026quot;的固件（链接：https://github.com/fbelavenuto/arpl/releases），其特点是引导式安装，不需要手工提取grup.cfg修改相关文件，相对较为简单。 ###1.下载和安装 去上面的网站下载对应版本的zip包，解压并使用Win32DiskImager之类的工具写入U盘。 一般下载最新版即可，我是在物理机安装因此选择第一个。 写完之后把U盘安装到需要安装群晖的主板上并在BIOS中设置好UEFI启动，因各主板步骤不一致此处不赘述。 ###2.进入和初步配置arpl 开启群晖主板电源等待1分钟之后，在路由器界面找到主板网卡IP,浏览器输入http://ip:7681即可进入arpl界面。 进去之后先选择x Cmdline menu，然后进入c Define a custom MAC，此步骤用于修改mac1的数据，如果需要洗白建议先做这一步，修改MAC后需要重新进入路由器界面找到主板网卡IP，因为IP会重新分配。 ###3.配置arpl ####首先是m Choose a model 即选择安装的群晖型号，此处我以DS918+为例。 ####第二步,n Choose a Build Number 即选择安装的版本，当前我要安装的是7.1.1，即版本号42962. ####第三步，s Choose a serial number 即输入序列号，进去之后会有两个选项，一个是a Generate a random serial number，即随机生成一个SN，如果玩黑的直接选这个即可。如果有SN码则选择第二个m Enter a serial number，输入后回车会提示Invalid serial, continue?，不理，确认即可。 ####第四步，Addone 即插件安装，默认会安装misc和acpid这两个插件，其他可以手动选择，好像对我都没用，所以就保留默认了。 ####第五步，x Cmdline menu 这个界面可以对一些详细的配置进行修改，比如有两个网口，想设置第二个网口的mac，则可以在a Add/edit a cmdline item中输入mac2并回车，然后输入MAC2的地址即可，其他例如U盘的PID和VID也可以通过这个方式修改。其他选项如字面意思理解，此处不赘述。（更正：不需要设置PID和VID，见https://github.com/fbelavenuto/arpl/blob/main/README-Zh.md） ####第六步，i Synoinfo menu 展示和修改群晖的相关信息，一般不用修改。 ####第七步，v Advanced menu 高级菜单，内容包含切换LKM版本、模块、手动编辑配置文件、尝试恢复DSM启动盘以及展示SATA端口和设备，一般只用看看最后一项检查SATA是否安装正常即可。 我的主板有两个SATA控制器，一共四个端口，因为我只安装一块硬盘，所以Port 1是亮的。 ####第八步，Build the loader 即编译启动器，它会自动下载所需文件并进行编译，直到提示Ready会自动退出。 ####第九步，b Boot the loader 此处即可开始启动了。此步骤会受U盘读写速度影响，（如果U盘带灯能看到狂闪）选择之后会卡一段时间直到显示Booting...，需要等待。如果有接显示器，此时会看到关机了，需要手动启动。 ###4.安装固件 浏览器登陆https://find.synology.com会查找到刚才安装的群晖。不知道为什么，群晖助手一直都显示不到，只有通过浏览器查找才可以。 ###5.一些问题： ####1.无法安装DSM，文件可能已经损坏。 可能是硬盘插错，U盘VID PID没正确配置，又或者是引导文件有问题，一切皆有可能。 ####2.作者更新不及时？ 尝试其他同类项目：https://github.com/AuxXxilium/arc/releases\n","date":"2023-08-12T16:26:00+08:00","permalink":"https://blog.tama.guru/record/new_dsm_install.html","title":"一种很新的群晖安装方法"},{"content":"###前言 很久之前买过一款kvm套件，基于树莓派4b的拓展版，能够通过USB和跳线起到控制设备开关机以及远程操作的作用，但是pikvm官方只发布了基于32位archlinuxarm的固件，在其官网的QA处有这么一段描述：\nWhy is PiKVM OS based on Arch Linux ARM and not Raspbian / Raspberry Pi OS? \u0026amp;gt; There are several reasons: Several years ago, when PiKVM was just starting out, Raspbian didn‘t have a minimalistic image and the transition to systemd was in full swing, which is why the distribution was not too stable. Raspbian did not have all the necessary packages in the repositories to satisfy most software dependencies. PiKVM was born as a pet project, and the founder likes Arch the most. However, we plan to provide an alternative OS image based on Raspbian in the future - now it is quite stable.\n大概意思就是pikvm起步早，当时raspbian还没成型，且raspbian的库中不能满足pikvm的依赖。但是官方正在计划做基于raspbian的固件，简而言之就是现在没有。 但对我来说，arch系的系统确实难用（我是debian的狗），另一方面我个人觉得，32位系统并不能发挥4B的全部实力。于是今天在逛pikvm的github的时候发现了这么一个issus：Running pikvm on top of another OS下有个评论： 第一个PDF介绍了用树莓派官方镜像刷写工具写入32位的raspios并安装pikvm的过程，为什么一定要32位？我不明白。因此决定刷个64位的系统按他的步骤试试看。 ###刷个RaspiOS 系统方面我选择的是基于debian 11于20230503更新的当前最新系统。 安装操作流程依照上面的PDF进行，需要注意的是其中提到的enable \u0026amp;quot;Skip first-run wizard\u0026amp;quot;选项当前已经不存在。 ###尝试安装pikvm 进入SSH，下载https://kvmnerds.com/RPiKVM/install-pikvm-raspbian.sh这个文件并赋予执行权限，然后直接./install-pikvm-raspbian.sh，开始一长串的wget（请注意:kvmnerds.com这个域名不能直连，需要自配梯子）\nRunning part 1 of PiKVM installer v5.6 script for Raspbian by @srepac -\u0026gt; Getting Pi-KVM packages from https://kvmnerds.com/REPO/NEW wget https://kvmnerds.com/REPO/NEW -O /var/cache/kvmd/packages.txt wget https://kvmnerds.com/REPO/NEW/janus-0.11.3-raspbian-armv7l.pkg.tar.xz -O /var/cache/kvmd/janus-0.11.3-raspbian-armv7l.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-3.241-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-3.47-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmi-rpi2-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-platform-v0-hdmi-rpi2-3.241-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmi-rpi2-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-platform-v0-hdmi-rpi2-3.47-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmi-rpi3-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-platform-v0-hdmi-rpi3-3.241-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmi-rpi3-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-platform-v0-hdmi-rpi3-3.47-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmi-zero2w-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-platform-v0-hdmi-zero2w-3.241-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmi-zero2w-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-platform-v0-hdmi-zero2w-3.47-1-any.pkg.tar.xz wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmiusb-rpi2-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/k wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmiusb-rpi2-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kv wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmiusb-rpi3-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/k wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmiusb-rpi3-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kv wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmiusb-zero2w-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v0-hdmiusb-zero2w-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/ wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmi-rpi4-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmi-rpi4-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd- wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmi-zero2w-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/kv wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmi-zero2w-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvm wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmi-zerow-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmi-zerow-3.54-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmiusb-rpi4-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/k wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v2-hdmiusb-rpi4-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kv wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v3-hdmi-rpi4-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v3-hdmi-rpi4-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd- wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v4mini-hdmi-rpi4-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/ wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v4mini-hdmi-rpi4-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/k wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v4plus-hdmi-rpi4-3.241-1-any.pkg.tar.xz -O /var/cache/kvmd/ wget https://kvmnerds.com/REPO/NEW/kvmd-platform-v4plus-hdmi-rpi4-3.47-1-any.pkg.tar.xz -O /var/cache/kvmd/k wget https://kvmnerds.com/REPO/NEW/kvmd-webterm-0.42-1-any.pkg.tar.xz -O /var/cache/kvmd/kvmd-webterm-0.42-1 ls -l /var/cache/kvmd total 3912 -rw-r--r-- 1 root root 4787 Aug 10 17:05 installer-20230810-17:04:49.log -rw-r--r-- 1 root root 1858636 Feb 13 2022 janus-0.11.3-raspbian-armv7l.pkg.tar.xz -rw-r--r-- 1 root root 1144228 Aug 7 08:16 kvmd-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 749608 Feb 10 2022 kvmd-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6220 Aug 7 08:16 kvmd-platform-v0-hdmi-rpi2-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6220 Aug 7 08:16 kvmd-platform-v0-hdmi-rpi2-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6280 Aug 7 08:16 kvmd-platform-v0-hdmi-rpi3-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6280 Aug 7 08:16 kvmd-platform-v0-hdmi-rpi3-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6684 Aug 7 08:16 kvmd-platform-v0-hdmiusb-rpi2-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6684 Aug 7 08:16 kvmd-platform-v0-hdmiusb-rpi2-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6732 Aug 7 08:16 kvmd-platform-v0-hdmiusb-rpi3-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6732 Aug 7 08:16 kvmd-platform-v0-hdmiusb-rpi3-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6704 Aug 7 08:16 kvmd-platform-v0-hdmiusb-zero2w-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6704 Aug 7 08:16 kvmd-platform-v0-hdmiusb-zero2w-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6336 Aug 7 08:16 kvmd-platform-v0-hdmi-zero2w-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6336 Aug 7 08:16 kvmd-platform-v0-hdmi-zero2w-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6364 Aug 7 08:16 kvmd-platform-v2-hdmi-rpi4-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6364 Aug 7 08:16 kvmd-platform-v2-hdmi-rpi4-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6888 Aug 7 08:16 kvmd-platform-v2-hdmiusb-rpi4-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6888 Aug 7 08:16 kvmd-platform-v2-hdmiusb-rpi4-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6372 Aug 7 08:16 kvmd-platform-v2-hdmi-zero2w-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6372 Aug 7 08:16 kvmd-platform-v2-hdmi-zero2w-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 5776 Feb 19 2022 kvmd-platform-v2-hdmi-zerow-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 5776 Feb 19 2022 kvmd-platform-v2-hdmi-zerow-3.54-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6628 Aug 7 08:16 kvmd-platform-v3-hdmi-rpi4-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6628 Aug 7 08:16 kvmd-platform-v3-hdmi-rpi4-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6792 Aug 7 08:16 kvmd-platform-v4mini-hdmi-rpi4-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6792 Aug 7 08:16 kvmd-platform-v4mini-hdmi-rpi4-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6792 Aug 7 08:16 kvmd-platform-v4plus-hdmi-rpi4-3.241-1-any.pkg.tar.xz -rw-r--r-- 1 root root 6792 Aug 7 08:16 kvmd-platform-v4plus-hdmi-rpi4-3.47-1-any.pkg.tar.xz -rw-r--r-- 1 root root 5940 Jun 26 2022 kvmd-webterm-0.42-1-any.pkg.tar.xz -rw-r--r-- 1 root root 14716 Aug 10 17:04 packages.txt Choose which capture device you will use: 1 - USB dongle 2 - v2 CSI 3 - V3 HAT 我的平台是V3 HA3,因此选择3：\nPlatform selected -\u0026gt; kvmd-platform-v3-hdmi-rpi4 Please verify the platform selected above. Press ENTER to continue or CTRL+C to break out of script. 回车确认，然后会进入安装依赖和编译过程流程（过程中会有apt does not have a stable CLI interface的提示，忽略即可）：\n/boot/config.txt # For more options and information see # http://rpf.io/configtxt # Some settings may impact device functionality. See link above for details # uncomment if you get no picture on HDMI for a default \u0026#34;safe\u0026#34; mode #hdmi_safe=1 # uncomment the following to adjust overscan. Use positive numbers if console # goes off screen, and negative if there is too much border #overscan_left=16 #overscan_right=16 #overscan_top=16 #overscan_bottom=16 # uncomment to force a console size. By default it will be display\u0026#39;s size minus # overscan. #framebuffer_width=1280 #framebuffer_height=720 # uncomment if hdmi display is not detected and composite is being output #hdmi_force_hotplug=1 # uncomment to force a specific HDMI mode (this will force VGA) #hdmi_group=1 #hdmi_mode=1 # uncomment to force a HDMI mode rather than DVI. This can make audio work in # DMT (computer monitor) modes #hdmi_drive=2 # uncomment to increase signal to HDMI, if you have interference, blanking, or # no display #config_hdmi_boost=4 # uncomment for composite PAL #sdtv_mode=2 #uncomment to overclock the arm. 700 MHz is the default. #arm_freq=800 # Uncomment some or all of these to enable the optional hardware interfaces #dtparam=i2c_arm=on #dtparam=i2s=on #dtparam=spi=on # Uncomment this to enable infrared communication. #dtoverlay=gpio-ir,gpio_pin=17 #dtoverlay=gpio-ir-tx,gpio_pin=18 # Additional overlays and parameters are documented /boot/overlays/README # Enable audio (loads snd_bcm2835) dtparam=audio=on # Automatically load overlays for detected cameras camera_auto_detect=1 # Automatically load overlays for detected DSI displays display_auto_detect=1 # Enable DRM VC4 V3D driver dtoverlay=vc4-kms-v3d max_framebuffers=2 # Run in 64-bit mode arm_64bit=1 # Disable compensation for displays with overscan disable_overscan=1 [cm4] # Enable host mode on the 2711 built-in XHCI USB controller. # This line should be removed if the legacy DWC2 controller is required # (e.g. for USB device mode) or if USB support is not required. otg_mode=1 [all] [pi4] # Run as fast as firmware / board allows arm_boost=1 [all] # srepac custom configs hdmi_force_hotplug=1 gpu_mem=128 enable_uart=1 dtoverlay=tc358743 dtoverlay=disable-bt dtoverlay=dwc2,dr_mode=peripheral dtparam=act_led_gpio=13 # HDMI audio capture dtoverlay=tc358743-audio # SPI (AUM) dtoverlay=spi0-1cs # I2C (display) dtparam=i2c_arm=on # Clock dtoverlay=i2c-rtc,pcf8563 /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with \u0026#34;#\u0026#34; are ignored. i2c-dev tc358743 dwc2 libcomposite /etc/udev/rules.d/99-kvmd.rules # https://unix.stackexchange.com/questions/66901/how-to-bind-usb-device-under-a-static-name # https://wiki.archlinux.org/index.php/Udev#Setting_static_device_names KERNEL==\u0026#34;video[0-9]*\u0026#34;, SUBSYSTEM==\u0026#34;video4linux\u0026#34;, KERNELS==\u0026#34;fe801000.csi|fe801000.csi1\u0026#34;, ATTR{name}==\u0026#34;unicam- KERNEL==\u0026#34;hidg0\u0026#34;, GROUP=\u0026#34;kvmd\u0026#34;, SYMLINK+=\u0026#34;kvmd-hid-keyboard\u0026#34; KERNEL==\u0026#34;hidg1\u0026#34;, GROUP=\u0026#34;kvmd\u0026#34;, SYMLINK+=\u0026#34;kvmd-hid-mouse\u0026#34; KERNEL==\u0026#34;hidg2\u0026#34;, GROUP=\u0026#34;kvmd\u0026#34;, SYMLINK+=\u0026#34;kvmd-hid-mouse-alt\u0026#34; -\u0026gt; Installing dependencies for pikvm apt install -y nginx python3 net-tools bc expect v4l-utils iptables vim dos2unix screen tmate nfs-common gpi WARNING: apt does not have a stable CLI interface. Use with caution in scripts. apt install -y python3-pip WARNING: apt does not have a stable CLI interface. Use with caution in scripts. pip3 install dbus-next apt-get install -y python3-aiofiles apt-get install -y python3-aiohttp apt-get install -y python3-appdirs apt-get install -y python3-asn1crypto apt-get install -y python3-async-timeout apt-get install -y python3-bottle apt-get install -y python3-cffi apt-get install -y python3-chardet apt-get install -y python3-click apt-get install -y python3-colorama apt-get install -y python3-cryptography apt-get install -y python3-dateutil apt-get install -y python3-dbus apt-get install -y python3-hidapi apt-get install -y python3-idna apt-get install -y python3-libgpiod apt-get install -y python3-marshmallow apt-get install -y python3-more-itertools apt-get install -y python3-multidict apt-get install -y python3-netifaces apt-get install -y python3-packaging apt-get install -y python3-passlib apt-get install -y python3-pillow apt-get install -y python3-ply apt-get install -y python3-psutil apt-get install -y python3-pycparser apt-get install -y python3-pyelftools apt-get install -y python3-pyghmi apt-get install -y python3-pygments apt-get install -y python3-pyparsing apt-get install -y python3-requests apt-get install -y python3-semantic-version apt-get install -y python3-serial apt-get install -y python3-setproctitle apt-get install -y python3-setuptools apt-get install -y python3-six apt-get install -y python3-spidev apt-get install -y python3-systemd apt-get install -y python3-tabulate apt-get install -y python3-urllib3 apt-get install -y python3-wrapt apt-get install -y python3-xlib apt-get install -y python3-yaml apt-get install -y python3-yarl apt-get install -y python3-serial-asyncio Selecting previously unselected package libev4:arm64. (Reading database ... 100902 files and directories currently installed.) Preparing to unpack libev4_4.33-1_arm64.deb ... Unpacking libev4:arm64 (1:4.33-1) ... Setting up libev4:arm64 (1:4.33-1) ... Processing triggers for libc-bin (2.31-13+rpt2+rpi1+deb11u5) ... (Reading database ... 100908 files and directories currently installed.) Preparing to unpack libjson-c5_0.15-2_arm64.deb ... Unpacking libjson-c5:arm64 (0.15-2) over (0.15-2) ... Setting up libjson-c5:arm64 (0.15-2) ... Processing triggers for libc-bin (2.31-13+rpt2+rpi1+deb11u5) ... (Reading database ... 100908 files and directories currently installed.) Preparing to unpack libuv1_1.40.0-2_arm64.deb ... Unpacking libuv1:arm64 (1.40.0-2) over (1.40.0-2) ... Setting up libuv1:arm64 (1.40.0-2) ... Processing triggers for libc-bin (2.31-13+rpt2+rpi1+deb11u5) ... Selecting previously unselected package ttyd. (Reading database ... 100908 files and directories currently installed.) Preparing to unpack ttyd_1.6.3-3~bpo11+1_arm64.deb ... Unpacking ttyd (1.6.3-3~bpo11+1) ... Setting up ttyd (1.6.3-3~bpo11+1) ... Created symlink /etc/systemd/system/multi-user.target.wants/ttyd.service → /lib/systemd/system/ttyd.service. Processing triggers for man-db (2.9.4-2) ... ttyd version: ttyd version 1.6.3 -\u0026gt; Building ustreamer apt install -y build-essential libssl-dev libevent-dev libjpeg-dev libbsd-dev libraspberrypi-dev libgpiod-de WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Cloning into \u0026#39;ustreamer\u0026#39;... remote: Enumerating objects: 174, done. remote: Counting objects: 100% (174/174), done. remote: Compressing objects: 100% (107/107), done. remote: Total 174 (delta 62), reused 136 (delta 54), pack-reused 0 Receiving objects: 100% (174/174), 172.77 KiB | 1.31 MiB/s, done. Resolving deltas: 100% (62/62), done. make apps make[1]: Entering directory \u0026#39;/tmp/ustreamer\u0026#39; make -C src make[2]: Entering directory \u0026#39;/tmp/ustreamer/src\u0026#39; -- CC libs/base64.c -- CC libs/frame.c -- CC libs/logging.c -- CC libs/memsink.c -- CC libs/options.c -- CC libs/unjpeg.c -- CC ustreamer/blank.c -- CC ustreamer/data/blank_jpeg.c -- CC ustreamer/data/favicon_ico.c -- CC ustreamer/data/index_html.c -- CC ustreamer/device.c -- CC ustreamer/encoder.c -- CC ustreamer/encoders/cpu/encoder.c -- CC ustreamer/encoders/hw/encoder.c -- CC ustreamer/h264.c -- CC ustreamer/http/bev.c -- CC ustreamer/http/mime.c -- CC ustreamer/http/path.c -- CC ustreamer/http/server.c -- CC ustreamer/http/static.c -- CC ustreamer/http/unix.c -- CC ustreamer/http/uri.c -- CC ustreamer/m2m.c -- CC ustreamer/main.c -- CC ustreamer/options.c -- CC ustreamer/stream.c -- CC ustreamer/workers.c -- CC ustreamer/gpio/gpio.c -- CC ustreamer/http/systemd/systemd.c == LD ustreamer.bin -- CC dump/file.c -- CC dump/main.c == LD ustreamer-dump.bin make[2]: Leaving directory \u0026#39;/tmp/ustreamer/src\u0026#39; make[1]: Leaving directory \u0026#39;/tmp/ustreamer\u0026#39; make apps make[1]: Entering directory \u0026#39;/tmp/ustreamer\u0026#39; make -C src make[2]: Entering directory \u0026#39;/tmp/ustreamer/src\u0026#39; make[2]: Nothing to be done for \u0026#39;all\u0026#39;. make[2]: Leaving directory \u0026#39;/tmp/ustreamer/src\u0026#39; make[1]: Leaving directory \u0026#39;/tmp/ustreamer\u0026#39; make -C src install make[1]: Entering directory \u0026#39;/tmp/ustreamer/src\u0026#39; mkdir -p /usr/local/bin install -m755 ustreamer.bin /usr/local/bin/ustreamer install -m755 ustreamer-dump.bin /usr/local/bin/ustreamer-dump make[1]: Leaving directory \u0026#39;/tmp/ustreamer/src\u0026#39; mkdir -p /usr/local/share/man/man1 for man in ustreamer.1 ustreamer-dump.1; do \\ install -m644 man/$man /usr/local/share/man/man1/$man; \\ gzip -f /usr/local/share/man/man1/$man; \\ done ustreamer version/features: 5.41 + WITH_GPIO + WITH_SYSTEMD + WITH_PTHREAD_NP + WITH_SETPROCTITLE + HAS_PDEATHSIG -\u0026gt; Building wiringpi from source Cloning into \u0026#39;WiringPi\u0026#39;... remote: Enumerating objects: 1733, done. remote: Counting objects: 100% (615/615), done. remote: Compressing objects: 100% (114/114), done. remote: Total 1733 (delta 555), reused 502 (delta 501), pack-reused 1118 Receiving objects: 100% (1733/1733), 803.57 KiB | 1.24 MiB/s, done. Resolving deltas: 100% (1188/1188), done. wiringPi Build script ===================== WiringPi Library [UnInstall] [Compile] wiringPi.c [Compile] wiringSerial.c [Compile] wiringShift.c [Compile] piHiPri.c [Compile] piThread.c [Compile] wiringPiSPI.c [Compile] wiringPiI2C.c [Compile] softPwm.c [Compile] softTone.c [Compile] mcp23008.c [Compile] mcp23016.c [Compile] mcp23017.c [Compile] mcp23s08.c [Compile] mcp23s17.c [Compile] sr595.c [Compile] pcf8574.c [Compile] pcf8591.c [Compile] mcp3002.c [Compile] mcp3004.c [Compile] mcp4802.c [Compile] mcp3422.c [Compile] max31855.c [Compile] max5322.c [Compile] ads1115.c [Compile] sn3218.c [Compile] bmp180.c [Compile] htu21d.c [Compile] ds18b20.c [Compile] rht03.c [Compile] drcSerial.c [Compile] drcNet.c [Compile] pseudoPins.c [Compile] wpiExtensions.c pseudoPins.c: In function ‘myAnalogRead’: pseudoPins.c:50:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 50 | int *ptr = (int *)node-\u0026gt;data0 ; | ^ pseudoPins.c: In function ‘myAnalogWrite’: pseudoPins.c:59:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 59 | int *ptr = (int *)node-\u0026gt;data0 ; | ^ pseudoPins.c: In function ‘pseudoPinsSetup’: pseudoPins.c:89:17: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 89 | node-\u0026gt;data0 = (unsigned int)ptr ; | ^ [Link (Dynamic)] [Install Headers] [Install Dynamic Lib] WiringPi Devices Library [UnInstall] [Compile] ds1302.c [Compile] maxdetect.c [Compile] piNes.c [Compile] gertboard.c [Compile] piFace.c [Compile] lcd128x64.c [Compile] lcd.c [Compile] scrollPhat.c [Compile] piGlow.c [Link (Dynamic)] [Install Headers] [Install Dynamic Lib] GPIO Utility [Compile] gpio.c [Compile] readall.c [Link] [Install] All Done. NOTE: To compile programs with wiringPi, you need to add: -lwiringPi to your compile line(s) To use the Gertboard, MaxDetect, etc. code (the devLib), you need to also add: -lwiringPiDev to your compile line(s). gpio version: 2.70 Copyright (c) 2012-2018 Gordon Henderson This is free software with ABSOLUTELY NO WARRANTY. For details type: gpio -warranty Raspberry Pi Details: Type: Pi 4B, Revision: 01, Memory: 4096MB, Maker: Sony * Device tree is enabled. *--\u0026gt; Raspberry Pi 4 Model B Rev 1.1 * This Raspberry Pi supports user-level GPIO access. -\u0026gt; Enabling kvmd-nginx kvmd-webterm kvmd-otg and kvmd services, but do not start them. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-nginx.service → /lib/systemd/system/kvmd-ng Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-webterm.service → /lib/systemd/system/kvmd- Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-otg.service → /lib/systemd/system/kvmd-otg. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd.service → /lib/systemd/system/kvmd.service. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-fix.service → /lib/systemd/system/kvmd-fix. Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-tc358743.service → /lib/systemd/system/kvmd Reboot is required to create kvmd users and groups. Please re-run this script after reboot to complete the install. Press ENTER to continue or CTRL+C to break out of script. 最后这里提示Reboot is required to create kvmd users and groups.Please re-run this script after reboot to complete the install.，会在重启之后创建一个kvmd用户和组，要求重启后再次运行这个脚本，按下回车之后会自动重启。重启过后再次执行脚本进入第二阶段：\nRunning part 2 of PiKVM installer v5.6 script for Raspbian by @srepac ==\u0026gt; Ensuring KVMD users and groups ... -\u0026gt; Disabling nginx service, so that we can use kvmd-nginx instead Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable nginx Removed /etc/systemd/system/multi-user.target.wants/nginx.service. -\u0026gt; Creating symlinks for use with kvmd python scripts -\u0026gt; Creating kvmd-webterm homedir drwxr-xr-x 2 kvmd-webterm root 4096 Aug 10 17:16 /home/kvmd-webterm ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;kvmd/streamer/unix\u0026#39;: None argument is not a valid absolute path Did kvmd -m run properly? [y/n] y -\u0026gt; Restoring config files -rw-r--r-- 1 root root 11360 Nov 20 2021 tools.js Getting most current tools.js file... done -rw-r--r-- 1 root root 11856 Aug 10 17:18 tools.js -rw-r--r-- 1 root root 11360 Nov 20 2021 tools.js.20230810 Updating CSS files as per pikvm/pikvm#599: fixed webui windows oversizing /usr/share/kvmd/web/share/css/kvm/stream.css /usr/share/kvmd/web/share/css/login/login.css /usr/share/kvmd/web/share/css/modal.css /usr/share/kvmd/web/share/css/start.css /usr/share/kvmd/web/share/css/vars.css /usr/share/kvmd/web/share/css/window.css Job for kvmd-otg.service failed because the control process exited with error code. See \u0026#34;systemctl status kvmd-otg.service\u0026#34; and \u0026#34;journalctl -xe\u0026#34; for details. Found existing installation: Pillow 8.1.2 Not uninstalling pillow at /usr/lib/python3/dist-packages, outside environment /usr Can\u0026#39;t uninstall \u0026#39;Pillow\u0026#39;. No files were found to uninstall. Check kvmd devices lrwxrwxrwx 1 root root 6 Aug 10 17:18 /dev/kvmd-video -\u0026gt; video0 You should see devices for keyboard, mouse, and video. Point a browser to https://tama If it doesn\u0026#39;t work, then reboot one last time. Please make sure kvmd services are running after reboot. Raspbian pikvm installer script completed on Thu 10 Aug 17:18:18 CST 2023 好像是受上面的配置影响，字面上理解是OTG这部分出问题了，但是不管了，先进https://tama看看 ： 直接报错了\u0026hellip;查日志看看：\nroot@tama:~/pikvm# journalctl -fu kvmd -- Journal begins at Wed 2023-05-03 11:23:19 CST. -- Aug 10 17:25:26 tama systemd[1]: kvmd.service: Main process exited, code=exited, status=1/FAILURE Aug 10 17:25:27 tama kvmd-cleanup[3136]: ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;kvmd/streamer/unix\u0026#39;: None ar Aug 10 17:25:27 tama systemd[1]: kvmd.service: Control process exited, code=exited, status=1/FAILURE Aug 10 17:25:27 tama systemd[1]: kvmd.service: Failed with result \u0026#39;exit-code\u0026#39;. Aug 10 17:25:27 tama systemd[1]: kvmd.service: Consumed 1.483s CPU time. Aug 10 17:25:30 tama systemd[1]: kvmd.service: Scheduled restart job, restart counter is at 93. Aug 10 17:25:30 tama systemd[1]: Stopped PiKVM - The main daemon. Aug 10 17:25:30 tama systemd[1]: kvmd.service: Consumed 1.483s CPU time. Aug 10 17:25:30 tama systemd[1]: Started PiKVM - The main daemon. Aug 10 17:25:31 tama kvmd[3148]: ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;kvmd/streamer/unix\u0026#39;: None argument i Aug 10 17:25:31 tama systemd[1]: kvmd.service: Main process exited, code=exited, status=1/FAILURE Aug 10 17:25:31 tama kvmd-cleanup[3150]: ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;kvmd/streamer/unix\u0026#39;: None ar Aug 10 17:25:32 tama systemd[1]: kvmd.service: Control process exited, code=exited, status=1/FAILURE Aug 10 17:25:32 tama systemd[1]: kvmd.service: Failed with result \u0026#39;exit-code\u0026#39;. Aug 10 17:25:32 tama systemd[1]: kvmd.service: Consumed 1.490s CPU time. qAug 10 17:25:35 tama systemd[1]: kvmd.service: Scheduled restart job, restart counter is at 94. Aug 10 17:25:35 tama systemd[1]: Stopped PiKVM - The main daemon. Aug 10 17:25:35 tama systemd[1]: kvmd.service: Consumed 1.490s CPU time. 直接就卡在启动过程中反复重启了\u0026hellip; 如果再次运行脚本，会提示让你确认命令kvmd -n能否运行：\nRunning part 2 of PiKVM installer v5.6 script for Raspbian by @srepac ==\u0026gt; Ensuring KVMD users and groups ... -\u0026gt; Disabling nginx service, so that we can use kvmd-nginx instead Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable nginx -\u0026gt; Creating symlinks for use with kvmd python scripts -\u0026gt; Creating kvmd-webterm homedir drwxr-xr-x 2 kvmd-webterm root 4096 Aug 10 17:16 /home/kvmd-webterm ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;kvmd/streamer/unix\u0026#39;: None argument is not a valid absolute path Did kvmd -m run properly? [y/n] n Please install missing packages as per the kvmd -m output in another ssh/terminal. 但是直接运行kvmd -m又会报同样的错：\nroot@tama:~/pikvm# kvmd -m ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;kvmd/streamer/unix\u0026#39;: None argument is not a valid absolute path 然后我看了眼脚本文件里面有这么一行: # 5.6 05/24/23 - added override entry to fix the Invalid value '' for key 'kvmd/server/unix': None argument error (|||ﾟДﾟ)?server报错是没有，但是还有个streamer报错啊？ 我上discord翻了下，发现有人也报过这个错误： 我试着把他这句加到我的配置文件的streamer下面：\nstreamer: unix: /run/kvmd/kvmd.sock h264_bitrate: default: 5000 重启之后报错发生改变：\nroot@tama:/etc/kvmd# journalctl -fu kvmd -- Journal begins at Wed 2023-05-03 11:23:19 CST. -- Aug 10 18:17:01 tama systemd[1]: kvmd.service: Scheduled restart job, restart counter is at 33. Aug 10 18:17:01 tama systemd[1]: Stopped PiKVM - The main daemon. Aug 10 18:17:01 tama systemd[1]: kvmd.service: Consumed 1.492s CPU time. Aug 10 18:17:01 tama systemd[1]: Started PiKVM - The main daemon. Aug 10 18:17:02 tama kvmd[6664]: ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;ipmi/kvmd/unix\u0026#39;: None argument is not a valid absolute path Aug 10 18:17:02 tama systemd[1]: kvmd.service: Main process exited, code=exited, status=1/FAILURE Aug 10 18:17:02 tama kvmd-cleanup[6670]: ConfigError: Invalid value \u0026#39;\u0026#39; for key \u0026#39;ipmi/kvmd/unix\u0026#39;: None argument is not a valid absolute path Aug 10 18:17:02 tama systemd[1]: kvmd.service: Control process exited, code=exited, status=1/FAILURE Aug 10 18:17:02 tama systemd[1]: kvmd.service: Failed with result \u0026#39;exit-code\u0026#39;. Aug 10 18:17:02 tama systemd[1]: kvmd.service: Consumed 1.489s CPU time. 这个key\u0026hellip; 要放到哪去？ 我放弃了。\n###转战blikvm 换个思路，blikvm的文档里面也有一个版本能在64位raspbian上跑，至少看起来是成功了，该文档地址位于：https://github.com/ThomasVon2021/blikvm/blob/master/dev-readme.md 其使用的环境为：\nRaspberry Pi OS Lite Release date: 20230201 System: 64-bit Kernel version: 5.15 Debian version: 11 (bullseye) 和新版的除了内核高点之外其他也差不到哪去。所以在最新版本上跑试试。 原文档就不放出来了，真的无力吐槽\u0026hellip;就放一些出问题的地方吧\u0026hellip; git clone https://libwebsockets.org/repo/libwebsockets链接是失效的，应该使用git clone https://github.com/warmcat/libwebsockets php安装内容是偏向7.4的，但是pecl install http://pecl.php.net/get/swoole-5.0.3.tgz这个地方会报错表示该版本仅支持php8.0+，所以需要修改成4.8.10或者其他版本。还有就是pecl install inotify这个命令无法直接执行，需要去pecl下载包下来到本地手动安装。 Install kvmd services这个地方更是吐血，首先是安装kvmd-main这个阶段，kvmd-main.service中ExecStart指向/usr/bin/blikvm/kvmd-main，但是这个文件并不在这个目录，导致安装会出错，同时这个kvmd-main.service依赖syslogd，需要手动运行apt install busybox-syslogd。其他的ustreamer以及kvmd-web均是如此，需要进所有文件去检查，路径有很多都是错的\u0026hellip; 一通修改之后终于见到了熟悉的界面 ---------------------------------------------------------- Commercial IP KVM using Raspberry Pi 4 ---------------------------------------------------------- Copyright (C) gzsgcs - All Rights Reserved Unauthorized copying of any file in this project, via any medium is strictly prohibited Proprietary and confidential Written by gzsgcs\u0026lt;gzsgcs@gmail.com\u0026gt;, September 2022 ---------------------------------------------------------- ------------------------- Version:2.11.2 Build:2023-08-08 15:13:24 ------------------------- [2023/08/10 23:36:26] [Log] Program start [2023/08/10 23:36:26] [Log] Bootstrapping [2023/08/10 23:36:26] [Log] Checking file system read write status [2023/08/10 23:36:26] [Log] file system is readable/writable [2023/08/10 23:36:26] [Log] Emulating network interfaces [2023/08/10 23:36:26] [Log] Interface: [eth0] ,IP/Mask/Broadcast: [192.168.50.164/255.255.255.0/192.168.50.255] [2023/08/10 23:36:26] [Log] You are running Release Version [2023/08/10 23:36:26] [Warning] Custom configure file not found , skip! [2023/08/10 23:36:26] [Log] admin config loaded! [2023/08/10 23:36:26] [Log] check msd directory [2023/08/10 23:36:26] [Log] Building static assets cache. [2023/08/10 23:36:26] [Log] Static assets cache build success! [2023/08/10 23:36:26] [Log] MSD.JSON not exists,initializing... [2023/08/10 23:36:26] [Log] MSD json initialize success [2023/08/10 23:36:26] [Log] Current Resolution is [640 x 480] [2023/08/10 23:36:26] [Log] wait for ustreamer service [2023/08/10 23:36:26] [Log] ustreamer service has started [2023/08/10 23:36:26] [Log] wait for janus service 但是依然有好几个服务还没运行成功（janus 和 ustreamer)\u0026hellip;.再慢慢改吧。\n不改了，去死吧。\n","date":"2023-08-10T18:02:00+08:00","permalink":"https://blog.tama.guru/record/pikvm_with_raspbian.html","title":"记录在raspbian上折腾pikvm的失败过程"},{"content":"2023年7月28日9时55分，2305号台风“杜苏芮”在福建省晋江市沿海登陆，登陆时最大风力15级（强台风级），为1949年以来登陆福建第二强台风。在给福建、浙江等地带来强降水之后，7月29日上午，“杜苏芮”在安徽省安庆市宿松县境内减弱为热带低压，中央气象台于29日11时对其停止编号。然而，其剩余环流对京津冀地区带来的影响才刚刚开始。\n7月29日上午开始，“杜苏芮”外围环流北上，河北省由南向北开始出现降水天气。7月29日8时至8月2日7时，河北省平均降水量前三的地区为保定（325.5毫米），石家庄（314.5毫米），雄安新区（306毫米），临城赵庄梁家庄降水量最大为1003.4毫米。上述几个地区的年均降雨量均在500毫米左右，这四天下了往年半年多的雨，给海河流域带来了很大的防汛压力。\n受强降雨影响，位于石家庄的滹沱河黄壁庄水库7月30日23时入库流量涨至3615立方米每秒，发生2023年第1号洪水，直接威胁到了下游流经天津的子牙河。8月1日，沧州市防汛抗旱指挥部发布紧急通知，决定于8月1日11时启用献县泛区（图2绿色虚线框），要求做好群众转移工作，保证人民群众生命安全。献县泛区包括了饶阳、武强、献县的100个行政村，献县占53个，而自然村为48个，所以又被称为“献县四十八村”。泛区群众连夜撤离，舍小家为大家，大大减轻了天津的防汛压力。 最近听到这种疑问，为什么水库在旱季不放水，反而到了雨季才泄洪导致下游被淹？事实恰恰相反，正是因为水库在雨季来临前保持了较低的水位，才有能力拦蓄洪水。本轮极端强降水，导致黄壁庄水库超过正常蓄水位，一旦溃坝后果不堪设想，为保证大坝安全不得不放水泄洪。 当洪水来临时，水库的另一个重要功能则是削峰，就拿本次泄洪的黄壁庄水库举例，7月30日23时入库流量3615立方米每秒，7月31日5时黄壁庄水库的泄洪量只有1600立方米每秒，水库通过延缓、削弱洪峰，给下游地区争取到了疏散人员的时间。如果没有水库呢？图2红色虚线框内是本次同样受灾严重的涿州、永定河沿岸地区，上游拒马河降水量大，且没有大型水库拦蓄洪水，山洪就直接冲击到涿州市区造成城区内涝群众被困，后汇入永定河给北京带来巨大防汛压力…… 京津冀一盘棋，京津冀一体化。天灾面前，献县四十八村为了给天津减轻压力，淹了自己的村子，天津为了保障永定河泄洪入海，紧急转移了滨海新区、静海区、西青区、武清区多少群众，都是为了让洪水尽快排走别再淹京津冀啊。在这里向献县泛区、永定河泛区、京津冀所有撤离的居民们说一声谢谢！再强的大局意识，没有了他们的配合，也都只是一场空谈。\n后记： 谈一谈我对这轮降水的印象吧。我见过比这猛烈的大风、大雨甚至冰雹，但持续时间都很短，最长也没有超过一天的。这次的大雨几乎是连续下了三天，也确实震撼到了我，感觉空气都变湿了，或许也算是南方梅雨季三天体验卡了？好在我的城市受灾并不严重，希望灾区的人们能快快渡过难关吧。\n","date":"2023-08-03T01:43:00+08:00","permalink":"https://blog.tama.guru/agkey/DOKSURI_JJJ.html","title":"记“杜苏芮”给京津冀带来的一点小小的台风震撼"},{"content":" \u0026ldquo;亚马逊将于一年之后即2023年6月30日，在中国停止Kindle电子书店的运营。在此之后，您将不能购买新的电子书。对于已经购买的电子书，您可以在2024年6月30日之前下载，并且可以在此后继续阅读。\u0026rdquo;\n以上公告来自亚马逊。这意味着6月30日起Kindle的国内线上服务将不再完整，需要完整的服务需要申请一个其他地区的亚马逊账号，但是国外的亚马逊商城中文书籍极少甚至有些地区没有，趁这个机会我就想把手头的KPW3越个狱。 之所以要拆机是因为KPW3当前免拆机越狱的最后一个版本是5.14.2（来源：Kindle 越狱支持一览：检查 Kindle 设备能否越狱），而我的设备已经升级到5.15.1.1,想要降级越狱必须拆机。\n准备工作：\n杜邦线公对母若干根 TTL刷机板（我用的是FT232RL，这玩意能选择输出1.8 3.3或者5伏） 拆机工具（包括但不限于翘片、螺丝刀、最好有热吹风） 电烙铁（选配，但是最好是有） SecureCRT 拆机过程不再赘述网上一抓一大把，拿出主板的时候注意从顶部抠开。 安装好TTL的驱动并确定好COM端口号，配置SecureCRT如下图所示。 接下来进行硬件连接，需要切换成3.3V模式，然后划出三根线，GND连接主板上任意部位，我连接到充电口；DEBUG接口左边为RX，连接到TTL的TX，中间为TX，连接到TTL的RX，最终如下图所示。 *正式刷写时此处应用烙铁飞出RX TX这两根线并固定好，否则刷到半断开了容易GG。 此时重启KPW3，SecureCRT上应该会显示出一些信息，证明是连接成功了。 剩下的部分等我的烙铁到了再更新 ::acfun:11:: 。\n焊点太小了焊不上，此贴终结。\n买了个J焊头，这次焊上去了，继续更新。因为触点实在太小了，拉了两坨锡把触点搞大，好在没有连锡。 长按电源10S重启，直到SecureCRT信息跳动，疯狂的按Enter（其实只要在Hit any key to stop autoboot:0之前按住就行了，不然会进入正常启动流程。 然后电脑安装这个驱动，驱动选择libsub-win32即可。 驱动安装完成后回到SecureCRT,在uboot\u0026gt;后输入run bootcmd_diags回车，然后再次疯狂回车，避免程序跑完后系统正常启动。注意，此时要把USB数据线与电脑连接。 如果成功了，会弹出一个Menu菜单，这个菜单会有倒计时，10秒没有反应就正常启动，因此要快点按住e，此时电脑会弹出一个Kindle的分区，把update_pw3_factory_5.8.9.0.1.bin这个固件放进去，复制完成后按住1，系统会进入恢复模式并自动升级。 在Kindle上可以看到显示正在安装更新。 这个时间是比较久的，而且线路松动的话设备很容易寄，因此焊接必须要做好，保证线路不能松动。 等大约二十分钟后系统自动重启，可以看到系统版本已经降下来了。 ","date":"2023-07-23T22:40:00+08:00","permalink":"https://blog.tama.guru/record/264.html","title":"记一次KPW3拆机降级"},{"content":"今年年初的时候Vultr推出了免费服务器计划，只要满足以下条件就能申请一台服务器：\n绑定了信用卡 开启2FA 服务器的规格如下：\n单核虚拟处理器 0.5GB内存 10GB磁盘 2TB的免费全球带宽 0.5G内存可能是小了点，但是免费的，跑个Debian应该还行。 申请之后一段时间会收到这个提示： 其中有提到这个计划的启动时间和结束时间，但是有网友问过客服，如果到期了再次审核满足条件的话是能继续续下去的。 建立新实例的步骤如下：\n选择Cloud Compute 选择Regular Performance 选择Server Location。需要注意的是，免费计划只适用于美国西雅图、迈阿密和德国法兰克福，选择其他地方是不会在Server Size出现\u0026quot;Free Tier\u0026quot;这个选项的。 新建成功之后去PING了一下IP，居然是通的 (ﾟ∀。)，记得几年前Vultr家的服务器是一封一大片。\n磁盘占用情况：\nroot@vultr:~# df -h Filesystem Size Used Avail Use% Mounted on udev 207M 0 207M 0% /dev tmpfs 46M 696K 46M 2% /run /dev/vda1 9.4G 2.6G 6.3G 30% / tmpfs 229M 0 229M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 46M 0 46M 0% /run/user/0 还剩6.3G，还行，还能做些事情。\n内存占用情况： root@vultr:~# free -m total used free shared buff/cache available Mem: 457 104 233 0 140 353 Swap: 0 0 0 还剩233M\u0026hellip;这下不开swap不行了，给swap划分1个G，那就还剩5个G左右的空间。 还要配置好swap的使用机制： echo \u0026quot;vm.swappiness = 50\u0026quot; \u0026gt;\u0026gt; /etc/sysctl.conf 这个数值0即完全不使用swap，100即更偏向使用swap。这么小内存的机子，我就配置个五五开差不多了。\n网速测试： root@vultr:~# speedtest-cli Retrieving speedtest.net configuration... Testing from Choopa, LLC (********)... Retrieving speedtest.net server list... Selecting best server based on ping... Hosted by Wowrack (Seattle, WA) [1.31 km]: 9.041 ms Testing download speed................................................................................ Download: 655.26 Mbit/s Testing upload speed...................................................................................................... Upload: 3234.36 Mbit/s (ﾟ∀。) Really nigger? 拖个镜像试试看\nroot@vultr:~# wget https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-12.0.0-amd64-DVD-1.iso --2023-07-15 17:24:53-- https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-12.0.0-amd64-DVD-1.iso Resolving cdimage.debian.org (cdimage.debian.org)... 2001:6b0:19::163, 2001:6b0:19::173, 2001:6b0:19::165, ... Connecting to cdimage.debian.org (cdimage.debian.org)|2001:6b0:19::163|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://saimei.ftp.acc.umu.se/debian-cd/current/amd64/iso-dvd/debian-12.0.0-amd64-DVD-1.iso [following] --2023-07-15 17:24:54-- https://saimei.ftp.acc.umu.se/debian-cd/current/amd64/iso-dvd/debian-12.0.0-amd64-DVD-1.iso Resolving saimei.ftp.acc.umu.se (saimei.ftp.acc.umu.se)... 2001:6b0:19::138, 194.71.11.138 Connecting to saimei.ftp.acc.umu.se (saimei.ftp.acc.umu.se)|2001:6b0:19::138|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 3931095040 (3.7G) [application/x-iso9660-image] Saving to: ‘debian-12.0.0-amd64-DVD-1.iso’ debian-12.0.0-amd64-DVD-1.iso 100%[===========================================================================================================================================\u0026gt;] 3.66G 87.3MB/s in 46s 2023-07-15 17:25:41 (81.9 MB/s) - ‘debian-12.0.0-amd64-DVD-1.iso’ saved [3931095040/3931095040] 欸欸欸 (ﾟ∀。)\n","date":"2023-07-16T01:35:27+08:00","permalink":"https://blog.tama.guru/record/vultr-free-instance.html","title":"Vultr免费服务器体验"},{"content":"之前接触过NekoBox这个匿名提问箱，非常小巧，界面简洁不花哨，非常有好感。但是因为一些不方便说明的原因，作者把原站关闭了（更正，作者已经重新开放原站了），实在可惜。好在他有把源码放到github（引路：https://github.com/NekoWheel/NekoBox)，虽然基本上相当于没有教程，而且使用过程中有好多报错。经过搭建之后半天摸索，现在功能基本上都正常了。 在此基础上，我引入并魔改了几个js实现了页面二维码以及自定义前景色背景色等小功能，另一方面则是尽量把可以部署的资源都部署到OSS上以实现更快速的访问。 底部加上了没什么用但是就想加上去的信息统计，至少看到数字有变化能盼我感受到:啊啊，原来还有人在用啊。。。\n狼的提问箱：狼的提问箱 欢迎访问和体验！\n界面很简洁，很干净。\n正如作者所说的“一个究极简洁的匿名问答箱。没有多余的社交元素，只是一问一答。不提醒，不打扰。你不需要下载 App，不需要绑定社交账号，甚至连邮箱都不需要是真的。” 提问也不需要注册，如果是需要收到提醒就填个接收邮箱就行了： 再最近一次更新中也实现了图片评论回答功能，一般提问箱的功能基本上能够实现了（用的R2作为图床，别问为什么）: 可以自定义提问箱的背景和个人头像，怕被骚扰？也可惜设置仅允许注册用户向我提问，也可以把所有关于你的信息导出，如果想销号也是直接停用： 如果你正好需要这样一个提问箱，不妨试试，有需要的话也可以自己搭建，最后，欢迎大家向我提问 ::acfun:1001:: 小狼的提问箱 - 狼的提问箱\n","date":"2023-06-03T14:36:00+08:00","permalink":"https://blog.tama.guru/record/tamabox.html","title":"搭了个基于NekoBox的提问箱！"},{"content":"先上结果： 所以网上关于这张卡无法在AMD的平台上跑这个说法基本上宣告破产了\u0026hellip;\u0026hellip; 但是在我B550M这个平台上安装上这卡并不容易，不仅是兼容性层面，还有物理层面问题（我的主卡3060ti实在是太大，直接把两个PCIe口占据了。。。而直接用PCIe延长线也是因为底座过高而无法安装。 接下来说说装这张卡碰到的坑。 大前提肯定是把ResizeBAR打开了，详情看之前的文章：记一次VBios的升级和resize bar的开启 首先我是插在A320M+2200G平台上的（这是NAS机，之前我想把这做推流机），插上去之后显示无输出，但是PiKVM能看到硬盘灯在闪烁，判断系统是正常运行了，于是从远程桌面进去发现能正常，安装驱动之后能够正确识别型号（设备管理器中有一个PCI设备一直显示无驱动且找不到驱动），发现NDI推流延迟较高，故放弃，转战主机。 主机上主显卡是3060TI，这玩意非常的大，大到把主板底部的大多数接口都盖住了。 首先我是DG1+PCIe延长线（延长线只支持到PCIe3.0）接到PCIe3.0接口上，主显卡不变，插在直通CPU的PCIe4.0接口，结果就如前文所述，延长线底座太高，3060TI插不进去了\u0026hellip; 然后我试着单独把DG1插到PCIe3.0接口上，结果是硬盘灯闪，显示器无信号。 再试着把DG1插到PCIe4.0接口上，结果也是硬盘灯闪，显示器无信号。即判断直接插入这张卡是无法正常显示的。 接下来我用3060TI接上延长线连接PCIe4.0接口，DG1直插PCIe3.0接口，显示器能反应，能进BIOS，但是进入系统的启动过程中会提示无法启动，无论切换到Win10 LTSC2021 Server2022 Win11均无法正常启动，这里就是我最疑惑的地方了。 最后我改变了想法，把3060TI接上延长线连接PCIe3.0接口，DG1直插PCIe4.0接口，却发现是能正常进入系统了！我的两台显示器分别插在两张卡上，进入系统之后只有插在3060TI上的卡的显示器是亮的，插在DG1的显示器黑屏。安装Xe驱动后，双屏正常工作了。 但是这样对性能的损耗有些大，3060TI在PCIe3.0上无法发挥其最大效用，而DG1占着PCIe4.0接口，但它最多也只能跑到4.0 x8 而且我发现这样接上之后，鼠标的拖动会偶尔发生卡顿，这个情况现在也是无解。 接下来我想再买一根PCIe4.0的延长线，看看这样插能不能把性能跑满，后续再继续测试视频和直播的编解码能力。 PS1:发现在启动浏览器的情况下鼠标拖动会有卡顿，如果桌面无任何程序时则很流畅。 PS2:点亮后如果把3060TI拔了（即单卡启动）仍然无法显示，在3060TI上插上HDMI后就都正常显示了。 PS3:把DG1上的线都插到3060TI上之后卡顿问题有所缓解但仍有发生。 PS4:对于PS1提到的问题，我发现，双显示器情况下把两条视频线分别插入两张显卡，不会发生卡顿。 PS5:在微星H510M爆破弹上开启UEFI resizebar above 4g和安全启动，关闭快速启动，无法点亮。拔掉电源和bios电池放电也无法启动，再插上核显（10400的uhd630）输出时有一定概率花屏。\n","date":"2023-05-10T23:24:00+08:00","permalink":"https://blog.tama.guru/record/dg1_with_b550m.html","title":"在技嘉B550M上成功点亮并使用（但不完美）DG1教程"},{"content":"首先科普一下resize bar是什么：\n可调整大小的 BAR 是一种可选的 PCI Express 接口技术。当您在游戏中的世界中移动时，GPU 内存 （VRAM） 会通过许多小型 CPU 不断传输纹理、着色器和几何体到 GPU 的传输。随着现代游戏资产规模的不断增长，这导致了大量的转移。使用可调整大小的 BAR，可以根据需要请求资产并完整发送，因此 CPU 可以有效地访问整个帧缓冲区。如果发出多个请求，传输可以同时进行，而不是排队。（来自Nvidia官网)\n这不是今天刚买了DG1嘛，有说到什么Resizebar什么新功能巴拉巴拉的，之前听都没听过，查了下资料发现好像是有点用处的嗷，又看了下30系确实是能用的，于是喜滋滋的去这里看如何操作（这里的七彩虹链接404了，后面是去官网找的）。我的卡是七彩虹的iGame GeForce RTX 3060 Ti Ultra W OC-V，去官网上找到对应的驱动页面，找到BIOS看到一个3060Ti Resizable BAR Support，哟还是今年三月更新的，赶紧下载了。 打开压缩包之后打开3060tiRZBARupdaterV2.exe（这里显示修改时间2021/4/9，怪） 按y进行下一步，发现提示Unsupported by this tool, contact card vendor ::acfun:1004:: 这不是我的卡的驱动吗？怎么还能不支持的？然后再搜了下，开启resize bar需要满足以下条件：\nBIOS中支持并开启Resize Bar Support同时开启Above 4G Decoding 关闭CSM（其实我的主板在打开Resize Bar Support后自动就把CSM关闭了，好像CSM和这个功能有冲突） 一张30系显卡 然后我就走了一遍流程把上面都打开了（顺便还把BIOS给升级了一遍）。重启后发现还是显示Resize Bar Disable 然后在GPU-Z的Advanced-PCIe Resizable BAR下面的Resizable BAR enabled in BIOS显示是NO ::acfun:19:: 什么勾八？ 网上搜索了一下，发现也有人出现这个情况，然后他把CSM重新打开就能识别了。我复现了一下发现根本不可行，而且其他例如CSM disabled也变成NO了，这不是妥妥的坑人嘛。 本来我都打算放弃了，在这个贴子上看到有提到vbios的问题，然后我琢磨着是不是我的vbios版本不对，然后去查了下如何升级vbios以及去 哪儿整vbios。 [button color=\u0026ldquo;danger\u0026rdquo;]风险警告！刷写VBIOS操作不当可能会导致显卡变砖！[/button] [button color=\u0026ldquo;danger\u0026rdquo;]风险警告！刷写VBIOS操作不当可能会导致显卡变砖！[/button] [button color=\u0026ldquo;danger\u0026rdquo;]风险警告！刷写VBIOS操作不当可能会导致显卡变砖！[/button] 简单来说，就是到这个网站搜索到自己型号的显卡，找到之后下载到一个rom后缀的文件，这个就是vbios了。 文件有了，还需要工具，也是到这个网站找到NVIDIA NVFlash这个页面:https://www.techpowerup.com/download/nvidia-nvflash/按自己机器的型号下载到压缩包之后，把文件解压，并把rom文件放在同一个文件夹。 以管理员身份运行CMD，并进入此文件夹。 先执行nvflash.exe --list查询是否识别到显卡并且判断显卡vbios版本 然后执行nvflash.exe -6 Colorful.RTX3060Ti.8192.201112.rom这里选择要升级的rom文件，-6参数是强制升级。 上图中现有版本是94.04.27.80.EC，要升级的版本是94.04.27.80.ED，看上去确实是差了一个版本。 如果顺利的话这里直接一路y过去，最后会提示你要重启，重启就是了。 然后再次打开上面那个3060tiRZBARupdaterV2.exe，哦豁。 Update supported, will be applied 我直接一个y。 提示Update successful，它要求重启，那我直接一个重启。 最后就是喜闻乐见的开启成功了，果然是vbios的问题。 完事手工。 ::acfun:06:: [button color=\u0026ldquo;danger\u0026rdquo;]再次警告！刷写VBIOS操作不当可能会导致显卡变砖！[/button]\n","date":"2023-05-07T23:28:00+08:00","permalink":"https://blog.tama.guru/record/3060ti_vbiosupdate_sizebar.html","title":"记一次VBios的升级和resizebar的开启"},{"content":"AMD在编解码这一块就是一坨大便！ 最近把平台从Intel转到AMD，现在家里的两台机器已经是清一色的红厂CPU了。\n主电脑 CPU: 5700X 显卡： 3060ti 备胎机 CPU: 2200G 显卡： 核显Vega8 自己打打游戏都还好，但是在换上新CPU的第一次直播我就发现，我这端开始提示`编码过载`，然后别人看直播都是一卡一卡的。这就很奇怪，明明配置比之前高了不少，而且设置也没改过，怎么会这样呢？水土不服？无论是奥德赛、欧卡，甚至是Muse Dash这种不是很依赖3D性能的游戏都很卡。 ![这是当前的OBS配置，没有改动过][1] 我自己玩起来是一点卡顿都没有的，那么有问题的很可能就是CPU。10400换了5700X之后，最重要的一个地方是核显没了，是不是这个原因呢？经过一番搜索，比如这里：[OBS编码详解][2] ![下面的评论][3] [一个带核显的CPU好 还是配了同样性能的独显好？][4] ![下面的评论][5] AMD有这么拉吗？我平台都换了，总不能再换回去吧... 我试想了几个解决方案： 通过内网用二胎机用VEGA8做推流编码工作。 主要是看到这篇文章：https://zhuanlan.zhihu.com/p/49187146 游戏机只负责玩游戏，由于游戏机通过显卡连了根线到采集卡，所以他把采集卡当做一块显示器，采集卡便采集这块“显示器”的视频数据，并因为装在直播主机上，使得该数据可以被直播机（OBS）捕获（直播主机把采集卡当做一个视频输入源，就像直播机外接了一个摄像头一样）。这样一来，游戏机借由另一台电脑来直播，自身无需承担任何直播相关的性能压力。\n这个情况和我现在的需求倒是挺像的，也确实有一台可以用作直播主机的机器，问题就是采集卡，好像也有办法直接通过软件推流到另一台电脑上而不需要通过采集卡，还有就是VEGA8能不能应付这个情况？稍微搜索了一下，发现如果要用采集卡的话对卡的质量要求挺高的（也挺贵的），而且我的备胎机是在另一个房间里，那么长的距离传输对延迟和各方面是不是都有一些影响？ 由于备胎平时还要用作NAS，本身机箱空间就小，平时温度挺高的，说实话我不是很想用这个方式，怕的是再加上编码这个活儿稳定性会大幅降低。\n再加个核显 也是偶然看到有https://zhuanlan.zhihu.com/p/617531197这个文章，第一次知道有外置核显这种玩意 ::acfun:02:: 参数（来源Intel Ark)： ARK | 比較 Intel® 產品 2023/05/07 16:53:56 Intel® Iris® Xe 獨立顯示卡 (80 EU) 關鍵元件 產品系列 Intel® Iris® Xe 顯示晶片獨立 GPU 代號 產品原名\u0026nbsp;\u0026nbsp;DG1 狀態 Launched 推出日期 Q1'21 GPU 規格 繪圖最大動態頻率 1500 MHz TDP 28 W PCI Express 設定 ‡ Up to x4 Gen4 記憶體規格 繪圖記憶體介面 128 bit 繪圖記憶體頻寬 68 GB/s 繪圖記憶體速度 4267 Gbps 支援的技術 DirectX* 支援 12.1 Vulkan* 支援 1 OpenGL* 支援 4.6 I/O 規格 支援的顯示器數量 ‡ 3 圖形輸出‡ DP 1.4 w/ HDR |\u0026nbsp;\u0026nbsp;HDMI 2.0b 最大解析度 (HDMI)‡ 4096 x 2160@60Hz 最大解析度 (DP)‡ 7680 x 4320@60Hz 功能 H.264 硬體編碼/解碼 是 H.265 (HEVC) 硬體編碼/解碼 Yes |\u0026nbsp;\u0026nbsp;12-bit 進階技術 Intel® Adaptix™ 技術 否 Intel® Deep Learning Boost 是 看起来好像还真有点那回事。今天下单了一张，过段时间到货了测试看看。 ","date":"2023-05-07T16:57:09+08:00","permalink":"https://blog.tama.guru/default/adm_stream.html","title":"AMD直播推流真的就是一坨答辩！"},{"content":"*注意，mirai无法启动仅针对在windows下使用时出现，linux并无此问题。\n使用最新的acfunlive源码编译windows-gui并使用时发现，执行 acfunlive.exe -mirai 会直接开始程序的运行，跳过mirai登录验证场景并报错： error: read /dev/stdin: The handle is invalid 这个问题苦恼了我很久，之前都时再开个linux虚拟机单独跑录播机器人，但是一想到之前也碰到过mirai机器人无法登录的问题，最终解决方式是通过gocqhttp生成device和session文件替换到程序目录中以骗过程序你已经登陆过了。 以下是操作流程：\n下载并配置go-cqhttp 到官网下载当前环境配置版本的go-cqhttp，此处我是windows，直接下载windows_x64版本。下载后双击运行exe，提示无法直接运行，之后生成一个bat文件，双击go-cqhttp.bat文件运行，然后输入1回车，提示默认配置文件已生成，请修改 config.yml 后重新启动!后关闭窗口。 修改config.yml，主要是修改uin这一项，其他不用管（因为之后使用的是watch协议登录，所以不需要填密码），修改后保存文件。 再次双击go-cqhttp.bat文件运行，在提示Bot将在5秒后登录并开始信息处理, 按 Ctrl+C 取消.后按Ctrl+C中断程序运行。 然后目录下会生成一个device.json文件，打开并将\u0026quot;protocol\u0026quot;:6的值修改成2，保存。然后再次双击go-cqhttp.bat文件运行，一段时间后他会提示你扫码登录，使用登录了同一个账号的手机扫码会提示是一个手表设备，确认登录。等出现如下内容时可以关闭程序。并看到目录下生成了sesssion.token这个文件。 修改acfunlive配置 把gocqhttp目录下的sesssion.token和device.json复制到acfunlive目录（保险起见可以全部复制过去），然后将其重命名为qqsesssion.token和qqdevice.json，此时目录结构如下所示。 此时在powershell下执行.\\acfunlive.exe -mirai或者正常启动到http://localhost:51880/startmirai再打开http://localhost:51880/log可以看到已经登录成功了。 如果提示要扫码，那么会在acfunlive的目录下有一个qqqrcode.png文件，打开用手机扫码登录即可。 ","date":"2023-05-05T23:35:47+08:00","permalink":"https://blog.tama.guru/record/acfunlive-mirai.html","title":"解决AcFunLive的mirai机器人无法使用的问题"},{"content":"本来是想买个随身WIFI，以便家里突然断网/断电的时候能够用手头上多余的一张SIM卡开个应急热点，但是去淘宝搜了一圈，成品随身WIFI要么说经常断网，要么就是无法使用自己的卡，要么就是能插自己的卡，但是只能插物联网卡或是插一张之后就不能插别的卡了（卡和机器绑定了），可玩性极差。然后想想家里还有一坨树莓派，用充电宝供电，能不能在这个基础上整些模块。 于是，在搜索了相关材料之后，选择了移远的EC200A-CN。 大概就长这样，一个USB口，四个串口，一个SIM卡槽，一个天线接口，没了。 在WIN下直接插上会直接当作USB网卡使用，但是任务管理器下面的AT Interface和Diag Interface会有感叹号，这意味着无法进行AT指令交互，也就只能当作一块无线网卡使用。只需要把这个驱动打上就正常了。 先不管WIN下使用AT怎样怎样，买这块板子的初衷就是给树莓派用的，然后我就把板子拔下来插树莓派上了。 先说下环境，因为我要用到pikvm，所以使用的系统是魔改的archlinuxarm，内核版本5.15.68-3-rpi-ARCH。 插上去之后，灯开始闪，但是执行 ifconfig 之后： 你妈的，我USB0呢？ 吓得我赶紧看看是不是给我搞坏了或者根本没识别。 ::acfun:02:: 还好还好，东西还在。 ::acfun:03:: 那么这是怎么个回事呢？我看店铺上明明写着linux免驱啊！于是在问一通客服之后 给了我个tgz包。 ::acfun:01:: 不问不给是吧。解压之后内容如下： 因为我的内核版本是5.15.68，离得比较近的是5.15.11，进入这个目录，执行 make 和 make install 后会生成option.ko``qcserial.ko和usb_wwan.ko三个文件，执行\ninsmod option.ko insmod qcserial.ko insmod usb_wwan.ko 载入模块。如果报错，可能是依赖没有载入。我是在执行insmod usb_wwan.ko时报错的，于是执行 modinfo ./usb_wwan.ko | grep depend 它显示需要载入一个usb模块，于是再执行 modprobe usb 再执行一次上面的命令，就算是成功完成驱动安装了。可以通过执行 dmesg | grep ttyUSB* 验证是否安装完成，我这个板子只有3个TTY，5G的卡好像是有5个TTY的。 这时候再次执行ifconfig，捏妈妈的，还是没有！ ::acfun:09:: 然后再查查资料，再这个地方翻到了一些有用的东西，这里说的时通过EC20模块访问互联网，大同小异，就先照着这个试试。原来还需要安装一个wvdial依赖包，因为我是arch，执行 pacman -S wvdial 如果时debian系的就是 apt install wvdial 应该也找得到吧。 然后修改配置文件，这里直接借鉴作者的。\n#电信或移动 [Dialer lan1] Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 \u0026amp;C1 \u0026amp;D2 +FCLASS=0 Modem Type = Analog Modem Baud = 9600 New PPPD = yes Modem = /dev/ttyUSB2 ISDN = 0 Phone = *99# Password = card Username = card #联通 [Dialer lan1] Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 \u0026amp;C1 \u0026amp;D2 +FCLASS=0 Init3 = at+cgdcont=1,\u0026#34;ip\u0026#34;,\u0026#34;uninet\u0026#34; Modem Type = Analog Modem Baud = 9600 New PPPD = yes Modem = /dev/ttyUSB2 ISDN = 0 Phone = *99# Password = card Username = card 根据自己的卡类型填写其中一组配置即可。其中的lan1是配置的名称，可以自行修改。然后打开个screen（因为执行时程序必须在后台） screen -S dial 执行： wvdial lan1 会根据配置文件进行PPP拨号，并生成一个ppp0的网卡。然后把screen放到后台，执行以下命令实验是否成功联网： ping www.baidu.com -I ppp0 可以看到成功PING通了，第一个包的延迟很高，但是后面就慢慢好起来了。 ::acfun:2002::\n","date":"2023-04-19T23:06:55+08:00","permalink":"https://blog.tama.guru/record/EC200A-CN.html","title":"4G开发板EC200A的初次使用记录"},{"content":"安装PVE并不复杂，相关操作网上一抓一大把此处不再赘述。 此处主要记录一些安装后碰上的问题以及对应的解决方案。 #####开启硬件直通##### 1.首先确保CPU带有虚拟化能力。对于AMD平台，在BIOS的高级\u0026gt;CPU设置查看是否有能开启SVM Mode。 确认能打开后，到高级\u0026gt;AMD CBS\u0026gt;NBIO Common Options\u0026gt;NB Configuration下把IOMMU打开。 2.进入系统控制台，修改grub启动时添加硬件直通功能。 打开/etc/default/grub 将\nGRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet\u0026#34; 进行修改。\n对于AMD平台修改为\nGRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet amd_iommu=on iommu=pt video=efifb:off,vesafb:off\u0026#34; 对于Intel平台修改为\nGRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off\u0026#34; 修改完成后执行：\nupdate-grub 并添加以下模块到内核中：\necho vfio \u0026gt;\u0026gt; /etc/modules echo vfio_iommu_type1 \u0026gt;\u0026gt; /etc/modules echo vfio_pci \u0026gt;\u0026gt; /etc/modules echo vfio_virqfd \u0026gt;\u0026gt; /etc/modules 添加完成后重启。 #####替换源##### 执行以下命令：\n#先把企业源换掉 rm -rf /etc/apt/sources.list.d/pve-install-repo.list echo \u0026#34;#deb https://enterprise.proxmox.com/debian/pve Bookworm pve-enterprise\u0026#34; \u0026gt; /etc/apt/sources.list.d/pve-enterprise.list #替换其他软件源 wget https://mirrors.ustc.edu.cn/proxmox/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg echo \u0026#34;deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription\u0026#34; \u0026gt; /etc/apt/sources.list.d/pve-no-subscription.list echo \u0026#34;deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-pacific bookworm main\u0026#34; \u0026gt; /etc/apt/sources.list.d/ceph.list sed -i.bak \u0026#34;s#http://download.proxmox.com/debian#https://mirrors.ustc.edu.cn/proxmox/debian#g\u0026#34; /usr/share/perl5/PVE/CLI/pveceph.pm sed -i.bak \u0026#34;s#ftp.debian.org/debian#mirrors.aliyun.com/debian#g\u0026#34; /etc/apt/sources.list sed -i \u0026#34;s#security.debian.org#mirrors.aliyun.com/debian-security#g\u0026#34; /etc/apt/sources.list echo \u0026#34;deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription\u0026#34; \u0026gt;\u0026gt; /etc/apt/sources.list 最后执行更新\napt update #####关闭订阅提示##### 修改文件：\n/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js 搜索 data.status.toLowerCase，并将框中内容删除： 再次搜索 data.status.toLowerCase，并将框中内容删除： 之后重启平台。 #####无法使用mkfs格式化硬盘##### 如果提示： apparently in use by the system; will not make a filesystem here! 则先执行 dmsetup remove_all 再执行 mkfs.filesystem /dev/disk #####手动挂载已有硬盘##### 首先通过fdisk -l查询硬盘/分区的路径 如需要挂载的设备为： /dev/sdc4 83888128 468862094 384973967 183.6G Linux filesystem 接下来通过blkid``查询设备UUID及分区类型 如查询结果为： /dev/sdc4: UUID=\u0026ldquo;b958d02b-9f99-4e48-bacf-xxxxxxxx\u0026rdquo; BLOCK_SIZE=\u0026ldquo;512\u0026rdquo; TYPE=\u0026ldquo;xfs\u0026rdquo; PARTUUID=\u0026ldquo;beabe66d-07c2-2d4b-9836-xxxxxxx\u0026rdquo; 如果需要挂载的是硬盘，接下来需要的是UUID，如果需要的是分区，则需要PARTUUID，另一个参数`type=\u0026quot;xfs\u0026quot;`表明了文件系统类型 修改/etc/fstab```添加以下内容\nUUID=\u0026#34;b958d02b-9f99-4e48-bacf-xxxxxxxx\u0026#34; /mnt/rootfs2 xfs defaults 0 0 第二个参数是需要挂载的目录位置。最后执行 mount -a即可。 #####使用lxc安装docker##### 1、首先进行换源操作\ncp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back sed -i \u0026#39;s|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g\u0026#39; /usr/share/perl5/PVE/APLInfo.pm 更换完成后重启pve。 2、接下来进入PVE网页端，按如下操作安装debian软件包。（选择的目录应有CT镜像功能） 之后等待窗口提示TASK OK。 3、点击右上角的创建CT，配置常规选项：特别要记住CT ID，并把无特权的容器的勾取消掉。 模板刚才下载的目录位置以及模板。 磁盘空间根据实际情况给，建议20G以上。 核心数分配根据机器的实际情况配置。 内存设置考虑到后期我需要运行的Docker内容较多，我设置为1024，如果配置较低或者使用负载较小可以设置512，Swap同理。 网络选项根据自己内网路由情况进行编辑，不建议使用DHCP，因为我经常找不到IP。 DNS设置使用默认即可。然后确认信息无误点击完成，等待TASK OK。 然后进入Docker的容器选项设置，把功能中以下内容勾选。 接下来进入终端，修改配置文件，如我的lxc容器id是100，则修改 /etc/pve/lxc/100.conf 在文件末尾添加以下内容：\nlxc.apparmor.profile: unconfined lxc.cgroup.devices.allow: a lxc.cap.drop: #以上三行是必备的，以下两行是用来开启容器tun转发的，不是必须的 lxc.cgroup2.devices.allow: c 10:200 rwm lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file 修改后整个文件应该看起来像： 接下来点击Docker界面的启动，等待启动完成。 4、进入Docker的控制台，修改软件源：\n修改 /etc/apt/sources.list替换成以下内容： deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free 执行apt update更新。 5、 执行以下命令：\napt install docker.io docker run -d --restart=always --name=\u0026#34;portainer\u0026#34; -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce 进入容器IP:9000即可看到Docker控制界面。 #####开机提示ACPI BIOS Error(bug)\u0026hellip;##### 在引导界面按e，并在linux行的最后添加acpi_backlight=vendor 这种情况一般是修改显卡直通之后出现的，而在网上查了一圈，好像也只有华擎主板有这个问题\u0026hellip;参考链接\n#####挂载现有硬盘到虚拟机或lxc容器##### 先获取分区的识别符 ls -l /dev/disk/by-id 例如本次要挂载的分区为ata-b958d02b-9f99-4e48-bacf-xxxxxxxx 如果要挂载到虚拟机上，则执行 qm set 虚拟机ID -sata1 /dev/disk/by-id/硬盘识别符 如果要挂载到LXC容器内，则执行 pct set 容器ID -mp0 /dev/disk/by-uuid/硬盘识别符,mp=/挂载路径 如果已经在pve上挂载硬盘想映射进lxc容器，可以执行： pct set 容器ID -mp0 /pve上挂载位置,mp=/lxc挂载路径 同理可将pve上的任意路径挂载进容器中。 #####PVE8.0创建LXC容器之后无法进入ssh##### 更新到8.0之后发现怎么创建容器都进不去SSH，具体是：控制台一片空白；XSHELL连接提示拒绝访问；宿主机使用ssh root@192.168.xx.xx提示Permission denied, please try again.（密码是正确的） 这种情况下可以先进入宿主机的ssh，执行:\nVMID Status Lock Name 101 running docker12 当前我运行的lxc容器ID是101，因此执行：\nroot@docker12:/etc/ssh# 这样就能进来了。 再编辑下/etc/ssh/sshd_config，把PermitRootLogin改成yes，再重启下sshd服务，这次能正常登陆了。\n","date":"2023-03-12T01:43:00+08:00","permalink":"https://blog.tama.guru/record/pve_install.html","title":"PVE安装后续优化"},{"content":"前几天安装Debian的时候，在Select and install software过程总是报错后终止安装进程，强制进入下一步安装引导会提示没有安装grub引导器可能会导致无法启动，查了一些资料后都在说是debian-security这个源在国外，直接连接速度极慢（体现为这一步下载4个文件需要几个小时，而且极大可能会突然连接不上然后安装失败）。 那么就有说在这一步之前选择不使用网络源并且按Ctrl+Alt+F2切换到其他tty： 修改/target/etc/apt/sources.list\n#修改debian-security为国内源或者直接屏蔽掉这一行 #deb http://security.debian.org/debian-security bullseye-security main 但是实际就算是把源换成国内的或是屏蔽掉，在点击下一步之后还是会把security.debian.org这个源还原回来，然后继续卡着\u0026hellip; 那么就有两种办法， ###一、全局代理### 这种方法我还没试过，不过觉得是可行的，需要在路由器或者上级网络配置好全局国外代理。使用手机USB网络或者热点可能有些问题，因为在这一步WIFI和USB网卡驱动还没能安装。 ###二、拔网线### 在进入是否选择网络源这个界面的时候把网线拔了再点下一步，这样就默认只使用本地介质上的资源进行更新。最好不要全程断网（进系统之后你需要自己配置网卡设置）或是在这之前断网（尝试在DHCP配置完成之后、是否选择网络源之前拔掉网线，会有可能导致安装进程卡住。），等待安装完成后再把网线接回去。\n","date":"2023-03-08T16:02:24+08:00","permalink":"https://blog.tama.guru/record/debian_install_slow.html","title":"解决Debian11安装慢问题的一些歪门邪道"},{"content":"目前访问ChatGPT主页多半会得到以下几种结果： ####·OpenAI‘s services are not available in your country·#### 如果你没挂梯子，那么请挂上梯子并打开全局代理模式，选择除香港外的服务器。 如果想使用规则模式，那么需要把以下内容添加到规则模式DOMAIN-SUFFIX：\nopenai.com auth0.com sentry.io google.com googleapis.com hcaptcha.com recaptcha.net gstatic.com gvt2.com gvt1.com gvt3.com msftconnecttest.com live.com sfx.ms microsoft.com ####·Access Denied·#### 过于频繁的切换服务器/当前IP已经被BAN。 ####·访问新必应提示404后跳转到必应中国·#### 参考：PCBeta 需要安装插件Gooreplacer，请求/相应头设置如下：\n动作类型：修改 键名：x-forwarded-for 键值：1.1.1.1 匹配模式：^http(s?)://(www\\.)?bing\\.com/?(.*) 匹配类型：正则表达式 设置页面保留所有ON。 再进入新必应即可看到加入队列的选项。 ####·新必应加入等待列表提示“出错了，请重试”·#### 官方回复：官方社区答疑\n可能受当前地区、网络 IP、申请频繁、频繁更换 IP 来源影响导致暂时禁止访问， 您可以耐心等待一段时间或几天后再进行加入申请，看看是否可行； 如果急需体验 Microsoft 新必应相关的功能的话，或许可以尝试通过重新注册新的 Microsoft 账户来申请加入，看看是否可行。 ","date":"2023-02-11T18:29:00+08:00","permalink":"https://blog.tama.guru/record/accessofopengpt.html","title":"目前能访问OpenGPT的方法"},{"content":"I have a d○ck. 不得不说，这东西挺有意思的，amd定制的zen2架构CPU及性能相当于1050的显卡能够应付大部分场景使用以及轻度游戏，还能轻松安装SteamOS+WIN10/11组合，玩一些原系统上因为各种原因玩不了的游戏，如果空间不够，还能自己买一个2230的M2换上去。但是在使用过程中这玩意其实坑挺多的，想要快乐玩耍掌握一些linux基础知识以及“合适的网络”是必不可少的。下面是我在使用过程中碰到的一些问题以及解决办法。 ####·首次开机联网后一直提示正在安装，然后卡在还剩1秒或者弹窗报错·#### 基本上是国内专属问题了，归根结底就是网络原因和\u0026quot;steam.cloud\u0026quot;连接有问题导致更新无法进行，而更新又是必须的就导致了这个死循环。 有网友说我有科技，直接开科技不就行了？如果是在路由的话这必须要设置全局代理，因为SteamDeck的WIFI连接界面不能手动设置代理。用手机开热点或许也是一个好办法，但是实测我的流量根本没走，可能是我的姿势不对吧。 还有网友说在安装界面直接长按电源键硬重启，多几次就能跳过，我试了四五次也不行。其中一次关机重启后进入到一个有LOGO+进度条及网速的界面，也在提示install update，但是更新完自动重启之后还是问题依旧。 目前我唯一测试通过的方法就是手机挂UU加速器（亲测雷神无效）加速steam（仅加速商店是免费的），然后开热点，SteamDeck这边开机的时候要设置为英文+UTC-8时区（即默认设置）再连接热点更新，大概率等待半小时就能通过了，手机这边如果开了流量监控，就会发现流量基本1.5m/s这个速度走（峰值4-5m/s），如果没动的话，建议重启加速器或是点击SteamDeck上的Back返回上一步重新开始，直到流量正常出去。大概也就花费1-2G。（下图是我更新了两次） ####·登录不上Steam账号·#### 首次登录可能会遇到这个问题，开加速器即可。\n####·我想换SSD，应该注意什么·#### 必须换2230长度的M2硬盘替换，一般能买到的都是二手的SN740或者530（530存货比较少反而比较贵），其他长度的硬盘虽然能够魔改替换上去但是会严重影响和硬盘紧贴在一起的电源芯片的散热，有烧鸡可能。详细拆机更换流程可以直接参考iFixit或者对着拆机视频操作即可。切记拆机后断开电源再换盘。\n####·我想在固态上装双系统，而且开机能够选择引导·#### 主要分为以下几个步骤：在U盘上载入一个带gparted的系统\u0026ndash;\u0026gt;拆出分区\u0026ndash;\u0026gt;装系统\u0026ndash;\u0026gt;做引导。 （1）建议找一块USB3.0的U盘，到此处下载Ventoy最新版本，下载解压执行Ventoy2Disk.exe，插入U盘后点击安装会把P盘数据格式化，然后生成一个Ventoy的空盘，下载gparted或其他带gparted的系统镜像直接扔进这个空盘，同时准备好WIN10/11的系统镜像，也一并放进去。 （2）把SteamDeck关机，用OTG或拓展坞把U盘连接到SteamDeck。按音量-及电源键一秒进入启动项选择，进入Boot from USB,然后会弹出Ventoy的启动界面并显示所有的镜像，选择下载好的gparted的iso镜像，选择normal启动，然后一路回车就进入镜像了。 （3）选择最大的分区将其resize，在最后部分调整出一块200G的空间，然后新增两个NTFS分区，一个用于装系统（80G），一个用于与SteamOS共享数据及给WIN装游戏。（根据实际情况自行调整）调整完后关机。 （4）按步骤2进入启动项选择，这次选择WIN镜像，后续步骤不再赘述，安装步骤和一般装系统完全一致。 （5）等安装完成后重启进入启动项选择，进入SteamOS并进入桌面模式，在右下角菜单找到系统\u0026gt;终端，\npasswd #修改默认密码 sudo passwd #修改root密码 sudo steamos-readonly disable #关闭系统只读 git clone https://github.com/jlobue10/SteamDeck_rEFInd mv SteamDeck_rEFInd .SteamDeck_rEFInd cd .SteamDeck_rEFInd sudo mkdir /root/Downloads sudo chmod +x refind_install_no_pacman.sh sudo sh refind_install_no_pacman.sh 至此引导脚本安装完成，重启之后就能看到StemaOS和WIN的两个LOGO了，五秒内不选择默认从SteamOS启动。之所以选择refind_install_no_pacman.sh是因为SteamOS默认情况下要开启pacman非常麻烦，而且后续升级的话pacman安装的相关软件都会丢失仅保留配置。\n####·我想玩学习版游戏·#### 自测了几个proton版本以及proton next还有heroics game launcher，还是有很多游戏没办法正常启动，建议直接上WIN系统。\n####·WIN系统设备管理器里面安装了Steam官方的驱动之后还是有几个感叹号·#### 截止2023.2.2，Steam官方仅提供了APU（显卡+声音）、声卡、蓝牙、读卡器、WIFI驱动，一部分驱动在WINDOWS系统更新后自动安装，剩余的部分驱动等待官方跟进放出。\n####·进入gparted镜像时报错无法进入图形界面·#### 如果提示I/O error, dev mmcblk0, sector x op 0x0:(READ) flags 0x0 phys_seg，请检查是否插入了SD卡，如果有，先拔出再重新进入。\n####·steam内游戏下载速度慢·#### 去设置看看下载服务器是否本地位置，不然就开加速器（例如我进系统他自己给我调整到日本札幌，换回国内重启后速度就上来了）。\n####·桌面模式的discovery商店访问速度慢·#### Steam桌面商店使用的是flathub源，默认使用的是https://glathub.org/repo，在国内访问较慢，建议换到上海交大源：\nsudo steamos-readonly disable sudo flatpak remote-modify flathub --url=https://mirror.sjtu.edu.cn/flathub 然后进商店里面更新一下就好了。\n####·我账号很多想用家庭共享，但是好像不起作用·#### 因为家庭共享是基于设备的，只在电脑上开通在deck上市无法启用的。这种情况下只能先登陆需要共享的账号，下载个游戏，然后登陆另外一个账号，这里会显示成“借用”状态，点击申请授权即可。\n####·怎么进BIOS/启动菜单·#### 关机状态下： 音量+ \u0026amp; 电源键 一秒（有提示音就放手） = BIOS设置 音量- \u0026amp; 电源键 一秒（有提示音就放手） = 引导选择\n####·怎么使用Steam自带的Proton环境·#### 在桌面模式下进入Steam，选择添加非Steam游戏，对话框默认之能选择.desktop修改成all files，然后选择需要执行的.exe文件，保存后右键Steam中生成的项目选择属性，兼容性设置中勾选强制使用，然后选择任意一个已安装的Proton环境，再运行即可。\n####·Steam自带的Proton在哪个路径·#### 以Proton7.0为例，其目录位于/home/desk/.local/.(忘了，待查)./driver_c/\n####·连接了其他设备切换模式后还能用吗·#### 亲测可以。以蓝牙设备为例，在游戏模式下连接键鼠后切换到桌面模式能正常使用。\n（未完待续）\n","date":"2023-02-02T09:47:00+08:00","permalink":"https://blog.tama.guru/record/steamdeck.html","title":"捣鼓SteamDeck的那些事"},{"content":"去年年末我们单位新采购了几台电脑，毫无意外的全部都是预装WIN11(22H2)，本来还美滋滋，一到连接打印机的时候就开始不对劲了，无论怎么连接都连接不上，叫技术人员上来给出几个解决方案：一、把打印机连接到这台新电脑（这样其他电脑就连接不上了）；二、把系统降下WIN10；三、让别人帮打印。 结果我在网上找了几个方法，最终生效的有且只有一个。 方法一：最多的方法是修改C:\\Windows\\System32\\win32spl.dll文件，网上有很多版本，也有做成脚本的，根据系统的型号覆盖后重启。以失败告终，依旧报错0X000000709。 方法二：修改注册表。即把以下内容保存成reg文件，导入注册表后重启。\nWindows Registry Editor Version 5.00 ［HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Print］ “RpcAuthnLevelPrivacyEnabled”=dword:00000000 ［HKEY_LOCAL_MACHINE\\Software\\Policies\\Microsoft\\Windows NT\\Printers\\PointAndPrint］ “RestrictDriverInstallationToAdministrators”=dword:00000000 结果：重启后依旧提示失败，报错0X000000709。 方法三：在Windows功能中启用LPD打印服务及LPR端口监视器，然后通过手动设置添加本地打印机或网络打印机，创建一个新LPR端口并绑定到远程IP。 结果：重启后依旧提示失败，报错0X000000709。 方法四：在控制面板\\所有控制面板项\\凭据管理器下的Windows凭据添加一个Windows凭据，地址选填网络打印机所在的IP/计算机名，用户名填写guest，密码不填。 结果：能连接，打印成功。\n","date":"2023-01-09T15:24:10+08:00","permalink":"https://blog.tama.guru/record/0X000000709.html","title":"WIN11连接老版本系统（WIN7-WIN10）打印机提示0X000000709的解决方法"},{"content":"::acfun:02:: 安装这个nodejs真的要命！首先是官方库里面的版本过老，如果通过添加源的方式更新一方面是更新速度极慢，另一方面则是可能会碰到“由于没有公钥，无法验证下列签名”这个怪问题，查了好多文章都无法解决。\n替换树莓派默认的node.js和npm 一、删除默认安装的软件 卸载nodejs sudo apt-get remove nodejs 清除软件包以及相关配置 sudo apt-get purge nodejs 二、查看内核版本： Linux tamapi 5.15.76-v8+ #1597 SMP PREEMPT Fri Nov 4 12:16:41 GMT 2022 aarch64 GNU/Linux aarch64 那我就选arm64版本的 三、下载最新版的 nodejs：此处是node19 https://nodejs.org/dist/latest-v19.x/node-v19.3.0-linux-arm64.tar.gz 四、解压压缩包 tar -zxvf node-v19.3.0-linux-arm64.tar.gz 五、删除系统上的旧目录（如果存在） sudo rm /usr/bin/node sudo rm /usr/bin/npm 六、将文件复制到指定位置 sudo mv ./node-v19.3.0-linux-arm64 /usr/local/node 七、node 和 npm 创建软连接 sudo ln -s /usr/local/node/bin/node /usr/bin/node sudo ln -s /usr/local/node/bin/npm /usr/bin/npm 八、检查软件安装是否成功 node -v v19.3.0 npm -v 9.2.0\n","date":"2022-12-31T21:13:00+08:00","permalink":"https://blog.tama.guru/record/iwannanewnodejs.html","title":"安装最新版nodejs的正确方法"},{"content":"请注意充值时拥有日本IP！请注意充值时拥有日本IP！请注意充值时拥有日本IP！\n通常情况下，在日服需要充值金额要通过以下几种方案：\nJCB 信用卡（不适用美服）：需要申请一张JCB国际信用卡，基本上各大银行都会有提供，此方案好就好在可以直接绑定到账户进行消费而不需要通过礼品卡渠道。 购买礼品卡：一般情况下很多人会选择到淘宝或者其他平台购买礼品卡，虽然方便，但是一个重要的问题是如果卖家使用黑卡买的礼品卡，那么你的账号可能也会受牵连。所以如果你恰好有一张外币卡（Visa或者MasterCard都行，各大银行都可以），就可以自己到日服apple store购买礼品卡，安全性大大提高。 我在日本有熟人。 以下对自有外币卡购买礼品卡进行介绍：\n进入[官网][1]，一定要进对，如果不小心买了用于购买硬件和外设的卡，那你就只能想办法电话到日本联系退款了。 先点击購入。 ![2022-12-05T16:03:05.png][2] 之后第一个默认选择email接收，第二个是卡面，随便选，第三项是充值金额，最后一项是その他の金額可以输入整数的其他金额。 ![2022-12-05T16:04:46.png][3] 再后来是填写收寄方信息：受取人の名前即收方名字，受取人のメールアドレス即收方邮件地址（之后礼品卡号会发到这个邮箱），同理差出人名字和邮箱也需要填写。（名字可以随意写，但是最好真实些）あなたからのメッセージを追加しますか？追加其他信息这里没必要填。最后点击バッグに追加。 ![2022-12-05T16:07:29.png][4]![2022-12-05T16:12:03.png][5] 之后会进入确认界面，需要确认金额以及宛先:``差出人:信息是否正确，正确点击注文手続きへ进入下一步。 ![2022-12-05T16:14:16.png][6] 如果之前有登录了apple id，会跳过这一步，如果没登陆，直接点击右侧的続行してApple IDを後で作成します。进入下一步![2022-12-05T16:16:48.png][7]\n填写付款信息。选择一般的な支払い方法下的クレジットカードまたはデビットカード然后按照下图填写信息。 ![2022-12-05T16:21:11.png][8] 注意，信息不能太离谱，实在不会写的去网上找生成器。携帯電話番号はありません。一定要勾选，然后在上面填写一个日本的座机号，之后点击注文の確認，扣款短信就会发到手机上了。 接下来的部分下次充值再写。 [1]: https://www.apple.com/jp/shop/gift-cards [2]: https://r2.337845818.best/oss-to-r2/2022/12/06/638e163682a9f.png [3]: https://r2.337845818.best/oss-to-r2/2022/12/06/638e169c0e420.png [4]: https://r2.337845818.best/oss-to-r2/2022/12/06/638e173ee025f.png [5]: https://r2.337845818.best/oss-to-r2/2022/12/06/638e18501b7ab.png [6]: https://r2.337845818.best/oss-to-r2/2022/12/06/638e18d5f4072.png [7]: https://r2.337845818.best/oss-to-r2/2022/12/06/638e196dcaa02.png [8]: https://r2.337845818.best/oss-to-r2/2022/12/06/638e1a7472944.png\n","date":"2022-12-06T00:23:34+08:00","permalink":"https://blog.tama.guru/record/apple_jp_giftcard.html","title":"通过自购礼品卡在日服applestore充值使用（也适用于美服）"},{"content":"目前系统是已经硬破的状态，且能正常运行，但是版本已经有点老了（Atmosphere版本14），导致目前有部分新的游戏无法运行，因此在此记录Switch升级大气层系统的相关步骤。\n事前准备：\n一台Switch，已经硬破（软破需要看ShallowSea的说明文档，会多出来两个步骤） 确保Switch有足够的电。。。 Switch固件，下载地址,当前最新15.0.1 ShallowSea整合包，下载地址，当前最新2.12.4，相关说明可以看这里。下载地址会标注整合包支持的系统版本。 请注意，ShallowSea因DMCA已经被屏蔽，其他固件请参考https://www.gamer520.com/48671.html 下面开始升级。\n取出Switch上的SD卡，删除除了emmMMC Nintendo 和你保存游戏的文件夹之外的其他所有文件。 把ShallowSea整合包ShallowSea-ams.zip解压覆盖到SD卡上。 在SD卡上新建一个firmware文件夹（或者其他英文文件夹），把Switch固件解压其中。 确认文件完整后弹出SD并插入Switch上。 插入注入器和短路器，\u0026quot;+\u0026ldquo;与电源键蓝灯进入引导 正常进入系统，设置里的主机-更新主机的Atmosphere版本已经升级到了最新1.4.0 接下来升级系统，进入相册-Daybreak 选择Install，并进入之前下载了15.0.1固件的文件夹Firmware，弹出Update infomation等待验证完成后选择Continue,Select driver variant选择Install(FAT32+exFAT),等待升级完成后选择Reboot重启。 可以看到系统版本也更新了。 上面的作者整合包Github被DMCA了，目前可以考虑https://github.com/Yuanbanba/Atmosphere这个版本，更新方法一样，保留好SD卡内的Emutendo和Nentendo文件夹（如果没有了也不要紧），其他删掉，再把整合包解压覆盖到SD卡根目录，此包支持系统版本为最高17.0.1，更新方法和上面一样。 为避免惨剧再次发生，以上文件已在云盘做备份：https://share.tama.guru/AliDisk/Switch_Games/ROM/17.0.1\n","date":"2022-11-27T01:15:00+08:00","permalink":"https://blog.tama.guru/record/switch_Atmosphere.html","title":"Switch15.0.1大气层系统升级的记录（整合包）-更新到17.0.1"},{"content":"坚持了大半年的WIN10今天终于因为不明原因无法启动了（开机无限转圈圈，进入修复模式修复失败无解），于是干脆就把系统换成Win11。自从上次直接从10升11出现一堆bug之后，以及我对阿三一直以来抱有的一种不信任感让我这半年基本没摸过11，这次就全新安装，给它个面子，看看它能不能给我个面子。\n[scode type=\u0026ldquo;lblue\u0026rdquo;]安装信息[/scode] 使用的是22H2的消费者版本镜像。安装选择的是Win11专业工作站版。 磁力链：magnet:?xt=urn:btih:85730cfa4be6b8c3e655d76becc2f6d32f261ce4\u0026amp;dn=zh-cn_windows_11_business_editions_version_22h2_updated_oct_2022_x64_dvd_b4e3a4f8.iso\u0026amp;xl=5515886592\n[scode type=\u0026ldquo;lblue\u0026rdquo;]激活办法[/scode] 激活还是老样子，可以用KMS激活，或者直接使用AAct进行激活。 [scode type=\u0026ldquo;yellow\u0026rdquo;]激活注意事项[/scode] 下载AAct之前需要把Windows安全中心的“病毒和威胁防护”相关设定先关闭，否则会被删除。卡巴斯基反病毒会检测到HEUR:HackTool.Win32.KMSAuto.gen，反正看你个人。 [scode type=\u0026ldquo;lblue\u0026rdquo;]让任务栏左对齐，使“开始按钮居左[/scode] 右键任务栏，选择任务栏设置，在”任务栏行为\u0026gt;任务栏对其方式选择“靠左”。 [scode type=\u0026ldquo;lblue\u0026rdquo;]让右键菜单以传统方式显示[/scode] Win11最影响体验的改变就是把右键菜单放到第二层，非常浪费时间。以下方法在22H2实验后仍然有效： 以管理员方式运行cmd，并输入 reg add HKCU\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32 /ve 回车后重启资源管理器即可。 以下是目前做到的效果，后续有变动再更新。 ","date":"2022-11-06T23:08:00+08:00","permalink":"https://blog.tama.guru/record/win11_new_setup.html","title":"Win11安装优化那些事"},{"content":"首先，欢迎使用狼圈子。\n[tag type=\u0026ldquo;info\u0026rdquo;]“圈子”是什么？[/tag] 这是一个Typecho上的插件，能够实现类似twitter或者广场的效果，目前本站圈子部分开放注册。 [tag type=\u0026ldquo;info\u0026rdquo;]我该如何注册？是否需要实名？[/tag] 只需要到这里像一般网站那样填写信息就行了，请确认电子邮箱是正确的，因为涉及到消息提醒、账号找回都需要通过注册时使用的邮箱。本站不需要填写任何关于实名的信息，如果有，那么你可能碰到骗子了。 或者在主界面点击小企鹅可以使用第三方登陆。 以下是关于使用的部分说明，按图中顺序进行： [scode type=\u0026ldquo;lblue\u0026rdquo;]1、博客[/scode] 也就是从圈子返回本站，没什么好说的。 [scode type=\u0026ldquo;lblue\u0026rdquo;]2、动态[/scode] 这里显示的是你自己以及你所关注的人的帖子，就类似于“粉丝可见”。 [scode type=\u0026ldquo;lblue\u0026rdquo;]3、探索[/scode] 探索包含的是全站内容，包括你没关注的人发的消息。探索包含[tag type=\u0026ldquo;info\u0026rdquo;]话题[/tag][tag type=\u0026ldquo;info\u0026rdquo;]用户[/tag][tag type=\u0026ldquo;info\u0026rdquo;]帖子[/tag]三个子页面；话题就是 类似这样的给帖子添加tag的效果，可以方便分类和查找；用户页面显示了本站所有注册的用户；帖子就是类似于“广场”的功能了。 [scode type=\u0026ldquo;lblue\u0026rdquo;]4、通知[/scode] 如图所示，点赞、评论、关注还有@会在这个页面显示。 [scode type=\u0026ldquo;lblue\u0026rdquo;]5、话题[/scode] 与“探索”中的话题效果一致。 [scode type=\u0026ldquo;lblue\u0026rdquo;]6、消息[/scode] 就是私信，这里可以给用户发消息。点击进入个人页面的这个蓝色按钮就能发消息了。有怪人轰炸你？截图发我我给你铲咯。 [scode type=\u0026ldquo;lblue\u0026rdquo;]7、沸点[/scode] 就是一个rss资源集合，目前整合了知乎日报精选、机核网以及动漫花园三个源。 [scode type=\u0026ldquo;lblue\u0026rdquo;]8、收藏[/scode] 简而言之，就是你收藏的帖子，点击帖子右下角的三个点选择收藏就会在这里显示。 [scode type=\u0026ldquo;lblue\u0026rdquo;]9、博友[/scode] 其他同样使用圈子插件的站长都会在这里留下链接。 [scode type=\u0026ldquo;lblue\u0026rdquo;]10、后台[/scode] 这里引导到的是typecho后台关于圈子插件的设置，如果非管理员访问会提示非法访问。 钱包、广告、推广这三项目前没用，此处不展开。 [scode type=\u0026ldquo;lblue\u0026rdquo;]11、设置[/scode] 此处包含的是关于账户的一些设置，比如用户名、邮箱地址、简介、关联QQ等。这里还可以设置通知和邮件提醒的类型，这里不勾选的消息是不会推送的。如果你想给账号后面增加蓝标，可以选择“验证我的账户”，如果你想退站了，请点击“删除配置文件”。 [scode type=\u0026ldquo;lblue\u0026rdquo;]12、风格[/scode] 这里可以选择圈子的配色方案和背景颜色。 [scode type=\u0026ldquo;lblue\u0026rdquo;]废话这么多，那我该如何发帖？[/scode] 在你的主页顶端可以找到发帖的对话框。 图中显示的分别是插入图片、视频、我一次都没试成功过的功能、表情（仅限emoji）、投票、预设GIF。需要注意的是上传的视频大小是有限制的，限制为24M。 [scode type=\u0026ldquo;lblue\u0026rdquo;]还有什么要注意的？[/scode] 请注意遵守国家相关的法律规定再发言。 后续有更新在补充说明。\n","date":"2022-10-22T16:00:00+08:00","permalink":"https://blog.tama.guru/record/wolf_circle.html","title":"关于“狼圈子”的使用说明"},{"content":"原文已丢失，以下部分为重写。 正文部分忘得差不多了，此处就记录一下使用过程中的问题吧。\n[scode type=\u0026ldquo;lblue\u0026rdquo;]No.1 我想在本地搭建服务并分享出去[/scode] 修改目录下的webui.py文件，将101行app,local_url,share_url = demo.launch(的代码块修改为：\napp,local_url,share_url = demo.launch( share=True, server_name=\u0026#34;你的本地IP，比如192.168.10.121\u0026#34; if cmd_opts.listen else None, server_port=cmd_opts.port, debug=cmd_opts.gradio_debug, auth=[tuple(cred.split(\u0026#39;:\u0026#39;)) for cred in cmd_opts.gradio_auth.strip(\u0026#39;\u0026#34;\u0026#39;).split(\u0026#39;,\u0026#39;)] if cmd_opts.gradio_auth else None, inbrowser=cmd_opts.autolaunch, prevent_thread_lock=True ) 修改完成后保存运行webui-user.bat即可。 需要注意的是开启分享需要全程连接谷歌，因为需要调用到谷歌的gradio服务。 [scode type=\u0026ldquo;lblue\u0026rdquo;]No.2 我想在本地搭建服务但是我的运存有点小[/scode] 按照官方的说法，只需要修改webui-user.bat文件，将set COMMANDLINE_ARGS=添加参数--medvram即可，即显示为： set COMMANDLINE_ARGS=--medvram 修改完成后保存运行webui-user.bat即可。 [scode type=\u0026ldquo;lblue\u0026rdquo;]No.3 我生成的结果好丑！[/scode] 我猜你是想画二次元涩图。其一：程序的wiki上留下的模型比较\u0026hellip;正常？所以首先你需要替换掉模型。目前因为一些原因novelai的ckpt模型已泄露，可以将下载到的模型重命名为model.ckpt并替换到models\\Stable-diffusion目录再重新启动程序即可。 其二：你需要到网页端把NSFW过滤给关掉了。 其三：你可能需要添加一些低质量关键词过滤，以下为参考： lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, bad feet\n","date":"2022-10-19T23:44:38+08:00","permalink":"https://blog.tama.guru/record/stable-diffusion-webui.html","title":"stable-diffusion使用过程中的一些记录"},{"content":"腾讯云香港服务器蹲了半年都蹲不出台正常点的，中低端经常售罄，至少都要2C2T+4G起步，一个月就要六七十，这谁受得了？？？月初打开阿里云一看，哟嚯，2C（其实是1C2T）+2G一个月才30，试用下访问速度基本上接近国内服务器，这我直呼受不了，赶紧把之前那破腾讯云上的数据迁移咯。使用体验基本复合我的预期，但是2G跑个debian在加几个网站基本就没用想别的了，内存这块有优化的必要。\n[scode type=\u0026ldquo;lblue\u0026rdquo;]No.1 mysql[/scode]\n对于小内存的机子来说mysql跑一段时间之后内存占用会高得恐怖。我中午刚新开的服务器，到晚上11点多用htop一看，单mysqld这个进程已经吃了18.5%的内存，也就是差不多400M，你也是真的能吃 ::acfun:01:: 。查了些资料然后进行比对，发现镜像原本的配置也已经优化的差不多了，但是我们还需要打开my.cnf，在[mysqld]字段添加\nperformance_schema = off\n然后保存重启mysql进程，也是有一定效果。\n[scode type=\u0026ldquo;lblue\u0026rdquo;]No.2 AliyunDun（阿里云盾）[/scode]\n这玩意是预装在系统里的，平时啥也不干也会吃掉5到6个点的内存，在官方的介绍页上，对这个产品的表述是：\n云盾是阿里巴巴集团多年来安全技术研究积累的成果，结合阿里云云计算平台强大的数据分析能力。为中小网站提供如安全漏洞检测、网页木马检测以及面向云服务器用户提供的主机入侵检测、防DDOS等一站式安全服务。\n其实平时不乱开端口，不乱往主机上塞文件问题就不大，至于DDoS，真要打我这小破站你这盾也不够用啊。。。\n以下是卸载步骤：\nwget http://update.aegis.aliyun.com/download/uninstall.sh sh uninstall.sh wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh sh quartz_uninstall.sh pkill aliyun-service rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service rm -rf /usr/local/aegis* 未完待续 ::acfun:2003::\n","date":"2022-10-16T00:15:00+08:00","permalink":"https://blog.tama.guru/record/aliyun_server.html","title":"阿里云服务器的买后优化记录"},{"content":"[scode type=\u0026ldquo;red\u0026rdquo;]\u0026ldquo;this MIUI version can’t be installed on this device\u0026rdquo;[/scode] 这个报错是MIUI12+版本在跨区刷包的时候出现的，电脑上使用MiFlasher进行跨区线刷时，务必保证选择了“全部删除/保留用户数据”，而非“全部删除并lock” ，目前跨区刷机已经被小米官方限制成仅解bl锁的用户使用，所以当你勾选了“全部删除并lock”的时候，系统会直接无法启动。如果之前手机有绑定账号并且能解锁bl，那么只需要下载小米官方的解锁软件重新再解锁一次就能正常使用了。如果你没绑定账号，那么就去找售后吧。 [scode type=\u0026ldquo;lblue\u0026rdquo;]\u0026ldquo;error:Not catch chinkpoint($fastboot -s .* lock), flash is not done\u0026rdquo;[/scode] 这个报错出现在线刷不回锁的时候，字面意思就是在MiFlash软件的Configuration中有一个\u0026quot;Checkpoint\u0026quot;的选项，用于判断刷机脚本是否完成，默认情况下这里是\\$fastboot -s .* lock，但是如果我们刷机的时候选择“全部删除/保留用户数据”，就不会涉及到上锁的命令，所以会触发这个错误，但其实刷机过程已经完成了，不会对使用有影响，如果觉得碍眼可以把Checkpoint给清空，就不会提示了。 [scode type=\u0026ldquo;red\u0026rdquo;]\u0026ldquo;我是电信卡，我在欧版上发不出短信\u0026rdquo;[/scode] 恭喜你刷到的是正版的欧版MIUI。如果非要用这个版本，需要先刷回国内版本的MIUI，进入短信应用用电信卡发一条短信，如果正常能发出再刷欧版，大概率能够解决这个问题。\n","date":"2022-10-05T17:23:00+08:00","permalink":"https://blog.tama.guru/record/miuiflashing.html","title":"MIUI刷机那些破事（持续更新）"},{"content":"不知道从哪个版本的miui开始，开发版的miui便不能直接从稳定版通过简单的卡刷进行转换，需要在官方论坛申请“公测”或者“内测”权限之后才能进行安装，而申请资格需要在官方论坛达到4级以上的等级并且要完成所谓的“答题”，如果等级不够或者“答题”分数不及格均无法获得权限，就算通过其他方法搞到了卡刷包，在刷写的时候也会被提示“该账号非内测权限”然后就停住了。 在这种背景之下，出现了几种方法来强行升级到开发版： 1、买账号：去某些平台上购买有升级权限的账号或者是找人代答题，这种方法我没试过，不知道是否能达到店方生成的“后续稳定升级”，而且，本来是花费一些心思能申请到的账号需要花钱去购买，也算是助长了这种风气吧，个人非常不推荐。 2、“偷渡”：也就是利用升级步骤上的一些漏洞来进行升级，之前会有一种把开发包下载好了之后在系统升级到99%断网再替换文件来骗过系统验证的方法，这种方法反正我是没成功过了；另一种是对于那些解锁了男同锁而且安装好了magisk框架的用户，可以到这个网站CGT Software下载MIUI Flash Freely 模块安装，理论上可支持MIUI 12/12.5/13，安装完直接刷开发包就可以了，这种方法我试过，确实是可以直接通过卡刷偷渡到开发版，且稳定使用了一段时间，但是目前出现了系统待机耗电量极高的问题，加上之前曾经看到过通过偷渡的方式上开发版会碰到很多系统完整性问题，我也选择放弃这个方法了。（注：每次升级之前都要装一次这个插件，而且装完最好双清） 3、线刷：部分网站会把一些官方“不小心”放出来的开发版线刷包整合，比如Xiaomirom这个网站，直接线刷进去能够最大限度保证系统完整性，但是后续依旧无法升级，而且线刷包一般版本都比较老。 所以我选择eea版本miui。\n看了下MIUI Flash Freely模块的内容，其实质是把/product/etc/device_fratures/机型代号.xml中的support_ota_validate修改成false，字面上理解就是把OTA数据验证关闭。 真能藏啊米哥。\n","date":"2022-10-04T19:47:00+08:00","permalink":"https://blog.tama.guru/record/miuidev.html","title":"关于MIUI升级到开发版的方法"},{"content":"新版的raspbian中已经取消了默认的pi+raspbian登录方式，这意味着如果使用无屏幕登录方式将无法直接登录。 解决方法： 1、用老版本。 2、连接显示器和键盘，首次开机会引导到配置账户界面。 3、去raspberry官网下载“树莓派镜像烧录器“，可以直观的配置一些首次开机必须的选项。\n","date":"2022-09-19T13:32:04+08:00","permalink":"https://blog.tama.guru/record/raspbian11login.html","title":"新版raspbian远程登录方法"},{"content":"不会有人2022年了还在用centos7吧。。。 由于centos7默认安装的是python2.7且系统内组件高度依赖python2.7，如果直接卸载换成3.X会导致许多系统软件无法运行(yum就是一个很好的例子），因此想法如下： ·编译安装3.X版本 ·把原来的python软链接指向3.x，并创建pip3的软链接 ·把相关软件的头手动进行修改 例如/usr/libexec/urlgrabber-ext-down中原来的#!/usr/bin/python应手动指定为#!/usr/bin/python2.7，/usr/bin/yum同理。 参考：https://www.cnblogs.com/jizhong/p/15157828.html\n","date":"2022-09-17T01:46:10+08:00","permalink":"https://blog.tama.guru/record/centos7_python3-x.html","title":"centos7在保留python2.7的前提下安装python3.x的方法"},{"content":"真的超神了 [vplayer url=\u0026ldquo;https://share.tama.guru/d/AliDisk/%E5%88%86%E4%BA%AB/%E8%A7%86%E9%A2%91/I%20got%20somke%20%E5%BD%95%E5%B1%8F%E7%89%88.mp4\u0026rdquo; /]\n","date":"2022-09-14T23:34:00+08:00","permalink":"https://blog.tama.guru/videoshare/igotsmoke.html","title":"[金曲鉴赏]丁真：I Got Smoke"},{"content":"和大多数人一样，过去的一晚我同样怀着沉郁的心情，久久难以入眠。看到佩洛西降落在台北松山机场之后，我决心写一篇文章，分析一下台海局势，以下是正文。（本文写于8月3日） 我想把一些话放在前面，这将作为这篇文章的一个大前提。相信大家都一定认同这句话“台湾问题的本质是中美关系”，但是我们需要对这句话有更深入的理解。它的意思并非明面上看到的那样，中美关系决定了台湾问题如何解决——恰恰相反，台湾问题的解决，将揭开中美竞争的序幕，这也是我一直以来的看法。如果你理解了我的论述，你会发现“台湾问题纯属中国内政”和“台湾问题本质是中美关系”这两句表面冲突的话，前者意味着在台湾问题上主动权始终在我，而后者解释了我们将如何利用主动权取得对美优势最大化，这二者说的恰是一件事情。在这个大前提之下，你会发现，某种意义上台湾人，甚至于台湾岛，已经完全不重要了，因为我们的一切行动都应以有利于中美竞争为目的。并且反过来，对美的优势都将转化为台湾的民心，以及永远也游不走的台湾岛。 带着上面这些大前提，我们回到现实。（需要再次强调的是，本文写于8月3日，此时事件仍未结束，目前的观点仅对当前现状进行评论。）现在网上充斥着两种声音，一种声音认为大陆怂了，只会张嘴抗议，而另一种声音认为，这是中国政府的计划，我们需要相信政府、静观其变。甚至认为我们是故意放走佩洛西的，这样我们就可以顺势收回台湾了。这两种声音源于大众最朴素的情感，虽然只是下意识的反应，但内中包含着更深层次的逻辑，即使可能民众自己也未意识到。我这里尝试分析一下。如果说仅仅把视角放在台湾并忽略美国，事情会是这样的：某国三号人物访问台湾，我军立即反应，在台海周边开展军事行动。行动区域环岛一周，深入领海，最近处仅有9海里。我想对于这种事实的描述，大多数群众绝不会有如此大的反应。但是如果将这段话加上一段“并未阻拦该国窜访，仅在其离台之后开展军事行动”，这么大的反应就很好理解了。民众愤怒的根源其实并非来自对台软弱，而是对美软弱。要知道军事实力并不完全取决于装备的数量和质量，作战意志同样是军事实力重要的组成部分。此次事件最严重的一点在于，这次释放出来的信号表现出对美的作战意志不足。这一后果非常严重，会加重美国的战略误判，反而增加了未来中美开战的几率。要知道，打得一拳开，免得百拳来。打不得一拳开，百拳就免不得都要来试试了。 当然，如果说佩洛西离开了台湾，这件事情就结束了，我们就输了，那也大可不必如此失落。佩洛西来台仅仅是上半场谢幕，至于下半场如何，我们仍然在行动。我不能给出准确的预测，但是基于我上面的判断，如果下半场无法表示出对美强硬，达到让美国痛的后果，那后果将是灾难性的。并且显而易见的是，事情发展到现在，已经到了再不有所行动，将动摇执政基础，甚至严重影响中华民族伟大复兴的历史进程的地步了。我不相信现在的中国政府真的会无动于衷。 期待下半场的演出。\n","date":"2022-08-04T01:34:00+08:00","permalink":"https://blog.tama.guru/wmdht/tw20220803.html","title":"关于今日台湾问题的一点个人看法"},{"content":"文前声明：作者非相关专业人士，部分内容仅代表本人猜测，杠就是你对。\n7月25日到26日，华北、华中、华东地区迎来了新一轮大规模降雨，前后波及十余省份，历时三十余小时。\n近两天总能在某音上刷到有关一张气象雷达图的视频，文案经常被配上什么“道家斗法破阵”，评论区也大都是“道长出山了”“一个坚定的唯物主义者陷入了沉思”“科学两个字卡在喉咙里”这种画风。 首先，气象多普勒雷达的探测区域本来就是一个以雷达为圆心的圆，探测边界外没有数据，和探测区域内形成对比就会有圆形的轮廓。其次，经常关注气象的话，会发现环形的雷达回波图并不罕见，这通常是因为雷达受到了干扰，或雷达站输出的数据错误。 根据视频截图大致定位，“怪圈”的圆心位置大约位于湖北省随州市。翻阅随州市7月26日01:00到05:00的气象雷达回波图可以发现，在7月26日04:12分后，雷达没有了数据。而在04:12分的回波图中，雷达所在地正是高雷达反射率的区域，这代表该片区域当时很可能正在遭遇强对流天气。随州市气象台于26日晨发布的暴雨橙色预警也证实了这一点。 因此我猜测，是强降雨干扰了雷达正常工作，没有数据输出，而某天气APP也出现了BUG，在对雷达回波图进行拼图时使用了错误的数据，导致这个奇怪的红圈出现。\n其实本来一张错误的雷达回波图根本算不了什么，但时间又恰巧赶上了南京“夏日祭”这事，就有人将这张图联想到宗教的方向，说是“道长出山施法破日本的阵”，我相信不少人是抱着开玩笑的态度说的这种话，但评论里的某些神棍言论让人不禁感叹基础教育任重道远。 这种舆论是不正常也是不应当鼓励的，他们今天能说异常天气是道长作法，明天就可以说是宗教带领抗战胜利。在这个无数抗战先烈用血肉之躯解放得来的国家，容不得封建迷信来指手画脚。\n最后还是来看看这场历时三十余小时，波及十余省份的大规模降雨吧。 ","date":"2022-07-27T12:52:00+08:00","permalink":"https://blog.tama.guru/science/doppler.html","title":"不吐不快，谈谈气象雷达图上的“怪圈”"},{"content":"原文请访问：[button type=\u0026ldquo;round\u0026rdquo; color=\u0026ldquo;success\u0026rdquo; url=\u0026ldquo;https://www.raycns.com/archives/774.html\u0026rdquo;]此处[/button]\n适用于带有iframe功能的视频网站。 使用方法： 将以下代码添加至 Handsome主题外观\u0026gt;设置外观开发者设置\u0026gt;自定义CSS\n/*视频挂载*/ .iframe_video { position: relative; width: 100%; } @media only screen and (max-width: 767px) { .iframe_video { height: 15em; } } @media only screen and (min-width: 768px) and (max-width: 991px) { .iframe_video { height: 20em; } } @media only screen and (min-width: 992px) and (max-width: 1199px) { .iframe_video { height: 30em; } } @media only screen and (min-width: 1200px) { .iframe_video { height: 40em; } } .iframe_cross { position: relative; width: 100%; height: 0; padding-bottom: 75% } .iframe_cross iframe { position: absolute; width: 100%; height: 100%; left: 0; top: 0 } 演示\n打开你想挂载在网站的视频 复制视频源代码复制嵌入代码 在复制的嵌入链接的iframe与src之间添加class=\u0026ldquo;iframe_video\u0026rdquo;\n以下演示\n\u0026lt;iframe class=\u0026#34;iframe_video\u0026#34; src=\u0026#34;https://www.acfun.cn/player/ac35737823\u0026#34; id=\u0026#34;ACPlayer-re\u0026#34; scrolling=\u0026#34;no\u0026#34; border=\u0026#34;0\u0026#34; frameborder=\u0026#34;no\u0026#34; framespacing=\u0026#34;0\u0026#34; allowfullscreen=\u0026#34;true\u0026#34;\u0026gt;\u0026lt;/iframe\u0026gt; 成片：\n","date":"2022-07-24T01:59:00+08:00","permalink":"https://blog.tama.guru/record/handsome-framevideo.html","title":"适用于handsome主题的自适应视频挂载"},{"content":"转载自：Typecho博客handsome主题博客信息添加全站字数、在线人数、访客总数和网站加载耗时\n首先将以下代码加到themes/handsome/libs/Content.php中放在class Content{}[tag type=\u0026ldquo;danger\u0026rdquo;]之前[/tag]。\n/** * 全站字数 */ function allOfCharacters() { $chars = 0; $db = Typecho_Db::get(); $select = $db -\u0026gt;select(\u0026#39;text\u0026#39;)-\u0026gt;from(\u0026#39;table.contents\u0026#39;); $rows = $db-\u0026gt;fetchAll($select); foreach ($rows as $row) { $chars += mb_strlen(trim($row[\u0026#39;text\u0026#39;]), \u0026#39;UTF-8\u0026#39;); } $unit = \u0026#39;\u0026#39;; if($chars \u0026gt;= 10000) { $chars /= 10000; $unit = \u0026#39;万\u0026#39;; } else if($chars \u0026gt;= 1000) { $chars /= 1000; $unit = \u0026#39;千\u0026#39;; } $out = sprintf(\u0026#39;%.2lf %s\u0026#39;,$chars, $unit); return $out; } /** * 在线人数 */ function online_users() { $filename=\u0026#39;online.txt\u0026#39;; //数据文件 $cookiename=\u0026#39;Nanlon_OnLineCount\u0026#39;; //Cookie名称 $onlinetime=30; //在线有效时间 $online=file($filename); $nowtime=$_SERVER[\u0026#39;REQUEST_TIME\u0026#39;]; $nowonline=array(); foreach($online as $line){ $row=explode(\u0026#39;|\u0026#39;,$line); $sesstime=trim($row[1]); if(($nowtime - $sesstime)\u0026lt;=$onlinetime){ $nowonline[$row[0]]=$sesstime; } } if(isset($_COOKIE[$cookiename])){ $uid=$_COOKIE[$cookiename]; }else{ $vid=0; do{ $vid++; $uid=\u0026#39;U\u0026#39;.$vid; }while(array_key_exists($uid,$nowonline)); setcookie($cookiename,$uid); } $nowonline[$uid]=$nowtime; $total_online=count($nowonline); if($fp=@fopen($filename,\u0026#39;w\u0026#39;)){ if(flock($fp,LOCK_EX)){ rewind($fp); foreach($nowonline as $fuid=\u0026gt;$ftime){ $fline=$fuid.\u0026#39;|\u0026#39;.$ftime.\u0026#34;\\n\u0026#34;; @fputs($fp,$fline); } flock($fp,LOCK_UN); fclose($fp); } } echo \u0026#34;$total_online\u0026#34;; } /** * 访客总数 */ function theAllViews(){ $db = Typecho_Db::get(); $row = $db-\u0026gt;fetchAll(\u0026#39;SELECT SUM(VIEWS) FROM `typecho_contents`\u0026#39;); echo number_format($row[0][\u0026#39;SUM(VIEWS)\u0026#39;]); } /** * 加载耗时 */ function timer_start() { global $timestart; $mtime = explode( \u0026#39; \u0026#39;, microtime() ); $timestart = $mtime[1] + $mtime[0]; return true; } timer_start(); function timer_stop( $display = 0, $precision = 3 ) { global $timestart, $timeend; $mtime = explode( \u0026#39; \u0026#39;, microtime() ); $timeend = $mtime[1] + $mtime[0]; $timetotal = number_format( $timeend - $timestart, $precision ); $r = $timetotal \u0026lt; 1 ? $timetotal * 1000 . \u0026#34; ms\u0026#34; : $timetotal . \u0026#34; s\u0026#34;; if ( $display ) { echo $r; } return $r; } themes/handsome/component/sidebar.php添加代码:\n\u0026lt;li class=\u0026#34;list-group-item text-second\u0026#34;\u0026gt;\u0026lt;span class=\u0026#34;blog-info-icons\u0026#34;\u0026gt;\u0026lt;i data-feather=\u0026#34;edit-3\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;badge pull-right\u0026#34;\u0026gt;\u0026lt;?php echo allOfCharacters(); ?\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;?php _me(\u0026#34;全站字数\u0026#34;) ?\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li class=\u0026#34;list-group-item\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;glyphicon glyphicon-user text-muted text-muted\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span class=\u0026#34;badge pull-right\u0026#34;\u0026gt;\u0026lt;?php echo online_users() ?\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;?php _me(\u0026#34;在线人数\u0026#34;) ?\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li class=\u0026#34;list-group-item text-second\u0026#34;\u0026gt;\u0026lt;span class=\u0026#34;blog-info-icons\u0026#34;\u0026gt; \u0026lt;i data-feather=\u0026#34;user\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;badge pull-right\u0026#34;\u0026gt;\u0026lt;?php echo theAllViews();?\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;?php _me(\u0026#34;访客总数\u0026#34;) ?\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li class=\u0026#34;list-group-item text-second\u0026#34;\u0026gt;\u0026lt;span class=\u0026#34;blog-info-icons\u0026#34;\u0026gt; \u0026lt;i data-feather=\u0026#34;clock\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;badge pull-right\u0026#34;\u0026gt;\u0026lt;?php echo timer_stop();?\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;?php _me(\u0026#34;加载耗时\u0026#34;) ?\u0026gt;\u0026lt;/li\u0026gt; ","date":"2022-07-23T17:18:00+08:00","permalink":"https://blog.tama.guru/record/sidebarmodify.html","title":"handsome主题博客信息添加全站字数、在线人数、访客总数和网站加载耗时"},{"content":" 对于航天，相信许多人的第一印象是拔地而起的火箭，尾部长长的火焰以及伴随而来的巨大轰鸣声。但可能大多数人的了解也仅限于此了。从上个世纪四十年代人类第一枚液体火箭V2，到现在已经八十年了，许多航天科技也已融入了日常生活。但大多数人对航天的了解仅限于“飞的很高很快”，而且存在许多奇怪的误解。最常见的误区如：火箭是一路垂直着飞上去的；太空不存在引力等。\n事实上，科普的难度一点不比掌握这门知识更简单，甚至要做到深入浅出，还要理解的更透彻一些。而那些伪“科普”文章显然不具备这样的能力，只能在浅显的地方语焉不详，又在高深的地方复述晦涩的文字。这不仅达不到科普的目的，反而会让人们敬而远之。科普需要首先明确受众，并根据受众的情况对文章进行修改。只要做到让目标受众能快速准确的理解，就是好的科普。\n因为以上两条原因，我打算写一系列文章来对航天领域进行基本的科普，目标受众是初中以上学历的人。如果他们能够仅靠我的系列文章大致理解航天，我的目的就达到了。如果能引起对航天领域的兴趣，那就更棒了。我在发布科普文章之前，会先让对应基础的人审稿若干遍，以确保文章的专业性与通俗性。\n","date":"2022-07-22T21:30:00+08:00","permalink":"https://blog.tama.guru/aerospace/space_00.html","title":"关于航天系列文章的前言（开新坑）"},{"content":"请直接参考作者文档：obs-auto-subtitle/README-zh.md at master · summershrimp/obs-auto-subtitle (github.com)\n自动转语音部分正在测试中\n[scode type=\u0026ldquo;yellow\u0026rdquo;]注意：使用中如果出现OBS闪退，多半是因为KEY到期了，先把相关源禁用，再到滤镜里设置新的KEY就能正常使用了。[/scode]\n[scode type=\u0026ldquo;red\u0026rdquo;]插件不支持obs 28.0及以上版本，如果在steam中误升级可右键obs 属性 测试版 选择27.X版本。[/scode]\n","date":"2022-07-17T12:38:00+08:00","permalink":"https://blog.tama.guru/record/obs-subtitles-audio.html","title":"使用OBS自动添加字幕识别已经转自动语音"},{"content":"来源：短代码 - Handsome 使用文档 (ihewro.com)\n以下进行搬运：\n时间线 [timeline title=\u0026#34;2020大事记\u0026#34; type=\u0026#34;small\u0026#34; start=\u0026#34;梦开始的地方\u0026#34; end=\u0026#34;新的一年开始\u0026#34;] [item date=\u0026#34;2020-1-20\u0026#34;] 武汉封城，疫情让一起变得慌乱起来 [/item] [item date=\u0026#34;2020-3-20\u0026#34;] 开始远程办公，慢慢有序起来[/item] [item]生活变得好起来了[/item] [item date=\u0026#34;2020-10-1\u0026#34;] 国庆节去哈尔滨旅行，和老同学见面[/item] [/timeline] 备注： timeline 属性列表：\ntype：可选项，默认为small， 可选值: small 小巧款式的时间线 large 大款式的时间线 random，可选项，默认为true，可选值为true、false，true表示时间线每一条会使用随机的色彩 对于 large样式的时间线，提供时间线开始和结束的一个文字自定义：\nstart：一些简单的文字 end:一些简单的文字 item 属性列表：\ndate ：可选项，默认不显示时间，可选值： 一个日期文字，实际上可以填写任何类型文字（不要太长） color：可选项，设置当前时间线条的颜色，可选值：\u0026ldquo;light\u0026rdquo;, \u0026ldquo;info\u0026rdquo;, \u0026ldquo;dark\u0026rdquo;, \u0026ldquo;success\u0026rdquo;, \u0026ldquo;black\u0026rdquo;, \u0026ldquo;warning\u0026rdquo;, \u0026ldquo;primary\u0026rdquo;, \u0026ldquo;danger\u0026rdquo;\n计划表 [goal title=\u0026#34;2021的小目标\u0026#34;] [item check=\u0026#34;true\u0026#34;] 每天早睡 [/item] [item check=\u0026#34;false\u0026#34;] 每天早起 [/item] [item progress=\u0026#34;50%\u0026#34;] 阅读10本书 [/item] [item start=\u0026#34;2021-01-02\u0026#34; end=\u0026#34;2021-10-1\u0026#34;] 每天锻炼30分钟 [/item] [/goal] 备注： 计划表中包含了三种类型的任务： check类型，该类型任务只有两种状态，完成和未完成 progress，该类型任务可以显示任务执行的进度，需要手动填写进度 start、end，该类型任务设置一个起始时间和终止时间，进度会根据当前时间自动更新进度 时间格式：必须是正确的时间格式，比如2021-01-02 12:00 ，也可以只写日期2021-01-02\n音乐 云解析歌曲：支持以下媒体： 网易云音乐 http://music.163.com 单曲 http://music.163.com/#/song?id=424474911 专辑 http://music.163.com/#/album?id=34808540 歌手 http://music.163.com/#/artist?id=3681 歌单 http://music.163.com/#/playlist?id=436843836 榜单 http://music.163.com/#/discover/toplist?id=60198 QQ 音乐 https://y.qq.com 单曲 https://y.qq.com/n/yqq/song/000jDQWP4JiB3y.html 专辑 https://y.qq.com/n/yqq/album/003rytri2FHG3V.html 歌手 https://y.qq.com/n/yqq/singer/003Nz2So3XXYek.html 歌单 https://y.qq.com/n/yqq/playlist/1144188779.html 虾米音乐 http://www.xiami.com or http://h.xiami.com 单曲 http://www.xiami.com/song/bf08DNT3035f 专辑 http://www.xiami.com/album/ddOZW6a10eb 歌手 http://www.xiami.com/artist/be6yda0f8 歌单 http://www.xiami.com/collect/254478782 酷狗音乐 http://www.kugou.com 单曲 http://www.kugou.com/song/#hash=09E8DE70A24C97B92A29F6A19F3528A2 专辑 http://www.kugou.com/yy/album/single/1645030.html 歌手 http://www.kugou.com/yy/singer/home/3520.html 歌单 http://www.kugou.com/yy/special/single/119859.html 百度音乐 http://music.baidu.com/ 单曲 http://music.baidu.com/song/268275324 专辑 http://music.baidu.com/album/268275533 歌手 http://music.baidu.com/artist/1219 歌单 http://music.baidu.com/songlist/364201689 本地mp3地址播放：\n//单首歌曲 [hplayer] [Music title=\u0026#34;歌曲名\u0026#34; author=\u0026#34;歌手\u0026#34; url=\u0026#34;http://\u0026#34; pic=\u0026#34;图片文件URL\u0026#34; lrc=\u0026#34;歌词文件URL\u0026#34; type=\u0026#34;mini\u0026#34;/] [/hplayer] //多首歌曲 [hplayer] [Music title=\u0026#34;歌曲名\u0026#34; author=\u0026#34;歌手\u0026#34; url=\u0026#34;http://\u0026#34; pic=\u0026#34;图片文件URL\u0026#34; lrc=\u0026#34;歌词文件URL\u0026#34; type=\u0026#34;mini\u0026#34;/] [Music title=\u0026#34;歌曲名\u0026#34; author=\u0026#34;歌手\u0026#34; url=\u0026#34;http://\u0026#34; pic=\u0026#34;图片文件URL\u0026#34; lrc=\u0026#34;歌词文件URL\u0026#34; type=\u0026#34;mini\u0026#34;/] [/hplayer] 其中lrc 字段可以不填，表示没有歌词,type 可选择为 normal、mini 两种\n视频 点击编辑器的插入视频图标可以插入视频，支持本地的视频地址的播放和解析第三方平台的视频 时光机的视频插入按钮也是同样的操作 [vplayer url=\u0026#34;http://xxx.com/xxx.mp4\u0026#34; pic=\u0026#34;http://xxx.com/xxx.png\u0026#34;] url：视频地址 pic：视频背景图片\n按钮 [button color=\u0026#34;danger\u0026#34; icon=\u0026#34;fontello fontello-gratipay\u0026#34; url=\u0026#34;http:\\/\\/wpa.qq.com\\/msgrd?v=3\u0026amp;uin=535425690\u0026amp;site=qq\u0026amp;menu=yes\u0026#34;]点击QQ咨询购买（√推荐）[/button] [button color=\u0026#34;success\u0026#34; icon=\u0026#34;glyphicon glyphicon-send\u0026#34; url=\u0026#34;mailto:ihewro@163.com\u0026#34;]ihewro#163.com[/button] [button color=\u0026#34;success\u0026#34; icon=\u0026#34;music\u0026#34; url=\u0026#34;mailto:ihewro@163.com\u0026#34;]音乐歌单[/button] [button color=\u0026#34;success\u0026#34; icon=\u0026#34;🍜\u0026#34; url=\u0026#34;mailto:ihewro@163.com\u0026#34;]菜谱[/button] 备注：\n内容可替换如下： 矩形文字按钮 椭圆形文字按钮 矩形图标文字按钮 例如：\n[button]矩形按钮文字[/button] [button color=\u0026#34;succees\u0026#34;]矩形按钮文字[/button] [button type=\u0026#34;round\u0026#34; color=\u0026#34;success\u0026#34;]椭圆形按钮文字[/button] [button color=\u0026#34;success\u0026#34; icon=\u0026#34;glyphicon glyphicon-eur\u0026#34;]图标按钮文字[/button] type：选填，不填默认为矩形按钮。可选值： round：椭圆形按钮 color： 选填，不填默认为success（绿色），可选值： light：白色 info：蓝色 dark：深色 success：绿色 black：黑色 warning：黄色 primary：紫色 danger：红色 icon：选填，不填默认为文字按钮 url:选填，填写点击的链接。举例：如果你的链接是http://www.baidu.com，请手动将/前面加一个反斜杆\\，即http://www.baidu.com\n链接卡片 [link] [item name=\u0026#34;百度一些\u0026#34; link=\u0026#34;http://baidu.com\u0026#34; desc=\u0026#34;百度一下你就知道\u0026#34; /] [item name=\u0026#34;网站名称\u0026#34; link=\u0026#34;http://example.com\u0026#34; desc=\u0026#34;一些链接描述\u0026#34; /] [item name=\u0026#34;网站名称\u0026#34; link=\u0026#34;http://example.com\u0026#34; desc=\u0026#34;一些链接描述\u0026#34; pic=\u0026#34;图片地址\u0026#34; /] [/link] 文章卡片 点击编辑器的调用文章的按钮可以调用其他文章并显示。 [post cid=\u0026#34;XXX\u0026#34; /] [post cid=\u0026#34;XXX\u0026#34; cover=\u0026#34;http:\\/\\/localhost\\/build\\/usr\\/themes\\/handsome\\/usr\\/img\\/sj\\/6.jpg\u0026#34;/] cid：必填，是文章的唯一编号，在后台的编辑文章的地址可以看到，比如http://localhost/build/admin/write-post.php?cid=23,值为23 cover：可选项，调用文章显示的封面，如果不填则默认显示随机缩略图。 size：可选项，可填写值large 、small，默认为large。small表示只显示文章标题，不显示其他额外信息。\n外链卡片 [post url=\u0026#34;XXX\u0026#34; title=\u0026#34;XXX\u0026#34; intro=\u0026#34;XXX\u0026#34; cover=\u0026#34;XXXX\u0026#34; /] title：必填，外链的名称/标题 url：必填，外链的地址（请填写绝对地址，就是浏览器地址栏什么样的就填什么样的） intro：（可选）外链网站的简介/介绍 cover：（选填）外链网站的介绍图片地址\n相册与图集 相册与图集的区别是： 相册样式是固定一行N个，N会根据屏幕尺寸调整 图集会自动将图集内部的所有图片显示在一行中（如果图片太多，需要分成多个图集），并且大小会自动调整 相册\n[album] [普通的图片插入，支持markdown语法和html语法，混合也可以] [/album] 图集：增加type=\u0026ldquo;photos\u0026rdquo; 则album下的图片排成一行，并根据图片的长高比自动排列\n[album type=\u0026#34;photos\u0026#34;] [普通的图片插入，支持markdown语法和html语法，混合也可以] [/album] 回复可见 [hide]需要隐藏的内容[/hide] 登陆可见 [login]需要加密的内容[/login] 高亮提示文本 [scode type=\u0026#34;share\u0026#34;]这是灰色的短代码框，常用来引用资料什么的[/scode] [scode type=\u0026#34;yellow\u0026#34;]这是黄色的短代码框，常用来做提示，引起读者注意。[/scode] [scode type=\u0026#34;red\u0026#34;]这是红色的短代码框，用于严重警告什么的。[/scode] [scode type=\u0026#34;lblue\u0026#34;]这是浅蓝色的短代码框，用于显示一些信息。[/scode] [scode type=\u0026#34;green\u0026#34;]这是绿色的短代码框，显示一些推荐信息。[/scode] 高亮提示文本有三种样式，默认的样式如上，可以通过\u0026quot;size\u0026quot; 属性来修改:\n[scode type=\u0026#34;red\u0026#34; size=\u0026#34;simple\u0026#34;]该样式不包含左侧的图标，为简单样式[/scode] [scode type=\u0026#34;red\u0026#34; size=\u0026#34;small\u0026#34;]该样式为文字背景，不包含图标和过多的边距[/scode] 收缩框 示例代码： [collapse title=\u0026#34;标题\u0026#34; status=\u0026#34;false\u0026#34;]一些文字内容[/collapse] [collapse title=\u0026#34;标题\u0026#34;]一些文字内容[/collapse] 其中status为false 表示默认不显示文字内容，为true表示默认显示内容。 不写status 属性，默认是展开内容的。\n标签卡 示例代码： [tabs] [tab name=\u0026#34;标签页 1\u0026#34; active=\u0026#34;true\u0026#34;]内容 1[/tab] [tab name=\u0026#34;标签页 2\u0026#34;]内容 2[/tab] [/tabs] 每个tab 都必须包括name属性，只能有一个tab 添加active属性，表示默认显示该tab的内容。\n此外tab支持更多css的属性，比如颜色，字体粗细等： [tab name=\u0026ldquo;标签页 2\u0026rdquo; color:\u0026quot;#000\u0026quot; font-weight=\u0026ldquo;bold\u0026rdquo;]高级内容文本示例[/tab]\n标签tag 示例代码： [tag]默认白色文字[/tag] [tag type=\u0026#34;primary\u0026#34;]紫色文字[/tag] [tag type=\u0026#34;info\u0026#34;]蓝色文字[/tag] [tag type=\u0026#34;warning\u0026#34;]黄色文字[/tag] [tag type=\u0026#34;danger\u0026#34;]红色文字[/tag] [tag type=\u0026#34;success\u0026#34;]绿色文字[/tag] [tag type=\u0026#34;dark\u0026#34;]黑色文字[/tag] 文章中插入多栏 size属性可以填写百分比或者固定的宽度值（单位是px）\n//一个简单的例子 [colum] [block size=\u0026#34;20%\u0026#34;]百分比宽度[/block] [block size=\u0026#34;200px\u0026#34;]固定宽度[/block] [block]标题3[/block] [/clumn] // 一个复杂一点的例子，block内部可以使用其他的短代码带来更丰富的排版 [column] [block size=\u0026#34;20%\u0026#34;] [scode type=\u0026#34;red\u0026#34; size=\u0026#34;small\u0026#34;]标题1[/scode] [scode type=\u0026#34;share\u0026#34; size=\u0026#34;small\u0026#34;]标题1 标题1的内容 [/scode] [/block] [block size=\u0026#34;200px\u0026#34;] [scode type=\u0026#34;red\u0026#34; size=\u0026#34;small\u0026#34;]标题2[/scode] [/block] [block] [scode type=\u0026#34;red\u0026#34; size=\u0026#34;small\u0026#34;]标题3[/scode] [/block] [/column] ","date":"2022-07-12T01:15:00+08:00","permalink":"https://blog.tama.guru/record/hs-shortcode.html","title":"handsome主题短代码"},{"content":"体验了几天这个主题，发现资源加载是真的离谱，动不动10s+：\n于是就想着把部分静态资源扔国内来了。\n直接把包内themeCore\\themes\\default\\statics打包上传到国内服务器搭建的网站目录下，最好和其他资源间隔开来，比如https://hostname/cdn/OneCircle/，然后修改themeCore/themes/default/apps/main/content.phtml和themeCore/themes/default/apps/cpanel/content_nosidebar.phtml把{%config theme_url%}替换成https://hostname/cdn/OneCircle/，再刷新即可。\n[scode type=\u0026quot;yellow\u0026quot;]注意！部分资源位于themeCore\\themes\\default\\apps\\cpanel\\statics下，此部分资源和上面的不一样，也需要提取到国内服务器上并进行替换。（说的就是你！themeCore/themes/default/apps/cpanel/content_nosidebar.phtml 你mua的！）[/scode]\n对于部分资源会得到has been blocked by CORS policy: No 'Access-Control-Allow-Origin'的跨域警告，是因为\n\u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://hostname/cdn/OneCircle/statics/scss/master.styles.min.css?v={%config version%}\u0026#34;\u0026gt; 这里的master.styles.min.js会请求几个woff文件，初步解决方案是只把这里修改回去，即：\n\u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;{%config theme_url%}/statics/scss/master.styles.min.css?v={%config version%}\u0026#34;\u0026gt; 后面有好方法再说。。。\nPS:解决方案：如果使用宝塔面板，在目标服务器（国内服务器）要关闭防跨站攻击(open_basedir)功能，并在配置文件的location添加以下两句即可：\nlocation / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods \u0026#39;GET, POST, OPTIONS\u0026#39;; } handsome主题内置了自定义cdn加速的功能，在主题设置的速度优化-主题本地静态资源自定义cdn加速下，填写加速地址：\n你需要把asset目录上传到你的cdn服务器上，比如CDN服务器的 handsome目录里，地址即为 https://cdn.ihewro.com/handsome/assets/ 在当前框中就填入该地址，主题就会引用你搭建的cdn上面的资源，而不再引用当前服务器上的资源 ","date":"2022-07-11T22:52:00+08:00","permalink":"https://blog.tama.guru/record/OneCirclePro-jscss.html","title":"OneCirclePro插件和handsome静态资源切换到国内服务器"},{"content":"如果你的服务器在国外导致部分内容加载缓慢，同时因为CDN需要准备七七八八的(cloudflare除外，但是体验一样不好)，又信不过国内一众免费图床（稳定性和安全性问题），那么可以试着使用lskypro在国内服务器自建图床。\n官网地址：Lsky Pro V 2.x | Lsky Pro\n依赖：（推荐使用宝塔面板安装依赖插件，以下操作均在宝塔面板操作并通过测试）\nPHP \u0026gt;= 8.0.2 BCMath PHP 扩展 Ctype PHP 扩展 DOM PHP 拓展 Fileinfo PHP 扩展 JSON PHP 扩展 Mbstring PHP 扩展 OpenSSL PHP 扩展 PDO PHP 扩展 Tokenizer PHP 扩展 XML PHP 扩展 Imagick 拓展 exec、shell_exec 函数 readlink、symlink 函数 putenv、getenv 函数 关闭open_basedir(即“防跨站”，在宝塔的网站-设置-网站目录-防跨站攻击(open_basedir)) 数据库版本要求：\nMysql 5.7+ PostgreSQL 9.6+ SQLite 3.8.8+ SQL Server 2017+ 软件下载地址：https://github.com/lsky-org/lsky-pro/releases\n部署到服务器上之后，设置好伪静态：\nlocation / { try_files $uri $uri/ /index.php?$query_string; } 运行目录选择/public。\n可能因为权限问题导致目录访问不了等问题，因此要在lskypro的目录运行：\nchown -R www:www *\nchmod -R 755 *\n之后访问安装的地址即可进入检测界面，这里可能会提示chown、chmod等功能不可用，可以在宝塔的PHP设置中把以上的禁用函数取消掉。\n如无问题，即可进入账户设置和服务器链接的界面。\n安装完成后默认是所有人都能上传的，这可能会导致一些问题，因此最好是设置一个管理员群组：\n在设置中关闭游客上传和注册功能：\n接口打开留着以便后面使用。\n接入typecho：\ntypecho兰空（LskyPro）图床插件 - Cold' Blog (coldyun.cn)在莫言的1.0版本插件基础上新增了对lskypro2.0版本的支持，直接到他的博客下载附件上传到typecho下的plugin安装即可。插件需要填写Api和Token两项，其中Token与上面的接口有关，我们需要通过post的方式获得token：此处使用Postman：\n注册成功后在左侧的collections点击加号，在New Collection点击GET New Request\n接下来在右侧把GET切换成POST：\n其中链接填写https://hostname/api/v1/tokens hostname是你的lskypro服务安装域名。\nkey填写email和password后面的value为lskypro安装注册时填写的管理员邮箱和密码，之后点击Send，下方会提示：\n此处即我们需要的token，填写进插件即可，后面就能正常使用了。\n[scode type=\u0026quot;yellow\u0026quot;]注意！如果提示500错误，极有可能是跨域设置问题，对于宝塔面板需要关掉防跨站攻击，对于lnmp需要进入lnmp/tools目录执行remove_open_basedir_restriction.sh，并输入图床源代码所在的目录，保存并执行lnmp restart即可[/scode]\n","date":"2022-07-11T20:46:00+08:00","permalink":"https://blog.tama.guru/record/lskypro.html","title":"使用lskypro作为typecho图床"},{"content":"[scode type=\u0026quot;yellow\u0026quot;]此处备份handsome主题一些自定义的教程：[/scode]\n彩色标签云：在开发者设置-自定义 JavaScript填写： let tags = document.querySelectorAll(\u0026#34;#tag_cloud-2 a\u0026#34;); let colorArr = [\u0026#34;#428BCA\u0026#34;, \u0026#34;#AEDCAE\u0026#34;, \u0026#34;#ECA9A7\u0026#34;, \u0026#34;#DA99FF\u0026#34;, \u0026#34;#FFB380\u0026#34;, \u0026#34;#D9B999\u0026#34;]; tags.forEach(tag =\u0026gt; { tagsColor = colorArr[Math.floor(Math.random() * colorArr.length)]; tag.style.backgroundColor = tagsColor; }); 如果使用PJAX需要同步填写到PJAX回调函数。\n头像相关美化：在开发者设置-自定义CSS： /*头像呼吸光环和鼠标悬停旋转放大*/ .img-full { width: 100px; border-radius: 50%; animation: light 4s ease-in-out infinite; transition: 0.5s; } .img-full:hover { transform: scale(1.15) rotate(720deg); } @keyframes light { 0% { box-shadow: 0 0 4px #f00; } 25% { box-shadow: 0 0 16px #0f0; } 50% { box-shadow: 0 0 4px #00f; } 75% { box-shadow: 0 0 16px #0f0; } 100% { box-shadow: 0 0 4px #f00; } } /*评论头像旋转*/ .img-circle { transition: all 0.3s; } .img-circle:hover { transform: rotate(360deg); } ","date":"2022-07-10T20:20:00+08:00","permalink":"https://blog.tama.guru/record/handsome-modify.html","title":"handsome美化记录"},{"content":"项目地址：[tachiyomi](tachiyomiorg/tachiyomi: Free and open source manga reader for Android. (github.com))\n介绍：tachiyomi是一个开源的支持安卓6.0+的漫画阅读器，支持在线阅读漫画源内容，插件更新速度快，界面美观，更新中文/英文/日文插件（包括NSFW）\n优点：插件更新快，覆盖内容广（包含dmzj等常见内容源，基本上正经漫画都能搜出来），MD界面，开源无广告\n缺点：\n插件使用github源，部分地区无法在软件内安装，需要手动到tachiyomi-extensions/apk at repo · tachiyomiorg/tachiyomi-extensions (github.com)手动下载或者开小飞机下载。 只支持安卓使用，其他设备使用需要一台服务器部署tachidesk服务：Suwayomi/Tachidesk-Server: A rewrite of Tachiyomi for the Desktop (github.com) ","date":"2022-07-09T13:40:00+08:00","permalink":"https://blog.tama.guru/record/tachiyomi.html","title":"唯一指定漫画阅读软件tachiyomi"},{"content":"很简单，直接把对应文件替换掉就好。 后续会把ac娘也接入。 [hide]https://blog.tama.guru/usr/themes/handsome/usr/OwO.json[/hide]\nPS:AC娘图标包也已经实装 只需要把[hide]https://cdn.aixifan.com/dotnet/20130418/project/emot/package2.0/acfun_emoji.zip[/hide]下载到服务器解压并将压缩包下图片集文件夹移动到usr/themes/handsome/assets/img/emotion改名为acfun再用上面的文件替换即可。\n如果觉得显示的表情过大了，可以在主题设置中的自定义css添加：\n/*滑稽小表情自定义大小*/ .emotion-funny { width: 30px; } .comment-content-true img.emotion-funny { max-width: 100%!important; } ","date":"2022-07-07T00:59:00+08:00","permalink":"https://blog.tama.guru/record/aclive-emotion.html","title":"添加acfun直播的颜文字（仅针对handsome主题）"},{"content":"在异地直接扫码登录miraiqq会有“异常，建议在同一WIFI环境下使用”的提示，如果服务器在本地还好，但是买的服务器在外地就很难这样去处理了。 解决的方式也很简单，因为go-cqhttp是通过检查运行目录下的 device.json和 session.token来验证数据的，因此只要在本地环境搭建好go-cqhttp环境并登陆，然后用本地生成的两个文件传输到远程服务器下替换掉原有文件就好了。\n具体步骤：\n本地搭建go-cqhttp（本地的服务器类型可以与异地不一致，因为最终生成的 device.json和 session.token内容是一样的） 到 https://github.com/Mrs4s/go-cqhttp/releases下载本地系统对应版本的文件，例如使用windows的可以下载 https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc3/go-cqhttp_windows_amd64.exe，下载到本地双击运行；使用debian系的可以 wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc3/go-cqhttp_1.0.0-rc3_linux_amd64.deb 然后 dpkg -i go-cqhttp_1.0.0-rc3_linux_amd64.deb，即可使用go-cqhttp命令在当前目录下运行。 使用windows版本会提示请勿通过双击运行本程序，确认即可，后续会生成 go-cqhttp.bat，双击运行 go-cqhttp.bat按要求选择通信方式，一般选择 0:HTTP通信即可，待提示 默认配置文件已生成，请修改 config.yml 后重新启动!后可关闭窗口。 之后修改 config.yml，此处只需要填报QQ账号、密码 其他不要动。 修改好之后再运行 go-cqhttp.bat一般会提示两个步骤：一是要滑动验证，直接复制生成的网址到浏览器并按要求处理即可；二是选择使用手机接收验证码。处理完两个步骤后提示正常运行即可关闭窗口，然后把目录下的 device.json和 session.token传输到服务器的miraiqq目录再运行对应程序即可（注意服务器的config文件中QQ账号、密码要和本地一致）。 PS： linux大同小异。 ","date":"2022-07-06T09:11:45+08:00","permalink":"https://blog.tama.guru/record/miraiqq-remote.html","title":"在异地服务器使用go-miraiqq教程"},{"content":"感谢万能小狼，我的账号密码终于回来了。（第一天就忘掉自己设置的密码，我是笨蛋\n","date":"2022-07-05T23:08:02+08:00","permalink":"https://blog.tama.guru/record/wmdht_001.html","title":"阿巴阿巴阿巴"},{"content":"慢慢完善\n资源类：\nnyaa:Home - Nyaa.se Torrents Proxy trackerlist:XIU2/TrackersListCollection mox.moe(Mox.moe [Kindle漫畫|Kobo漫畫|epub漫畫] [volmoe.com] 在线解析：影视软件VIP视频解析接口集合 | ahhhhfs - A姐分享 游戏相关：\nsteam游戏价格查询:https://steamdb.info/ 雀魂网页版：雀魂麻將 ","date":"2022-07-05T02:00:00+08:00","permalink":"https://blog.tama.guru/record/somelinks.html","title":"一些链接的备份"},{"content":" kr版本已出，记录下攻略\n游戏下载链接：{cloud title=\u0026ldquo;格林花园的魔女krkr\u0026rdquo; type=\u0026ldquo;bd\u0026rdquo; url=\u0026ldquo;https://pan.baidu.com/share/init?surl=Gok0LLjkBfEo-QS8-BtQiA\" password=\u0026ldquo;hsly\u0026rdquo;/}\n樱子线：\n反驳她 试着问一下 和恋冢一起吃饭 试着问一下 这主意不错（SAVE1） 在食堂吃饭 放着不管（SAVE2） 樱子 樱子 。。。 好，回去 樱子 陪这三人 选择两方 （樱子线完成） 真由线：\n笑着敷衍过去 试着问一下 今天就算了吧 试着问一下 这主意不错 在食堂就餐 暗中给她鼓劲 真由 真由 。。。（此处不可选“叫住她”） 好，回去（疑似选项错乱） 真由 陪这三人 （真由线完成） 千岁线：\n反驳她 试着问一下 和恋冢一起吃饭 试着问一下 这主意不错（SAVE1） 在食堂吃饭 放着不管（SAVE2） 千岁 千岁 。。。 好，来吧！ 千岁 樱子 陪这三人 自己擦 选择两方 白雪线：\n笑着敷衍过去 不去在意 今天就算了吧 放着不管 这主意不错 去中庭 给她面包 真由 其他人 白雪 。。。 好，回去吧 千岁 樱子 停止 强迫他们买 选择两方 （白雪线完成） 主线：\n反驳她 试着问一下 和恋冢一起吃饭 试着问一下 这主意不错（SAVE1） 回自己房间 觉得我怎么样？ 樱子 其他人 若叶 叫住她（此处需要所有支线完成） ","date":"2022-07-03T23:28:00+08:00","permalink":"https://blog.tama.guru/method/witch_in_gleamgarden.html","title":"格林花园的魔女-攻略-20220703"},{"content":"因为使用这个主题的时候是整个dev分支clone过来的，难免有一些bug（也确实看到作者刚在十几天前修了一些东西） 目前使用关注人/圈子会在后台显示post 500 error 错误位置：\nvar xhrSendProcessor = function() { try { var requestDescriptor = findRequestDescriptor(this); if (xhrProxyEnabled \u0026amp;\u0026amp; requestDescriptor) { deleteDescriptor(this); if (!requestDescriptor.isCORS \u0026amp;\u0026amp; !requestDescriptor.headerSet) oldSetRequestHeader.apply(this, [KasperskyLab.RequestCustomHeader, \u0026#39;Ajax_Request\u0026#39;]); if (requestDescriptor.RequestSend) { requestDescriptor.RequestSend.apply(this, [].slice.call(arguments)); return; } } } catch(e) { KasperskyLab.SessionError(e, \u0026#34;xhr\u0026#34;); } return oldSend.apply(this, [].slice.call(arguments)); }; 具体出错位置：\nreturn oldSend.apply(this, [].slice.call(arguments)); 暂且记录问题。\n","date":"2022-07-03T19:09:46+08:00","permalink":"https://blog.tama.guru/record/follow-crash.html","title":"关注人/圈子功能处于寄的状态"},{"content":"避免服务器寄了群友d谁都忘了，以下做个记录 订阅列表(截至20220703)\n空灵晓 7491034 qyqx 378269 Ag_Key 459097 唐茶唯一指定唐茶色 18245957 裕奈Yuna 37662640 完美的核桃 46571378 千璃Senri 12961787 1001Project 179922 筱木茗 25061941 律诗 32844838 奈子绘Nakoe 35764170 ✟塞壬Siren✟ 37181305 一支橘猫 13337864 我家亲爱的列克星敦 220810 寒禅肆青雲 65454607 存活率极低的小狼 852888 唐茶 2869300 tsukasalol 416752 notify.group.acfun.live.tmpl\n{{ if .living -}} [AcFun] {{ .name }} 正在直播 开始时间：{{ hour }}:{{ minute }}:{{ second }} 直播标题：{{ .title }} 直播链接：{{ .url -}} {{ pic .cover \u0026#34;[封面]\u0026#34; }} {{- else -}} [AcFun] {{ .name }} 直播结束了 {{ pic .cover \u0026#34;[封面]\u0026#34; }} {{- end -}} 今天吃什么选择器 内容：\nKFC 拌面 包子 煲仔饭 肠粉 炒菜 炒饭 炒面 炒年糕 川菜 刀削面 盖浇饭 汉堡 汉堡王 黄焖鸡 黄焖鸡米饭 烩面 馄饨 火锅 鸡公煲 煎饼果子 饺子 咖喱饭 烤串 烤冷面 烤肉拌饭 烤肉饭 烤鸭 肯德基 拉面 兰州拉面 凉皮 凉皮儿 卤肉饭 螺狮粉 驴肉火烧 麻辣拌 麻辣烫 麻辣烫肉夹馍 麻辣香锅 麦当劳 冒菜 米线 牛肉面 泡面 披萨 热干面 沙县小吃 烧烤 生煎 石锅拌饭 手抓饼 寿司 水饺 酸菜鱼 酸辣粉 土豆粉 小碗菜 蟹黄包 羊肉汤 油泼面 炸鸡 炸酱面 重庆小面 粥 猪脚饭 粽子 如有需要后续会更新\n","date":"2022-07-03T16:43:00+08:00","permalink":"https://blog.tama.guru/record/ddbot-live.html","title":"做一下ddbot的记录"},{"content":"记录一下15周年的录播\n实现步骤：\n在自定义css中添加如下内容： /*视频挂载*/ .iframe_video { position: relative; width: 100%; } @media only screen and (max-width: 767px) { .iframe_video { height: 15em; } } @media only screen and (min-width: 768px) and (max-width: 991px) { .iframe_video { height: 20em; } } @media only screen and (min-width: 992px) and (max-width: 1199px) { .iframe_video { height: 30em; } } @media only screen and (min-width: 1200px) { .iframe_video { height: 40em; } } .iframe_cross { position: relative; width: 100%; height: 0; padding-bottom: 75% } .iframe_cross iframe { position: absolute; width: 100%; height: 100%; left: 0; top: 0 } 插入代码（直接在编辑器中）： \u0026lt;iframe style=\u0026#34;min-width: 720px;min-height: 480px\u0026#34; src=\u0026#34;https://www.acfun.cn/player/ac35443632\u0026#34; id=\u0026#34;ACPlayer-re\u0026#34; scrolling=\u0026#34;no\u0026#34; border=\u0026#34;0\u0026#34; frameborder=\u0026#34;no\u0026#34; framespacing=\u0026#34;0\u0026#34; allowfullscreen=\u0026#34;true\u0026#34;\u0026gt;\u0026lt;/iframe\u0026gt; ","date":"2022-07-03T01:13:00+08:00","permalink":"https://blog.tama.guru/videoshare/23.html","title":"记录一下15周年的录播"},{"content":"在debian11直接apt install -y wifite 并运行会提示： [!] Warning: Recommended app bully was not found. install @ https://github.com/aanarchyy/bully [!] Warning: Recommended app pyrit was not found. install @ https://github.com/JPaulMora/Pyrit/wiki [!] Warning: Recommended app hashcat was not found. install @ https://hashcat.net/hashcat/ [!] Warning: Recommended app hcxdumptool was not found. install @ apt install hcxdumptool [!] Warning: Recommended app hcxpcapngtool was not found. install @ apt install hcxtools [!] Warning: Recommended app macchanger was not found. install @ apt install macchanger 接下来把他需求的所有组件都安装一遍： ①bully:这个安装很简单 git clone https://github.com/aanarchyy/bully cd bully/src/ make \u0026amp;\u0026amp; make install ②pyrit：注意的是pyrit需要python2.7环境，需要先手动安装python2.7: apt install -y python2.7 python2.7-dev git clone https://github.com/JPaulMora/Pyrit.git pip install psycopg2\npip install scapy cd pyrit \u0026amp;\u0026amp; python2 setup.py clean \u0026amp;\u0026amp; python2 setup.py build python2 setup.py install ③hashcat：hashcat依赖libconv组件，有可能安装了它找不到，因此可按以下步骤： wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz tar zxvf libiconv-1.17.tar.gz \u0026amp;\u0026amp; cd libiconv-1.17 ./configure \u0026ndash;prefix=/usr/local make \u0026amp;\u0026amp; make install 有可能还是会出错，搜索一下只不是有多个iconv.h find / -name iconv.h 果然在/usr/local/include下有一个，这个需要改名 mv /usr/local/include/iconv.h /usr/local/include/iconv.h.bak 之后安装hashcat: wget https://hashcat.net/files/hashcat-6.2.5.7z tar zxvf hashcat-6.2.5.7z cd hashcat-6.2.5 make \u0026amp;\u0026amp; make install\n","date":"2022-07-02T20:24:31+08:00","permalink":"https://blog.tama.guru/default/wifite_in_debian11.html","title":"在debian11安装并使用wifite"}]