<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>首页 on FCANA</title><link>https://fcana.com/</link><description>Recent content in 首页 on FCANA</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 19 Jul 2026 13:09:45 +0800</lastBuildDate><atom:link href="https://fcana.com/index.xml" rel="self" type="application/rss+xml"/><item><title>checklist</title><link>https://fcana.com/posts/checklist/</link><pubDate>Sun, 19 Jul 2026 13:09:45 +0800</pubDate><guid>https://fcana.com/posts/checklist/</guid><description>&lt;h1 id="oss--esa--服务端上线前检查单"&gt;OSS + ESA + 服务端上线前检查单
&lt;/h1&gt;&lt;p&gt;架构目标：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;reader.fcana.com -&amp;gt; ESA -&amp;gt; 书店 UI
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;reader-data.fcana.com -&amp;gt; ESA -&amp;gt; JSON / OPDS / 下载授权
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;reader-file.fcana.com -&amp;gt; ESA -&amp;gt; 私有 OSS
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;说明：P0 为上线硬门槛；P1 为强烈建议；P2 为上线后优化项。&lt;/p&gt;
&lt;h2 id="0-测试样本"&gt;0. 测试样本
&lt;/h2&gt;&lt;p&gt;准备一个带空格和中文的测试对象，用来发现路径编码问题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bookshelf-prod/books/preflight/a b-中文.epub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;记录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bucket：&lt;code&gt;________________&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Region：&lt;code&gt;cn-beijing&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prefix：&lt;code&gt;bookshelf-prod&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文件域名：&lt;code&gt;reader-file.fcana.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;数据域名：&lt;code&gt;reader-data.fcana.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="a-oss"&gt;A. OSS
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;A01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Bucket 地域&lt;/td&gt;
					&lt;td&gt;OSS 控制台&lt;/td&gt;
					&lt;td&gt;华北2（北京）&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Bucket 权限&lt;/td&gt;
					&lt;td&gt;OSS 控制台&lt;/td&gt;
					&lt;td&gt;私有，未开启公共读&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;公共访问阻断&lt;/td&gt;
					&lt;td&gt;OSS ACL/Policy&lt;/td&gt;
					&lt;td&gt;无匿名读取权限&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Object Key&lt;/td&gt;
					&lt;td&gt;控制台搜索测试对象&lt;/td&gt;
					&lt;td&gt;完整 Key 含 &lt;code&gt;bookshelf-prod/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A05&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;裸 OSS 直链&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;curl.exe -I&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;，不能是 &lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A06&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;RAM 写入权限&lt;/td&gt;
					&lt;td&gt;RAM Policy&lt;/td&gt;
					&lt;td&gt;仅目标 Bucket/Prefix；无管理权限&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A07&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;服务端上传&lt;/td&gt;
					&lt;td&gt;上传测试文件&lt;/td&gt;
					&lt;td&gt;OSS 中存在且大小一致&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A08&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;Content-Type&lt;/td&gt;
					&lt;td&gt;查看对象 Metadata&lt;/td&gt;
					&lt;td&gt;EPUB 为 &lt;code&gt;application/epub+zip&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A09&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;对象不可变&lt;/td&gt;
					&lt;td&gt;查看 Key 规则&lt;/td&gt;
					&lt;td&gt;更新后使用新 hash/版本路径&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A10&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;删除保护&lt;/td&gt;
					&lt;td&gt;查看清理逻辑&lt;/td&gt;
					&lt;td&gt;不使用全桶 &lt;code&gt;sync --delete&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Windows CMD：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl.exe -I &lt;span style="color:#e6db74"&gt;&amp;#34;https://BUCKET.oss-cn-beijing.aliyuncs.com/bookshelf-prod/books/preflight/a&lt;/span&gt;%2&lt;span style="color:#e6db74"&gt;0b-&lt;/span&gt;%E4%&lt;span style="color:#e6db74"&gt;B8&lt;/span&gt;%AD%&lt;span style="color:#e6db74"&gt;E6&lt;/span&gt;%9&lt;span style="color:#e6db74"&gt;6&lt;/span&gt;%8&lt;span style="color:#e6db74"&gt;7.epub&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过：&lt;code&gt;403 Forbidden&lt;/code&gt;。返回 &lt;code&gt;200&lt;/code&gt; 时立即停止上线。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="b-服务端配置"&gt;B. 服务端配置
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;B01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Endpoint&lt;/td&gt;
					&lt;td&gt;查看 Storage Profile&lt;/td&gt;
					&lt;td&gt;北京公网或可用内网 Endpoint&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Bucket&lt;/td&gt;
					&lt;td&gt;查看配置&lt;/td&gt;
					&lt;td&gt;只填 Bucket 名&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Region&lt;/td&gt;
					&lt;td&gt;查看配置&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;cn-beijing&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Prefix&lt;/td&gt;
					&lt;td&gt;查看配置&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;bookshelf-prod&lt;/code&gt;，无首尾 &lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B05&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;CDN Base URL&lt;/td&gt;
					&lt;td&gt;查看配置&lt;/td&gt;
					&lt;td&gt;仅 &lt;code&gt;https://reader-file.fcana.com&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B06&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;下载模式&lt;/td&gt;
					&lt;td&gt;查看配置&lt;/td&gt;
					&lt;td&gt;阿里云 ESA HMAC CDN&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B07&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;HMAC Secret&lt;/td&gt;
					&lt;td&gt;查看状态，不打印明文&lt;/td&gt;
					&lt;td&gt;与 ESA 使用同一密钥&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B08&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Secret 安全&lt;/td&gt;
					&lt;td&gt;搜 Git/日志/前端&lt;/td&gt;
					&lt;td&gt;无明文 Secret、AK、SK&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B09&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;签名协议&lt;/td&gt;
					&lt;td&gt;检查代码&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;exp + sig&lt;/code&gt;，HMAC-SHA256，小写 hex&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B10&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;时间戳&lt;/td&gt;
					&lt;td&gt;查看真实 URL&lt;/td&gt;
					&lt;td&gt;Unix 秒，不是毫秒&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B11&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;路径一致&lt;/td&gt;
					&lt;td&gt;比较三处路径&lt;/td&gt;
					&lt;td&gt;OSS Key、CDN path、签名 path 完全一致&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B12&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;特殊字符&lt;/td&gt;
					&lt;td&gt;生成测试 URL&lt;/td&gt;
					&lt;td&gt;无 &lt;code&gt;%2520&lt;/code&gt; 或双重编码&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B13&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;无 OSS 原生签名&lt;/td&gt;
					&lt;td&gt;检查 Location&lt;/td&gt;
					&lt;td&gt;无 &lt;code&gt;OSSAccessKeyId&lt;/code&gt;/&lt;code&gt;x-oss-signature&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B14&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;下载授权&lt;/td&gt;
					&lt;td&gt;带账号请求&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;302/307&lt;/code&gt; 到 &lt;code&gt;reader-file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B15&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;授权端点不缓存&lt;/td&gt;
					&lt;td&gt;查看响应头&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Cache-Control: private, no-store&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B16&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;未登录访问&lt;/td&gt;
					&lt;td&gt;不带凭据请求&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;401/403&lt;/code&gt;，无 &lt;code&gt;Location&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B17&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;越权访问&lt;/td&gt;
					&lt;td&gt;无权限账号请求&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403/404&lt;/code&gt;，无 &lt;code&gt;Location&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B18&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;TTL&lt;/td&gt;
					&lt;td&gt;比较 &lt;code&gt;exp-now&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;建议约 300 秒&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B19&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;幂等入库&lt;/td&gt;
					&lt;td&gt;同 key 重复提交&lt;/td&gt;
					&lt;td&gt;只产生一个正式书目&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;B20&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;健康检查&lt;/td&gt;
					&lt;td&gt;请求 &lt;code&gt;/readyz&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl.exe -u &lt;span style="color:#e6db74"&gt;&amp;#34;USERNAME:PASSWORD&amp;#34;&lt;/span&gt; -D - -o NUL &lt;span style="color:#e6db74"&gt;&amp;#34;https://reader-data.fcana.com/download/BOOK_ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过响应：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;302
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Location: https://reader-file.fcana.com/bookshelf-prod/...?exp=...&amp;amp;sig=...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Cache-Control: private, no-store
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="c-esa-dns-与私有-oss-回源"&gt;C. ESA DNS 与私有 OSS 回源
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;C01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;DNS 记录&lt;/td&gt;
					&lt;td&gt;ESA 控制台&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;reader-file&lt;/code&gt; 已开启代理&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;CNAME&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;nslookup&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;指向 ESA，不是 VPS IP&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;HTTPS&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;curl.exe -I&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;证书有效且域名匹配&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;源站类型&lt;/td&gt;
					&lt;td&gt;ESA 控制台&lt;/td&gt;
					&lt;td&gt;OSS，私有访问－同账号&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C05&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Bucket&lt;/td&gt;
					&lt;td&gt;ESA 控制台&lt;/td&gt;
					&lt;td&gt;与服务端上传 Bucket 相同&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C06&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;回源授权&lt;/td&gt;
					&lt;td&gt;ESA 控制台&lt;/td&gt;
					&lt;td&gt;自动授权成功，只读回源&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C07&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;不经 Nginx&lt;/td&gt;
					&lt;td&gt;查看 Nginx/流量&lt;/td&gt;
					&lt;td&gt;文件请求不进入 VPS&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C08&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;静态网站冲突&lt;/td&gt;
					&lt;td&gt;OSS 控制台&lt;/td&gt;
					&lt;td&gt;未启用静态网站托管&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nslookup reader-file.fcana.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="d-esa-hmac-旁路函数"&gt;D. ESA HMAC 旁路函数
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;D01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;函数已发布&lt;/td&gt;
					&lt;td&gt;函数和 Pages&lt;/td&gt;
					&lt;td&gt;有生产版本&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;旁路模式&lt;/td&gt;
					&lt;td&gt;路由配置&lt;/td&gt;
					&lt;td&gt;Bypass 已开启&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;路由范围&lt;/td&gt;
					&lt;td&gt;查看路由&lt;/td&gt;
					&lt;td&gt;只匹配 &lt;code&gt;bookshelf-prod/books/*&lt;/code&gt;、&lt;code&gt;covers/*&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;算法一致&lt;/td&gt;
					&lt;td&gt;比对代码&lt;/td&gt;
					&lt;td&gt;HMAC-SHA256、UTF-8 Secret、64 位 hex&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D05&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;签名原文&lt;/td&gt;
					&lt;td&gt;固定向量验证&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;encoded_path + exp&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D06&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;无签名&lt;/td&gt;
					&lt;td&gt;直接请求&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D07&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;错误签名&lt;/td&gt;
					&lt;td&gt;改 &lt;code&gt;sig&lt;/code&gt; 一位&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D08&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;过期签名&lt;/td&gt;
					&lt;td&gt;使用旧 URL&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D09&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;过远未来 exp&lt;/td&gt;
					&lt;td&gt;手工构造&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D10&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;合法签名&lt;/td&gt;
					&lt;td&gt;服务端生成 URL&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200&lt;/code&gt; 或 &lt;code&gt;206&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D11&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;中文/空格路径&lt;/td&gt;
					&lt;td&gt;测试对象&lt;/td&gt;
					&lt;td&gt;合法 URL 成功，篡改编码失败&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D12&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;方法限制&lt;/td&gt;
					&lt;td&gt;POST/PUT/DELETE&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403/405&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;D13&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;函数指标&lt;/td&gt;
					&lt;td&gt;指标页面&lt;/td&gt;
					&lt;td&gt;无持续脚本错误或 CPU 超限&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl.exe -I &lt;span style="color:#e6db74"&gt;&amp;#34;https://reader-file.fcana.com/bookshelf-prod/books/preflight/a&lt;/span&gt;%2&lt;span style="color:#e6db74"&gt;0b-&lt;/span&gt;%E4%&lt;span style="color:#e6db74"&gt;B8&lt;/span&gt;%AD%&lt;span style="color:#e6db74"&gt;E6&lt;/span&gt;%9&lt;span style="color:#e6db74"&gt;6&lt;/span&gt;%8&lt;span style="color:#e6db74"&gt;7.epub&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;必须返回 &lt;code&gt;403&lt;/code&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="e-esa-缓存"&gt;E. ESA 缓存
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;E01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;文件缓存规则&lt;/td&gt;
					&lt;td&gt;查看规则&lt;/td&gt;
					&lt;td&gt;只匹配文件域名的 books/covers&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Cache Key 忽略 &lt;code&gt;exp&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;查看规则&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;exp&lt;/code&gt; 不参与 Cache Key&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Cache Key 忽略 &lt;code&gt;sig&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;查看规则&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sig&lt;/code&gt; 不参与 Cache Key&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;无全局参数冲突&lt;/td&gt;
					&lt;td&gt;查看全局设置&lt;/td&gt;
					&lt;td&gt;未开启冲突的全站忽略 query&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E05&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;首次请求&lt;/td&gt;
					&lt;td&gt;合法 URL A&lt;/td&gt;
					&lt;td&gt;MISS 或首次回源&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E06&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;第二次请求&lt;/td&gt;
					&lt;td&gt;同路径合法 URL B&lt;/td&gt;
					&lt;td&gt;HIT 或 &lt;code&gt;Age&lt;/code&gt; 增加&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E07&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;HIT 后仍验签&lt;/td&gt;
					&lt;td&gt;错误签名访问已缓存对象&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E08&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;错误响应不长缓存&lt;/td&gt;
					&lt;td&gt;先错后对&lt;/td&gt;
					&lt;td&gt;合法请求不持续命中旧 403/404&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E09&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;TTL&lt;/td&gt;
					&lt;td&gt;查看规则&lt;/td&gt;
					&lt;td&gt;不可变 hash 路径可长缓存&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E10&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;刷新流程&lt;/td&gt;
					&lt;td&gt;刷新测试对象&lt;/td&gt;
					&lt;td&gt;能正确清除对应缓存&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最关键的三步：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;合法 URL A -&amp;gt; MISS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;合法 URL B（同路径、不同 exp/sig）-&amp;gt; HIT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;错误签名 URL -&amp;gt; 403
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;错误签名得到 &lt;code&gt;200&lt;/code&gt; 时立即停止上线。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="f-range-与大文件"&gt;F. Range 与大文件
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;F01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Range&lt;/td&gt;
					&lt;td&gt;请求 0-1023&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;206 Partial Content&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Content-Range&lt;/td&gt;
					&lt;td&gt;看响应头&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;bytes 0-1023/总大小&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;Accept-Ranges&lt;/td&gt;
					&lt;td&gt;看响应头&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;bytes&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;文件大小&lt;/td&gt;
					&lt;td&gt;HEAD/完整下载&lt;/td&gt;
					&lt;td&gt;与 OSS 对象一致&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F05&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;Content-Type&lt;/td&gt;
					&lt;td&gt;看响应头&lt;/td&gt;
					&lt;td&gt;类型正确&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F06&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;文件名&lt;/td&gt;
					&lt;td&gt;实际下载&lt;/td&gt;
					&lt;td&gt;中文名可用，至少有 ASCII fallback&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F07&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;断点续传&lt;/td&gt;
					&lt;td&gt;中断后续传&lt;/td&gt;
					&lt;td&gt;不从头重新下载&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F08&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;不经 VPS&lt;/td&gt;
					&lt;td&gt;观察网卡&lt;/td&gt;
					&lt;td&gt;VPS 无文件主体流量&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl.exe -H &lt;span style="color:#e6db74"&gt;&amp;#34;Range: bytes=0-1023&amp;#34;&lt;/span&gt; -D - -o range-test.bin &lt;span style="color:#e6db74"&gt;&amp;#34;完整合法签名URL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="g-cors前端使用-fetchblob-时升为-p0"&gt;G. CORS（前端使用 fetch/Blob 时升为 P0）
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;G01&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;Allow-Origin&lt;/td&gt;
					&lt;td&gt;带 Origin 请求&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;https://reader.fcana.com&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;G02&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;Expose-Headers&lt;/td&gt;
					&lt;td&gt;看响应&lt;/td&gt;
					&lt;td&gt;暴露 Length、Range、Disposition 等&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;G03&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;Credentials&lt;/td&gt;
					&lt;td&gt;看响应&lt;/td&gt;
					&lt;td&gt;不依赖 Cookie 时不启用&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;G04&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;OPTIONS&lt;/td&gt;
					&lt;td&gt;预检请求&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200/204&lt;/code&gt; 或确认业务不触发预检&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;G05&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;浏览器实测&lt;/td&gt;
					&lt;td&gt;UI 点击下载&lt;/td&gt;
					&lt;td&gt;无 CORS 报错&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl.exe -I -H &lt;span style="color:#e6db74"&gt;&amp;#34;Origin: https://reader.fcana.com&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;完整合法签名URL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="h-旧-esa-规则迁移"&gt;H. 旧 ESA 规则迁移
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;H01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;新下载端点绕过缓存&lt;/td&gt;
					&lt;td&gt;请求两次&lt;/td&gt;
					&lt;td&gt;每次重新鉴权/签发&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;JSON/API 动态&lt;/td&gt;
					&lt;td&gt;查看规则&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/api/*&lt;/code&gt; 不共享缓存&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;OPDS 权限&lt;/td&gt;
					&lt;td&gt;两账号请求&lt;/td&gt;
					&lt;td&gt;内容按权限隔离&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;旧规则不抢先&lt;/td&gt;
					&lt;td&gt;检查顺序和 Host&lt;/td&gt;
					&lt;td&gt;新旧规则互不覆盖&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H05&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;旧 Authorization Cache Key&lt;/td&gt;
					&lt;td&gt;查看匹配范围&lt;/td&gt;
					&lt;td&gt;不作用于 &lt;code&gt;reader-file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H06&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;旧链路可回滚&lt;/td&gt;
					&lt;td&gt;保留配置&lt;/td&gt;
					&lt;td&gt;观察期内可切回&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H07&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;协议接口无 JS Challenge&lt;/td&gt;
					&lt;td&gt;Koodo/KOReader 实测&lt;/td&gt;
					&lt;td&gt;返回 XML/302，不返回 HTML&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H08&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;管理 API 未全放行&lt;/td&gt;
					&lt;td&gt;查看 WAF&lt;/td&gt;
					&lt;td&gt;仍有正常安全防护&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;H09&lt;/td&gt;
					&lt;td&gt;P2&lt;/td&gt;
					&lt;td&gt;清理旧规则&lt;/td&gt;
					&lt;td&gt;稳定后执行&lt;/td&gt;
					&lt;td&gt;删除旧下载缓存和 Koodo 白名单&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="i-端到端"&gt;I. 端到端
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;编号&lt;/th&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;检测方法&lt;/th&gt;
					&lt;th&gt;预期结果&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;I01&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;上书&lt;/td&gt;
					&lt;td&gt;上传测试 EPUB&lt;/td&gt;
					&lt;td&gt;任务成功、对象进入 OSS&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I02&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;JSON&lt;/td&gt;
					&lt;td&gt;请求 catalog&lt;/td&gt;
					&lt;td&gt;书目和下载入口正确&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I03&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;OPDS&lt;/td&gt;
					&lt;td&gt;客户端/curl&lt;/td&gt;
					&lt;td&gt;acquisition 指向新授权端点&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I04&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;UI&lt;/td&gt;
					&lt;td&gt;浏览器&lt;/td&gt;
					&lt;td&gt;封面、分类、下载正常&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I05&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;跳转链&lt;/td&gt;
					&lt;td&gt;点击下载&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;reader-data&lt;/code&gt; -&amp;gt; 302 -&amp;gt; &lt;code&gt;reader-file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I06&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;完整性&lt;/td&gt;
					&lt;td&gt;比较 hash/打开 EPUB&lt;/td&gt;
					&lt;td&gt;文件完整可读&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I07&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;权限隔离&lt;/td&gt;
					&lt;td&gt;无权限账号&lt;/td&gt;
					&lt;td&gt;UI/JSON/OPDS/下载均不可越权&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I08&lt;/td&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;隐藏/删除&lt;/td&gt;
					&lt;td&gt;隐藏书目后重试&lt;/td&gt;
					&lt;td&gt;新请求立即不可见；旧 URL 到期失效&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I09&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;客户端兼容&lt;/td&gt;
					&lt;td&gt;Koodo/KOReader&lt;/td&gt;
					&lt;td&gt;能下载、识别文件名和格式&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I10&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;移动端&lt;/td&gt;
					&lt;td&gt;手机浏览器&lt;/td&gt;
					&lt;td&gt;能下载或打开系统分享&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;I11&lt;/td&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;监控&lt;/td&gt;
					&lt;td&gt;下载大文件&lt;/td&gt;
					&lt;td&gt;ESA/OSS 有流量，VPS 无主体流量&lt;/td&gt;
					&lt;td&gt;☐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="j-go--no-go"&gt;J. Go / No-Go
&lt;/h2&gt;&lt;p&gt;以下任意一项出现，立即 No-Go：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☐ OSS 裸直链返回 &lt;code&gt;200&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;☐ &lt;code&gt;reader-file&lt;/code&gt; 无签名返回 &lt;code&gt;200&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;☐ 错误签名在缓存 HIT 后返回 &lt;code&gt;200&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;☐ OSS Key、CDN path、签名 path 不一致&lt;/li&gt;
&lt;li&gt;☐ 空格或中文路径发生双重编码&lt;/li&gt;
&lt;li&gt;☐ 服务端生成 OSS 原生预签名参数&lt;/li&gt;
&lt;li&gt;☐ 下载授权 302 被共享缓存&lt;/li&gt;
&lt;li&gt;☐ 无权限用户取得 &lt;code&gt;Location&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;☐ Range 不返回 &lt;code&gt;206&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;☐ 文件主体流量仍经过 VPS&lt;/li&gt;
&lt;li&gt;☐ Secret、AK、SK 出现在 Git、前端或日志&lt;/li&gt;
&lt;li&gt;☐ 新 ESA 规则被旧规则覆盖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;允许上线的条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☐ 所有 P0 通过&lt;/li&gt;
&lt;li&gt;☐ P1 失败项均有风险说明和处理日期&lt;/li&gt;
&lt;li&gt;☐ 已备份数据库、服务端配置和 ESA 规则&lt;/li&gt;
&lt;li&gt;☐ 已完成一份真实 EPUB 的完整端到端下载&lt;/li&gt;
&lt;li&gt;☐ 已完成“缓存 HIT 后错误签名仍 403”测试&lt;/li&gt;
&lt;li&gt;☐ 已记录回滚操作&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="k-推荐上线顺序"&gt;K. 推荐上线顺序
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. 备份旧配置
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. 上传测试对象
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3. 验证 OSS 裸直链 403
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4. 接入 reader-file 私有 OSS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5. 发布 HMAC 旁路函数
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;6. 验证无签名/错误/过期均 403
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7. Cache Key 忽略 exp 和 sig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;8. 验证 MISS -&amp;gt; HIT -&amp;gt; 错误签名仍 403
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;9. 验证 Range 206
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10. 服务端启用新 Storage Profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11. 上传真实测试刊物
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;12. 验证 JSON、OPDS、UI、302 和完整下载
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;13. 小范围切换
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;14. 观察至少 24 小时
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;15. 再清理旧 Koodo ESA 规则
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="l-回滚"&gt;L. 回滚
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. 暂停新上书
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. 下载入口切回旧端点
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3. 恢复旧 Storage Profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4. 保留 OSS 新对象，不批量删除
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5. 禁用 reader-file 函数路由
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;6. 恢复旧 ESA 规则
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7. 排查 prefix、编码、HMAC、Cache Key 和规则优先级
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;回滚时不要公开 Bucket，也不要为了临时可用而关闭 HMAC 后让文件域名裸奔。&lt;/p&gt;</description></item><item><title>UNC 01 - Briefly Intro</title><link>https://fcana.com/posts/unc-01-briefly-intro/</link><pubDate>Sat, 11 Jul 2026 19:31:00 +0800</pubDate><guid>https://fcana.com/posts/unc-01-briefly-intro/</guid><description>&lt;p&gt;&lt;em&gt;做跨境电商和B2B外贸，你平时去哪里找宏观选品数据？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;花几万块买行业研报？还是全凭经验盲猜？其实，全球最权威的进出口底层数据，联合国早就向全人类免费开放了，只是 90% 的人不知道怎么用。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这个系列，我们从零开始，从网页查询学习到 Python 自动化，以该数据库为蓝本建立你自己的分析体系。&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="1-un-comtrade-入门篇"&gt;1. UN Comtrade 入门篇
&lt;/h1&gt;&lt;h2 id="11什么是un-comtrade-"&gt;1.1什么是UN Comtrade ？
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;United Nations Commodity Trade Statistics Database，即联合国商品贸易统计数据库（本文后称UNC）是全球最全面的全球贸易数据平台，按产品和贸易伙伴汇总了详细的全球年度和月度贸易统计数据，供各国政府、学术界、研究机构和企业使用。
它汇集了全球近200个国家和地区的官方海关进出口统计数据，数据最早可追溯到1962年。所有的商品都通过国际标准的分类系统（在本文中，通常为HS编码*）进行分类。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="unc-是一个宏观市场分析工具对于b2c外贸而言它主要适合解决以下几类外贸问题"&gt;UNC 是一个宏观市场分析工具。对于B2C外贸而言，它主要适合解决以下几类外贸问题：
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A)	我的产品该卖给谁?&lt;/strong&gt; 通过输入你产品的 6 位 HS 编码，你可以查到产品的流动情况，包括进口国、出口国和贸易额。这也是这个系统最核心的用途。用这些数据我们即可回答一系列宏观问题，包括市场集中度，买卖方需求，或是寻找潜力市场。
&lt;strong&gt;B)	我面临哪些国家的竞争？&lt;/strong&gt; 通常来说即使是制造业大国，在某些产品的生产和运输上也敌不过某些小国（即所谓比较优势理论）。通过该平台，您可以查阅到主要的产品来源地、产品生产国的市场占有率，为你即将开展的商业行为作参考。
&lt;strong&gt;C)	当地市场的接受价格是多少？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;请注意：UNC不能、也不应该作为微观外贸的决策。它可以告知您“橡胶制品正在美洲热销”，但是它不能告诉您“我应该在 Amazon 平台销售剑匠零鼠标垫就一定能成功。” UNC最适合在外贸立项前期、制定年度出口战略、开拓新市场时使用。它能帮你从宏观层面指明方向，而具体的客户开发则需要配合其他工具（如海关提单数据、领英等）结合使用。&lt;/p&gt;
&lt;p&gt;对于学者或是希望进行宏观数据分析的读者而言，该数据库提供了丰富的国与国之间贸易数据。你可通过该网站数据把握全球产业链转移与宏观趋势，也可为微观决策做参考。有很多高级的数据分析方法可供您快速、自动化的达成以上目标。我们将在后续教程中逐步揭示。&lt;/p&gt;
&lt;h3 id="不过在开始之前我们要提到该数据库自身的一些局限性"&gt;不过，在开始之前，我们要提到该数据库自身的一些局限性：
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A)没有买家/卖家信息&lt;/strong&gt;：它是宏观统计数据，你查不到具体的进口商名字、出口商名字、联系方式或提单信息。如果你需要找具体的客户邮箱和公司名，需要购买商业化的海关提单数据。
&lt;strong&gt;B)存在数据滞后&lt;/strong&gt;：各国向联合国上报数据的速度不同。部分发达国家按月更新，但很多发展中国家的数据通常滞后几个月甚至一年（通常只能查到上一年的年度数据）。
&lt;strong&gt;C)HS编码的位数限制&lt;/strong&gt;：国际通用的 HS 编码只有6位是全球统一的。7位及以上的编码各国都不一样，因此在UNC上进行跨国比较时，最多只能精确到6位编码（这可能会导致产品大类稍微偏宽泛）。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;*注1：
为什么通常是HS？HS (Harmonized System 协调制度)是全球通用的海关商品编码。全球统一到前 6 位。
虽然在接下来的演示中还有按加工程度分类的SITC和按经济用途分类的BEC出现，SITC是按初级产品、工业制品两大项及下一级子项计算指数；BEC是顶层经济类别、最终用途、加工程度等维度划分商品并计算指数。但我们几乎不会用到这两项。在用到时，我们会加以详细说明。请读者留意。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>影单</title><link>https://fcana.com/posts/movie-history/</link><pubDate>Sat, 11 Jul 2026 19:27:53 +0800</pubDate><guid>https://fcana.com/posts/movie-history/</guid><description>&lt;h1 id="本页面简单记录一些我看过的电影电视剧"&gt;本页面简单记录一些我看过的电影、电视剧。
&lt;/h1&gt;&lt;h2 id="2026年"&gt;2026年
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;影片名&lt;/th&gt;
					&lt;th&gt;一句话剧情&lt;/th&gt;
					&lt;th&gt;观影时间&lt;/th&gt;
					&lt;th&gt;观影体验&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;龙猫&lt;/td&gt;
					&lt;td&gt;宫崎骏经典风味&lt;/td&gt;
					&lt;td&gt;2026.7.7,动车卧铺&lt;/td&gt;
					&lt;td&gt;经典老片😋😋爽之&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;泰迪熊(电视剧版两季)&lt;/td&gt;
					&lt;td&gt;真人版恶搞之家&lt;/td&gt;
					&lt;td&gt;2026.5-2026.7,陆陆续续看完的&lt;/td&gt;
					&lt;td&gt;爆米花剧，随便看看打发时间用的。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;泰迪熊2(电影)&lt;/td&gt;
					&lt;td&gt;本质打反派&lt;/td&gt;
					&lt;td&gt;2026.7.6，长沙&lt;/td&gt;
					&lt;td&gt;电影版的主人公 剧情 和电视剧版本的不一样，但是内核是没差的。看这个系列最好还是懂一些西方冷门梗。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>我的记账方法</title><link>https://fcana.com/posts/money-collective/</link><pubDate>Sat, 11 Jul 2026 18:01:59 +0800</pubDate><guid>https://fcana.com/posts/money-collective/</guid><description>&lt;p&gt;记账是人之常情，对穷人来说亦是如此。我从拿到第一笔零花钱的时候就开始思考怎么记账，之前甚至用过那种加锁的本子🧐，但是总是草草收场。&lt;/p&gt;
&lt;p&gt;后来我反思了一下造成这个问题的核心原因，我发现核心问题大概就是由于过于追求掌控欲，导致一切太麻烦了。&lt;/p&gt;
&lt;p&gt;人总是想记录自己的每一笔开支，从昨天买的柠檬水到百万房贷的利息。但事实上，大部分的生活开支并不会成为一个很严重的的问题，也即所谓“吃饭穷不了”。&lt;/p&gt;
&lt;p&gt;基于此，我和GPT 5.6激情探讨了一晚上，得到了以下这个最新的，（我个人认为）言之有理并且启动成本不高的记账方法。发布出来分享。&lt;/p&gt;
&lt;h1 id="收付实现制"&gt;收付实现制
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;收付实现制，又称“现收现付制”或“现金制”，是指收入在实际收到现金时确认，费用在实际支付现金时确认，不考虑相关经济业务是否应归属于本期。
其核心原则是：凡在本期实际收到或支付的款项，无论发生时间早晚或是否应由本期承担，均作为本期的收入和费用处理。 By Copilot&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;我们的记账方法，也正是基于这种思想实现的。这有助于解决一个生活中常见的痛点：你买的货币基金、理财、各种账户之间左手倒右手，要区分这些开支简直是太难了，因为在各类流水中都有所体现。所以我们假定以下公式：&lt;/p&gt;
&lt;p&gt;&lt;img alt="公式" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fcana.com/media/posts/2026/07/2026-07-11-money-collective-p18/ade28f441e29.webp"&gt;&lt;/p&gt;
&lt;p&gt;基于这一公式，每个月的全部净资产就很好统计了。&lt;/p&gt;
&lt;h1 id="地基环境搭建"&gt;地基环境搭建
&lt;/h1&gt;&lt;p&gt;首先打开一个空白Excel表格。先统计一下基本信息：&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片说明" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fcana.com/media/posts/2026/07/2026-07-11-money-collective-p18/95e3f6024a38.webp"&gt;&lt;/p&gt;
&lt;p&gt;再新建一个工作簿，整理一下刚性支出：&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片说明" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fcana.com/media/posts/2026/07/2026-07-11-money-collective-p18/153e9a1ac497.webp"&gt;&lt;/p&gt;
&lt;p&gt;再新建一个工作簿，整理一下每个月的基本状况：&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片说明" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fcana.com/media/posts/2026/07/2026-07-11-money-collective-p18/14cdcfa7eac9.webp"&gt;&lt;/p&gt;
&lt;p&gt;其中以下几列使用了公式：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;列&lt;/th&gt;
					&lt;th&gt;公式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;I2&lt;/td&gt;
					&lt;td&gt;=IF(COUNT(C2,G2)&amp;lt;2,&amp;quot;&amp;quot;,C2+SUM(D2:F2)-G2)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;J2&lt;/td&gt;
					&lt;td&gt;=IF(I2=&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,I2-N(H2))&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;K2&lt;/td&gt;
					&lt;td&gt;=IF(J2=&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,J2/DAY(EOMONTH(DATE(A2,B2,1),0)))&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;C3&lt;/td&gt;
					&lt;td&gt;=IF(G2=&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,G2)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;向下拖条，让Excel自动复制。完毕。结束了。&lt;/p&gt;
&lt;h1 id="每个月的实操怎么做"&gt;每个月的实操怎么做？
&lt;/h1&gt;&lt;p&gt;第一期输入一次月初资产，以后每个月调整E F G H四列数字就可以。&lt;/p&gt;
&lt;p&gt;场景1：当月出去旅游消费1000元。没有收入。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;月初&lt;/th&gt;
					&lt;th&gt;月末&lt;/th&gt;
					&lt;th&gt;非常态支出&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;10000&lt;/td&gt;
					&lt;td&gt;6000&lt;/td&gt;
					&lt;td&gt;1000&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;自动推算可以得到当月常态日均消费约100元，也已经是很高的级别。&lt;/p&gt;
&lt;p&gt;场景2：当月支付飞机票2000元，单位报销。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;月初&lt;/th&gt;
					&lt;th&gt;月末&lt;/th&gt;
					&lt;th&gt;外部额外流入&lt;/th&gt;
					&lt;th&gt;非常态支出&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;10000&lt;/td&gt;
					&lt;td&gt;8000&lt;/td&gt;
					&lt;td&gt;2000&lt;/td&gt;
					&lt;td&gt;2000&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;自动推算可以得到当月常态日均消费约64.52元，就已经像合理的方向发展了。&lt;/p&gt;
&lt;h1 id="小结"&gt;小结
&lt;/h1&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;</description></item><item><title>UN Comtrade 教程(3) - First EXCEL QUEUE</title><link>https://fcana.com/posts/un-comtrade-3-first-excel-queue/</link><pubDate>Fri, 10 Jul 2026 18:46:22 +0800</pubDate><guid>https://fcana.com/posts/un-comtrade-3-first-excel-queue/</guid><description>&lt;p&gt;&lt;em&gt;UN Comtrade系列的第三篇文章。前两篇文章我们回答了什么是UN Comtrade,怎么使用UN Comtrade进行第一次查询的问题，接下来是时候解答第三个问题了。&lt;strong&gt;我们要这些数据有什么用？应该怎么用？&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;本篇问题：如何使用EXCEL 读取UN Comtrade的首次查询&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="31-下载un-comtrade的第一个查询结果"&gt;3.1 下载UN Comtrade的第一个查询结果
&lt;/h2&gt;&lt;p&gt;在页面上点击Preview - Download,就可以下载到数据了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片说明" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fcana.com/media/posts/2026/06/2026-06-25-un-comtrade-3-first-excel-queue-p15/440a17fb3f88.webp"&gt;&lt;/p&gt;
&lt;p&gt;本文接下来将开始以此查询为基础，分析巴西向全世界出口咖啡豆的报告。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://fcana.com/media/posts/2026/06/2026-06-25-un-comtrade-3-first-excel-queue-p15/789f7bd0-example_data.xlsx" &gt;示范文件下载&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;就以这个示例查询结果来说，我们可以看到这样一些表头：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;typeCode	freqCode	refPeriodId	refYear	refMonth	period	reporterCode	reporterISO	reporterDesc	flowCode	flowDesc	partnerCode	partnerISO	partnerDesc	partner2Code	partner2ISO	partner2Desc	classificationCode	classificationSearchCode	isOriginalClassification	cmdCode	cmdDesc	aggrLevel	isLeaf	customsCode	customsDesc	mosCode	motCode	motDesc	qtyUnitCode	qtyUnitAbbr	qty	isQtyEstimated	altQtyUnitCode	altQtyUnitAbbr	altQty	isAltQtyEstimated	netWgt	isNetWgtEstimated	grossWgt	isGrossWgtEstimated	cifvalue	fobvalue	primaryValue	legacyEstimationFlag	isReported	isAggregate&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;我们接下来分层次拆解。&lt;/p&gt;
&lt;h3 id="312-精挑细选"&gt;3.1.2 精挑细选
&lt;/h3&gt;&lt;p&gt;本来这一部分我想先从“删”开始介绍各个表头含义的，但是后来我想到Excel中一个很好用的功能：数据透视表。我们接下来用几个实际的Case来阐释各主要列表的经济含义。总体来说：我们不删无用的，而是先挑选有用的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="数据透视表入口" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fcana.com/media/posts/2026/06/2026-06-25-un-comtrade-3-first-excel-queue-p15/cc1ae3c3ac48.webp"&gt;&lt;/p&gt;
&lt;p&gt;现在就有一张数据透视表了。问题在于，哪些是给人看的，哪些是给机器读的？&lt;/p&gt;
&lt;p&gt;这里有一个标准可供区分：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;以 Code 结尾的，通常是给机器或系统识别的数字代码（比如国家代码 156 代表中国）。
以 Desc (Description) 结尾的，是给人看的纯英文全称描述（比如 China）。
以 ISO 结尾的，是国际通用的 3 位字母缩写（比如 CHN），非常适合后期在地图报表上画图用。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>UNC 02 - First Attempt</title><link>https://fcana.com/posts/unc-02-first-attempt/</link><pubDate>Thu, 25 Jun 2026 15:49:18 +0800</pubDate><guid>https://fcana.com/posts/unc-02-first-attempt/</guid><description>&lt;h2 id="21-认识unc查询主界面"&gt;2.1 认识UNC查询主界面
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;工欲善其事，必先利其器。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;掌握以下这些查询术语，让你的数据查询之路如虎添翼。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;作为正式教程的第一部分，我们开始吧。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;作为全系列教程的第一课，相信不少人之前已经进入过 &lt;a class="link" href="https://comtradeplus.un.org/TradeFlow" target="_blank" rel="noopener"
 &gt;UNC的高级数据查询页面&lt;/a&gt; 。或许是误打误撞，或许是有意筹划，但大多数人第一时间进入这个页面，很显然会是一头雾水：&lt;strong&gt;我在看什么？我要干什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们接下来就来一步一步解决这些问题。&lt;/p&gt;
&lt;h2 id="21-认识unc查询主界面-1"&gt;2.1 认识UNC查询主界面
&lt;/h2&gt;&lt;p&gt;截至本文成稿，UNC主界面长这样：&lt;/p&gt;
&lt;p&gt;&lt;img alt="UNC主界面截图，(c)Myself, 2026-06" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fcana.com/media/posts/2026/06/2026-06-24-unc-02-trade-terms-p14/b5f8ceb5195b.webp"&gt;&lt;/p&gt;
&lt;p&gt;我们来一步一步拆解各项参数，帮助阅读此页面的读者完成第一次自主查询。相信我，很简单，读完本文后都能做到。
&lt;em&gt;如果你愿意的话，也可以打开一开始的页面一起做。&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="22-type-of-product商品种类"&gt;2.2 TYPE OF PRODUCT(商品种类)
&lt;/h2&gt;&lt;p&gt;正如我们一开始向大家展示的，商品种类(TYPE OF PRODUCT)有两种：&lt;strong&gt;商品贸易(Goods) 和 服务贸易(Service)。&lt;/strong&gt;
商品贸易和服务贸易适用完全不同的查询标准和查询参数。因此我们接下来将分为两个小节，向读者讲解完整的查询步骤，让大家完成自己的第一次查询。&lt;/p&gt;
&lt;h3 id="221-基于商品贸易的数据查询"&gt;2.2.1 基于商品贸易的数据查询
&lt;/h3&gt;&lt;p&gt;如果你想查询商品贸易数据，请跟随以下的步骤选择每一条参数。&lt;/p&gt;
&lt;h4 id="1frequency频率"&gt;1.Frequency(频率)
&lt;/h4&gt;&lt;p&gt;Annual(年度) / Monthly(月度)&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;知识穿透：
看宏观选大市场：选 Annual。年度数据最全、最准，适合做 3-5 年的趋势分析。
看淡旺季做备货：选 Monthly。但要注意，很多国家（尤其是发展中国家）的月度数据上报非常滞后，甚至缺失。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="2-classifications分类标准"&gt;2. Classifications（分类标准）
&lt;/h4&gt;&lt;p&gt;HS / SITC / BEC。
&amp;gt; 知识穿透：目前阶段，请锁定 HS。
&amp;gt; HS是全球通用的海关商品编码。全球统一到前 6 位。比如 090111 代表“未焙炒的咖啡豆”。
在国内出口报关用的前6位，和美国海关接收时看到的前6位是一模一样的。而后两位各个国家都不同。&lt;/p&gt;
&lt;h4 id="3hs-commodity-codes-hs代码"&gt;3.HS Commodity Codes (HS代码)
&lt;/h4&gt;
 &lt;blockquote&gt;
 &lt;p&gt;可以通过第三方网站查询HS编码。搜索引擎搜索&amp;quot;HS编码&amp;quot;即可。
依然请注意：&lt;strong&gt;前6位是一模一样的。而后两位各个国家都不同。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="4-periods-year-month"&gt;4. Periods (year, month)
&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;报告期限。需要注意，某些发展中国家上报数据可能会有缺失或延迟，这是正常现象。
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="5-reporterspartners和trade-flow三元组重中之重"&gt;&lt;strong&gt;5. Reporters、Partners和Trade Flow三元组&lt;/strong&gt;(重中之重)
&lt;/h4&gt;&lt;p&gt;Reporters，是指（报告国/申报国）；Partners是指（贸易伙伴国）；Trade Flow有两个方向我们举一个第一人称的例子来理解这个问题：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;现在中国向美国出口5公斤大米。
A.Reporter是中国，从中国的视角（第一人称）来看，我 向 美国 出口 5kg 大米。那么Partner就是美国，显而易见；Trade flow 就是Export.
B.但是你如果从美国的视角来看，进行一下视角转换呢？Reporter是美国， 中国 向 我 进口 5kg 大米。站在美国的视角来看，我的Partner就是中国了！显而易见此时Trade Flow就是Import.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="51高级玩法a商品贸易的镜像数据"&gt;&lt;strong&gt;5.1.高级玩法A&lt;/strong&gt;：商品贸易的镜像数据
&lt;/h4&gt;
 &lt;blockquote&gt;
 &lt;p&gt;以后我们用 Python 处理数据会发现，查法A和查法B的金额往往对不上（因为运费、关税、统计口径甚至虚报等原因）。查法B被称为查法A的 &lt;strong&gt;“镜像数据”&lt;/strong&gt; 。当某些国家（如战乱国）不主动上报数据（Reporter为空）时，我们就必须利用其他国家作为 Reporter 反向推导。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="6periods时间周期"&gt;6.Periods（时间周期）
&lt;/h4&gt;&lt;p&gt;你要查哪一年的数据？&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;知识穿透：可以多选。比如同时选中 2021, 2022, 2023。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="222-几条常见的坑点"&gt;2.2.2 几条常见的坑点
&lt;/h3&gt;&lt;h4 id="1world-与-all-的影分身之术数据无故翻倍之谜"&gt;1.World 与 All 的“影分身之术”（数据无故翻倍之谜）
&lt;/h4&gt;
 &lt;blockquote&gt;
 &lt;p&gt;你下载了一份中国对全球各国的出口数据，丢进 Excel 做数据透视表求和，或者放到 Power BI 里拉了一个柱状图。结果老板一看数字大怒：“中国去年的出口总额怎么可能比全球 GDP 还高？！”&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这主要是PARTNER参数造成的。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Partner = All，联合国会老老实实把中国对美国、对日本、对德国……等全球近 200 个国家的交易一行一行地全部给你拉出来。&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Partner = World（全球汇总计，代码为 W00）： 它是联合国帮你提前算好的一行 &lt;strong&gt;“总计数据”。它代表中国对全世界所有国家出口额的总和&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;最佳实践:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在 GUI 阶段&lt;/strong&gt;如果只想看宏观大数，Partner 就只选 World；如果要分析各个国家的排名，就选 All，千万不要在搜索框里把两个同时勾上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在数据清洗阶段&lt;/strong&gt;在 Excel 里，养成习惯第一步就把 Partner 列里的 World（或国家代码 W00）筛选并删除/隐藏；在 SQL 或 Power BI 里，写死一个过滤条件：WHERE Partner &amp;lt;&amp;gt; &amp;lsquo;World&amp;rsquo;。&lt;/p&gt;
&lt;h4 id="2不可名状的-2nd-partner不要瞎选all-和-world-依然致命"&gt;2.不可名状的 2nd Partner（不要瞎选，All 和 World 依然致命）
&lt;/h4&gt;&lt;p&gt;这其实是第一个坑的“变种”，但在处理更复杂的供应链溯源时极其致命。&lt;/p&gt;
&lt;p&gt;知识点穿透（什么是 2nd Partner）：
正常的贸易是 A国 卖给 B国。但有时存在“转口贸易”或“原产地追溯”。2nd Partner 通常指的是 &lt;strong&gt;“原产国”或“发货国”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;虽然初期不涉及，但有些人看着这个下拉框，强迫症发作，顺手就选了 All 或 World，觉得“反正是全选，数据更全”。&lt;/p&gt;
&lt;p&gt;一旦你在这里瞎选，你的数据维度会被瞬间打碎。&lt;/p&gt;
&lt;p&gt;如果你选了 Partner = USA 且 2nd Partner = All，你会发现原本一行“中国出口到美国”的数据，裂变成了几十行（因为这批货里可能包含了原产自不同国家的零部件）。&lt;/p&gt;
&lt;p&gt;更可怕的是，如果你在 2nd Partner 里混选了 All 和 World，再结合上面提到的求和翻倍问题，你的数据可能会变成原值的 3倍、4倍甚至错乱无穷大。&lt;/p&gt;
&lt;p&gt;最佳实践:&lt;strong&gt;只要不是为了专门研究复杂的原产地或转口贸易，2nd Partner 请坚决地保持默认的 World。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;纸上得来终觉浅，绝知此事要躬行。&lt;/p&gt;
&lt;p&gt;了解了基本参数和常见坑点后，请打开 UNC的主查询页面 ，尝试独立完成以下三个循序渐进的实战任务。这不仅能帮你巩固本章所学，更是为了接下来引入代码自动化查询打下坚实的业务逻辑基础。
任务一：经典跑通（商品贸易基础）&lt;/p&gt;
&lt;p&gt;背景：假设你是一家国内咖啡豆贸易商的数据分析师，老板想了解 2023 年中国向美国、德国、日本出口了多少“未焙炒的咖啡豆”。&lt;/p&gt;
&lt;p&gt;TYPE OF PRODUCT：Goods&lt;/p&gt;
&lt;p&gt;Frequency：Annual&lt;/p&gt;
&lt;p&gt;Periods：2023&lt;/p&gt;
&lt;p&gt;Reporter：China&lt;/p&gt;
&lt;p&gt;Partner：USA, Germany, Japan（防坑提示：这里请手动输入并勾选这三个国家，千万不要选 All 或 World）&lt;/p&gt;
&lt;p&gt;Trade Flow：Export&lt;/p&gt;
&lt;p&gt;HS Code：090111
🎯 验收标准：点击查询或下载数据后，你应该能看到清晰的 3 行核心数据，并且能够分别读出对这三个国家的 Trade Value (US$)（贸易额）和 Net Weight（净重）。&lt;/p&gt;
&lt;p&gt;任务二：视角转换（寻找“镜像数据”）&lt;/p&gt;
&lt;p&gt;背景：接着任务一，我们现在要用“镜像数据”来做个交叉验证，看看美国海关那边的统计口径和中国海关的数据差异有多大。&lt;/p&gt;
&lt;p&gt;参数修改：保持其他参数不变，但这次请将 Reporter 改为 USA，将 Partner 改为 China，并将 Trade Flow 改为 Import（进口）。&lt;/p&gt;
&lt;p&gt;思考题：这是美国视角的“从中国进口咖啡豆”。&lt;/p&gt;
&lt;p&gt;🎯 验收标准：对比一下任务二（美国报进口）和任务一（中国报出口）中，中美两国关于这批咖啡豆的 Trade Value (US$)。你会发现这两个数字并不完全相等。&lt;/p&gt;
&lt;p&gt;知识穿透：为什么对不上？因为通常出口国按照 FOB（离岸价）申报，进口国按照 CIF（到岸价，包含运费和保费）申报，外加在途时间跨年等因素。这就是真实商业世界的数据常态。&lt;/p&gt;
&lt;p&gt;任务三：虚拟出海（服务贸易初探）&lt;/p&gt;
&lt;p&gt;背景：你的朋友在做软件外包和游戏出海，想看看中国近两年在“IT与信息服务”领域的整体出海大盘数据。&lt;/p&gt;
&lt;p&gt;TYPE OF PRODUCT：切换为 Services&lt;/p&gt;
&lt;p&gt;Frequency：Annual（回忆一下，服务贸易没有月度数据）&lt;/p&gt;
&lt;p&gt;Periods：2022, 2023&lt;/p&gt;
&lt;p&gt;Reporter：China&lt;/p&gt;
&lt;p&gt;Partner：World（防坑提示：我们只看宏观大数，所以选 World 总计即可）&lt;/p&gt;
&lt;p&gt;Trade Flow：Export&lt;/p&gt;
&lt;p&gt;EBOPS分类：在搜索框中寻找 Telecommunications, computer, and information services 相关的选项。&lt;/p&gt;
&lt;p&gt;🎯 验收标准：成功拉出这两年的数据。请亲自观察一下数据表，确认 Net Weight 和 Qty 这几列是不是如同我们所说的，全都是空的？&lt;/p&gt;</description></item><item><title>更新规则</title><link>https://fcana.com/posts/update-rules/</link><pubDate>Mon, 22 Jun 2026 18:47:03 +0800</pubDate><guid>https://fcana.com/posts/update-rules/</guid><description>&lt;p&gt;更详细的更新打算。&lt;/p&gt;
&lt;h3 id="我准备集中每半年的更新计划到一个总集页面刷新时间是3月和9月"&gt;我准备集中每半年的更新*计划到一个总集页面，刷新时间是3月和9月。
&lt;/h3&gt;&lt;p&gt;取3和9一部分原因是按照春秋季学期（也是大部分人十几年的学生经验）来排布，不在年初不在年末，正好适合总结和复盘，进行中期调整；&lt;/p&gt;
&lt;h3 id="具体更新内容分三部分"&gt;具体更新内容分三部分：
&lt;/h3&gt;&lt;h4 id="a一个系列总集或是需要深度展开的内容"&gt;a.一个系列，总集，或是需要深度展开的内容。
&lt;/h4&gt;&lt;p&gt;一篇写不下，或可能随着时间发展滑移，所以需要动态更新；或者是固定时间更新的文章（虽然我说过可能不会这样做，但是万一呢）&lt;/p&gt;
&lt;h4 id="b由突然发生的事上文的碎片记录转化而来的感想"&gt;b.由突然发生的事（上文的碎片记录）转化而来的感想。
&lt;/h4&gt;&lt;p&gt;此类内容多为单篇拓展，可能较长也可能较短。但是品质是有保证的，还是那句话，绝不辜负大家的时间、精力和智商；&lt;/p&gt;
&lt;h4 id="c为服务于特定功能或目的临时加更的文章"&gt;c.为服务于特定功能或目的临时加更的文章。
&lt;/h4&gt;&lt;p&gt;这类文章随缘发。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;*:为什么是半年呢？我觉得按季度来总结过于琐碎了，何况有些比较大的项目可能一个季度真写不出一两篇；按年度又太长了，半年比较合理。&lt;/p&gt;

 &lt;/blockquote&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;/p&gt;</description></item><item><title>创刊号</title><link>https://fcana.com/posts/hello-world/</link><pubDate>Mon, 22 Jun 2026 15:28:47 +0800</pubDate><guid>https://fcana.com/posts/hello-world/</guid><description>&lt;h3 id="1合规全新启航"&gt;1.合规全新启航。
&lt;/h3&gt;&lt;p&gt;六年前我还是个未成年公民，缺乏各种KYC的要素，也就没能顺利完成国内的域名备案认证，只能用国外的github搭点服务器玩玩。稳定性不足。这次的架构选择了轻量付费、具有SLA保证的全新服务架构，且启用了备案域名，对国内访客友好，标志着网站运营走向长期规范化；&lt;/p&gt;
&lt;h3 id="2软件架构升级"&gt;2.软件架构升级。
&lt;/h3&gt;&lt;p&gt;以前选择博客架构起手就是wordpress或者什么静态的Gridia hosted on github pages,可玩性很高，可持续性不足。这次选择了Hugo+手码一套CI/CD部署工具，提高了在线稳定性，减少攻击暴露面，也让国内服务更可持续。&lt;/p&gt;
&lt;h3 id="3生产内容规划"&gt;3.生产内容规划。
&lt;/h3&gt;&lt;p&gt;以前博客抱着做着玩的心态来做，也就没有很认真的规划内容产出。现在相较于更常见的“我一定要多久更新一次”这种硬flag,新版架构我准备采用“schedule”，计划表更新周期，先有了灵感和选题之后再规划更新时间，以内容产出为计量单位而不是以时间作为硬性的计量单位，呈现出来的效果大概就是“更新计划表”一类的东西。这个只是暂时的，可能后期还要进行规划调整。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;新架构，新产出，新收获。&amp;ldquo;新&amp;quot;博客，我们来了。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>