OpenWrt 从上级路由0段访问本机1段路由配置
### 一、场景与地址 OpenWrt 作为二级路由： - WAN 口接上级路由/网络： "192.168.0.136" - LAN 网段： "192.168.2.1/24" - 上级网段： "192.168.0.0/24" 目标： - 在"192.168.0.x" 设备访问 OpenWrt 管理页： "http://192.168.0.136" - 可选访问下级 LAN： "192.168.2.x" - 需要防火墙、uhttpd、上级静态路由配合。 推荐访问地址： http://192.168.0.136 ### 二、OpenWrt 防火墙规则 在 LuCI：网络 → 防火墙 → 通信规则/流量规则。 规则 1：允许上级访问 OpenWrt 本机 LuCI 名称："allow-wan-to-local" 名称任意，可识别即可 - 源区域：wan - 源地址： "192.168.0.0/24" - 目标区域：设备/本机/INPUT，即"此设备" - 协议：TCP - 目标端口："80,443" - 操作：接受 说明：让 "192.168.0.0/24" 访问 OpenWrt 本机 Web 管理，端口可以选择 任意 或特定端口。 规则 2：允许上级访问下级 LAN 名称："allow-wan-to-lan" 名称做任意可识别即可 - 源区域：wan - 源地址："192.168.0.0/24" - 源端口：任意 - 目标区域：lan - 目标地址："192.168.2.0/24" - 目标端口：任意 - 操作：接受 说明：这是转发规则，让 "192.168.0.0/24" 访问 "192.168.2.0/24"。 保存并应用 ### 三、uhttpd 配置 检查/设置 uhttpd 监听和 RFC1918 过滤。 SSH连接找到uhttpd配置文件所在位置，默认/etc/config/uhttpd配置文件直接修改或用命令修改： uci set uhttpd.main.rfc1918_filter='0' uci commit uhttpd /etc/init.d/uhttpd restart /etc/init.d/rpcd restart 确认监听： netstat -lntp | grep -E ':80|:443' 应看到类似： 0.0.0.0:80 0.0.0.0:443 关键： "rfc1918_filter" 必须为 "0"，否则来自 "192.168.0.x" 的私有地址访问 LuCI 会被拒绝。 ### 四、上级路由静态路由 以 TP-LINK 为例：路由设置 → 静态路由。 项目 值 规则名称 to-192.168.2.0 目的地址 "192.168.2.0" 子网掩码 "255.255.255.0" 下一跳 "192.168.0.136" 出接口 LAN 状态 开启 作用：告诉上级路由， "192.168.2.0/24" 交给 OpenWrt WAN 口 "192.168.0.136"。 ### 五、Windows / 上级网络验证 PowerShell： ping 192.168.0.136 ping 192.168.2.1 Test-NetConnection 192.168.0.136 -Port 80 Test-NetConnection 192.168.2.1 -Port 80 浏览器无痕访问： http://192.168.0.136 访问方式总结： 目标 地址 说明 OpenWrt 管理页 "http://192.168.0.136" 推荐 OpenWrt 管理页 "http://192.168.2.1" 需路由+转发规则 下级 LAN 设备 "192.168.2.x" 需上级静态路由+OpenWrt 转发规则 ### 六、排错速查 现象 可能原因 处理 ping 通，Web 拒绝/无法访问 "uhttpd rfc1918_filter=1" 设为 "0"，重启 uhttpd/rpcd 连接超时 防火墙未放通到"此设备" 检查规则 1，协议 TCP，端口 80,443 能开 "192.168.0.136"，不能访问 "192.168.2.x" 上级无静态路由或 OpenWrt 转发规则缺失 补静态路由/转发规则 浏览器跳转/缓存异常 缓存或之前会话 无痕窗口，清缓存 SSH "client_loop: send disconnect" 空闲/路由切换 重连即可 规则配置了不生效 未保存并应用 保存应用，或 "/etc/init.d/firewall restart" ### 七、应急回退 恢复为仅 LAN 侧管理： LuCI 中删除两条通信规则： - "allow-wan-to-local" / "to-localdevice" - "allow-wan-to-lan" / "to-192.168.0.0" OpenWrt SSH： uci set uhttpd.main.rfc1918_filter='1' uci commit uhttpd /etc/init.d/uhttpd restart /etc/init.d/firewall restart 上级 TP-LINK/路由器删除静态路由条目 "to-192.168.2.0"。 ### 八、最终确认配置摘要 - OpenWrt WAN： "192.168.0.136" - OpenWrt LAN： "192.168.2.1" - 防火墙： - wan "192.168.0.0/24" → 此设备，TCP 80,443，接受 - wan "192.168.0.0/24" → lan "192.168.2.0/24"，接受 - uhttpd： - 监听 "0.0.0.0:80" / "0.0.0.0:443" - "rfc1918_filter=0" - 上级路由静态路由： - 目的 "192.168.2.0/24" → 下一跳 "192.168.0.136" - 访问： "http://192.168.0.136"
Claude Code 写代码 Agent 完整逻辑分析，学习顶级公司的agent设计思路
> 基于本仓库源码梳理。Claude Code 的核心范式是：**LLM + 工具循环（Agentic Loop）**。宿主不做独立的“需求 NLU / 代码 AST 分析器”，而是通过 System Prompt、上下文注入、工具执行与上下文压缩，让 Claude 模型自主完成理解、探索、写码与验证。 --- ## 1. 总览：一句话架构 ``` 用户输入 → processUserInput（解析 / 斜杠命令 / 附件） → 组装 System Prompt + CLAUDE.md + git 上下文 + 记忆 → queryLoop（无限循环） → 压缩上下文 → 流式调用 Anthropic Messages API → 若有 tool_use → 执行工具 → 把 tool_result 写回 messages → 继续下一轮 → 无 tool_use 时结束本轮，回复用户 ``` **代码如何“准确”落盘**：模型通过 Grep/Glob/Read 先读真实文件，再用 FileEdit（精确字符串替换）或 FileWrite 写入；工具层强制「先读后写」、校验 `old_string` 唯一匹配；可选 Plan Mode、AskUserQuestion、Verification 子代理进一步提高正确性。 --- ## 2. 关键文件地图 | 路径 | 职责 | |------|------| | `entrypoints/cli.tsx` | CLI 引导入口 | | `main.tsx` | Commander 主程序：会话、REPL / print 模式 | | `screens/REPL.tsx` | 交互 TUI：`onQuery` → `query()` | | `utils/handlePromptSubmit.ts` | 用户回车后的提交编排 | | `utils/processUserInput/processUserInput.ts` | 输入解析：斜杠命令 / 文本 / bash / 图片 | | `QueryEngine.ts` | SDK / 无头会话：`submitMessage()` | | **`query.ts`** | **Agent 主循环** `query()` / `queryLoop()` | | `constants/prompts.ts` | 默认 System Prompt 组装 | | `utils/systemPrompt.ts` | System Prompt 优先级（override / agent / custom / default） | | `utils/queryContext.ts` | `fetchSystemPromptParts`：system + userContext + systemContext | | `context.ts` | `getUserContext`（CLAUDE.md）/ `getSystemContext`（git status） | | `Tool.ts` / `tools.ts` | 工具类型与注册表 | | `services/tools/toolOrchestration.ts` | `runTools()`：并发 / 串行执行 | | `services/tools/toolExecution.ts` | 单工具权限 + 调用 | | `services/tools/StreamingToolExecutor.ts` | 流式边收边执行工具 | | `services/api/claude.ts` | `queryModelWithStreaming`：Anthropic API | | `services/compact/*` | micro / auto / reactive / snip 压缩 | | `memdir/*` | 长期记忆目录、MEMORY.md、相关记忆检索 | | `utils/attachments.ts` | 附件注入（记忆、IDE 选区、@文件等） | | `tools/{Grep,Glob,FileRead,FileEdit,Bash,Agent}Tool/` | 探索与改码工具 | | `utils/sessionStorage.ts` | 会话 transcript 持久化 / resume | --- ## 3. 端到端流程（用户输入 → 代码输出） ```mermaid flowchart TD A[用户输入 / SDK prompt] --> B[handlePromptSubmit / QueryEngine.submitMessage] B --> C[processUserInput] C -->|斜杠命令本地处理| C1[不进入 query 或带特殊副作用] C -->|普通 prompt| D[创建 UserMessage + Attachments] D --> E[组装 SystemPrompt + userContext + systemContext] E --> F[query / queryLoop while true] F --> G[上下文预处理: budget / snip / microcompact / autocompact] G --> H[callModel = queryModelWithStreaming] H --> I{assistant 含 tool_use?} I -->|否| J[stop hooks / token budget / 结束本轮] I -->|是| K[runTools / StreamingToolExecutor] K --> L[权限 canUseTool → tool.call] L --> M[tool_result 用户消息 + attachments] M --> N[messages = 旧消息 + assistant + toolResults] N --> F J --> O[UI 显示文本 / 文件已由 Edit/Write 落盘] ``` ### 3.1 入口 - **交互模式**：`cli.tsx` → `main.tsx` → Ink `REPL` → 回车 → `handlePromptSubmit` → `onQuery` → `query()` - **SDK / 无头**：`QueryEngine.submitMessage()` → `processUserInput` → `query()` ### 3.2 用户输入处理（`processUserInput`） 1. 识别 `/slash` 斜杠命令、bash 模式、粘贴图片、`@` 提及 2. 执行 `UserPromptSubmit` hooks（可拦截） 3. 生成 `UserMessage` 4. 通过 `getAttachmentMessages` 注入： - IDE 打开文件 / 选区 - `@file` 提及的文件内容 - 嵌套目录的 `CLAUDE.md` / rules - 相关记忆预取结果等 5. 返回 `shouldQuery`：纯本地命令（如 `/help`）可不调模型 ### 3.3 Agent 主循环（`queryLoop`） 核心在 `query.ts`： ```ts // query.ts — 伪结构 async function* queryLoop(params) { using pendingMemoryPrefetch = startRelevantMemoryPrefetch(...) while (true) { // 1. 裁剪过大 tool 输出 / snip / microcompact / autocompact messagesForQuery = await applyToolResultBudget(...) messagesForQuery = snipCompactIfNeeded(...) messagesForQuery = await microcompact(...) // 可能触发 autocompact → 用摘要替换长历史 // 2. 流式调模型 for await (const message of deps.callModel({ messages: prependUserContext(messagesForQuery, userContext), systemPrompt: fullSystemPrompt, tools: toolUseContext.options.tools, ... })) { // 收集 assistant 消息；若出现 tool_use → needsFollowUp = true // 可选 StreamingToolExecutor 边流边执行 } // 3. 无 tool_use → stop hooks / 结束 if (!needsFollowUp) { ... return / continue recovery ... } // 4. 有 tool_use → runTools → 拼 tool_result → continue state.messages = [...messagesForQuery, ...assistantMessages, ...toolResults] continue } } ``` **终止条件**：无 `tool_use` 且 stop hooks 不阻塞；或 abort、maxTurns、prompt_too_long（无法恢复）、hook_stopped、blocking_limit 等。 --- ## 4. 如何分析用户需求 **结论：宿主侧没有独立意图分类器。** 需求理解由 Claude 模型完成，宿主提供行为规范与澄清手段。 ### 4.1 System Prompt 行为约束 `constants/prompts.ts` → `getSystemPrompt()` 组装多段指令，核心包括： | 段落 | 作用 | |------|------| | Intro | 「你是交互式软件工程 agent」 | | `getActionsSection` | 可逆操作可大胆做；破坏性操作先确认 | | `getUsingYourToolsSection` | 强制用专用工具而非滥用 Bash | | Plan / AskUserQuestion | 复杂任务先调研；歧义时提问 | | Memory 段 | 何时读写长期记忆 | | Env / Language / Output Style | 环境、语言、输出风格 | 典型身份定义： ```text You are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. ``` ### 4.2 辅助「理解」机制 | 机制 | 位置 | 作用 | |------|------|------| | Thinking blocks | `thinkingConfig` + API thinking | 模型内部多步推理 | | Plan Mode | `EnterPlanModeTool` / `ExitPlanModeV2Tool` | 复杂任务先调研再实现；限制写权限 | | AskUserQuestion | `AskUserQuestionTool` | 澄清歧义选项 | | Todo / Task 工具 | `TodoWriteTool` / `TaskCreateTool` | 拆解任务并跟踪进度 | | Side query 记忆选择 | `memdir/findRelevantMemories.ts` | 用较小模型从记忆索引挑相关文件 | | Ultraplan 等关键字 | `processUserInput` | 特殊触发词改变流程 | ### 4.3 实际「需求分析」过程（模型侧） 典型模型行为（由 prompt + 工具驱动）： 1. 读用户原话 + CLAUDE.md + 相关记忆 attachment 2. 若任务模糊 → `AskUserQuestion` 或先探索再确认 3. 若任务复杂 → 进入 Plan Mode 或写 Todo 4. 用 Grep/Glob/Read/Bash 收集证据后再改代码 5. 改完后用 Bash 跑测试 / 可选 Verification Agent --- ## 5. 如何分析用户已有代码 **结论：不做全局预索引灌入模型。** 模型按需用只读工具探索；种子上下文来自 CLAUDE.md、@文件、IDE 选区。 ### 5.1 探索工具 | 工具 | 文件 | 行为 | |------|------|------| | **Grep** | `tools/GrepTool/` | ripgrep：`pattern/path/glob/type`；可并发 | | **Glob** | `tools/GlobTool/` | 文件名通配 | | **FileRead** | `tools/FileReadTool/` | 按行读；支持 offset、PDF、notebook、图片；维护 `readFileState` | | **Bash** | `tools/BashTool/` | `git status`、测试、构建、复杂 shell | | **LSP** | `tools/LSPTool/` | 诊断 / 符号（需开启） | | **Agent(Explore)** | `tools/AgentTool/built-in/exploreAgent` | 专用探索子代理，保护主上下文 | | **WebFetch / WebSearch** | 对应 tools/ | 外部文档 | System Prompt 明确要求： ```text To read files use FileRead instead of cat/head/tail/sed To search for files use Glob instead of find/ls To search content use Grep instead of grep/rg Reserve Bash for system commands that truly need a shell ``` ### 5.2 种子上下文（无需工具即可看到） | 来源 | 实现 | 说明 | |------|------|------| | CLAUDE.md 树 | `context.ts` → `getUserContext()` → `getClaudeMds` / `getMemoryFiles` | 项目约定、编码规范 | | Git 快照 | `getSystemContext()` → `getGitStatus()` | 分支、status、最近 5 条 commit（会话开始时缓存） | | `@file` / IDE | `utils/attachments.ts` | 直接注入文件或选区 | | 嵌套 CLAUDE.md | 读路径时触发 | 进入子目录时追加规则 | ### 5.3 `readFileState`：读后缓存 `FileRead` 会把内容与时间戳写入 `toolUseContext.readFileState`。后续 `FileEdit` **强制要求先读过目标文件**，且文件未被外部修改，否则拒绝编辑并提示重新 Read——这是防止「幻觉改码」的关键硬约束。 --- ## 6. 记忆与上下文体系 ### 6.1 分层结构 ``` ┌─────────────────────────────────────────────────────────┐ │ System Prompt（静态可缓存段 + 动态边界后内容） │ │ + memory 段：MEMORY.md 机制说明 + 入口内容 │ ├─────────────────────────────────────────────────────────┤ │ userContext：CLAUDE.md 树 + currentDate │ │ systemContext：gitStatus（会话开始快照） │ ├─────────────────────────────────────────────────────────┤ │ Conversation messages[]（API 历史 + tool_use/result） │ │ + Attachments（相关记忆、提醒、MCP delta…） │ ├─────────────────────────────────────────────────────────┤ │ 磁盘：session transcript / memdir / SessionMemory 摘要 │ └─────────────────────────────────────────────────────────┘ ``` ### 6.2 各层说明 | 层 | 关键实现 | 说明 | |----|---------|------| | 项目指令 | `utils/claudemd.ts`、`getUserContext` | 各级 CLAUDE.md | | Auto memory | `memdir/memdir.ts`：`loadMemoryPrompt`、`ENTRYPOINT_NAME=MEMORY.md` | 教模型读写记忆目录；入口最多约 200 行 / 25KB | | 相关记忆预取 | `startRelevantMemoryPrefetch` → `findRelevantMemories` | 每用户 turn 启动；Sonnet sideQuery 选 ≤5 个相关记忆文件，settled 后注入 attachment | | 会话消息 | `QueryEngine.mutableMessages` / REPL `messages` | 完整对话；发 API 前经 compact 投影 | | 压缩 | microcompact / autocompact / reactiveCompact / snip / contextCollapse | 控制上下文窗口 | | Session Memory | `services/SessionMemory/` | 后台摘要，辅助 compact | | Transcript | `sessionStorage` | 持久化与 `--resume` | | 输入历史 | `history.ts` | 仅 UI ↑ 键历史，**不进模型上下文** | ### 6.3 相关记忆选择（Side Query） `memdir/findRelevantMemories.ts`： 1. `scanMemoryFiles` 扫描记忆文件 header（文件名 + 描述） 2. 用独立 `sideQuery`（较小模型，如 Sonnet）按用户 query 挑选最多 5 个文件 3. 主循环在工具阶段消费预取结果，注入为 attachment（不阻塞首轮 API） 选择器 system prompt 要求「只选确定有用的；不确定则不选」。 ### 6.4 上下文压缩（Compaction） 每轮 API 调用前按层处理： 1. **Tool result budget**（`applyToolResultBudget`）：裁剪过大工具输出 2. **Snip**（`HISTORY_SNIP`）：剪历史尾部 3. **Microcompact**：轻量清理旧 tool 结果等 4. **Context collapse**：分块折叠投影 5. **Autocompact**：接近阈值时 fork 模型写 summary，用摘要替换长历史 6. **Reactive compact**：API 413 / media size 错误后再压 设计目标：在有限 context window 下保持「无限会话」体验（system prompt 中也写明 *unlimited context through automatic summarization*）。 ### 6.5 User Context 注入形态 `prependUserContext` 把 CLAUDE.md 等包成 meta user 消息： ```xml As you answer... use the following context: # claudeMd ...CLAUDE.md contents... # currentDate Today's date is ... IMPORTANT: this context may or may not be relevant... ``` --- ## 7. 如何请求 AI 接口并得到准确代码 ### 7.1 API 调用链 ``` queryLoop → deps.callModel（默认 queryModelWithStreaming） → queryModel（services/api/claude.ts） → anthropic.beta.messages.create({ stream: true }) （或 Bedrock / Vertex / Foundry 客户端） ``` ### 7.2 请求组装要点 | 字段 | 来源 / 处理 | |------|-------------| | `messages` | `normalizeMessagesForAPI` + `prependUserContext` | | `system` | `buildSystemPromptBlocks`：按 `SYSTEM_PROMPT_DYNAMIC_BOUNDARY` 拆静态/动态，配合 prompt cache | | `tools` | 从 `Tool` 列表转 Anthropic tool schema；可延迟加载（ToolSearch） | | `thinking` | 按 `thinkingConfig`（adaptive / disabled） | | 其它 | `cache_control`、effort、task_budget、fallback model | 流式解析 content blocks → 产出 `AssistantMessage` / `stream_event`；失败可回落非流式请求。 ### 7.3 工具反馈回模型（准确性的核心闭环） ``` assistant: [text?, thinking?, tool_use{id, name, input}] ↓ runTools / StreamingToolExecutor user: [tool_result{tool_use_id, content, is_error?}] ↓ 合并进 messages 下一轮 callModel：模型看到真实文件内容 / 测试输出后再决策 ``` `runTools`（`toolOrchestration.ts`）： - 连续 `isConcurrencySafe` 的只读工具 **并行**（默认并发 10） - 写工具 / 非并发安全工具 **串行** - 每个 `tool.call` 前经 `canUseTool`（权限：default / plan / bypass / auto 等） 权限拒绝也会写成 `is_error` 的 `tool_result`，模型可改策略。 ### 7.4 代码写入路径与硬校验 | 工具 | 行为 | 准确性保障 | |------|------|------------| | **FileEdit** | `old_string` → `new_string` 精确替换 | ① 必须先 Read（`readFileState`）② 文件 mtime 未变 ③ `old_string` 必须在文件中唯一匹配（或 `replace_all`）④ 可做 quote / whitespace 归一化匹配 | | **FileWrite** | 整文件写 | 适合新建或大幅重写 | | **NotebookEdit** | 改 notebook cell | 结构化编辑 | | **Bash** | 脚本 / 格式化 / 测试 | 用真实命令结果验证 | FileEdit 拒绝示例（来自校验逻辑）： - `File has not been read yet. Read it first before writing to it.` - `File has been modified since read... Read it again...` - `String to replace not found in file.` - `Found N matches... provide more context to uniquely identify` 这保证模型不能凭记忆瞎改；必须以磁盘真实内容为锚点。 ### 7.5 进一步提高「准确逻辑」的机制 1. **先探索后改**：prompt 引导用 Grep/Read，禁止空猜 2. **Plan Mode**：大改前先调研，限制写操作 3. **并行只读、串行写入**：减少竞态 4. **Verification Agent**（可选）：非平凡改动后，独立子代理对抗式验证 5. **Hooks**：UserPromptSubmit / PostToolUse / Stop 等可拦截或反馈 6. **自测**：模型用 Bash 跑测试、lint、typecheck，把输出当下一轮上下文 **没有**单独的「生成代码后强制编译通过」硬门槛；正确性主要靠工具反馈闭环 + 可选验证子代理。 --- ## 8. System Prompt 组装优先级 `buildEffectiveSystemPrompt` 大致优先级： 0. `overrideSystemPrompt`（完全替换） 1. Coordinator mode 2. Main-thread agent definition（proactive 时 append，否则 replace） 3. `--system-prompt` custom 4. `getSystemPrompt()` default + 总是可 append `appendSystemPrompt` `getSystemPrompt` 典型段落顺序： ``` Intro → system reminders → doing tasks → actions → using tools → agent/verification → tone → [DYNAMIC BOUNDARY] → session guidance → memory → env → language → output style → MCP → scratchpad → FRC ... ``` 静态段可跨组织缓存；动态段（记忆、环境、语言等）在 boundary 之后，避免污染 prompt cache。 --- ## 9. 子 Agent 与多代理 | 能力 | 实现 | 说明 | |------|------|------| | AgentTool | `tools/AgentTool/` → `runAgent` | 再跑同一套 `query()`，独立 `agentId`、工具子集、system prompt | | Explore Agent | `built-in/exploreAgent` | 专用探索，减少主上下文噪声 | | Verification Agent | `VERIFICATION_AGENT_TYPE` | 对抗式验收 | | Coordinator / Swarm | `coordinator/`、`TeamCreate`、`SendMessage` | 多代理协同（feature 门控） | | Worktree | `EnterWorktreeTool` | 隔离工作树 | 子代理默认 prompt（`DEFAULT_AGENT_PROMPT`）： ```text You are an agent for Claude Code... Complete the task fully— don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report... ``` --- ## 10. 工具注册一览（写代码相关） `tools.ts` → `getAllBaseTools()` 注册，写代码主路径常用： | 类别 | 工具 | |------|------| | 探索 | Grep、Glob、FileRead、LSP、Agent(Explore) | | 修改 | FileEdit、FileWrite、NotebookEdit | | 执行 | Bash、REPL（ant-only） | | 规划 | EnterPlanMode、ExitPlanMode、TodoWrite、Task* | | 澄清 | AskUserQuestion | | 外部 | WebFetch、WebSearch、MCP 工具 | | 扩展 | Skill、ToolSearch、DiscoverSkills | --- ## 11. ASCII 总架构图 ``` ┌─────────────────── CLI / SDK / Bridge ───────────────────┐ │ entrypoints/cli.tsx → main.tsx → REPL | QueryEngine │ └──────────────────────────┬───────────────────────────────┘ │ user text / ContentBlocks ▼ ┌──────────────── processUserInput + attachments ──────────┐ │ slash cmds | UserMessage | CLAUDE.md / @files / IDE │ │ + relevant memory prefetch (sideQuery) │ └──────────────────────────┬───────────────────────────────┘ │ ▼ ┌──────────────────── queryLoop (while true) ──────────────┐ │ compact → API stream → tools? → tool_results → recurse │ │ │ │ ┌────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │ │ prompts.ts │→→│ claude.ts │→→│ Anthropic API │ │ │ │ context.ts │ │ (streaming) │ │ Messages+Tools │ │ │ └────────────┘ └─────────────┘ └────────┬────────┘ │ │ │ tool_use │ │ ┌───────────────────────────────────────────▼────────┐ │ │ │ Grep Glob Read Edit Write Bash Agent MCP Plan ... │ │ │ │ toolOrchestration + permissions │ │ │ └───────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────┘ │ ▼ 终端 UI / SDK events / 磁盘文件变更 ``` --- ## 12. 对照四个核心问题的结论 ### Q1：如何分析用户需求？ 宿主不做 NLU。靠 **System Prompt 行为规范 + Thinking + Plan/AskUserQuestion + 工具探索闭环**，由 Claude 理解任务。可选 sideQuery 做记忆筛选、job/skill classifier（实验性）。 ### Q2：如何分析用户已有代码？ 模型驱动 **Grep / Glob / Read / Bash / LSP / Explore Agent** 按需探索；**CLAUDE.md + @文件 + IDE 选区** 提供种子上下文。`readFileState` 保证编辑基于真实文件。 ### Q3：如何做记忆？ 多层： 1. **CLAUDE.md**（项目级持久指令） 2. **memdir / MEMORY.md**（可读写长期记忆 + 每 turn 相关记忆预取） 3. **会话 messages**（短期工作记忆） 4. **Compaction / SessionMemory**（长会话摘要压缩） 5. **Transcript 落盘**（resume） ### Q4：如何请求 AI 并得到准确代码？ `queryModelWithStreaming` 流式 Messages API；模型在 tool 闭环中读真实代码再 Edit/Write。**准确性来自：先读后写硬校验、精确字符串匹配、工具结果反馈、权限与 Plan、可选 Verification Agent 与自测**——而非一次性「生成完整正确代码」。 --- ## 13. 建议阅读顺序（深入源码） 1. `query.ts` — `queryLoop` 主循环（约 300–1700 行） 2. `constants/prompts.ts` — `getSystemPrompt` / `getUsingYourToolsSection` 3. `context.ts` + `utils/queryContext.ts` — 上下文三件套 4. `services/api/claude.ts` — `queryModelWithStreaming` 5. `services/tools/toolOrchestration.ts` + `toolExecution.ts` 6. `tools/FileEditTool/FileEditTool.ts` — 先读后写校验 7. `memdir/memdir.ts` + `findRelevantMemories.ts` — 记忆 8. `services/compact/autoCompact.ts` — 上下文压缩 9. `QueryEngine.ts` / `screens/REPL.tsx` — 会话边界 --- ## 14. 小结 Claude Code 的写代码 Agent **不是规则引擎，而是编排良好的 Tool-use Agent**： - **理解需求** = Prompt + 模型推理 + 提问/规划工具 - **理解代码** = 按需工具探索 + 项目记忆注入 - **记忆** = CLAUDE.md + memdir + 对话历史 + 压缩摘要 - **准确写码** = API 流式采样 ↔ 工具真实反馈的多轮闭环，外加 FileEdit 硬校验与可选验证 宿主的价值在于：**可靠的工具、权限、压缩、记忆注入与会话编排**；「智能」本身仍在 Claude 模型中。
ventoy系统安装盘，无需格式化U盘，快速制作各种安装盘
Ventoy是一款革命性的开源工具，它彻底改变了传统制作启动盘的方式。有了Ventoy，你只需要制作一次U盘，之后就可以像使用普通U盘一样，直接复制各种系统镜像文件（如Windows、Linux、PE工具等），无需反复格式化，即可在启动时自由选择要安装的系统。 ### 1. 制作U盘（一次性操作） 这是唯一需要“格式化”的一步，制作完成后，U盘即可永久使用。 1. 下载工具：访问 https://www.ventoy.net 下载最新版本，解压到电脑。 2. 运行程序：插入U盘，运行解压后的 Ventoy2Disk.exe。 3. 一键安装：在软件界面选择你的U盘设备，点击 “Install” 按钮。 4. 确认操作：程序会提示此操作将清除U盘数据，确认后等待进度条走完即可。 `注意：制作过程会清空U盘，请务必提前备份重要数据。制作完成后，U盘会被分为一个隐藏的引导分区和一个可见的数据分区，你可以像使用普通U盘一样在数据分区存放文件。` ### 2. 下载不同的系统安装镜像 制作好Ventoy启动盘后，后续使用极其简单： 1. 下载镜像：从官网下载你需要的系统镜像文件，如 Windows11.iso、Ubuntu.iso、WePE.iso 等。 2. 复制文件：直接将下载好的 .iso 文件复制到U盘的可见分区中。你可以建立文件夹进行分类管理（如 /Windows/、/Linux/），Ventoy会自动扫描所有目录。 `优势：传统工具（如Rufus）需要将镜像“写入”U盘，耗时且只能存一个系统。Ventoy只是“复制”文件，速度极快，且可以存放无数个系统。` ### 3. 使用U盘安装系统时如何选择镜像 1. 设置启动项：将U盘插入电脑，开机时按 F12、F11 或 ESC 键（不同主板按键不同）进入启动菜单，选择从你的U盘启动。 2. 进入菜单：电脑会进入Ventoy的图形化启动界面，这里会列出U盘中所有的ISO文件。 3. 选择系统：使用键盘的 上下方向键 选择你想要安装的系统镜像，按 回车键 即可启动。 4. 开始安装：接下来的步骤就和用光盘或普通启动盘安装系统完全一样了。 ### 4. 总结优点 • 无需反复格式化：制作一次，终身受用。想换系统时，只需删除旧ISO，复制新ISO即可，U盘里的其他个人文件完全不受影响。 * 支持多系统共存：一个U盘可以同时存放Windows、Linux、PE工具、DOS工具等，想用哪个选哪个，告别携带多个U盘的烦恼。 * 操作极其简单：不需要复杂的刻录过程，复制即安装，对新手非常友好。 * 兼容性极强：支持Legacy BIOS和UEFI两种启动模式，支持超过1300种操作系统镜像。 Ventoy是系统维护和装机爱好者的必备神器，真正实现了“一盘在手，天下我有”。
1、首先修改服务器ssh配置： 位于/etc/ssh/sshd_config 位置的文件是服务器的ssh配置文件，需要在配置文件中修改下列配置项： ``` RSAAuthentication yes #开启RSA验证 PubkeyAuthentication yes #使用公钥验证 AuthorizedKeysFile .ssh/authorized_keys #公钥保存位置 #必要时，可以通过下面的配置属性修改登录端口和禁用密码登录，提高服务器安全性 Port 22 #修改登录端口 PasswordAuthentication yes #开启密码登录 ``` 然后重启ssh服务即可 ``` systemctl restart sshd ``` 2、上传客户端生成的公钥文件id_rsa.pub文件内容到 `.ssh/authorized_keys` 文件中。 或者在客户端使用 ``` ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.111 ``` 将公钥传给服务器。之后直接使用`ssh root@192.168.0.111`即可直接登录服务器无需输入密码。
常用手机厂家app推送注册账号及appId appKey appSecret获取方法整理
各厂家开放平台地址： 小米：https://admin.xmpush.xiaomi.com/ 华为：http://developer.huawei.com/consumer/cn 魅族 : http://push.meizu.com oppo: https://open.oppomobile.com/ vivo: https://dev.vivo.com.cn/home FCM : https://console.firebase.google.com/ ####华为 1登录 [华为控制台](https://developer.huawei.com/consumer/cn/agconnect "华为控制台")，点击右上角的管理中心 ![](https://blog.ww4k.com/usr/uploads/2021/06/3018368942.png) 2 单击应用中心，选择AppGallery Connect项 ![](https://blog.ww4k.com/usr/uploads/2021/06/3223387642.png) 3 选择 我的项目，如已经创建可直点击我的应用，跳转到第五步 ![](https://blog.ww4k.com/usr/uploads/2021/06/1166543906.png) 4 创建项目 并创建应用 创建的过程中注意，华为这边的包名要与极光后台的保持一致 ，填写必要信息即可，不用上架，填写完保存就行。 需要注意的是 ，SHA256证书指纹是必须填写的 ，你可以参考这里来获取 ![](https://blog.ww4k.com/usr/uploads/2021/06/2523783512.png) 5 进入 应用详情 这一步就可以拿到我们需要的配置信息了 ，红色部分的内容，是你开发过程要用的信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/4193538211.png) 6 极光后台配置示例 （请对照上一步的图片内容进行定位） 极光控制台地址 路径：我的app-应用设置（左边导航栏最下面）-推送设置-集成设置 ![](https://blog.ww4k.com/usr/uploads/2021/06/2809849279.png) ### 小米 1 登录[小米推送平台](https://admin.xmpush.xiaomi.com/ "小米推送平台") 注册账户，新建app，注意包名需要与极光后台的配置保持一致。 2 找到刚刚创建好的应用，点击应用信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/274418275.png) 3 获取后台配置信息 红色框线部分就是极光后台以及工程配置需要的信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/367017837.png) 4 配置极光后台 请参照上面的图将对应信息填入 后台 极光控制台地址 路径：我的app-应用设置（左边导航栏最下面）-推送设置-集成设置 ![](https://blog.ww4k.com/usr/uploads/2021/06/4261212763.png) ### OPPO 1 登录[oppo推送平台](https://open.oppomobile.com/ "oppo推送平台")注册账户，点击应用服务->推送服务->申请接入 进入到如下页面，点击创建新应用新建app ![](https://blog.ww4k.com/usr/uploads/2021/06/3407006110.png) 注意包名需要与极光后台的配置保持一致。 2 登录到oppo push运营平台找到刚刚创建好的应用，点击应用信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/1042434382.png) 3 获取后台配置信息 红色框线部分就是极光后台以及工程配置需要的信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/643453896.png) 4 配置极光后台 请参照上面的图将对应信息填入 后台 极光控制台地址 路径：我的app-应用设置（左边导航栏最下面）-推送设置-集成设置 ![](https://blog.ww4k.com/usr/uploads/2021/06/1397009200.png) ### VIVO 1 登录[vivo推送平台](https://dev.vivo.com.cn/home "vivo推送平台") 注册账户，点击内容分发->应用商店->上传应用 来到如下页面，点击创建应用 ![](https://blog.ww4k.com/usr/uploads/2021/06/120917992.png) 注意包名需要与极光后台的配置保持一致。 2 找到刚刚创建好的应用，点击应用信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/76733649.png) 3 获取后台配置信息 红色框线部分就是极光后台以及工程配置需要的信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/122513849.png) 4 配置极光后台 请参照上面的图将对应信息填入 后台 极光控制台地址 路径：我的app-应用设置（左边导航栏最下面）-推送设置-集成设置 ![](https://blog.ww4k.com/usr/uploads/2021/06/3766777549.png) ### 魅族 1 登录[魅族推送后台](http://push.meizu.com/ "魅族推送后台") 并创建新应用 ,点击打开应用 注意应用的包名应与极光后台保持一致。 ![](https://blog.ww4k.com/usr/uploads/2021/06/890725393.png) 2 点击配置管理 ![](https://blog.ww4k.com/usr/uploads/2021/06/2778946513.png) 3 获取配置极光后台以及manifest里的信息 ![](https://blog.ww4k.com/usr/uploads/2021/06/1837187345.png) 4 极光后台配置示例 具体信息位置请对照上面的图 极光控制台地址 路径：我的app-应用设置（左边导航栏最下面）-推送设置-集成设置 ![](https://blog.ww4k.com/usr/uploads/2021/06/2691517181.png) ### FCM 1控制台地址 [FCM Console](https://console.firebase.google.com/ "FCM Console") 新建项目不再赘述，新建的app包名需要跟极光后台的保持一致。 2 获取控制台秘钥 点击已经创建好的项目，进入后点击设置按钮 ![](https://blog.ww4k.com/usr/uploads/2021/06/1723413623.png) 点击云消息传递 即可拿到所需数据 ![](https://blog.ww4k.com/usr/uploads/2021/06/1725012490.png) 3 配置极光后台 具体信息位置请对照上面的图 极光控制台地址 路径：我的app-应用设置（左边导航栏最下面）-推送设置-集成设置 ![](https://blog.ww4k.com/usr/uploads/2021/06/1661046745.png) 4成功集成插件的表现 观察日志是否有token输出 ，如果集成没问题会自动打印 ![](https://blog.ww4k.com/usr/uploads/2021/06/3492004565.png) 5 Firebase控制台测试 位置在左边的导航栏 ,可以在这里直接进行消息推送测试 。 【注意】测试需要挂海外节点的VPN，否则走极光通道。 【注意】在Google pixel模拟器上测试可能会无法使用极光通道，但是alias的设置是正常的 ，可以设置完到极光这边推送测试。 ![](https://blog.ww4k.com/usr/uploads/2021/06/1159524126.png)
### 以公司名义申请开发者账号 1、申请duns,邓白氏编码d-u-n-s 进入：https://developer.apple.com/enroll/duns-lookup/ 填写信息，查询。如果未申请过，会显示没有找到。 并且在下边已经根据你填写的信息，填写好了申请表单。 直接提交申请即可 2、等待审核通过之后，会收到邮件。要求提供一些资料清单： ``` 1.请提供公司清晰的营业执照正本（或副本）实物照片和公司公章刻字面的实物照片（如是事业单位请提供事业单位法人证） 2.公司中文名称（工商注册的中文名，如有更名情况，请同时提供更名前和更名后的名称）：XXXXX有限公司 英文名（如无正式的英文名按字面翻译）: XXXXX Co., Ltd 3.中文办公地址：广东省XXXXX 英文办公地址：guang dong XXXXX 4.邮编：100000 5. 企业类型：有限责任公司 6. 是否是独立企业（公司有无分公司或办事处，只需填有或无）:无 7. 公司英文简称或英文商标（如果没有可以填无）：无 8. 主营业务（一个最主要的业务）：xxxx 9. 员工人数（请尽量精确,例:10人；不要填区间,例：10-20人）: 1000 10.本项目联系人（务必填写申请公司的本项目联系人） 姓名：XXXX 性别：男 职务：项目负责人 电话（公司座机和联系人手机，所提供座机和办公地址保持一致）：17011111111 ``` 按模板回复资料，等待审核通过之后，就会邮件通知duns编码，后边申请会用到这个编码 3、需要一台登录了苹果账号的 苹果手机，并且下载 apple developer 应用 4、登录developer应用，登录苹果账户， 点这个位置 ![](https://blog.ww4k.com/usr/uploads/2021/04/207009880.png) 然后根据流程填写信息即可，账户类型选择 组织 ![](https://blog.ww4k.com/usr/uploads/2021/04/3656992016.png) 5、申请完需要支付99$ 订阅费。 以前帮一个公司申请duns过程有遇到过出错，无法申请： ``` 错误信息如下： ================================================ 您的要求未能完成。 我们暂时未能完成您需创建 D-U-N-S 编号的要求。 ================================================ ``` 最后通过在apple官网提交工单，跟客服反映这个情况。然后客服发发一份申请邮件，直接回复邮件申请完成。 ### 以个人名义申请开发者账号 个人申请就比较简单，不需要申请duns编码，直接跳过公司申请的1、2步。直接第3开始即可。账户类型选择 个人，费用一样也是99$
###1. 将手机通过usb连接上手机 打开手机的调试模式，通过下述命令确认设备连接成功 `adb devices` ###2. 确认手机的ip地址 在PC上直接通过adb登录手机的shell环境： `adb shell` //连接手机shell通过 ifconfig查看手机的ip 或者直接手机查看IP地址，省略这一步 多台设备同时连接时可以增加如下参数，emulator-5554为设备名 ``` -s emulator-5554 ``` ###3. 打开adb监听端口 直接在电脑上运行如下命令，给手机开一个连接端口 `adb tcpip 5555` 其中端口可自行选择。 ###4. 远程连接 现在你可以断开手机和PC的有线连接，直接使用adb命令远程连接： `adb connect ip:port` 这时候再通过devices命令可以查看连接成功： `adb devices` ###5.断开远程连接 `adb disconnect ip:port` 如果使用IDE环境进行开发，需要使用对应的ADB命令进行操作，这样就可以直接在ide中识别相应的远程设备
美国四年本科后对中国教育的感悟－写给刚入大学的你们【转载】
>这篇关于选专业，关于教育，关于人生。一遍不错的文章。转载分享，希望对正处理这个阶段的人有所帮助。 今天接到一个妹妹的电话，她刚查到了高考成绩，问我明天填志愿该填什么专业，她爸爸说金融工程好，以后去银行就业，收入稳定，要不要报金融工程？ 我要怎么告诉她呢？我自己为了选择我的专业花了一两年的时间思考，到现在还没有给我自己的职业生涯下一个定论，我怎么样告诉她在一个晚上的时间里快速地判断学什么专业好呢？ 中国的教育就是这样，中学时代的孩子什么都不懂，不知道各个专业到底是什么意思、社会上各种职业到底意味着怎样的工作状态、他们到底擅长什么、对什 么感兴趣、终生的追求是什么，统统不知道… 于是就在高考分数出来之后的某一晚在饭桌上和家长合计了一下，就胡乱报个金融、报个计算机、报个会计… 可是这么重要的事情，怎么可以在饭桌上花一两个小时决定呢？ 我决定整理一下电话里的内容，这些是我在美国四年对大学教育的很多思考，这一阵子一个接一个的社团听到我的讲座邀请我去讲梦想、讲经历、讲选择－受 之有愧，因为我毕竟没有那么多超出同龄人的见解可讲，但我又十分迫切地希望更多处在迷茫中的学弟学妹们得到一些正能量，面对压力和挑战更加坚定信心，去做 最好的选择。那么，我干脆写成一篇文章吧。也许在填报志愿这些日子不经意间转发到某位大学新生的手里了还可以给人一些启迪。当然啦，我不是教育学专家，一 家之言，有些偏颇的观点还望指正。 ###一、成功的人都在做自己想做的事情 我首先问她：你想做一个成功的人吗？她迫不及待地说：想！我说：那我告诉你，所有成功的人，无一例外，都在做他们感兴趣的事情。如果你不喜欢金融， 但是觉得金融好就业就填报金融，那大学四年会非常的难过，工作之后会觉得压力特别的大，生活质量也不高… 但如果你认为你真心的热爱画画、你可以不知疲倦地研究地图、谈到各种美食的烹饪方法就会眉飞色舞，那很有可能你就应该去学美术、地理或者烹饪，并且很可能 会取得了不起的成就。哈佛大学的校长Faust曾在毕业典礼上说：你可以选择你的退路，但人生很长，先去做你最热爱的事情，不要一开始就选择退路。 对！人生还很长，即使你现在已经中年了，只要目标坚定，都是可以重头开始的！美国人一般会转行很多次，这也是他们反复探索自己兴趣的一个过程，但是 一般对于东亚人来说，重头开始总被认为是特别困难而且丢人的。电影《当幸福来敲门》里有句话：“你要尽全力保护你的梦想。那些嘲笑你梦想的人，因为他们必 定会失败，他们想把你变成和他们一样的人。我坚信，只要我心中有梦想，我就会与众不同。你也是。”大家知道折纸原理吗？50年可以奋斗的人生如果是50张 纸叠在一起，就只有几厘米厚，但是目标坚定的人，50年都围绕着一个目标在生活，那么50年之后的成就就像一张无限大的纸折叠了50次一样厚！一张纸折叠 50次之后一定会很厚吧？但你绝对无法想象，它的厚度竟然可以从地球伸到太阳！那我们现在来想象，为什么有人一辈子对人类的贡献微不足道，有的人却可以改 写人类的历史呢？这就是梦想的力量！ 当然了，这个不适用于没有成功野心的人，很多人就是喜欢安逸的小日子，那随波逐流地选专业、进体制，也未尝不可。但是我想说，社会永远都只有绝对的 上游和绝对的下游，和一个正在缩小的的中游，中国的经济脉搏一刻不停，而社会阶层在固化，不进则退的河流里，是容不下一条小船舒适地游弋的。 说到选专业这个事情，我认为就先不要考虑好不好找工作了，反正不好找！今年大学生只有30％不到能找到工作，再说，找工作跟专业不相关也是再正常不 过的事情。肯定会有人说，那找不到好工作怎么办呢？挣不够钱买不起房丈母娘看不上娶不到老婆怎么办呢… 其实这些不是本文想要讨论的范围，但如果允许我发表一些自己的观点的话，我觉得找不到工作的意思是说找不到好工作，但是即使是工地里的工作都可以至少让自 己有饭吃啊，如果梦想够坚定，就能体会到一边流浪一边作画的乐趣，就不会把当下吃的苦看得那么重了… 我相信好姑娘会欣赏有梦想有志气的男生的，喜欢这篇文章的人很多都是有能力有野心的人，我相信你们不会连自己都养不活的。 我高中是理科，我一直有种从政报国的念头，于是看着很多领导人的简历，感觉应该去学理科，于是大学也继续学习电子工程（真是一个很奇怪的逻辑，好在 现在的领导人都开始变成文科出身了）。我修了很多的数理化，结果发现那些课学起来过于简单（可能是国内高中基础打得好），慢慢地越来越迷茫－我花了这么多 的时间，付这么多的学费，到底要来美国学什么？我不想就这么稀里糊涂地念完大学的四年，最后像大多数华盛顿大学工程系的学生一样去微软、英特尔找个舒适的 工作－我接触过这些公司里的一部分工科男，社交圈子非常的窄，每天和程序打交道，以至于英文都说不流利了（当然啦，真心喜欢这个行业的肯定也不少 的）… 我跟学校提出要休学，于是我去了中国的西部各省，开始穷游欧洲，后来决定要学社会科学－经济学和国际研究学。 可是在国内可等不得！读了一年多发现不喜欢了再转肯定是很困难的！我们还是先问问自己，本科学习到底意义是什么？英文里，之所以有 undergraduate和graduate的区别，是因为西方人觉得研究生才算是真正的大功告成，本科只是打个基础而已。美国上层家庭的子女爱去文理 学院，就是因为那里的基础打得好，什么基础呢？人文基础！美国富人总觉得金融、计算机、工程、医学这种技术性很强的学科是中低阶层的孩子还有很多亚洲人爱 学的，他们的孩子以后要做高管，要去政府，就必须学英文文学、历史、哲学、经济、政治、法律这一类的富人才敢学的专业，因为本科毕业不用急着养家糊口，还 可以体验几年社会，再继续深造，接着进入商界和政坛。中国的有能力送子女去海外接受本科教育的父母们也开始慢慢转变思维了，开始避免让孩子选择会计、工程 等类似技校也可以学到的专业，而让孩子在本科阶段接受更好的人文教育和通识教育。这里是我与很多美国人交流之后的一个不具权威性的总结，并不代表对任何专 业的否定，不管是数学、医学、工程… 都是有价值的专业，你必须去学你热爱的东西。求学的过程最好是怀着一些的浪漫主义情怀，就像在生意场上，最成功的商人都能享受经营的乐趣，把提高产品品 质，而不是把赚钱作为最大的动力。去真正为了满足你的好奇心和求知欲去学习，去拥抱真正的大学精神，去为了求得真理和造福社会而学习… ###二、千万不要继承父母不成功的思维模式 前些天看到一篇文章，是一个银行的人力资源经理写的面试大学实习生的感悟，说进银行的三类大学生特征明显：机关子弟、商人子弟、知识分子子弟和农民 子弟。父母是公务员或者国企职工的，一般会搞关系，做事儿的时候爱耍小聪明；生意人的孩子显得自信而且做事认真；父母是知识分子的总显得有点傲气，不合 群；农民的孩子不太爱说话，情商不高，但是做事勤快。接着作者说，最受欢迎的商人子弟一般都能留下，机关子弟有关系，也可以，知识分子子弟和农民子弟一般 都很难留在银行… 每个人的父母都会不知不觉地把他们认为最正确的一套是非观和为人处事的办法教给孩子－如果他们认为不正确他们也不会那么干－结果就是孩子们完完整整地接受了父母的思维方式，造成了很多人一辈子辛勤工作却仍然无法成功的最主要原因。 我认识的大多数同龄人，都处在父母粗暴的人生规划之下，从小学这学那是父母决定的，选什么专业上什么大学是父母决定的，大学毕业马上读研究生或者考 公务员是父母决定的，跟哪个女生在一起也是父母决定的… 那人生到底还有多少是自己的？大多数的美国学生都不会在本科毕业之后立即读研究生（少数数学、物理等理论科学除外），而是进入社会体验个几年或者十几年， 甚至有人在没进入本科或者刚读了一两年之后中断好多年去做任何自己感兴趣的事情，他们总是认为带着经验阅历进入研究生院才能学到更多，在职业生涯里遇到一 个学位造成的瓶颈了再去取得那个学位更有目的性。这样一来，他们可以尝试很多领域，真正知道自习喜欢什么之后，再带着自己工作中的实战经验去听课，真是把 读研究生的时间和钱花在了刀刃上，再看看我们中国一窝蜂地读研大军，非常的盲目，大多数人都不知道自己想要什么！学到这样的学位如果以后再找一份跟专业不 对口的工作，将会是怎样一番感受呢？ 不知道自己想做什么？可以去做做职业性格测试，或者多接触各个领域的成功人士（比如参加各种论坛和聚会），听听他们的成长轨迹，也可以禅修、去休 学、去打工、去旅游，让自己的内心走出喧嚣的环境，自习地听清楚内心的呼声到底是什么。知道自己想要什么了，再去读书，再去花时间培养自己那一方面所需要 的所有素养，而不是相反。 好在，还是有人敢于去冒险，敢于挑战常规，去来一次“说走就走的旅行”，去为了教育的理想建学堂，还有人耶鲁毕业去当村官… 这些都是了不起的尝试，虽然在美国人看来可能都是身边随处可见的例子，但至少中国的90后们开始了对常规的挑战，这就是一个好的开始！对于父母的建议，很 多当然都是宝贵的人生经验，但不要在自己独立思考判断之前就全盘照收，除非你不想发展得更好，只想复制你父辈的人生轨迹。父母永远都是为你好，没错！但是 父母永远都不知道什么选择对你最好！做为司机的你，做为棋手的你，必须经过自己的思考，自己手握方向盘、自己谋划大的棋局，而不是和父母一起握着方向盘、 在争吵声中落棋… 不谋万世者，不足以谋一时，如果你不能尽早居安思危，按照自己的意愿规划好自己的人生，那你只会成为一个普通的打工仔，成为别人庞大计划的一个零件。 ###三、大学，不仅仅只是学好专业那么简单 在美国的大学毕业要求里，每个学生通常都必须修满定量的自然科学、社会科学和艺术课程，这三个领域也是构成一个人知识系统的基本分类，如果任何一个 人，没有在这些领域都有过较好的教育，都很难称为一个成功的领导者。所以，不管你学的专业是什么，都去关心政治、历史、经济、法律、哲学、地理、天文、生 物、数学、美术、音乐这些学科吧，为什么犹太商人是世界上最成功的商人？因为它们对待各种学科的知识贪得无厌！据说犹太商人聚会的时候不怎么爱谈生意，话 题通常会非常的广阔。一个人的视野决定了他的高度，决定了他可以成为一个多好的领导，其实你永远都不知道哪一天某一门知识就会在一个重要的时刻派上大的用 场！乔布斯不就是从他感兴趣的大学书法课中获得苹果独创字体的灵感的吗？ 很多人都在花很大的气力提高自己的GPA，这样固然是好的，但是大学还有很多事情可以做啊。从一个懵懂的高中生，到进入职场，我们需要在大学里学到 的东西还有好多－自然科学、社会科学、艺术、领导能力（包括演讲能力、写作能力和沟通能力）、批判性思考能力（你是否敢于挑战权威，永远保持冷静客观？尤 其是在国内上学的学生们，更应该特别小心地呵护自己地批判性思考能力遭到扼杀，否则将造成非常大的遗憾）、写作能力、社会责任意识、职业素养… 其中的每一项都非常的重要，而且是很多大学生在毕业的时候还严重欠缺的。 既然如此，那就好好地利用大学四年的时间吧！给自己一个阅读和锻炼的计划；去勇敢地开口和陌生人交谈，去接触各种各样的人，了解他们的故事；去积极 地参与几个有意义的社团，或者组建一个自己的社团；去旁听各类入门的课程，打开自己的知识面；去逼自己跳出舒适圈，不要交那么多的酒肉朋友，独立地应对挑 战，并且和优秀的、志同道合的人交朋友吧；去打工、实习、省下零花钱，去旅游和探险吧！ 中国的学生，站在国际舞台上跟很多国家的学生相比，真的是好缺乏自信心啊！中国的教育体制和社会意识形态，对学生创造力想象力的束缚、批判能力的打 压、责任意识的忽视，造成多少人尤其是多少男生性格狭隘和自卑啊！一个对自己都不相信的人，谁能相信你呢，谁能去把任务交给你、指望你呢？遵照自己内心的 意愿，多做一些能让自己以后能感到骄傲的事情吧，不要让自己越活越没有自信！ 前些天我参加了一个活动的面试，被问到在美国的大学四年，最大的收获是什么？我想了一会儿，觉得是－包容－二字。我尽量避免过多和中国学生“扎 堆”，花了很多的时间，去理解华大里的国际学生们背后的文化，去感受基督教、天主、摩门教徒们的信仰，利用交流访问、会议、采访、背包旅行各种机会，去到 20多个国家，认识当地的人，感受他们的生活方式和价值观念… 我认为避免“文明的冲突”需要包容的公民和包容的国家，增加对整个社会和世界格局的认识是一件非常美妙的事情！顺便说一句，去很多国家不需要很有钱才可以 做到的，很多人可以一分钱不带，靠coachsurfing和打零工环游世界。你可以有一百个理由不去做，但如果要去做，那只需要一个理由，就是你真的 想！ 去年在东京UNIQLO实习的时候，亲自面试每一位实习生的总裁柳井正曾一度是日本首富，他年轻的时候在早稻田大学学习政治经济学，也正是因为这样 的专业背景，他具有非常独特的视角和眼界。他不喜欢看人的简历，常常会问：你是哪里人？父母是做什么的？你曾经在哪里生活过？你童年的时候做过什么有意思 的事情？他试图去从文化和价值观的角度去理解一个人，因而会比别人看到的更深刻。也许，这就是为什么我认为大家需要多接触人、多关心时事、多认识世界－有 容乃大，包容让人成为更出色的领导者。 ###四、做个精致的利己主义者对自己没好处 现在大学毕业的时候流行说“感谢室友四年的不杀之恩”了，其原因就是我们从小到大的教育机制让我们一直参与非常盲目狭隘而且没有意义的分数攀比，导 致学生的心理和生理出现了严重的扭曲。生理上的教训就是现在学生的体质的严重下滑和近视的大规模发生。心理上，学生开始为了自己的一点点利益不择手段，甚 至杀害自己的同窗好友，还有更多的人为了一些情感上的问题选择自杀！什么样的问题值得我们牺牲生命的代价呢！ 北京大学钱理群教授说：我们的大学，包括北京大学，正在培养一大批“精致的利己主义者”，他们高智商，世俗，老道，善于表演，懂得配合，更善于利用体制达到自己的目的。这种人一旦掌握权力，比一般的贪官污吏危害更大。我们的教育体制，正在培养大批这样的“有毒的罂粟花”。 已经进入到大学的各位，肯能深有体会，身边很多人是这样的吧！他们真的很聪明，有手腕，为了自己的保研、留学、奖学金、竞选真的可以不择手段。我在 美国的体会是怎样的呢？我的国际研究课上有不少同学，他们在朝鲜进行过食品援助，他们积极地为无家可归者筹集物资善款，他们去非洲帮助难民解决用水问 题… 这些伟大的国际主义精神真的让我倍受感动，尽管很多人是出于自己的信仰去实现他们的善举，但不管信仰如何，这样的力量指引着人们做真、善、美的事情，我们 的社会就还有希望。我在云南看到干海子村的小孩儿们一年只能洗一次澡，几乎完全过着原始人的生活的时候，深深地不明白为什么同一个国家的教育可以差得那么 远… 我们这边有很多人为自己没考上一本苦恼，那边的孩子上不上得了高中都是个大问题。 我总是在想，我去做公益，你们真的就觉得我不懂为自己捞利益那么傻吗？人活着的意义就是为了快乐，我们的任何一个举动，归根结底都是为了让自己快 乐，要么直接取悦自己（比如游戏、吃喝），要么避免让自己陷于不快（比如赔偿、减肥）… 但是你们想过人的终极幸福来自于哪里吗？人的终极幸福感来自于感觉到被爱和感觉到自己的重要性。如果不去亲自参与公益，不去亲自帮助那么一两个人，我想这 样的给予所带来的幸福感，是没有办法体会的。正是因为这种对于最伟大的幸福的追求，才会有屈原、鲁迅、南丁格尔、甘地这样的人像灯塔一样照亮人类文明的前 进方向。 我一直很厌恶各种在网络上炫富的行为，一方面，这样的人没有思想，只有继承的一些财富和挥霍的暴发户习气，另一方面，我们的国家这么的积贫积弱，人 均收入在非洲都只能算中等啊！你们知不知道，我们今天所拥有的生活，没有饥饿、战争，拥有住所、洁净的饮用水、充足的粮食，是多少人做梦都在渴望的生活 啊！如果你知道这个世界上，某个角落，也许就在印度活着非洲，每四秒钟就有一个不到五岁的孩子因为贫困而死，你还会忍心浪费粮食吗？你还好意思去炫耀自己 的包包和汽车吗？收入分配还这么的不公平，这样的人有什么资格炫耀自己的很可能是不法所得的财富？老子在《道德经》里表达过“无私为大私”的哲学思想，你 紧盯着小利，可以得到小利，但是胸怀天下，天下都会属于你！这样的幸福，可不是豪华的汽车别墅和万贯财富可以比拟的。施比受更有福，怀有一颗悲悯之心，去 关心一些更大的事情，去帮助别人吧！ （郑人元 2013.6.25） P.S.: 深夜成文，时间仓促，我成长的一路上有很多人帮助过我，从申请大学、到选择课程和专业、到公益计划的建立… 谢谢你们所有人…因为今天就是填志愿的时间了，希望更多人能看到这篇文章（发现人民网居然已经刊登出来这篇文章了，很及时啊），如果我也能尽一份力， 给学弟学妹们一点点启发，实在是万分荣幸… 我带着美国眼睛看中国的教育，谁说美国人做得就一定对呢，只是希望能提供给在国内念书的同学们一个不一样的观察视角。我的本意是希望高三毕业生看到此文， 难免有些“过来人”的口气，但不少读到本文的人都不是新生了，还请见谅。倘若你已经在读一门你不喜欢的专业了，那我真的希望这篇文章不会让你丧气，而是让 你在做出今后的选择的时候更明智，人生还很长啊！至于接不接地气、符不符合国情、如何慢慢地改善我们的“地气”和“国情”，就需要靠大家仁者见仁，智者见 智，共同努力了！我的想法还比较幼稚，也在和诸位一样不断地思考和探索着，遥祝大家求学路上一路顺利：）