HollowのBlog
type: channel
link: https://blog.hongrui-fu.online/
description: 为什么要演奏春日影😡
items: 证券金融的一些常识
items: Prompt、Agent与MCP概念详解
items: 如何将子目录的Git仓库合并到主项目并保留提交记录？
items: 从零开始：将 Vite + React 项目部署到 GitHub Pages 完全指南
items: 趣谈网络协议：通信协议综述
items: test
items: 欢迎使用 Typecho

证券金融的一些常识
type: item
date: 2026-04-09T22:27:00+08:00
description: 1.1 金融市场的功能金融市场是要素市场，不卖面包，它卖的是“买面包机和雇佣工人的能力”（即：钱/资本）。产品市场（实物市场）： 交易的是“终点”。比如你买一个面包、一台电脑、一次按摩。这些东西买回来是为了直接消耗掉或使用。要素市场： 交易的是“起点”。它不直接产生幸福感，但它是生产实物所必需的。传统的生产要素有三样：土地、劳动力、资本（现在还会加上“技术”和“数据”）。金融市场的本质，就是要素市场中的“资本（Capital）市场”。当你理解了金融市场是“要素市场”，你就会明白：股市的涨跌往往领先于实物市场。 因为只有资金（要素）先到位了，工厂才能开工，产品才能卖出。所以，看懂了“钱”的流向（要素），你就能预判“货”的兴衰（产品）。银行涨，是因为它在变身为“低风险理财产品”。概念股涨，是因为市场在“买入梦想、卖出事实”。此外金融市场还提供资金融通、价格发现、流动性（变现功能）、风险管理（保险、对冲）、降低搜索成本和信息成本的功能。记住 “两融、两价、一降低”。两融： 资金融通、流动性（融通的一种体现）。两价： 价格发现、风险管理（定价风险）。一降低： 降低成本。1.2 直接融资和间接融资在金融机构里，“直接融资”和“间接融资”对应着完全不同的 IT 架构、数据模型和核心指标。直接融资 = 证券市场（发股票、发债券），盈余方直接承担风险： 银行把老百姓的钱收进来（存款），再借给企业（贷款）。这里面的风险是银行承担的。如果你去分析银行的数据，重点看的是存贷差、坏账率（不良贷款率）、资本充足率。间接融资 = 银行（存贷款），银行作为中介承担风险： 市场只提供一个“撮合交易”的场所。在这里做数据分析工程师，不管是搭建底层的数据仓库，还是跑 SQL/ETL 处理海量流水，你关注的业务指标会变成交易量（佣金收入）、活跃用户数、撮合延迟、以及系统并发量。直接融资的特点（“直接自主分差不可逆”）：直接性、分散性、差异性（信誉）、不可逆性、自主性。⚔️ 炒股视角的“生死线”不可逆性 = 没得退货的沉没成本股票等典型的直接融资没有“退款机制”。资金一旦变成股权，唯一的退出路径就是二级市场的买卖。💡 实战启示： 绝对不碰没有流动性的“僵尸股”。一旦流动性枯竭，你的钱就成了账面死水。信誉差异性 = 买者自负的黑暗森林 存款（间接融资）有银行兜底，但直接融资没有。市场里既有印钞机也有皮包公司，信用资质天差地别。 💡 实战启示： 倒逼你必须去甄别财报真伪、理解估值逻辑。风险自担，红利也独享。💻 数据分析视角的“业务痛点”如果你在大型金融机构做数据分析或系统架构，这几个特点就是你日常搬砖的底层业务逻辑：分散性 = 高并发与数仓架构的试金石资金供求双方无数个独立的交易节点在同时产生动作，导致底层数据呈现极度“碎片化”和“海量并发”。如何承载这种吞吐量，并做好海量流水的实时 ETL 清洗，是核心技术壁垒。信誉差异性 = 风控建模与算法的黄金矿区 既然没有银行作为单一的信用中介兜底，参与者信用又参差不齐，这恰恰是数据挖掘的用武之地。通过宏观统计分析和风控算法，从海量异构数据中计算违约概率、给海量主体打上信用标签，这就是数据工程师在金融界的核心价值。（第三方评级与量化投资机构）直接融资的 5 种形态（实战与技术映射）（股债风投伤心|商信借民间）股票融资：出让控制权与分红权。实操警示：破产清算时剩余索取权劣后，风险最高。数据形态：高频、标准化行情数据。债券融资：标准化的借条。实操警示：关注违约评级。数据形态：标准化交易流水与信用利差模型。风险投资 (VC)：一级市场股权置换，距离散户较远，偏向初创期押注。民间借贷：非正规渠道的资金拆借，通常游离于核心监管报表之外，是引发企业突发性暴雷的隐患。商业信用融资：基于买卖关系的“赊账”。实操警示：直接体现为财报上的“应收/应付账款or商品赊销”。数据形态：高度复杂的供应链非标数据，是构建企业信用知识图谱的核心素材。如果一家公司账上没钱，但它能靠压榨上游供应商（拖欠货款）来维持生产，这就叫强大的商业信用融资能力（比如当年的格力）。反之，如果它的报表上全是别人欠它的钱（应收账款高企），说明它在行业里没有话语权，随时面临资金链断裂的风险。直接融资对金融市场的 3 个底层意义风险转移器（分散风险）： 把原本集中在银行系统内的坏账风险，转移到广大的资本市场投资者（股民、基民）身上，保卫国家金融底座的安全。经济转型发动机（匹配实体）： 传统银行不敢把钱借给没有抵押物的轻资产科技公司（如 AI、半导体），只有靠股市的股权融资，才能支撑起国家当前的产业结构升级。资金投票机（资源配置）： 不靠行政审批，而是让无数个手握资金的人在市场上充分博弈，谁能涨、谁能圈到钱，由市场说了算，从而把资源引向最高效的地方。间接融资的特点：间接性、相对集中性、信…

Prompt、Agent与MCP概念详解
type: item
date: 2025-11-01T20:49:00+08:00
description: 1. 超越简单提问：“系统提示词”是AI的隐藏人设我们与AI的每一次互动，都离不开“提示词”（Prompt）。它分为两种：用户提示词（User Prompt）： 这很简单，就是我们直接在对话框里输入给AI的问题或指令。系统提示词（System Prompt）： 这是一个预设的、通常隐藏的指令集。它为AI定义了角色、性格、背景和语气，相当于给AI设定了一个“人设”。没有它，AI的回答往往是“四平八稳的通用回答”；有了它，AI的互动便能充满个性。例如，当你对AI说“我肚子疼”：如果AI的“人设”是妈妈，它可能会问：“要不要去医院？”如果“人设”是爸爸，它可能会说：“去厕所！”如果“人设”是女朋友，它可能会回答：“滚一边去，老娘也疼！”通过系统提示词，同一个用户问题，可以根据预设的“人设”产生截然不同、生动且场景化的回答。2. 从“大脑”到“手脚”：AI Agent让AI动起来仅有提示词的AI，充其量只能“说”，而AI Agent的目标是让AI能“做”。AI Agent（如早期的AutoGPT项目）的核心思想，是赋予AI连接外部世界并执行任务的能力。它的工作流程巧妙地建立在“系统提示词”之上：提供工具箱： 开发者为Agent提供一系列可执行的“工具”（Tools），例如list_files（列出文件）、read_file（读取文件）等具体函数，并附上这些工具的功能描述。生成系统提示词： Agent的核心工作之一，就是将这些工具的列表和功能描述，自动编译成一段详尽的系统提示词。这段提示词会告诉AI模型：“你现在拥有以下工具，它们分别是做什么的，如果你想使用它们，应该返回什么样的格式。”理解与决策： 当用户提出任务（例如，“帮我找一下原神的安装目录”），Agent会将这个任务（作为用户提示词）和上面生成的那段包含工具说明的系统提示词，一起打包发给AI大模型。执行与反馈： AI模型作为“大脑”，根据任务需求决定调用哪个工具。Agent则扮演“手脚”，解析AI的指令并执行相应的工具函数，再将执行结果反馈给AI。这个过程会反复进行，直到最终完成任务。在这个流程中，Agent通过动态生成系统提示词，将外部工具的能力赋予AI，是连接模型、工具和用户之间的关键桥梁。3. 从“随心所欲”到“规范语法”：Function Calling带来的可靠性革命3.1. 概念解释早期的AI Agent完全依赖系统提示词来指导AI调用工具，但这存在一个问题：AI本质上是概率模型，它有时会“不听话”，返回的指令格式不符合预设规范。这会导致Agent需要反复重试，既不可靠，也浪费计算资源。为了解决这个问题，大模型厂商推出了“官方解决方案”——Function Calling。它的核心思想是标准化。它不再使用自然语言在系统提示词里描述工具，而是通过一套标准化的JSON格式来严格定义每个工具。这份定义通常包含三个关键字段：name（工具名）、description（功能说明）和parameters（所需参数）。同时，它也规定AI在决定调用工具时，必须返回同样标准化的格式。这就像是把随意的口头约定，升级成了一套所有参与方都必须遵守的、清晰的“语法规则”。更重要的是，因为格式是统一的，如果AI返回了无效的格式，AI服务本身就可以在服务器端检测到并自动重试，用户无需感知，也节省了用户端重试带来的token开销。目前，基于系统提示词和Function Calling这两种方式在市面上是并存的。3.2. 为什么这很重要？Function Calling的出现极大地提升了AI调用工具的可靠性和效率。它降低了开发者构建Agent的门槛和复杂性，是推动AI Agent从“实验性项目”走向“大规模应用”的关键一步。“通过统一工具的描述格式、统一AI回复的格式，模型厂商可以更有针对性地训练AI，使其深刻理解‘调用工具’这一场景，从而变得更加可靠和高效。”4. 避免重复造轮子：MCP，AI工具的“USB协议”4.1. 概念解释我们面临一个新的问题：如果每个Agent都需要一个“浏览网页”的工具，难道我们要在每个Agent项目里都重写一遍同样的代码吗？这显然是低效且不优雅的。为了解决工具复用的问题，MCP（Model-Component-Protocol）应运而生。MCP是一套通信协议，旨在将AI Agent和它所使用的能力进行解耦。它允许开发者将通用的能力打包成独立的服务（称为MCP Server）。这些能力不仅仅是工具（Tools），还可以是资源（Resources）（如文件读写服务）或提示词模板（Prompts）。任何AI Agent（作为MCP Client）都可以通过这套标准协议，去“连接”并使用这些远端的服务，而无需关心其内部的具体实现。4.2. 为什么这很重要？MCP的价值在于它促…

如何将子目录的Git仓库合并到主项目并保留提交记录？
type: item
date: 2025-03-08T20:14:00+08:00
description: 场景还原我在本地开发一个项目时，先在dataset子文件夹下创建了Git仓库，用于管理数据集相关的代码和版本控制。随着项目扩大，我需要将整个项目（包含dataset子目录）上传到GitHub，但希望保留dataset文件夹的独立提交历史。问题核心：如何将一个已存在独立Git仓库的子目录（dataset），合并到主项目的Git仓库中，同时保留其完整的提交记录？解决方案：使用Git Subtree合并仓库Git Subtree 允许将一个仓库作为子目录嵌入到另一个仓库，并保留完整历史记录。与Submodule不同，Subtree会将代码完全合并到主仓库，更适合需要频繁修改子目录内容的场景。操作步骤：1. 初始化主项目仓库# 进入项目根目录 cd C:\Users\hollow\YKF2a # 初始化Git仓库并创建main分支 git init -b main # 添加文件并提交初始版本 git add . git commit -m "Initial commit for main project"2. 使用Subtree添加子仓库# 语法：git subtree add --prefix=<子目录名> <子仓库路径> <分支名> git subtree add --prefix=dataset C:\Users\hollow\毕业论文\dataset main• --prefix=dataset：指定子目录名称为dataset • 子仓库路径：本地或远程仓库地址（此处为本地绝对路径） • 分支名：要合并的子仓库分支（此处为main）3. 验证结果git log --oneline --graph # 输出示例 * cdbed89 (HEAD -> main) Add 'dataset' via subtree |\ | * 3a2b1c0 (subproject/main) [dataset] Update data processing | * 8f7e6d5 [dataset] Initial dataset commit * 9a8b7c6 Initial commit for main project此时dataset目录已合并到主项目，且提交历史完整保留。关键点解析为什么不用Submodule？ Submodule仅保存子仓库的引用，需要用户手动更新。而Subtree将代码直接合并到主仓库，更适合需要共同开发的场景。路径处理注意事项 • 若子仓库位于远程（如GitHub），需替换为远程URL： git subtree add --prefix=dataset https://github.com/user/dataset.git main• 路径含空格或特殊字符时建议使用双引号包裹。后续更新子仓库 • 拉取子仓库更新： git subtree pull --prefix=dataset [URL] main• 推送修改到子仓库： git subtree push --prefix=dataset [URL] main关于 --squash 参数若希望合并子仓库的历史提交为单次提交​（避免主仓库历史被污染），可在命令中添加 --squash。适用场景：子仓库提交历史复杂，且主仓库只需保留关键版本记录时。完整操作日志参考PS C:\Users\hollow\YKF2a> git init -b main Initialized empty Git repository in C:/Users/94918/Desktop/YKF2a/.git/ PS C:\Users\hollow\YKF2a> git add . PS C:\Users\hollow\YKF2a> git commit -m "Initial commit for main project" [main (root-commit) cdbed89] Initial commit for main project 1 file changed, 47 insertions(+) create mode 100644 "\347\273\274\350\277\260\346\241\206\346\236\266.md" PS C:\Users\hollow\YKF2a> git subtree add --prefix=dataset C:\Users\hollow\毕业论文\dataset main git fetch C:\Users\hollow\metaProject\dataset main ... Added dir 'dataset'最终项目结构YKF2a（主仓库） ├── 文献综述.md └── dataset（子仓库合并后的目录） ├─…

从零开始：将 Vite + React 项目部署到 GitHub Pages 完全指南
type: item
date: 2025-01-27T23:50:00+08:00
description: 从零开始：将 Vite + React 项目部署到 GitHub Pages 完全指南本教程基于实际操作经验编写，从"为什么"到"怎么做"，带你彻底理解整个部署流程。写在前面你写了一个网页应用，想让朋友也能访问。最简单的方式就是部署到 GitHub Pages —— 免费、稳定、还自带 HTTPS。但当你真正动手时，可能会遇到一堆问题：什么是 Git？什么是 GitHub？它们有什么区别？GitHub Pages 和 GitHub Actions 又是什么关系？为什么我的 React 项目不能直接部署，还要配置一堆东西？这篇教程会回答所有这些问题。读完后，你不仅能成功部署项目，还能理解每一步背后的原理。第一章：理解基本概念在开始之前，我们先搞清楚几个核心概念。这些概念相互关联，理解它们之间的关系非常重要。1.1 Git：你的代码时光机想象一下，你在写一篇重要的文章。你可能会这样保存：论文_v1.doc 论文_v2.doc 论文_v2_修改.doc 论文_最终版.doc 论文_最终版_真的最终.doc这种方式有很多问题：文件越来越多、不知道每个版本改了什么、想回到某个状态很困难。Git 就是为了解决这个问题而生的。它是一个版本控制系统，能够：记录每一次修改的内容随时回到任何一个历史版本查看"谁在什么时候改了什么"使用 Git 后，你只需要一个文件夹，所有历史版本都被 Git 默默记录在 .git 隐藏目录里。1.2 GitHub：Git 的云端管家Git 把版本历史存在你自己电脑上，但如果：电脑坏了怎么办？想和别人协作怎么办？想在另一台电脑上继续工作怎么办？GitHub 就是一个云端平台，专门用来存放 Git 仓库。你可以把本地的代码"推送"到 GitHub，它就安全地保存在云端了。💡 简单记忆：Git 是工具，GitHub 是平台。就像 "视频" 和 "YouTube" 的关系。1.3 GitHub Pages：免费的网站托管GitHub 除了存代码，还提供了一个福利：GitHub Pages。它能把你仓库里的静态文件（HTML、CSS、JS）变成一个真正可访问的网站。而且完全免费，自带 https://用户名.github.io/仓库名 的域名。1.4 GitHub Actions：自动化机器人这是一个稍微高级的概念，但对于现代前端项目来说必不可少。问题来了：你写的是 React + TypeScript 代码，但浏览器只认识 HTML、CSS、JavaScript。你写的代码 浏览器需要的 ─────────── ──────────── App.tsx → index.js styles.scss → styles.css 组件化代码 → 打包后的单文件中间这个转换过程叫做构建（Build）。在本地，你运行 npm run build，Vite 就会帮你完成构建，生成 dist 文件夹。但 GitHub Pages 只是一个静态文件托管服务，它不会帮你运行 npm run build。这就是 GitHub Actions 的作用：它是一个自动化服务，可以在 GitHub 的服务器上执行命令。每当你推送代码，它就自动：下载你的代码安装依赖 (npm install)执行构建 (npm run build)把构建结果部署到 Pages相当于你有了一个 24 小时在线的机器人，帮你做重复性工作。1.5 概念关系图让我们用一张图来总结这些概念的关系：┌─────────────────────────────────────────────────────────────────┐ │ 你的电脑 │ │ ┌─────────────┐ │ │ │ 项目文件 │ ──── git add/commit ────→ 本地 Git 仓库 │ │ │ (源代码) │ (.git 目录) │ │ └─────────────┘ │ └──────────────────────────────┬──────────────────────────────────┘ │ git push ▼ ┌─────────────────────────────────────────────────────────────────┐ │ GitHub │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 远程仓库 │ ───→ │ Actions │ ───→ │ Pages │ │ │ │ (存储代码) │ │ (自动构建) │ │ (托管网站) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────…

趣谈网络协议：通信协议综述
type: item
date: 2024-08-15T12:46:00+08:00
description: 在数字时代，互联网已成为连接世界的“通天塔”。作为一名“程序猿”，我们敲击着通用的语言，构建着这个互联世界。但你是否想过，你的“Hello World!”代码本身也是一种协议，是你与计算机沟通的方式？而要连接世界，让“一大片机器互相协作”，则需要更复杂的网络协议。一、协议的三要素无论是人类语言、计算机语言，还是网络协议，它们都具备以下三个核心要素：语法 (Syntax)：规定了内容需要符合的规则和格式。例如，编程语言中括号要成对，语句要以分号结束。在网络协议中，HTTP 请求和返回也有其特定的格式。语义 (Semantics)：代表了内容的意义。例如，数字相减有意义，而数字与文本相减通常无意义。HTTP 响应中的状态码 200 表示网页成功返回，404 则表示未找到页面。顺序 (Sequence)：规定了操作的先后次序。例如，先加后减的计算顺序。在网络通信中，先发送 HTTP 请求，才有对应的 HTTP 返回。二、网络为什么要分层？理解网络包的“生命周期”教科书常将网络分层比喻为公司架构，但这种比喻并不恰当。更准确的理解是，网络分层是为了处理复杂性，是一种程序设计的必然要求。网络包在传输过程中，就像俄罗斯套娃（或层层封装的快递），每一层都在上一层的数据外加上自己的“头部”信息，形成一个完整的包裹。核心原则：只要是在网络上跑的包，都是完整的。可以有下层没上层，绝对不可能有上层没下层。发送过程（封装）：当你点击浏览器发送 HTTP 请求时，你的程序（浏览器）将 HTTP 请求内容交给底层的网络处理程序。应用层数据（HTTP请求）会被 TCP 层加上 TCP 头（包含源端口和目的端口，如80端口）。带TCP头的包再交给 IP 层加上 IP 头（包含源 IP 和目的 IP 地址）。带IP头的包再交给 MAC 层加上 MAC 头（包含源 MAC 地址和目的 MAC 地址）。最终，这个完整的网络包通过网卡发送出去。接收过程（解封装）：当网络包到达你的机器时，网络处理程序会逐层解开：MAC 层首先处理，检查 MAC 头是否与本机相符，如果相符则去掉 MAC 头。然后交给 IP 层处理，检查 IP 头是否与本机相符或需要转发，如果发给本机则去掉 IP 头。再交给 传输层（TCP或UDP），根据 TCP/UDP 头判断包的类型（发起、应答、数据包），处理后去掉 TCP/UDP 头。最终，应用层（如浏览器）根据端口号接收并处理剩余的应用层数据（如HTML内容），与底层无关。设备分层：二层设备（如交换机）收到完整的网络包，只摘取 MAC 头来判断是丢弃、转发还是自己保留。三层设备（如路由器）收到完整的网络包，摘取 MAC 头后，还会摘取 IP 头来判断是丢弃、转发还是自己保留。三、IP 地址与 MAC 地址：门牌号与身份证在Windows上是ipconfig 在Linux上是 ifconfig 、ip addrWindows上刷新DNS缓存的命令：ipconfig /flushdnsifconfig 是传统的网络配置命令，属于 net-tools 工具包。ip addr 是较新的命令，属于 iproute2 工具包，功能更强大。在网络世界中，IP 地址和 MAC 地址是识别设备的两种重要方式。IP 地址 (Internet Protocol Address)：作用：相当于现实世界的“门牌号码”，具有远程定位功能，用于在互联网中找到目标机器。格式：IPv4 是 32 位（四段点分十进制表示，如 10.100.122.2），IPv6 是 128 位。唯一性：一个网络接口在一个网络中应拥有唯一的 IP 地址，冲突会导致网络问题。公有 IP 与私有 IP：私有 IP 地址：在组织内部（如家庭、办公室、数据中心）使用，由内部 IT 人员管理和分配，可以在不同组织间重复使用。常见的私有 IP 段如 192.168.x.x、10.x.x.x 等。公有 IP 地址：由统一组织分配，全球唯一，用于互联网上的公开访问。CIDR (Classless Inter-Domain Routing)：一种表示 IP 地址的方式，用斜杠/后跟数字表示网络号的位数（如 10.100.122.2/24 表示前 24 位是网络号，后 8 位是主机号）。通过将 IP 地址与子网掩码进行按位 AND 运算可得到网络号。示例：16.158.165.91/22网络号：16.158.164.0 (二进制计算 165 的前 6 位 101001 作为网络号，后 2 位 01 和 91 组成主机号。网络号主机位全为 0，所以 10100100 即 164)。第一个地址：16.158.164.1 (网络号 + 最小主机号)。子网掩码：255.255.252.0 (网络号位全为 1，主机位全为 0)。…

test
type: item
date: 2024-03-08T03:15:43+08:00
description: test😄为什么要演奏春日影！！！

欢迎使用 Typecho
type: item
date: 2021-10-20T20:20:00+08:00
description: 如果您看到这篇文章,表示您的 blog 已经安装成功😊.