<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Mias&apos; blog</title><description>我憧憬那闪烁永夜的天光</description><link>https://mias.moe/</link><language>zh_CN</language><item><title>golang随笔备忘录</title><link>https://mias.moe/posts/golang-learn-tour/</link><guid isPermaLink="true">https://mias.moe/posts/golang-learn-tour/</guid><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;为什么不做前端了？well...这个问题涉及的个人原因有些多，纯技术角度解释也很复杂，可以参考&lt;a href=&quot;https://hdu-cs.wiki/s/751b2a65&quot;&gt;杭电某 wiki&lt;/a&gt;，特指其中评价后端的某句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这些概念在不同的语言和框架之间是通用的。而核心的业务逻辑甚至基本可以脱离特定的 Web 框架而存在。你会学习到通用的 “道”，而不是仅仅某一个工具的 “术”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;总之对如今/后来的我，前端已经：不适合，不够擅长，使用范围重合低&lt;/p&gt;
&lt;p&gt;为什么是 Go？很多人吐槽其控制流面条，不爽，OOP 弱，ORM 奇怪，巴拉巴拉，xxx&lt;/p&gt;
&lt;p&gt;少关注太多别人的见解，每个人有自己的需求立场，不同的立场和角度得到的结论往往差别较大，乃至难以理解。关注自己的需求就好。就这么简单。&lt;/p&gt;
&lt;p&gt;web 后端需求+朋友项目+杭州找饭吃+语言生态对我需求便利&lt;/p&gt;
&lt;p&gt;完&lt;/p&gt;
&lt;p&gt;看什么：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/&quot;&gt;go.dev 选看&lt;/a&gt; + &lt;a href=&quot;pkg.go.dev&quot;&gt;module ref&lt;/a&gt; (ref) + 适当 llm + Google&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://xiaolincoding.com/&quot;&gt;八股 1&lt;/a&gt; + &lt;a href=&quot;https://golangguide.top/&quot;&gt;八股 2&lt;/a&gt; + &lt;a href=&quot;https://goclub.space/docs/companion&quot;&gt;CN 校准参考&lt;/a&gt; + &lt;a href=&quot;https://gopl-zh.github.io/index.html&quot;&gt;CN-basic-synatx&lt;/a&gt; +&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为什么 P1 不是直接给固定的各种 老 blog/教程/视频？&lt;/p&gt;
&lt;p&gt;太老/太旧/八股 or 面试题为主/缺乏引导/中文过量/卖课过量/中文圈 go 匮乏/go 特殊性，原因很多&lt;/p&gt;
&lt;p&gt;本篇目的？&lt;/p&gt;
&lt;p&gt;没有目的，也不是给其它人看的。我的记性很差，故备忘录随笔糊个几下。老实说我已经越来越懒于写 blog 了，意义不足&lt;/p&gt;
&lt;h2&gt;大纲&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Go&lt;/code&gt;(basic syntax)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MySQL&lt;/code&gt;/&lt;code&gt;PostgreSQL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Redis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RabbitMQ&lt;/code&gt;/&lt;code&gt;Kafka&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Docker compose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;K3s&lt;/code&gt;/&lt;code&gt;K8s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;gRPC&lt;/li&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;li&gt;Grafana&lt;/li&gt;
&lt;li&gt;OpenTelemetry&lt;/li&gt;
&lt;li&gt;GORM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来部分跳着看，自取所需即可。想找工作就 web 框架+mysql+中间件+八股+面经+容器化，有远大追求另谈。&lt;/p&gt;
&lt;p&gt;我层次比较低，以效率目的为先，填补构建在后。以及要找饭吃（）&lt;/p&gt;
&lt;h2&gt;阶段 A — 语言基础（语法、模块、并发）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 安装 Go 并运行第一个程序
&lt;ul&gt;
&lt;li&gt;文档：https://go.dev/doc/install&lt;/li&gt;
&lt;li&gt;练习：hello world、&lt;code&gt;go run&lt;/code&gt;、&lt;code&gt;go build&lt;/code&gt;、&lt;code&gt;go env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 完成 &lt;strong&gt;A Tour of Go&lt;/strong&gt;（交互式）
&lt;ul&gt;
&lt;li&gt;文档：https://go.dev/tour/&lt;/li&gt;
&lt;li&gt;重点：slices、maps、methods、interfaces、defer、panic/recover&lt;/li&gt;
&lt;li&gt;练习：跑完所有章节并做题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 阅读 &lt;strong&gt;Effective Go&lt;/strong&gt;（风格）
&lt;ul&gt;
&lt;li&gt;文档：https://go.dev/doc/effective_go&lt;/li&gt;
&lt;li&gt;练习：把常见 idiom 写成小样例（命名、接口、错误处理）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 学习 Go Modules (&lt;code&gt;go mod&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;文档：https://go.dev/ref/mod&lt;/li&gt;
&lt;li&gt;练习：&lt;code&gt;go mod init&lt;/code&gt;、添加依赖、查看 &lt;code&gt;go.sum&lt;/code&gt;、配置 proxy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 并发基础（goroutine / channel / context）
&lt;ul&gt;
&lt;li&gt;参考文章：https://go.dev/blog/pipelines&lt;/li&gt;
&lt;li&gt;练习：实现 worker pool、并发爬虫（限制并发）、用 &lt;code&gt;context&lt;/code&gt; 管理取消/超时&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;阶段 B - Web 后端必备（目标：能独立实现 REST API + 数据持久化 + 测试）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 学习标准库 HTTP（优先）
&lt;ul&gt;
&lt;li&gt;文档：https://pkg.go.dev/net/http&lt;/li&gt;
&lt;li&gt;练习：实现最小 HTTP server（路由、JSON I/O、日志 middleware、graceful shutdown、请求超时与 context）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] JSON 编码/解码与请求处理
&lt;ul&gt;
&lt;li&gt;文档：https://pkg.go.dev/encoding/json&lt;/li&gt;
&lt;li&gt;练习：实现 &lt;code&gt;POST /users&lt;/code&gt;、&lt;code&gt;GET /users/{id}&lt;/code&gt;、输入校验、错误返回&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 可选：用轻量框架重写（对比实现）
&lt;ul&gt;
&lt;li&gt;Gin 文档：https://gin-gonic.com/en/docs/&lt;/li&gt;
&lt;li&gt;练习：用 Gin 改写并比较两种写法的优劣&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 数据库基础（以 PostgreSQL 为推荐）
&lt;ul&gt;
&lt;li&gt;PostgreSQL docs：https://www.postgresql.org/docs/&lt;/li&gt;
&lt;li&gt;Go &lt;code&gt;database/sql&lt;/code&gt;：https://pkg.go.dev/database/sql&lt;/li&gt;
&lt;li&gt;推荐驱动 / 示例库：&lt;code&gt;pgx&lt;/code&gt; 或 &lt;code&gt;lib/pq&lt;/code&gt;（在 github 搜索最新驱动）&lt;/li&gt;
&lt;li&gt;练习：设计 &lt;code&gt;users&lt;/code&gt; 表，写 CRUD、事务、索引、分页&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 可选 ORM（理解其代价）
&lt;ul&gt;
&lt;li&gt;GORM docs：https://gorm.io/docs/index.html&lt;/li&gt;
&lt;li&gt;练习：用 GORM 实现 CRUD，并查看生成的 SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 并发模式与后台任务
&lt;ul&gt;
&lt;li&gt;练习：实现异步任务（邮件/图片处理）、保证安全关闭与没有 goroutine 泄露&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 测试（单元/集成）与基准
&lt;ul&gt;
&lt;li&gt;文档：https://pkg.go.dev/testing&lt;/li&gt;
&lt;li&gt;练习：表驱动测试、集成测试（用 Docker Compose 启动 DB）、&lt;code&gt;go test -bench&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 性能剖析（pprof）
&lt;ul&gt;
&lt;li&gt;文档：https://pkg.go.dev/runtime/pprof&lt;/li&gt;
&lt;li&gt;练习：在服务暴露 &lt;code&gt;/debug/pprof/&lt;/code&gt;，采集 CPU/heap 分析热点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;阶段 C — 工程化与生产能力（目的：把服务做成可运维的系统）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Redis 缓存与缓存策略
&lt;ul&gt;
&lt;li&gt;文档：https://redis.io/docs/latest/&lt;/li&gt;
&lt;li&gt;Go client（示例）：https://github.com/redis/go-redis&lt;/li&gt;
&lt;li&gt;练习：为 &lt;code&gt;GET /users/{id}&lt;/code&gt; 添加缓存，设计缓存失效与一致性方案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 消息与事件（Kafka / NATS 等）
&lt;ul&gt;
&lt;li&gt;Kafka docs：https://kafka.apache.org/documentation/&lt;/li&gt;
&lt;li&gt;练习：实现 &lt;code&gt;user_created&lt;/code&gt; 事件生产/消费，处理幂等与重试&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] RPC 与接口定义（gRPC + Protobuf）
&lt;ul&gt;
&lt;li&gt;gRPC Go：https://grpc.io/docs/languages/go/&lt;/li&gt;
&lt;li&gt;练习：用 protobuf 定义接口，搭建简单的 gRPC 服务并互相调用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 容器化（Docker）
&lt;ul&gt;
&lt;li&gt;文档：https://docs.docker.com/&lt;/li&gt;
&lt;li&gt;练习：编写高质量 Dockerfile（multi-stage）、构建并在本地运行镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 编排与部署（Kubernetes）
&lt;ul&gt;
&lt;li&gt;文档：https://kubernetes.io/docs/&lt;/li&gt;
&lt;li&gt;练习：用 minikube/kind 或云集群部署应用，熟悉 Deployment/Service/ConfigMap/Secret、滚动更新与探针&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 监控、可视化与追踪
&lt;ul&gt;
&lt;li&gt;Prometheus：https://prometheus.io/docs/introduction/overview/&lt;/li&gt;
&lt;li&gt;Grafana：https://grafana.com/docs/&lt;/li&gt;
&lt;li&gt;OpenTelemetry（Go）：https://opentelemetry.io/docs/languages/go/&lt;/li&gt;
&lt;li&gt;练习：导出指标，搭建 Grafana 面板，实践分布式追踪分析 P99&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] CI/CD 与自动化流水线
&lt;ul&gt;
&lt;li&gt;GitHub Actions docs：https://docs.github.com/actions&lt;/li&gt;
&lt;li&gt;练习：实现 build → test → image → deploy 的流水线&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] 安全与运维要点
&lt;ul&gt;
&lt;li&gt;练习：Secrets 管理、TLS/HTTPS、依赖漏洞扫描、速率限制、日志审计、认证（JWT/OAuth）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;随笔&lt;/h3&gt;
&lt;p&gt;Go 的 gc 和内存自动管理，导致 runtime 停机时间不可测，使得其无法做硬实时平台，与 java 和 py 类似&lt;/p&gt;
&lt;p&gt;每个 go 项目为一个 module，每个 module 下，通常按惯例，每个 directory=package=library，package(except main)/lib can be imported by others who can access the module.others can use the func of the pack, like &lt;code&gt;fmt.Println()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;btw, in &quot;import&quot; process, the statement like &quot;math/fmt&quot;,it means the pack u import is &quot;fmt&quot;,like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;math/rand&lt;/code&gt; -&amp;gt; rand&lt;/p&gt;
&lt;p&gt;&lt;code&gt;net/http&lt;/code&gt; -&amp;gt; http&lt;/p&gt;
&lt;p&gt;and,module is unique. eg: github.com/gin-gonic/gin . it represent &quot;module path + directory&quot;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module
  ├─ directory
  │     └─ package
  ├─ directory
  │     └─ package
  └─ directory
        └─ package
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the pack/dirc is a kind of &quot;namespace&quot;.&lt;/p&gt;
&lt;p&gt;蚌，发现自己 en 讲比 cn 貌似还顺畅些。&lt;/p&gt;
&lt;p&gt;:::tip
Go Tour and the other similar, many exercises of them are CS-style learning, not production backend.&lt;/p&gt;
&lt;p&gt;Don&apos;t get stuck thinking:&lt;/p&gt;
&lt;p&gt;&quot;If I can&apos;t solve this, I can&apos;t be a backend dev.&quot;&lt;/p&gt;
&lt;p&gt;That is false.
:::&lt;/p&gt;
</content:encoded></item><item><title>往日旧事总结-回忆录篇</title><link>https://mias.moe/posts/memoir/</link><guid isPermaLink="true">https://mias.moe/posts/memoir/</guid><description>终有一日，愿遂彼空</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;各位新年好，这是我第一次从头写这么长的 年末总结。我知道定期写总结对个人复盘 督促 警惕徘徊陷阱等有好处，但我实在不善组织言语来长篇逻辑性表达，以及我的文法确实很糟糕。&lt;/p&gt;
&lt;p&gt;让我从头介绍下吧：&lt;/p&gt;
&lt;p&gt;你们可以叫我 mia,米垭 都行，现如今是一个正在努力的后端开发者，倾向于 infra 的&lt;code&gt;PaaS&lt;/code&gt;&amp;amp;&lt;code&gt;SRE&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我是个很普通 也很平庸的人。我既没有无与伦比的天赋，也并非出生在大城市，也没有高知宽容的幸福家庭，像样的朋友 曾经往日里都没几个。或许如今在部分人的眼里，会觉得我是大佬 很厉害 计算机知道很多 研究员 跨阶层等等什么的，但我自己始终 也无比清楚的知道：我很平庸，我攀爬的速度仍然太慢。&lt;/p&gt;
&lt;p&gt;我与计算机的开始。。。老实说，我也不知道什么才是真正的起点。非要说的话，或许是小学四年级吧。我的家庭并不关心我，或许他们工作从未偷懒，但他们确实不是合格的父母。那时在那个穷乡僻壤的破学校里，欺负我的教师子女不少，毕竟谁会拒绝一个没有家人在乎的沙包呢（笑。没有人会帮我的，在那个偏远小地方里，教育畸形 思想愚昧 可笑的“关系”遍布，一群互保的乡间野猴，谁会在乎我呢，没有人会拯救我。那时四年级有机房课，其实也就是小孩子玩玩 4399 页游的。我已经不记得 那时到底是什么启蒙我了。大致是利用了 arp 缓存的缺陷，改变全机房的网关 ip-&amp;gt;MAC 映射，使得网关 ip 实际指向为不转发流量的我，从而让所有人断网。那时的我很开心，发自心底的开心。因为没有教师 亲人 同学愿意帮助的 一无所有的我，被计算机帮助，报复了他们。&lt;/p&gt;
&lt;p&gt;当然，这在现在行不通，当时是因为 老旧协议+windows 安全缺陷+破地方机房设施草台班子 等各种因素叠加下，才能诞生的侥幸。如今是不可能行得通的。&lt;/p&gt;
&lt;p&gt;后来。。。自然也不是一些轻小说中那样一路展现天赋的剧情。我只是个平庸的 穷乡僻壤的孩子，当时的我没有见识到广袤的天地，多彩的世界，也没有愿意支持我的开明家庭，帮助我的诸多前辈。我被寄养到了另一个穷乡僻壤的亲戚家完成小学六年级至高一的学业，这家亲戚的认知环境稍微高些，但依旧畸形、愚昧、短视。我在这期间偶尔会展现兴趣，偷偷用他们的电子设备去搜索各样的知识，满足些对小孩子而言再正常不过的爱好，用一个破烂的杂牌平板去鼓捣类 unix 新奇小玩具，甚至做到了些 在那些乡间人事看来不可思议的 所谓的奇迹。隐私考虑，不展开了（笑 当时的我过的一点也不开心，因为我总是要写一些永远写不完的亲戚孩子不用的破书，总是要忍受这家亲戚生活中的不顺 谩骂 自我发泄的虐待 自我感动的 pua 和畸形观念。那时什么都不知道的我，将周遭的一切视作正常，毕竟那时我只是个没什么见识面的普通人，活在一个扭曲而 toxic 的囚笼中。可笑而卑微的我努力的获取这些野猴的认可，就和那些可怜的小镇做题家似的 追求着一些无关紧要的考试成绩自我慰藉 自我感动，期待能被那些也挺扭曲的同学和教师认可，能证明：我并非一无所有&lt;/p&gt;
&lt;p&gt;呵，在如今的 完整的我看来，他真是个可笑 可怜 可悲的孩子。不过，我依然会同情 悲悯那时无力而麻木的“自己”。&lt;/p&gt;
&lt;p&gt;btw,我毕业后后来所经历的人性，也阴暗 唯利是图的多。与之相比，这些可能完全只算是宝宝巴士了（苦笑&lt;/p&gt;
&lt;p&gt;高中。。我不太记得学校，也基本不太记得这期间认识的人了。我有着做噩梦的习惯，但我很少梦到与高中有关联的一切，偶尔有了，也是在惊醒后陷入茫然：我刚刚梦到啥了来着？ 就如同消失空白的三年一样。到手的只有个没啥用的高考分数和毕业证书，几个烂摊子，在空白中重新活过来的自己。&lt;/p&gt;
&lt;p&gt;其实从大学往前推，过往的一切，无论是同学 教师 亲戚的名字和脸，还是我究竟是如何熬过那宛如噩梦般 无用 可笑 扭曲 灰暗的十余年，我都已经不太记得了。&lt;/p&gt;
&lt;p&gt;如今看来着实好笑，我在短短的两年内，经历了，比过去十余年多还多的人生阅历，仿佛如今的我和曾经无力而卑微的我不是同一个人一般。这也是我从未真正共情过去人事包括自己的缘由。&lt;/p&gt;
&lt;p&gt;不过也没有那个必要，如今有很多事情等待着我去做 去学 去实现。比如下辈子也看不完的计算机知识（笑 。好玩的 有价值的人事多的是，多彩而宏大的世界也一点点的被我所接触 所展开，这不比过去那些没啥用又想不起来的东东有用多了（笑&lt;/p&gt;
&lt;p&gt;我想想（毕竟要遮去敏感信息&lt;/p&gt;
&lt;p&gt;我学到了不少曾经好奇 没能细究的技术，与能上电视屏幕的人鼓捣东西&lt;/p&gt;
&lt;p&gt;我去了很多的学术会议，看到了接近巅峰的光景，被一些过去遥不可及的人带去参会和吃饭，听他们有趣的过去时光和见闻，去了好多好多地方&lt;/p&gt;
&lt;p&gt;我被很多阶层很高的前辈 朋友帮助，极大拉高了眼界见识面，填补了信息差，并见识到了。。“真实的世界”&lt;/p&gt;
&lt;p&gt;我的所长所好被真正厉害的人所认可，发挥了价值。我赚到了米，买了曾经自己想要需要的电子设备，吃到了好吃的，看到了好多好多&lt;/p&gt;
&lt;p&gt;www,如果是你的话，在有一天离开阴暗可怖的马厩，迈向了广袤无垠的草原，被一匹匹千里马向前推，向上行后&lt;/p&gt;
&lt;p&gt;你，能接受过去所经历的一切毫无意义，一切皆为谬误和底层民众不切实际的幻想，自己 自己的朋友亲人 自己的一切一切 都只不过是外界天上之人们嘲笑的对象，最可笑的耗材吗&lt;/p&gt;
&lt;p&gt;即使接受了&lt;/p&gt;
&lt;p&gt;你，还会在乎曾经被困在马厩中，卑微而麻木的自己，马厩中所见所触的 愚昧而畸形的一切吗&lt;/p&gt;
&lt;p&gt;一开始迈入草原的我，怨憎过去的一切，瞧不起乃至嘲笑过去的一切，打自心底的蔑视 藐视 鄙夷他们，鄙夷 过去活在囚笼中可笑而无知的我。&lt;/p&gt;
&lt;p&gt;我鄙夷那群认知低微的亲人，愚昧自锁的中学教师，没有理想混日子的同学，活在笼中的自己，等等所有过去的一切，我甚至不曾把他们当做是“人”，&lt;/p&gt;
&lt;p&gt;因为那时的我觉得，包括过去的我在内，所有这些的一切，不过都只是群 穷乡僻壤 自欺欺人 认知配得上苦难的，假山上的野猴。&lt;/p&gt;
&lt;p&gt;但如今，我既行过云霄之上那璀璨的天宫 见到了那或是沉沦或是问道的仙，也踩过群山之间那污浊的泥沼 见到了那或是挣扎或是无力的人。&lt;/p&gt;
&lt;p&gt;在方今的我来看，无论是天上仙 沼间人 笼中鸟，都有自己活法的权利。我或许会以傲慢的眼光看一些认知匮乏的人，也或许会忽视他们，但当我看见时，不再会鄙夷他们了。因为他们是泥沼间挣扎的人，笼子里囚徒终生的鸟，他们无力改变一切，我们也帮不了他们。&lt;/p&gt;
&lt;p&gt;我很幸运，因为我的人生因为一些愿意主动帮我的“天上仙”和“计算机/Web”这条道而改变了&lt;/p&gt;
&lt;p&gt;我很不幸，因为我知道了太多太多，它们超出了我原本阶层的上限，我不得不放弃过去的一切。虽然我本来就已经不记得了（笑&lt;/p&gt;
&lt;p&gt;我拥有了好多，但。。我却一点点的失去了对游戏 对动漫的热忱、对朋友 对他人的期待、对过去 对他人的共情，世界随着我所经历的一切，随着我在这长阶上一步步的登攀，一点点的褪色 直至灰白。&lt;/p&gt;
&lt;p&gt;有了喜欢的电子设备，有了广阔的自由人生，有了喜欢我的人。我因为这条路得到了许多，却在逐步失去享受它的时间 和 热忱，它托举我跨入那遥不可及的云霄，触及那照彻永夜的皓月，成为那被人羡慕的天光，但...&lt;/p&gt;
&lt;p&gt;我也因此，永远 成为了它的囚徒。永远不得不向着那些更为璀璨的群星看齐，与他们相比，我不过是萤火之光，即使走在了通往天上的路，也不过是最最平庸黯淡的星星。&lt;/p&gt;
&lt;p&gt;只有当你跨越苍穹之上，俯视这众生沉浮的无垠大地，瞥见那诸星璀璨的寰宇星空，你才能明白自己的无知 愚昧，才能超越你的过去，跨越这一切，成为 你想成为的自己&lt;/p&gt;
&lt;p&gt;&amp;lt;pre&amp;gt;&amp;lt;b&amp;gt;
To follow the path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;look to the master,

follow the master,

walk with the master,

see through the master,

become the master.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/b&amp;gt;&amp;lt;/pre&amp;gt;&lt;/p&gt;
&lt;p&gt;当你成为了 master,回首一瞥&lt;/p&gt;
&lt;p&gt;或许，只会剩下一声无奈的叹息，一个饱含沧桑的苦笑&lt;/p&gt;
&lt;p&gt;再见了，过去&lt;/p&gt;
&lt;p&gt;终有一日 愿遂彼空。&lt;/p&gt;
</content:encoded></item><item><title>课题组AiCE使用记录</title><link>https://mias.moe/posts/%E8%AF%BE%E9%A2%98%E7%BB%84aice%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/</link><guid isPermaLink="true">https://mias.moe/posts/%E8%AF%BE%E9%A2%98%E7%BB%84aice%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/</guid><description>好难</description><pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;施工（吐槽）中。。。&lt;/h2&gt;
</content:encoded></item><item><title>课题组EvolvePro使用记录</title><link>https://mias.moe/posts/%E8%AF%BE%E9%A2%98%E7%BB%84evolvepro%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/</link><guid isPermaLink="true">https://mias.moe/posts/%E8%AF%BE%E9%A2%98%E7%BB%84evolvepro%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/</guid><description>这帮做科研的人真的会写文档和代码吗（</description><pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;抱怨&lt;/h2&gt;
&lt;p&gt;**我c你m的科研代码，你m写的是什么sb玩意，依赖是不全的，文档是一笔带过的，paper是只写数学/生物学术理论的，产品是不打算教人用的，就连nm的连个pip包单词拼写都nm是错的，你写你m呢写，这是什么傻x玩意，多写点是要扣你的经费么？ntm就当写写开发日记或者llm帮你写都jb写的比这好，你这sb文档最好不是什么傻鸟kimi/豆包之类的玩意写的，在学术上您值得受敬，代码可用性上ntm就是个 *的s*，cnm的💩文档，照着你这s*玩意能做出来就有你*的鬼了，您才是该被linus竖中指的coding毒瘤，s* ! **&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;言归正传，这篇文章我本来想拿个llm写的文档糊一下了事的，没什么好写的，引用下某群u的话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;因为搞科研的就没两个会写代码的&lt;/p&gt;
&lt;p&gt;会写代码的那两个也懒得在这种地方认真写&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;此言有理乎，我感觉自己正在coding上经受莫大的折磨&lt;/p&gt;
&lt;p&gt;如果说写/看vue的文档是被开发者们拖着皮鼓，百般讨好让你看看它们最新的努力成果和对使用者的宽容&lt;/p&gt;
&lt;p&gt;那用/看这种扫码科研项目的文档简直就是在舔写文档/写💩项目的人的皮燕子&lt;/p&gt;
&lt;p&gt;这玩意从头到尾就不是让人用的，就差把提防写脸上了，它根本就是一个给业内评委看一眼的展示品，甚至这个展示品不能独立的从头到尾自包含的跑一次&lt;/p&gt;
&lt;p&gt;还有学校给的服务器，“我们学校图书馆最强的服务器”，2015年出产的8代E7，还没有gpu，让我训练一个现代5090见了都倒头就拜的模型，每个时代有每个时代自己的长生不老仙丹妙药，笑死我了&lt;/p&gt;
&lt;p&gt;60g显存，用dr3的1.5t memory硬跑那个paper原作推荐的15B model，第二天早上起来一看日志，动都不带动一下的，难绷。最后还是用自己的设备去强跑650M的，提取了一下午的plm训练用向量&lt;/p&gt;
&lt;h2&gt;什么是蛋白质进化？&lt;/h2&gt;
&lt;h3&gt;用日常例子理解&lt;/h3&gt;
&lt;p&gt;想象您有一把钥匙（蛋白质），但它开锁（功能）不够顺畅。您想改进它。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;传统方法&lt;/strong&gt;：随机换零件，一个个试 → 太慢了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;钥匙有 562 个零件（氨基酸）&lt;/li&gt;
&lt;li&gt;每个零件可以换成 19 种其他零件&lt;/li&gt;
&lt;li&gt;总共有 10,678 种可能&lt;/li&gt;
&lt;li&gt;一个个试，写这项目的人试到经费耗尽也试不完&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;EvolvePro 方法&lt;/strong&gt;：让 LLM/AI 帮您预测 → 快多了&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先试 20 把钥匙，记录哪个好哪个坏&lt;/li&gt;
&lt;li&gt;LLM/AI 学习这 20 个的特征&lt;/li&gt;
&lt;li&gt;LLM/AI 预测剩下 10,658 个哪些最有希望&lt;/li&gt;
&lt;li&gt;您只试 LLM/AI 推荐的最好的 20 个&lt;/li&gt;
&lt;li&gt;重复这个过程，越来越接近完美的钥匙&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;流程概览&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;第一阶段：准备工作（1-2 小时，计算机完成）
┌─────────────────────────────────────────────┐
│ 输入：您的蛋白质序列（562 个氨基酸）          │
│   ↓                                          │
│ 生成所有可能的单点突变体（9,482 个）          │
│   ↓                                          │
│ 用 AI 给每个突变体&quot;拍照&quot;（提取特征）          │
│   ↓                                          │
│ 输出：9,482 个突变体的&quot;数字指纹&quot;              │
└─────────────────────────────────────────────┘

第二阶段：实验 + 预测循环（2-3 个月，多轮迭代）
┌─────────────────────────────────────────────┐
│ 【第 1 轮】                                   │
│  1. 选择 10~20 个突变体（随机或理性选择）         │
│  2. 实验室测试（1-2 周）                         │
│  3. 记录数据：哪些好坏以及activity活性相对值（假设wt野型为1.0） 
│   (activity可以选用任意期望权重，包括但不限于酶活性，结合亲和度，只需要除以野型蛋白的数据得到比例即可)
│  4. LLM/AI 学习并预测剩下的 9,462 个              │
│  5.LLM/AI 推荐 Top 50 个最有希望的               │
│                                              │
│ 【第 2 轮】                                   │
│  1. 从 Top 50 里选 10~20 个测试                  │
│  2. 实验室测试（1-2 周）                      │
│  3. 累积数据：现在有 20~40 个数据点了             │
│  4. LLM/AI 重新学习，预测更准确                   │
│  5. 推荐新的 Top 50                          │
│                                              │
│ 【第 3-5 轮】                                 │
│  重复上述过程...                              │
│  数据越来越多，LLM/AI 越来越聪明                  │
│  通常 3-5 轮后找到显著改进的突变体             │
└─────────────────────────────────────────────┘

第三阶段：收获成果
┌─────────────────────────────────────────────┐
│ 获得：                                        │
│   改进的蛋白质突变体                         │
│   性能提升 50%-200%（典型）                 │
│   只用了 60-100 个实验（vs 9,482 个全试）    │
│   节省了 95% 的时间和成本                    │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;详细步骤&lt;/h2&gt;
&lt;h3&gt;阶段一：前期准备工作&lt;/h3&gt;
&lt;h4&gt;Step 1：生成突变体序列&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;做什么：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从您的原始蛋白质序列出发&lt;/li&gt;
&lt;li&gt;把每个位置的氨基酸都换一遍&lt;/li&gt;
&lt;li&gt;生成所有可能的单点突变体&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;打个比方：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;原始序列：MADKLN...（562 个字母）
         ↓
突变体 1：AADKLN...（第1位 M→A）
突变体 2：DADKLN...（第1位 M→D）
突变体 3：EADKLN...（第1位 M→E）
...
突变体 9482：MADKLA...（最后一位 N→A）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;技术细节：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个位置可以换成 19 种其他氨基酸（除了它自己）&lt;/li&gt;
&lt;li&gt;562 个位置 × 19 种可能 = 10,678 种理论可能&lt;/li&gt;
&lt;li&gt;实际生成 9,482 个（某些不合理的会被排除）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;输出文件：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;output/exp_results/your_protein/
  ├── your_protein.fasta           ← 原始序列（WT）
  └── your_protein_mutants.fasta   ← 9,482 个突变体
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;耗时：&lt;/strong&gt; 几秒钟&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Step 2：提取 LLM/AI 特征（嵌入向量）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;做什么：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用 ESM2 语言模型给每个突变体&quot;拍照&quot;&lt;/li&gt;
&lt;li&gt;每张&quot;照片&quot;是 1,280 个数字（向量）&lt;/li&gt;
&lt;li&gt;这些数字代表蛋白质的特征&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;为什么需要这一步？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;计算机/模型不认识 &lt;code&gt;MADKLN&lt;/code&gt; 这样的字母，但认识数字。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;打个比方：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;人类看蛋白质：MADKLN（一串字母）
                ↓ ESM2 模型
电脑看蛋白质：[0.23, -0.15, 0.89, ..., 0.47]（1,280 个数字）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这 1,280 个数字包含了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;蛋白质的结构信息&lt;/li&gt;
&lt;li&gt;氨基酸之间的相互作用&lt;/li&gt;
&lt;li&gt;功能相关的特征&lt;/li&gt;
&lt;li&gt;...等等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用的模型：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESM2-650M&lt;/strong&gt;（您本地勉强可用的）：6.5 亿参数，本地 CPU 运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESM2-15B&lt;/strong&gt;（可选）：150 亿参数，需要服务器 GPU，且至少60g&lt;strong&gt;显存&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;技术细节：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ESM2 是 Meta（Facebook）开发的蛋白质语言模型&lt;/li&gt;
&lt;li&gt;在 2.5 亿个蛋白质序列上训练&lt;/li&gt;
&lt;li&gt;能&quot;理解&quot;蛋白质的语法和结构&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;输出文件：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;output/plm/esm/
  └── your_protein_esm2_t33_650M_UR50D.csv
      ├── 9,483 行（9,482 突变体 + 1 WT）
      └── 1,280 列（1,280 维向量）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;耗时：&lt;/strong&gt; 3-4 小时（本地 CPU）或 1-2 小时（服务器 GPU）&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;阶段二：实验与预测循环&lt;/h3&gt;
&lt;p&gt;这是整个流程的核心，重复多轮，每轮包含 4 个步骤：&lt;/p&gt;
&lt;h4&gt;Step 3：准备实验数据&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;做什么：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创建一个 Excel 表格，记录实验结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表格格式：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;variant&lt;/th&gt;
&lt;th&gt;activity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WT&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N58V&lt;/td&gt;
&lt;td&gt;0.85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Y250N&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Y268V&lt;/td&gt;
&lt;td&gt;0.92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L230G&lt;/td&gt;
&lt;td&gt;1.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;字段说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;variant&lt;/strong&gt;（突变体名称）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WT&lt;/code&gt;：Wild Type = 野生型 = 原始蛋白质&lt;/li&gt;
&lt;li&gt;&lt;code&gt;N58V&lt;/code&gt;：第 58 位的 N（天冬酰胺）→ V（缬氨酸）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Y250N&lt;/code&gt;：第 250 位的 Y（酪氨酸）→ N（天冬酰胺）&lt;/li&gt;
&lt;li&gt;格式：&lt;code&gt;原氨基酸 + 位置 + 新氨基酸&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;activity&lt;/strong&gt;（活性值）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实验测得的性能指标&lt;/li&gt;
&lt;li&gt;可以是任意单位（只要能比较大小）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数值越大表示越好&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;建议以 WT 为基准（WT = 1.0）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;活性值示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;酶活性：
  WT = 100 U/mL  → 标准化为 1.0
  突变体 A = 125 U/mL → 1.25（提升 25%）
  突变体 B = 80 U/mL  → 0.80（下降 20%）

结合亲和力（Kd 越小越好）：
  WT = 100 nM    → 取倒数 → 0.01 → 标准化为 1.0
  突变体 A = 50 nM → 取倒数 → 0.02 → 2.0（提升 100%）
  突变体 B = 200 nM → 取倒数 → 0.005 → 0.5（下降 50%）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第一轮要测试多少个？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最少&lt;/strong&gt;：WT + 10 个突变体（11 个数据点）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推荐&lt;/strong&gt;：WT + 20-30 个突变体（21-31 个数据点）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更多更好&lt;/strong&gt;：数据越多，模型越准确&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如何选择突变体？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一轮（没有 AI 推荐时）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;方法 1：随机选择 20-30 个&lt;/li&gt;
&lt;li&gt;方法 2：基于结构/功能知识选择（活性位点、关键残基等）&lt;/li&gt;
&lt;li&gt;方法 3：&lt;strong&gt;混合策略&lt;/strong&gt;（推荐）：一半随机，一半理性选择&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;后续轮（有 AI 推荐时）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从 AI 推荐的 Top 50 里选择&lt;/li&gt;
&lt;li&gt;可以全选 Top 20&lt;/li&gt;
&lt;li&gt;或者混合：Top 10 + 随机 10（避免过拟合）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;操作步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 打开我创建的模板
libreoffice data/exp/rounds/your_protein_Round1_template.xlsx

# 2. 填写数据
#    - 第一列：突变体名称
#    - 第二列：活性值

# 3. 保存为
data/exp/rounds/your_protein_Round1.xlsx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;耗时：&lt;/strong&gt; 实验 1-2 周，填表 10 分钟&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Step 4：训练模型并预测&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;做什么：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AI 学习您的实验数据&lt;/li&gt;
&lt;li&gt;对所有 9,482 个突变体进行预测&lt;/li&gt;
&lt;li&gt;推荐最有希望的 Top 50&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;技术原理：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用**随机森林（Random Forest）**机器学习模型：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;输入：
  - 9,482 个突变体的&quot;数字指纹&quot;（1,280 维向量）
  - 您测试的 20 个突变体的活性值

训练：
  AI 学习：&quot;哦，这些特征的突变体活性高，那些特征的活性低&quot;

预测：
  AI 预测剩下 9,462 个突变体的活性值

输出：
  按预测活性排序，推荐 Top 50
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么用随机森林？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;简单有效，不容易过拟合&lt;/li&gt;
&lt;li&gt;对小样本数据（20-30 个）效果好&lt;/li&gt;
&lt;li&gt;不需要大量调参&lt;/li&gt;
&lt;li&gt;训练速度快（几秒钟）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;操作步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 编辑快速启动脚本
nano scripts/exp/your_protein_quickstart.py

# 2. 找到 Round 1 代码块（第 93-110 行左右）
#    删除前面的 # 号（取消注释）

# Round 1
ROUND = 1
evolve.evolve(
    ROUND,
    wt_fasta_file=WT_FASTA_FILE,
    mutant_fasta_file=MUTANT_FASTA_FILE,
    rounds_data_file=ROUNDS_DATA_FILE,
    embeddings_file=EMBEDDINGS_FILE,
    output_dir=OUTPUT_DIR,
    model=MODEL,
    scaler=SCALER,
    hyperparameter_tune=HYPERPARAMETER_TUNE,
    cv=CV,
    selection=SELECTION,
    n_top=N_TOP,
)

# 3. 保存并运行
conda activate evolvepro
python scripts/exp/your_protein_quickstart.py evolve
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;输出文件：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;output/exp_results/your_protein/Round1/
  ├── your_protein_Round1_predicted_variants.csv
  │   ├── 所有 9,482 个突变体的预测结果
  │   └── 按预测活性排序
  │
  ├── your_protein_Round1_predicted_variants_top50.csv
  │   └── 推荐的 Top 50（用于下一轮测试）
  │
  ├── your_protein_Round1_model_performance.png
  │   └── 模型性能图（预测 vs 实际）
  │
  └── your_protein_Round1_feature_importance.csv
      └── 哪些特征最重要
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;查看结果：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看 Top 50 推荐
head -20 output/exp_results/your_protein/Round1/your_protein_Round1_predicted_variants_top50.csv

# 查看模型性能图
xdg-open output/exp_results/your_protein/Round1/your_protein_Round1_model_performance.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;耗时：&lt;/strong&gt; 10-30 分钟&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Step 5：第二轮实验&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;做什么：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从 Top 50 推荐里选 20 个突变体&lt;/li&gt;
&lt;li&gt;实验室测试&lt;/li&gt;
&lt;li&gt;创建 Round 2 数据文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;重要：Round 2 数据包含所有前几轮的累积数据&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Round 1 数据：WT + 20 个突变体（21 个数据点）
              ↓
Round 2 数据：WT + 20 个（Round 1）+ 20 个（Round 2）= 41 个数据点
              ↓
Round 3 数据：WT + 40 个（Round 1-2）+ 20 个（Round 3）= 61 个数据点
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Excel 格式：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;data/exp/rounds/your_protein_Round2.xlsx

variant  | activity
---------|----------
WT       | 1.0       ← 每轮都要包含
N58V     | 0.85      ← Round 1 数据
Y250N    | 1.25      ← Round 1 数据
...      | ...       ← Round 1 数据
L299F    | 1.38      ← Round 2 新数据
L313W    | 0.78      ← Round 2 新数据
...      | ...       ← Round 2 新数据
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;操作步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 创建 Round 2 数据文件
#    - 复制 Round 1 的数据
#    - 添加 Round 2 的新数据
#    - 保存为 your_protein_Round2.xlsx

# 2. 编辑快速启动脚本
nano scripts/exp/your_protein_quickstart.py

# 3. 取消注释 Round 2 代码块

# 4. 运行
conda activate evolvepro
python scripts/exp/your_protein_quickstart.py evolve
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;耗时：&lt;/strong&gt; 实验 1-2 周，计算 10-30 分钟&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Step 6-N：继续迭代&lt;/h4&gt;
&lt;p&gt;重复 Step 5，直到找到满意的突变体。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;何时停止？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;活性不再显著提升（收敛了）&lt;/li&gt;
&lt;li&gt;达到目标性能&lt;/li&gt;
&lt;li&gt;预算/时间用完&lt;/li&gt;
&lt;li&gt;通常 3-5 轮后收敛&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;每轮的变化：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;轮次&lt;/th&gt;
&lt;th&gt;数据量&lt;/th&gt;
&lt;th&gt;模型准确度&lt;/th&gt;
&lt;th&gt;发现好突变体的概率&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Round 1&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Round 2&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Round 3&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Round 4&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;很高&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Round 5&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;极高&lt;/td&gt;
&lt;td&gt;90%+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;阶段三：分析与验证&lt;/h3&gt;
&lt;h4&gt;Step 7：性能提升分析&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;查看最佳突变体：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看最终推荐的突变体
head -10 output/exp_results/your_protein/Round5/your_protein_Round5_predicted_variants_top50.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;绘制进化曲线：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import pandas as pd
import matplotlib.pyplot as plt

# 读取所有轮次的数据
rounds = []
for i in range(1, 6):
    df = pd.read_excel(f&apos;data/exp/rounds/your_protein_Round{i}.xlsx&apos;)
    df[&apos;round&apos;] = i
    rounds.append(df)

all_data = pd.concat(rounds)

# 绘制每轮最佳活性
best_per_round = all_data.groupby(&apos;round&apos;)[&apos;activity&apos;].max()
plt.plot(best_per_round.index, best_per_round.values, marker=&apos;o&apos;)
plt.xlabel(&apos;Round&apos;)
plt.ylabel(&apos;Best Activity&apos;)
plt.title(&apos;Evolution Progress&apos;)
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;典型结果：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Round 1：发现 1.5x WT 的突变体
Round 2：发现 2.0x WT 的突变体
Round 3：发现 2.5x WT 的突变体
Round 4：发现 3.0x WT 的突变体（收敛）
Round 5：仍是 3.0x WT（确认收敛）
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;Step 8：组合突变&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;单点突变体不够 -&amp;gt; 试组合&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;找到几个单独都好的突变体，组合在一起：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;单点突变：
  Y250N：1.5x WT
  L299F：1.8x WT
  R307N：1.6x WT

组合突变：
  Y250N + L299F：2.3x WT？
  Y250N + L299F + R307N：3.5x WT？
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 组合效果不一定是简单叠加，需要实验验证。&lt;/p&gt;
&lt;h2&gt;实际案例&lt;/h2&gt;
&lt;h3&gt;案例 1：T7 RNA 聚合酶&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;目标：&lt;/strong&gt; 提升转录效率&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Round 1：测试 24 个随机突变体，发现最好的是 1.4x WT&lt;/li&gt;
&lt;li&gt;Round 2：测试 Top 24，发现 2.1x WT&lt;/li&gt;
&lt;li&gt;Round 3：测试 Top 24，发现 2.8x WT&lt;/li&gt;
&lt;li&gt;Round 4：测试 Top 24，发现 3.0x WT（收敛）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;最佳突变体：&lt;/strong&gt; Y639F, L746M, Q732R
&lt;strong&gt;组合突变：&lt;/strong&gt; Y639F + L746M = 4.2x WT（协同效应）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总测试：&lt;/strong&gt; 96 个突变体（vs 9,000+ 个全试）&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;案例 2：Cas12f 核酸酶&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;目标：&lt;/strong&gt; 提升切割效率&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Round 1：测试 32 个（一半随机，一半活性位点附近）&lt;/li&gt;
&lt;li&gt;Round 2：测试 Top 32，发现 1.8x WT&lt;/li&gt;
&lt;li&gt;Round 3：测试 Top 32，发现 2.3x WT&lt;/li&gt;
&lt;li&gt;Round 4：测试 Top 32，发现 2.5x WT&lt;/li&gt;
&lt;li&gt;Round 5：测试 Top 32，发现 2.6x WT（收敛）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;最佳突变体：&lt;/strong&gt; N282D, L355F, K412R&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总测试：&lt;/strong&gt; 160 个突变体&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;案例 3：抗体亲和力优化&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;目标：&lt;/strong&gt; 降低 Kd（提升亲和力）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;挑战：&lt;/strong&gt; Kd 是越小越好，需要取倒数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据处理：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WT：Kd = 10 nM → activity = 1/10 = 0.1 → 标准化为 1.0
突变体 A：Kd = 5 nM → activity = 1/5 = 0.2 → 2.0
突变体 B：Kd = 2 nM → activity = 1/2 = 0.5 → 5.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;结果：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5 轮后找到 Kd = 0.5 nM 的突变体（提升 20 倍）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;上述内容我已经经过review，在650M模型下向量提取等工作流没问题&lt;/p&gt;
&lt;p&gt;15B参数等esm2 plm没法试，也别指望自己能跑得动，建议直接找老板。Google可知其显存需求至少60g needs，在模型启动的一瞬间，显存内存就会双双过载，&lt;code&gt;dmsg&lt;/code&gt;可知发生  oom &lt;code&gt;out-of-memory&lt;/code&gt; ，进程直接panic。超256g的内存勉强可以保持不发生panic，但速度非常慢，cpu硬算就更慢了，这并不是你的cpu有什么性能缺陷（当然也可能有），而是图计算和模型训练这种活就不是cpu擅长的范围，犹如让重卡车和超跑比赛车一样&lt;/p&gt;
&lt;p&gt;一言以蔽之，科研codebase在功能上或许一个比一个神异，但在代码结构和用户友好性上那是一个比一个沟式，拒开发者于千里之外&lt;/p&gt;
&lt;h2&gt;转机&lt;/h2&gt;
&lt;p&gt;well...由于AiCE本身无法被直接用于活性推断，RF diffusion 3 对显卡显存要求极为严苛，12GiB+都是至少了，故回到 evolvePro的 esm2-650MiB 这边，思考有没有什么转机之法&lt;/p&gt;
&lt;p&gt;教授那边一共就39个现存的突变体的活性数据，理论上来说，如果要从活性推断吻合的角度来收敛模型，得到高精的 嵌入向量提取 那是远远不可能够的（）巧妇亦难为无米之炊（&lt;/p&gt;
&lt;p&gt;但考虑到这就是个本科毕设，应该不需要那么精确的预估范围，于是转换思路：&lt;/p&gt;
&lt;p&gt;如果我只判断趋势，不追究最高效数值呢？然后尝试：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;改写evolvePro的流程，不再是以十次为单位的交互式训练，而是再第一次初始化嵌入提取后，一次性给它30个作训练集&lt;/li&gt;
&lt;li&gt;以剩下9个数据为测试集，不再是「预估具体的活性程度和大小」，而是「判断活性增减趋势与实验侧数据是否符合」&lt;/li&gt;
&lt;li&gt;调整训练集与测试集的数据分配，测个四五次 五六次&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;um，结果出乎意料的好，准确率高达77.8%，意味着 7/9 的高额准确率，都能拿来投入实际产出来缩减实验侧的试剂开销了貌似（）&lt;/p&gt;
&lt;p&gt;再次吐槽，这科研代码的作者就差把“别研究我”写在注释里了，bro是有多怕被后人钻研才能把代码架构和流程间的交互烂到这种地步（&lt;/p&gt;
</content:encoded></item><item><title>软路由配置记录</title><link>https://mias.moe/posts/soft-router-gl-mt3000/soft-routing-config/</link><guid isPermaLink="true">https://mias.moe/posts/soft-router-gl-mt3000/soft-routing-config/</guid><description>gl-mt3000 + openwrt分支iStore</description><pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;学校校园网网关限制了每个带宽账号2个&lt;code&gt;mac&lt;/code&gt;——这对我的超过7个设备是极大的阻碍。&lt;/li&gt;
&lt;li&gt;AP隔离使得内网设备间不可通信。&lt;strong&gt;AP/Client Isolation 在 L2 层面拦截站对站流量&lt;/strong&gt;，这意味着它阻止了无线客户端之间直接交换以太网帧（ARP、IPv4/IPv6 unicast）。因为没有 L2 通道，基于直接 IP 的会话（比如 SSH/TCP 连接、UDP 单播、广播）通常无法建立，这是帧 Frame 级别的阻拦，不可绕过——这对我多设备通信极不友好。&lt;/li&gt;
&lt;li&gt;我有些设备不便于在本地代理，或者其l3/4无法被捕获/转发。&lt;/li&gt;
&lt;li&gt;我没玩过软路由，&lt;s&gt;给自己找点罪受，&lt;/s&gt;，体验实践一遍软路由整套部署的大致工作流。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普及下 router-based proxy 和 device-based proxy 的区别&lt;/p&gt;
&lt;p&gt;router-based：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;例子&lt;/th&gt;
&lt;th&gt;OSI 层&lt;/th&gt;
&lt;th&gt;原理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NAT（网络地址转换）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenWrt、iptables MASQUERADE&lt;/td&gt;
&lt;td&gt;L3 / L4&lt;/td&gt;
&lt;td&gt;直接改写 IP 头和 TCP/UDP 端口，不看应用层内容。纯粹的数据包转发。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TProxy / REDIRECT 透明代理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clash、Surge、OpenClash、Xray 透明代理&lt;/td&gt;
&lt;td&gt;L3 / L4&lt;/td&gt;
&lt;td&gt;捕获所有目的端口流量，把 TCP/UDP 流导入本地监听的代理进程（例如 HTTP/SOCKS）。代理进程再在 L7 层解析。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;防火墙规则/路由策略&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;iptables、nftables、ip rule、ip route&lt;/td&gt;
&lt;td&gt;L3 / L4&lt;/td&gt;
&lt;td&gt;依据 IP 和端口做流量重定向或丢弃，不理解 L7 内容。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;软路由中的代理核心&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clash、Xray、V2Ray、Sing-box&lt;/td&gt;
&lt;td&gt;L7&lt;/td&gt;
&lt;td&gt;在路由器中运行的代理引擎本身理解 HTTP、TLS、QUIC、SOCKS 协议。属于应用层代理，但它接收的流量是从内核 L4 转发来的。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;device-based：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;th&gt;OSI 层&lt;/th&gt;
&lt;th&gt;原理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP 代理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;系统设置中的 HTTP Proxy、Surge、Quantumult&lt;/td&gt;
&lt;td&gt;L7&lt;/td&gt;
&lt;td&gt;应用发送 HTTP 请求给代理，代理解析并转发。处理的是应用层 HTTP 协议。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SOCKS5 代理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shadowsocks、Clash 本地模式&lt;/td&gt;
&lt;td&gt;L7&lt;/td&gt;
&lt;td&gt;代理客户端封装 TCP/UDP 连接请求，通过 SOCKS 协议转交代理服务器。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPN App / Tun 驱动&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clash Tun、WireGuard、Outline、OpenVPN&lt;/td&gt;
&lt;td&gt;L3~L4（虚拟网卡）+ L7（代理引擎）&lt;/td&gt;
&lt;td&gt;虚拟网卡捕获 IP 包（L3），然后交给 L7 的代理协议（如 Shadowsocks、Vmess、Trojan）处理。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;然后这个 &lt;a href=&quot;https://openwrt.org/toh/gl.inet/gl-mt3000&quot;&gt;gl-mt3000&lt;/a&gt; 在硬路由上性价比和社区名声不错，但单纯就软路由来说，并不算是性价比很好的选择，而是个妥协。既要天线2.4g+5g高频宽、usb-device + 2.5g wan口 接入等硬路由需求，又要openwrt supporting list &quot;榜上有名&quot;，还要有轻便小巧+售后兜底，那肯定是有代价的（&lt;/p&gt;
&lt;p&gt;友善系列可玩度高，但价格太抽象了，且仅能做软路由用途，不考虑（）而且我很 &lt;s&gt;实用主义&lt;/s&gt; 懒，着实不想在工作流外的事情上花太多时间，我没那么多闲空。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MediaTek MT7981BA&lt;/code&gt; 这个CPU作为arm平台，那转发处理肯定是性能远不如E5等便宜好用x86平台的，但没办法，我总不能为了个软路由在宿舍单独放个itx+ups堆箱 or 裸露开发板+线缆放在宿舍小的可怜的桌面上，那也太抽象了。&lt;/p&gt;
&lt;p&gt;这里鸣谢下 &lt;a href=&quot;https://moliyue.xyz/&quot;&gt;molinyue&lt;/a&gt; 。没有这位在网工上很厉害的朋友，面对软路由这个完全陌生的领域，我可能要自己摸索个少说三天往上（）时间高低得翻个四五倍不止（&lt;/p&gt;
&lt;h2&gt;过程&lt;/h2&gt;
&lt;h3&gt;前置部分&lt;/h3&gt;
&lt;p&gt;首先，我们需要明白的是，openwrt的本质就是linux，是个特化适配了路由器相关软硬件包的轻量&lt;code&gt;distro&lt;/code&gt;，因此您可以用您对macos（cli）和对linux常规distro共通的常识去对待它。把它当成一个比较好伺候的linux server即可。&lt;/p&gt;
&lt;p&gt;它的pack manager是&lt;code&gt;opkg&lt;/code&gt;，&lt;s&gt;听说不太好用&lt;/s&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh gl-mt3000.local || ssh 192.168.8.1 #出厂默认ipv4是这个  
cat /etc/openwrt_release
cd /etc/opkg
ls -la
cat distfeeds.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;如果您发现ssh出现问题，那大概率是&quot;host indentification has changed&quot;，清理下残留host记录就好&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm -f &quot;$HOME/.ssh/known_hosts&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果您配置过&lt;code&gt;.ssh/config&lt;/code&gt;，看到诸如&quot;permission error&quot;，那大概率是ssh配置文件的权限设置问题，openssh对此有着严格的安全要求，如果您是 macOS/linux 用户，那非常简单，只需如下，但如果是windows，umm请自行llm/Google&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod 600 ~/.ssh/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;给不太清楚这个config是做什么的萌新普及下，你可以理解成这是个openssh的配置文件，它是描述性的，而且日常用的话其实配起来很简单，可以省去每次输入完整ipv4以及ssh protocol断链的烦恼，以下为示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host *
    AddKeysToAgent yes       # 自动将密钥添加到 ssh-agent
    UseKeychain yes          # macOS 使用 Keychain 管理密码,其他os用户可忽略
    IdentityFile ~/.ssh/id_rsa  # 默认私钥存储文件
    ServerAliveInterval 60   # 每60s尝试一次相应，避免断链
    ServerAliveCountMax 5    # 服务器无响应时，5*60=300s后断链

Host gl-mt3000
    HostName 192.168.8.1     # ipv4
    User root								 # login user
    Port 22                  # ssh开放端口
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;code&gt;cat&lt;/code&gt;查看信息后，可以清楚的看到这个路由器出厂内置的就是openwrt的一个snapshot, 这点毫无疑问，其区别只是引入了厂商特调的ui和 opkg 源等部分。既然内核完善，具备openwrt luci，是linux且可被ssh，那事情将会变得非常简单&lt;/p&gt;
&lt;p&gt;首先摆在您面前的有三个选项 ：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接前往 &lt;a href=&quot;https://openwrt.org/toh/gl.inet/gl-mt3000&quot;&gt;openwrt supported device&lt;/a&gt; 下载&lt;strong&gt;Firmware OpenWrt Upgrade URL&lt;/strong&gt;(直接进openwrt的 luci ui-web 安装新固件)或者下载&lt;strong&gt;Firmware OpenWrt Install URL&lt;/strong&gt;(通过Uboot刷入安装固件)，两者没区别，前者方便的多&lt;/li&gt;
&lt;li&gt;前往 &lt;a href=&quot;https://site.istoreos.com/firmware/download?devicename=mt3000&quot;&gt;iStore&lt;/a&gt; 搜索您的设备型号 gl-mt3000 然后下载tar打包固件，然后同上的第一种安装新固件方式。关于iStore和openwrt的关系/区别请自行llm/Google。不过要说明的是iStoreOS的openwrt内核往往落后官方一些，比如这里是24&lt;/li&gt;
&lt;li&gt;自行下载openwrt提供的，包含编译源码ci流程的container，并使用docker或其他容器工具启动/部署，自行选择自己的平台/设备进行编译（）不过放心，gl-mt3000是“榜上有名”的受支持设备，一般不会碰上离谱问题&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./openwrt-compile-container1.png&quot; alt=&quot;container1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./openwrt-compile-container2.png&quot; alt=&quot;container2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我是实用主义者&lt;s&gt;懒狗&lt;/s&gt;，于是在经过多方征询实践经验&lt;s&gt;摇人&lt;/s&gt;后我选择2（&lt;/p&gt;
&lt;p&gt;然后就等待固件刷入就行，&lt;strong&gt;记得期间不要断路由器电，不碰它最好）&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;完善部分&lt;/h3&gt;
&lt;p&gt;好，那么现在您已经得到了纯的不能再纯的软路由了，您可为自己达成了世上99.99%的普通人都没做到的事感到由衷的自豪（？&lt;/p&gt;
&lt;p&gt;接下来就不算什么特别重要的事情了，只是一些诸如&lt;code&gt;openclash&lt;/code&gt;，镜像源配置，一些小坑的注意点等细枝末节，根据个人需求完善即可，本文只介绍我的 personal practice，不然一篇post写着实在太费力了（&lt;/p&gt;
&lt;p&gt;题外话：在 2025-10-18 更新本文上传图片时碰上了怪事，vercel部署的webapp url正常，被cf dns解析至vercel部署所在的域名则第一张图片加载失败。怪。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openclash&lt;/code&gt;的配置其实很简单，只是有几个可能需要留意的小坑。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在github下载ipk，并通过&lt;code&gt;scp&lt;/code&gt;上传至openwrt/iStore中的&lt;code&gt;/tmp&lt;/code&gt;缓存区（把它当linux server轻量服务器就好&lt;/li&gt;
&lt;li&gt;ssh，补齐作者readme中所写的依赖项，&lt;code&gt;opkg&lt;/code&gt;直装&lt;/li&gt;
&lt;li&gt;补齐openclash所需要的内核部分，clash、meta、verge，自选。这里有个要注意的地方就是关于内核安装，项目本身提供了三个镜像源和github url，但这四个有时都会因为网络问题要么不行要么curl下一半断掉。这时您可以多试几次&lt;s&gt;大力出奇迹&lt;/s&gt;，或者干脆去github源址下完内核，然后同理scp上传，并安装至openclash内&lt;/li&gt;
&lt;li&gt;余下就是subscribe file，自动生成代理组/策略组config，然后享受您的软路由了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;btw，arm平台的软路由确实存在转发能力瓶颈的问题。能用，但有时反应有点慢（tcp握手过程&lt;/p&gt;
&lt;h3&gt;2025-10-25 17:15&lt;/h3&gt;
&lt;p&gt;补充碰上的小问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[/tmp/clash_latest_version] Download failed: [curl xxxxx]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;具体表现为日志里不断滚出此报错，且无法正常测速代理文件内的各个节点&lt;/p&gt;
&lt;p&gt;判断为疑似dns问题&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh
vim /etc/resolv.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后发现其中包含字段如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;search lan
namerserver 127.0.0.1
nameserver ::1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这玩意一看就不太对劲。。。尝试改为阿里的dns&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;search lan
nameserver 223.5.5.5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;问题解决。&lt;/p&gt;
&lt;h3&gt;2025-12-9 16:30&lt;/h3&gt;
&lt;p&gt;首先arm平台存在同价格同功率下低人一等的劣势，软路由用户层转发上先天不足&lt;/p&gt;
&lt;p&gt;其次当用它做wifi中继时，我感觉在无线扫描和接口转发配置上经受了莫大的折磨。这似乎和iStoreOS对MT3000的无线固件适配存在一些问题，在更替接口配置时，会出现无法激活/关联无线的窘境（（（&lt;/p&gt;
&lt;p&gt;不得不承认，特供有特供的道理（（（&lt;/p&gt;
&lt;p&gt;赤了半下午史，发现纯硬路由还是原厂特供的openwrt固件好用（  istore对天线的激活本来就有毛病，死磕不明智&lt;/p&gt;
&lt;p&gt;引用某前辈的话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（不用管，这些就是能 work 就行&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>常见命名范式</title><link>https://mias.moe/posts/naming-spec/</link><guid isPermaLink="true">https://mias.moe/posts/naming-spec/</guid><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;现代项目常见命名范式&lt;/h2&gt;
&lt;p&gt;我相信不少萌新在接触完整项目时，会发现在代码中各个元素的命名都是有规律、成体系的。它们有规律，而且很简单。&lt;/p&gt;
&lt;p&gt;规范范式的命名很重要，在社区/商企的实际项目中，遵循统一的命名规范可以极大地提高代码的可读性和可维护性。“统一度量衡” ，这是连秦始皇都明白的道理。只有组成的零部件在互通上不成障碍，才能加速主干部分的发展。&lt;/p&gt;
&lt;p&gt;不同的命名法有各自的特点和常见的应用场景，通常在不同的编程语言或代码元素（如变量、函数、类）中会有所偏好，下表将对此大致介绍。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命名规范&lt;/th&gt;
&lt;th&gt;格式&lt;/th&gt;
&lt;th&gt;主要应用对象&lt;/th&gt;
&lt;th&gt;常用语言/场景&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lowerCamelCase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;myVariableName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;变量、函数、方法&lt;/td&gt;
&lt;td&gt;Java, JavaScript, C#, C++&lt;/td&gt;
&lt;td&gt;&lt;code&gt;userName&lt;/code&gt;, &lt;code&gt;calculateTotal&lt;/code&gt;, &lt;code&gt;getUserInfo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UpperCamelCase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MyClassName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;类、接口、组件、构造函数&lt;/td&gt;
&lt;td&gt;Java, C#, Python, JavaScript (用于类)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UserProfile&lt;/code&gt;, &lt;code&gt;ServiceManager&lt;/code&gt;, &lt;code&gt;HttpRequest&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;snake_case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;my_variable_name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;变量、函数、文件名、数据库字段&lt;/td&gt;
&lt;td&gt;Python, Ruby, C/C++ 标准库, SQL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_name&lt;/code&gt;, &lt;code&gt;calculate_total&lt;/code&gt;, &lt;code&gt;first_name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SCREAMING_SNAKE_CASE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MY_CONSTANT_NAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常量、全局配置&lt;/td&gt;
&lt;td&gt;Java, Python, PHP 等多种语言&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MAX_CONNECTIONS&lt;/code&gt;, &lt;code&gt;API_KEY&lt;/code&gt;, &lt;code&gt;DEFAULT_TIMEOUT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;kebab-case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;my-variable-name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CSS 类名、HTML 属性、URL 路径、文件名&lt;/td&gt;
&lt;td&gt;CSS, HTML, Lisp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main-container&lt;/code&gt;, &lt;code&gt;user-profile-card&lt;/code&gt;, &lt;code&gt;primary-button&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>一条 SE 自学之路</title><link>https://mias.moe/posts/path-for-se-learning/</link><guid isPermaLink="true">https://mias.moe/posts/path-for-se-learning/</guid><description>平庸者的咏叹调</description><pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;最最普通的自学之路/心路&lt;/h1&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在此致敬湊老师的 &lt;a href=&quot;https://asukaminato.notion.site/CS-4b9f59acd3a64bf8916f834d0c7f25ea#f4345eee71bc4f69bf6e3c307c448613&quot;&gt;一条CS自学之路&lt;/a&gt; ,给了一开始小小的我大大的启蒙，虽然那时候因为混淆我期望的道路，因而导致花了很多时间走歪路，但那是我的问题不是湊老师那篇文章的www。我是个很普通很平庸的人，因此我很清楚，90%的萌新都会极度的缺少&quot;常识&quot;。我看过很多被推荐的blog, article, turorial，看到了那宛若繁星难以理清的概念和技术，见到了那大大的、难以触及的世界。我相信很多其他真正想走在这条路上的人都会有着难以下手的错乱和矛盾感。&lt;/p&gt;
&lt;p&gt;在这篇文章中，我将以我，一个平庸者的视角，向您拉开计算机那难以透过的帷幕。&lt;/p&gt;
&lt;h2&gt;误区&lt;/h2&gt;
&lt;p&gt;在现代社会里，包括曾经的小萌新时期的我在内，很多人会混淆计算机的各个方向，对这个巨大的世界认知往往模糊不清，认为一个人能完成整套业务需求、做web的一定会写数学算法、做理论的一定能写好项目代码等等，这些都是由于认知高度和信息来源极度匮乏、没有清晰教育和&quot;隔行如隔山&quot;等造成的结果。&lt;/p&gt;
&lt;p&gt;首先，在学习开始前，您需要清晰的思考和认知到，自己希望走的道路是什么样的&lt;/p&gt;
&lt;p&gt;在现代-2025年，以我个人的视角大致可以将除了硬件之外的，您目之所及的软&quot;计算机&quot;分为两大类：&lt;code&gt;CS&lt;/code&gt;和&lt;code&gt;SE&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;一、计算机科学（Computer Science, CS）&lt;/h2&gt;
&lt;p&gt;计算机科学的核心目标是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;研究“计算”本身的本质与规律。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它更偏理论、底层和抽象，强调“为什么能工作”,“如何更快/更优地计算”等。&lt;/p&gt;
&lt;p&gt;主流研究与应用方向（从理论到系统）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层次&lt;/th&gt;
&lt;th&gt;方向&lt;/th&gt;
&lt;th&gt;包括&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;理论层&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;计算理论（Theory of Computation）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;研究可计算性、复杂度、NP问题、图灵机模型。属于CS最理论的分支。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;算法与数据结构（Algorithms &amp;amp; Data Structures）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;研究高效求解问题的算法设计与分析。ICPC核心内容。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;数理逻辑与离散数学&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;支撑算法、语言理论、形式化验证等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;系统层&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;操作系统（Operating Systems）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;研究进程管理、内存管理、调度机制。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;编译原理（Compiler Design）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;研究语言解析、优化、中间代码生成。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;计算机体系结构（Computer Architecture）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;研究CPU结构、并行计算、硬件抽象。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;数据库系统（Database Systems）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;探讨存储结构、事务、索引、分布式一致性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;网络与分布式系统（Networking &amp;amp; Distributed Systems）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;涉及协议、容错、共识算法、P2P架构。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;智能层&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;人工智能与机器学习（AI &amp;amp; ML）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;研究计算学习理论、深度神经网络、强化学习。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;自然语言处理（NLP）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;模型语言、语义理解、对话系统。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;计算机视觉（CV）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;图像识别、视频理解、生成模型。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;量子计算、密码学、安全理论&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数学逻辑、计算复杂度与安全算法。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果您完整的在CS的道路上走下去，您大概率会走在这些方向上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;算法工程师（Algorithm Engineer）&lt;/li&gt;
&lt;li&gt;系统工程师（OS、Compiler、Kernel、Network）&lt;/li&gt;
&lt;li&gt;研究员 / 博士（AI/LLM、理论计算、复杂度分析）&lt;/li&gt;
&lt;li&gt;安全专家 / 密码分析师&lt;/li&gt;
&lt;li&gt;数据科学/分析、机器学习&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们几乎都是&lt;strong&gt;理论&lt;/strong&gt;性、&lt;strong&gt;抽象&lt;/strong&gt;性、研究导向、底层性的&lt;/p&gt;
&lt;p&gt;如果您希望走的是这条路上的内容，我推荐您看一位对我启蒙很大的恩师的&lt;a href=&quot;https://asukaminato.notion.site/CS-4b9f59acd3a64bf8916f834d0c7f25ea#f4345eee71bc4f69bf6e3c307c448613&quot;&gt;文章(点此)&lt;/a&gt; ,我对CS只有系统层稍微了解些，因为SE会不可避免的触及到“本质”&lt;/p&gt;
&lt;h2&gt;二、软件工程（Software Engineering, SE）&lt;/h2&gt;
&lt;p&gt;软件工程的核心目标是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;研究“如何高效地构建、维护、迭代和交付大型软件系统”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它更偏实践、系统、工程与协作，强调“让系统能运行、能扩展、能维护”。&lt;/p&gt;
&lt;p&gt;主流研究与应用方向（从架构到管理）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层次&lt;/th&gt;
&lt;th&gt;方向&lt;/th&gt;
&lt;th&gt;包括&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;开发层&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;前端开发（Frontend Engineering）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web、移动端、UI/UX、React、Vue、Flutter 等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;后端开发（Backend Engineering）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;业务逻辑、数据库、API设计、微服务、Spring Boot、Gin、Flask 等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;全栈开发（Full-stack）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;同时承担前后端。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;架构层&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;软件架构（Software Architecture）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MVC、微服务、DDD、分层架构、消息队列等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;系统设计（System Design）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;大规模系统、高并发、负载均衡、缓存一致性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;云计算与容器化（Cloud/DevOps）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker、Kubernetes、CI/CD、监控、部署自动化。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;质量层&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;测试与质量保证（QA / Testing）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;单元测试、自动化测试、集成测试。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;软件维护与重构（Refactoring）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;管理技术债、重构架构、版本控制（Git）。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;管理层&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;项目管理（Project Management）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;敏捷开发、Scrum、Kanban、需求分析。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;团队协作与工程文化（Engineering Culture）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code Review、文档、规范、可维护性。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果您完整的在SE这条路上走下去，您大概率会走在这些方向上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前端 / 后端 / 全栈工程师&lt;/li&gt;
&lt;li&gt;软件架构师（Software Architect）&lt;/li&gt;
&lt;li&gt;DevOps / SRE（Site Reliability Engineer）&lt;/li&gt;
&lt;li&gt;测试工程师 / QA&lt;/li&gt;
&lt;li&gt;项目经理（PM）&lt;/li&gt;
&lt;li&gt;系统分析师（System Analyst）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们多数都是&lt;strong&gt;工程&lt;/strong&gt;性、系统性、协作性、&lt;strong&gt;落地&lt;/strong&gt;性的。&lt;/p&gt;
&lt;p&gt;一言以蔽之：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;计算机科学(CS)&lt;/strong&gt; 研究“计算的规律与底层机制”&amp;lt;br&amp;gt;
&lt;strong&gt;软件工程(SE)&lt;/strong&gt; 研究“如何得到可靠、可维护、可用的产品”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;只有理清了您想做什么，您才能形成清晰的认知然后找到学习的路线，并极大化减少自己方向外的，不需要的庞大知识树。当然，CS需要部分SE，SE也需要部分CS，这点在之后您都会慢慢接触到。&lt;/p&gt;
&lt;p&gt;当时候到了，您自然而然就会接触到您需要的内容。&lt;/p&gt;
&lt;p&gt;如果您也和我一样打算走engineer方向，那应该把重心放在自己需要的知识树和实践上。&lt;/p&gt;
&lt;p&gt;未完待续...&lt;/p&gt;
</content:encoded></item><item><title>小萌新装大系统的奇遇记</title><link>https://mias.moe/posts/install-linux-in-laptop/</link><guid isPermaLink="true">https://mias.moe/posts/install-linux-in-laptop/</guid><pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;这是篇关于我为什么如今选择使用&lt;code&gt;Kubuntu&lt;/code&gt;，以及期间一些经历和解决方案的文章&lt;/p&gt;
&lt;p&gt;我不喜欢windows，当然我也不是那种在desktop上堆一堆folder，连&lt;code&gt;brew&lt;/code&gt;包管理和shell都不会用的果粉。&lt;/p&gt;
&lt;p&gt;Windows遮掩了很多东西，过度的gui，冗余的组件，难堪其用的权限分配和目录树，见鬼一样的sh &lt;code&gt;env&lt;/code&gt;等等都是我不用它干活的理由。您会不得不需要大量的&lt;code&gt;虚拟化环境&lt;/code&gt;，啥都整合的&lt;code&gt;IDE&lt;/code&gt;，以及大量的兼容性，版本管理问题。&lt;/p&gt;
&lt;p&gt;那破目录树简直是什么考古垃圾堆...&lt;code&gt;Program Files&lt;/code&gt;、&lt;code&gt;Program Files (x86)&lt;/code&gt;、&lt;code&gt;AppData&lt;/code&gt;、&lt;code&gt;System32&lt;/code&gt;，再加上点盘符和反直觉路径名...一个库装完是要在四五个路径里找残骸的。后台进程是要抢IO的。cli tool是东拼西凑的。包管理&lt;code&gt;winget&lt;/code&gt;、&lt;code&gt;choco&lt;/code&gt;、&lt;code&gt;scoop&lt;/code&gt;是三国割据的。脚本好像还互不兼容🤔？权限分配(UAC)像是大陆的学校门卫——平时谁都随便过，一旦你想干点大的，立刻把门锁死装眼瞎耳聋的（&lt;/p&gt;
&lt;p&gt;PATH更神秘。用户级、系统级、session级，左右脑互搏各管各的，解析展开和合并生效也模糊不清。python装几遍、node装几遍，语言包管理和被管理主体永远指向不同版本。最后一看生效path和link，后宫宫斗这一块。&lt;/p&gt;
&lt;p&gt;最后还有最爱的&lt;strong&gt;遮羞布&lt;/strong&gt;：&lt;code&gt;GUI&lt;/code&gt;。点开N层窗口才能找到真正的配置选项。日志散在十几个角落，想看端口还得&lt;code&gt;netstat&lt;/code&gt;。这不是在开发，是在做考古。这些“外壳”都掩盖了DEV需要的透明度。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;它不希望你理解它，只希望你别碰它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;Windows&lt;/code&gt;像是个被强行封装的黑盒系统，它允许你&apos;&apos;运行程序&apos;&apos;，却不鼓励乃至阻碍你&quot;理解系统&quot;。一言以蔽之：&lt;strong&gt;Windows很适合日常消费者民用，但不适合多数触及本质的开发&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以及：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;wsl2有着众所周知的跨文件系统极其拉垮的读写性能&lt;/li&gt;
&lt;li&gt;vmware有着神秘非常的网络配置问题&lt;/li&gt;
&lt;li&gt;hyper-v的网桥数次让我Windows主体的&lt;code&gt;DE&lt;/code&gt;崩溃。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我是个高度的实用主义者，我不在乎是&lt;code&gt;MacOS&lt;/code&gt;还是&lt;code&gt;Linux&lt;/code&gt;的哪个distro，方便好用就行。当然，如果您是做基架/计算机科学向(理论算法除外)的，那需要额外的考量。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;安装 - 1. Arch Linux&lt;/h2&gt;
&lt;h3&gt;背景&lt;/h3&gt;
&lt;p&gt;我想您曾在数次在各个社区/info上看到这句 &quot;&lt;s&gt;btw, i use arch&lt;/s&gt;&quot;&lt;/p&gt;
&lt;p&gt;Hey,bro,我想其中还有不少使用来自东方的二次元纸片小人，其中又有不少背景是彩虹或🍥（）&lt;/p&gt;
&lt;p&gt;不可否认的是，&lt;code&gt;Arch wiki&lt;/code&gt;在如今社区处理问题的便携性(对比以前)上可谓功不可没，such as:你在&lt;code&gt;debian&lt;/code&gt;/&lt;code&gt;ubuntu&lt;/code&gt;/&lt;code&gt;open suse(Tumbleweed)&lt;/code&gt;等其他distro上碰上nvidia或者其他毛病，搜出来往往google SEO榜首是&lt;code&gt;Arch wiki&lt;/code&gt;的某篇post ( ) 它写下了从零构建整个现代gnu/linux您所需要的近乎一切，看不懂/不会看是您的问题，不是它的（笑&lt;/p&gt;
&lt;p&gt;但就我个人平心而论，我真不觉得complete newcomer用Arch是啥好主意，您会以至少6t/h的速率去高频骚扰agnet/llm，然后又使用更多的时间去问询关于linux基础架构和底层实现的知识，您会淹没在庞杂的command里，延伸出十几个、几十个、近百个问题及其分支中。不是每个人都做计算机科学的系统层方向，也不是所有人都会在乎哪个犄角旮旯的包是崩溃的罪魁祸首。您修/问等折腾的时间将会远远超过您在特定环境下完成期望的工作/学习的时间，请牢记：&lt;strong&gt;You are just a newcomer,not long-term open-source contributor or scientist.&lt;/strong&gt; &amp;lt;span id=&quot;self-awareness&quot;&amp;gt;很多知识/技能不是您当下该学的，您也学不会，就算学会也要花费很多不值得的时间精力。&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;p&gt;时间到了，您自然会需要，会根据自己的需求接触到。&lt;/p&gt;
&lt;h3&gt;过程&lt;/h3&gt;
&lt;p&gt;我使用&lt;code&gt;Ventory&lt;/code&gt;来创建&lt;code&gt;bootable USB drive&lt;/code&gt;，u盘是Samsung 64g的闪存盘，我喜欢稳定和适量的冗余余地，同时我对镜像损坏和盘读写锁死有阴影。同样，因为我实用主义&lt;s&gt;懒&lt;/s&gt;。这个工具创建&lt;code&gt;USB driver&lt;/code&gt;可以同时放入多个镜像文件，而且只需要把iso拖入进存储分区就行，不需要反复formant，而且除了&lt;code&gt;UEFI&lt;/code&gt;外的存文件的分区可以当作正常u盘来放文件，我可不想买个u盘只能当安装介质。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;screen_uefi.png&quot; alt=&quot;UEFI&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我使用&lt;code&gt;archinstall&lt;/code&gt;来安装，这是一个helper library，很多人抱怨它不能手动分区（这一点其实新版的镜像附带的&lt;code&gt;archinstall&lt;/code&gt;已经解决了）以及失去了手动学习arch的机会。但我不在乎这个，我只想有个合适的工作环境。&lt;s&gt;&lt;strong&gt;工具做出来就是给人用的嘛。&lt;/strong&gt;&lt;/s&gt; 不过当然了，以后有机会/空闲时我会&quot;朝圣&quot;一番拜读纯手工安装的arch wiki的，但现在不是时候。然后就是非常固定的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;进入&lt;code&gt;bios&lt;/code&gt;，关闭&lt;code&gt;Secure Boot&lt;/code&gt;(安全启动)，调整efi顺序为ventory优先&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;联网和配置临时代理:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export http_proxy=&quot;http://proxy-host-address:proxy-lan-port&quot;
export https_proxy=&quot;$http_proxy&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入&lt;code&gt;archlive&lt;/code&gt;， &lt;code&gt;pacman -Sy archinstall&lt;/code&gt;更新&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;archinstall&lt;/code&gt;，然后把它要求您必填的字段全处理好，包括Partition，Time zone，镜像下载来源，nvidia driver，root/user账密等等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入kde后，再次配置临时代理，安装yay，字体，fx5 input source，&lt;code&gt;fish shell&lt;/code&gt;，您喜欢的proxy cli/gui&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::tip
这里有个小坑，一些游戏本会在新live环境自动启动飞行模式以禁用网卡，造成您在iwconfig时看不到网卡存在，您只需要用键盘的Fn key关闭飞行模式即可&amp;lt;br&amp;gt;
强烈建议您用rj45网线链接路由器lan口，然后用手机clash系代理app进行LAN Proxy，以最大化减少不必要的麻烦
:::&lt;/p&gt;
&lt;p&gt;:::warning
请给&lt;code&gt;/&lt;/code&gt;和&lt;code&gt;/root&lt;/code&gt;划入不同的分区，便于您后续修&lt;code&gt;/root&lt;/code&gt;时保留自己的用户数据&amp;lt;br&amp;gt;
请务必选择nvidia的闭源专有驱动，以及在这之后禁用自带的nouveau开源驱动（让你看个亮的）
:::&lt;/p&gt;
&lt;p&gt;至此主体安装以及结束了，但剩下的细枝末节实在是难以数尽，包括但不限于:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;部分app window在&lt;code&gt;Wayland&lt;/code&gt;下字体渲染模糊&lt;/li&gt;
&lt;li&gt;内置网卡上下行速率奇慢无比(树外驱动)，&lt;s&gt;这里特指联发科某些偏门/邪门玩意&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;nvidia睡死，桌面环境渲染输出崩溃&lt;/li&gt;
&lt;li&gt;明明支持&lt;code&gt;Wayland&lt;/code&gt;但默认不启用，查arch wiki：u need add the flag &lt;code&gt;--ozone-platform-hint=auto --enable-wayland-ime &lt;/code&gt;to the launch file for Chrome (often located in &lt;code&gt;/usr/share/applications/google-chrome.desktop&lt;/code&gt; ) &lt;a href=&quot;https://wiki.archlinux.org/title/Chromium#2.9:~:text=Xwayland%2Drelated%20crashes.-,Native%20Wayland%20support,-Chromium%20140%20supports&quot;&gt;&lt;strong&gt;Native Wayland support&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;滚挂（设置下timeshort在每次-Syu之前备份快照，其实修起来还好）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是乎，我放弃arch了。因为 &amp;lt;a href=&quot;#self-awareness&quot;&amp;gt;上文所提&amp;lt;/a&amp;gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;安装 - 2. Kubuntu&lt;/h2&gt;
&lt;h3&gt;背景&lt;/h3&gt;
&lt;p&gt;在被Arch拷打半个月后，感觉自己的的怒气值和跟llm间的亲密度，尤其是日用期间修问题时与日俱增😡(这也可能与我双硬盘双系统设备本身有关)，因而转头被&lt;code&gt;Kubuntu&lt;/code&gt;捞走了。一开始其实期望是&lt;code&gt;open suse&lt;/code&gt;，但我对ubuntu这边的包管理熟悉度好些(以前用&lt;code&gt;Kali&lt;/code&gt;的)。契机：暑假时偶然认识到了一位叫做 &lt;a href=&quot;https://github.com/Glavo&quot;&gt;Glavo&lt;/a&gt; 的猫猫，得知其居然是大名鼎鼎的 &lt;a href=&quot;https://github.com/HMCL-dev/HMCL&quot;&gt;HMCL&lt;/a&gt; 的唯一maintainer以及 &lt;a href=&quot;https://github.com/plctlab&quot;&gt;PLCT&lt;/a&gt; 的疑似lv5前辈，感到十分震惊。看了几天他在bili上的日常issue、code、pr&amp;amp;merge以及我最头大的config env都是在&lt;code&gt;Kubuntu 24LTS&lt;/code&gt;下进行。几日观察+和群u聊天提问后选择了这个distro，因为——它真的很懒。&lt;/p&gt;
&lt;h3&gt;过程&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&amp;lt;u&amp;gt;遭罪，非常的遭罪。&amp;lt;/u&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我一开始为了图更新的包而选择了&lt;em&gt;Latest&lt;/em&gt;而不是&lt;em&gt;&lt;strong&gt;LTS&lt;/strong&gt;&lt;/em&gt;，相信我，这简直是赛博酷刑。&lt;/p&gt;
&lt;p&gt;我的所有config都是接近最优最简解的&lt;strong&gt;Best Practice&lt;/strong&gt;，和Arch以及多数distro类似的前置配置，config proxy，apt update&amp;amp;upgrade，然后最恶心的来了: &lt;code&gt;ubuntu-drivers&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个cli本身没有任何问题，它同时也是被社区共同认可/设计的、面对 &lt;em&gt;&quot;Which proprietary graphics driver to install?&quot;&lt;/em&gt; 时的Best Practice，详情可见&lt;a href=&quot;https://askubuntu.com/questions/543325/how-to-download-all-required-ubuntu-drivers&quot;&gt;Community&lt;/a&gt;。可以说你压根不用动脑子，直接:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ubuntu-drivers install   
sudo reboot   
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可解君愁。&lt;s&gt;一开始我就是如此相信的（&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;但直到我花了整整八次去重装并输出内核报错结果以及显卡硬件信息反馈后我发现：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Best practice is NOT ALWAYS the BEST (&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我用了2次尝试在best practice下查明问题所在和发生了什么：情况一. 网卡部分内核级崩溃，别说无线，连rj45有线网卡，usb网卡都不识别。 情况二. Nvidia经典一睡不醒，这是安装过程中的随机事件，但我日志看了半天看不明白为什么发生。控制变量完全一致。但如果您使用了大陆高校/大厂镜像源的话可能性疑似更大&lt;/p&gt;
&lt;p&gt;然后用了5次尝试了所有&lt;code&gt;sudo ubuntu-drivers devices&lt;/code&gt;下的所有drivers，open kernel的，proprietary的，新的老的全试了一遍，最后得到结论：在我的设备环境下(CPU：amd R9-7945HX，GPU：RTX 4060 Laptop，Wireless LAN Card：&lt;strong&gt;&amp;lt;u&amp;gt;MediaTek Wi-Fi 6E MT7922 (&lt;em&gt;RZ616&lt;/em&gt;)&amp;lt;/u&amp;gt;&lt;/strong&gt; ，Lenovo R900P 2024)，安装&lt;code&gt;Kubuntu latest&lt;/code&gt;（KDE 6.x , Wayland）将会100%复现情况一，概率复现情况二。且reddit社区对联发科(MediaTek)的这位邪门网卡驱动表现可谓&lt;a href=&quot;https://www.reddit.com/r/MSI_Gaming/comments/1bbq600/amd_wifi_rz616_mediatek_crappy_wifi_drivers/&quot;&gt;骂声一片&lt;/a&gt;, linux上&lt;a href=&quot;https://www.reddit.com/r/linuxquestions/comments/1n17dhs/slow_and_unstable_wifi_on_mediatek_rz616_mt7922/&quot;&gt;同样&lt;/a&gt;, 感兴趣可自行goggle search下这位神秘网卡。&lt;/p&gt;
&lt;p&gt;然后红温了，直接照搬Glavo&lt;s&gt;猫猫大人&lt;/s&gt;的配置，成为究极懒狗。1. &lt;code&gt;Kubuntu 24LTS&lt;/code&gt; 2. &lt;code&gt;sudo ubuntu-drivers install&lt;/code&gt; 3. Install &lt;code&gt;fish shell&lt;/code&gt;, 啥都不改，&lt;code&gt;WM&lt;/code&gt;也是24LTS的&lt;code&gt;X11&lt;/code&gt;，&lt;code&gt;DE&lt;/code&gt;也是default &lt;code&gt;KDE 5.x&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;然后过上了幸福的日子，解决了我近乎一切烦恼，除了💩的 &lt;strong&gt;&amp;lt;u&amp;gt;MediaTek Wi-Fi 6E MT7922 (&lt;em&gt;RZ616&lt;/em&gt;)&amp;lt;/u&amp;gt;&lt;/strong&gt; ，它在linux下的速率和信号接收仍然是依托答辩，不负它在社区的显赫骂名（&lt;/p&gt;
&lt;p&gt;后续：我又重装了两三次确认，在24LTS下无论装那种devices optional下的Nvidia drivers，都没有出现任何问题。&lt;/p&gt;
</content:encoded></item></channel></rss>