<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on 知</title><link>https://k.fseasy.top/posts/</link><description>Recent content in Posts on 知</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>fseasy</copyright><lastBuildDate>Wed, 15 Apr 2026 07:09:42 +0800</lastBuildDate><atom:link href="https://k.fseasy.top/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>26-04</title><link>https://k.fseasy.top/p/26-04/</link><pubDate>Wed, 15 Apr 2026 07:09:42 +0800</pubDate><guid>https://k.fseasy.top/p/26-04/</guid><description>&lt;!-- 开始写作 --&gt;
&lt;h2 id="words"&gt;Words
&lt;/h2&gt;&lt;h3 id="disease"&gt;Disease
&lt;/h3&gt;&lt;p&gt;因为它中间的元音和辅音组合不太符合直觉。&lt;/p&gt;
&lt;p&gt;它的正确拼写是：Disease&lt;/p&gt;
&lt;p&gt;💡 记忆小窍门（拆解法）
你可以把它拆成两个你非常熟悉的单词，这样这辈子都不会拼错了：&lt;/p&gt;
&lt;p&gt;Dis + ease = Disease&lt;/p&gt;
&lt;p&gt;Ease: 意思是“舒服、安逸、轻松”（比如 at ease）。&lt;/p&gt;
&lt;p&gt;Dis-: 是一个否定前缀，表示“不、相反”。&lt;/p&gt;
&lt;p&gt;Disease: 字面意思就是**“不舒服、不轻松”**。&lt;/p&gt;
&lt;h3 id="itinerary"&gt;Itinerary
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;词根记忆法（最科学）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它的核心词根是 &amp;ldquo;it-&amp;quot;，在拉丁语中表示 &amp;ldquo;go&amp;rdquo;（走）。&lt;/p&gt;
&lt;p&gt;it- (走) + -iner- (路径) + -ary (形容词/名词后缀)&lt;/p&gt;
&lt;p&gt;联想： 既然是“走”出来的“路径”，自然就是“行程”。&lt;/p&gt;
&lt;p&gt;相关词： Exit（ex 出 + it 走 = 出口）。记住 Exit 里的 it，就能记住 Itinerary 的开头。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拼写避坑指南&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个词最容易写错的地方是中间的 &amp;ldquo;ne&amp;rdquo; 和 &amp;ldquo;ra&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;口诀记忆： &amp;ldquo;I-tine-rary&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;想象你在 Tina（一个常见的女生名）的家里规划 Rary（想象成路经）。&lt;/p&gt;
&lt;h2 id="ventilation"&gt;Ventilation
&lt;/h2&gt;&lt;p&gt;记忆小窍门
你可以通过单词的来源来记忆，它和“风”以及“扇子”有关：&lt;/p&gt;
&lt;p&gt;Vent (通风口/出口)：这是核心词根。比如电脑主机的散热口就叫 vent。&lt;/p&gt;
&lt;p&gt;-ila-：联想 iluminating（启发）或者类似的小音节。&lt;/p&gt;
&lt;p&gt;-tion：名词后缀，表示一个动作或状态。&lt;/p&gt;
&lt;p&gt;拆解记忆：Vent + i + la + tion&lt;/p&gt;</description></item><item><title>26-03</title><link>https://k.fseasy.top/p/26-03/</link><pubDate>Thu, 19 Mar 2026 10:34:33 +0800</pubDate><guid>https://k.fseasy.top/p/26-03/</guid><description>&lt;!-- 开始写作 --&gt;
&lt;h2 id="translation"&gt;Translation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Well, it actually IS pretty cool. If you run it with Claude&amp;hellip;and as the banana briber said, it&amp;rsquo;s outright laughable what can be spent on API fees, because, well yeah, I chuckled out the bucks.&lt;/p&gt;
&lt;p&gt;这玩意儿配合 Claude 模型用起来确实牛，但那 API 费用也贵得离谱，我是一边苦笑一边往外掏银子。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;&amp;hellip;and as the banana briber said&amp;rdquo; : 这里的 banana briber 可能是网友名字，也可能是 banana bribery (香蕉行贿者，来自香蕉共和国)，也可能指 nano banana.&lt;/p&gt;
&lt;p&gt;outright: ADJ 形容词完全的；彻底的；全部的 Outright means complete and total.&lt;/p&gt;
&lt;p&gt;laughable： 这里的 laughable 不是“好笑”，而是： 离谱到好笑 / 贵得夸张&lt;/p&gt;
&lt;p&gt;chuckle： an act of laughing quietly 低声轻笑；轻声地笑&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="words"&gt;Words
&lt;/h2&gt;&lt;h3 id="stall"&gt;stall
&lt;/h3&gt;&lt;p&gt;V-ERG 及物/不及物动词(使)(进程)暂停;(使)推后 If a process stalls, or if someone or something stalls it, the process stops but may continue at a later time.
2.VERB 动词拖延 If you stall, you try to avoid doing something until later.
.VERB 动词暂时阻止;把…拖住 If you stall someone, you prevent them from doing something until a later time.
V-ERG 及物/不及物动词(使)突然熄火 If a vehicle stalls or if you accidentally stall it, the engine stops suddenly.
N-COUNT 可数名词货摊;摊位;咨询台 A stall is a large table on which you put goods that you want to sell, or information that you want to give people.
6.N-PLURAL 复数名词(戏院、音乐厅的)正厅前排座位 The stalls in a theatre or concert hall are the seats on the ground floor directly in front of the stage.
7.N-COUNT 可数名词(淋浴间等房间里的)小分隔间 A stall is a small enclosed area in a room which is used for a particular purpose, for example a shower.&lt;/p&gt;
&lt;p&gt;context-sent: A larger buffer reduces CPU-side stalls and allows more work to be queued on a GPU. 更大的缓冲区可以减少 CPU 端的停顿，并允许向 GPU 排队更多的工作。 stall = 卡住 / 等待&lt;/p&gt;
&lt;h3 id="extraneous"&gt;extraneous
&lt;/h3&gt;&lt;p&gt;/ɪkˈstreɪniəs/ (formal)&lt;/p&gt;
&lt;p&gt;ADJ 形容词无关的；不必要的 Extraneous things are not relevant or essential to the situation you are involved in or the subject you are talking about.&lt;/p&gt;
&lt;p&gt;We ought not to bring in extraneous matters in trying to find a basis for a settlement&amp;hellip;&lt;/p&gt;
&lt;p&gt;我们努力寻求解决问题的基础时，不应该牵扯进无关的事情。&lt;/p&gt;
&lt;p&gt;I can choose to ignore these extraneous thoughts or certainly choose not to act on them.&lt;/p&gt;
&lt;p&gt;我可以选择无视这些无关的想法，当然也可以选择不按这些想法行事。&lt;/p&gt;
&lt;h3 id="conducive"&gt;conducive
&lt;/h3&gt;&lt;p&gt;A is conducive to B&lt;/p&gt;
&lt;p&gt;意思是：&lt;/p&gt;
&lt;p&gt;A 对 B 有利 / 有助于 B / 有助于发生 B&lt;/p&gt;
&lt;p&gt;However, if your runtime environment is not conducive to downloading weights during execution, you can refer to the following commands to manually download the model weights to a local directory&lt;/p&gt;
&lt;p&gt;“但是，如果你的运行环境不适合在程序执行过程中下载模型权重，你可以参考下面的命令，把模型权重手动下载到本地目录。”&lt;/p&gt;</description></item><item><title>英语学习 26-02</title><link>https://k.fseasy.top/p/en-learn-2602/</link><pubDate>Tue, 03 Feb 2026 07:37:22 +0800</pubDate><guid>https://k.fseasy.top/p/en-learn-2602/</guid><description>&lt;!-- 开始写作 --&gt;
&lt;h2 id="a-slop-survival-guide-0203-from-tldr-by-wealthsimple"&gt;a slop survival guide (02.03, from TLDR by Wealthsimple)
&lt;/h2&gt;&lt;p&gt;来自&lt;/p&gt;
&lt;p&gt;slop 原意是&amp;quot;猪食 / 泔水 / 稀烂难吃的东西&amp;quot;. 在现在的互联网语境里，常用来指 低质量、批量生成、没营养的信息或内容.
比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI 批量生成的水文&lt;/li&gt;
&lt;li&gt;clickbait 垃圾内容&lt;/li&gt;
&lt;li&gt;没深度、重复、凑字数的文章&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;都可能被骂成 AI slop / content slop&lt;/p&gt;
&lt;p&gt;合起来：&lt;/p&gt;
&lt;p&gt;a slop survival guide: &amp;ldquo;在垃圾内容泛滥环境下的生存指南&amp;rdquo;, 或者 信息垃圾时代的避雷手册&lt;/p&gt;
&lt;p&gt;Hard times for metal heads&lt;/p&gt;
&lt;p&gt;What a decade last week was! Gold and silver surged early — putting gold up 96% since this time last year and silver up 160%. The era of precious metals is here! The greenback is dead! Oh wait. Just kidding — on Friday gold and silver got absolutely clobbered. Speaking of clobbered: Bitcoin — which topped US$100,000 just over a year ago — remained in free fall, dropping below $78,000 by week’s end. And stocks? Halfway through earnings season, the markets have sent a clear message by splurging on anyone who makes hardware to power AI and hammering anyone who makes software that seems bound to get cannibalized by it. It’s hard to tell which is moving faster than normal: markets or market narratives. Either way, it’s a whirlwind.&lt;/p&gt;
&lt;h2 id="write-optimization"&gt;Write Optimization
&lt;/h2&gt;&lt;p&gt;[1] &lt;em&gt;DB input time must have tz info while [{value}] doesn&amp;rsquo;t have&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;建议 1： &amp;ldquo;The input time must have timezone information, but {value} does not.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;建议 2： &amp;ldquo;Database requires input time to have timezone information. {value} is missing the timezone.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;建议 3： &amp;ldquo;Input time should include timezone information. {value} has no timezone information.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;建议 4： &amp;ldquo;Time input must include timezone info. {value} lacks timezone information.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;建议 5： &amp;ldquo;&amp;ldquo;The time provided ({value}) is missing timezone information, but the database requires it.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;[2] &lt;em&gt;Don&amp;rsquo;t use &amp;amp;&amp;amp;, it will make the set -e work not as expected&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;make the set -e work not as expected&amp;rdquo;
这个结构虽然能懂，但：&lt;/p&gt;
&lt;p&gt;不够自然&lt;/p&gt;
&lt;p&gt;工程师更习惯用 behave unexpectedly / break behavior / interfere with behavior&lt;/p&gt;
&lt;p&gt;英语技术写作更偏好：&lt;/p&gt;
&lt;p&gt;as it can &amp;hellip;&lt;/p&gt;
&lt;p&gt;which may &amp;hellip;&lt;/p&gt;
&lt;p&gt;opt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoid using &amp;amp;&amp;amp;, as it can interfere with the expected behavior of set -e.&lt;/li&gt;
&lt;li&gt;Try not to use &amp;amp;&amp;amp; — it can break the expected behavior of set -e.&lt;/li&gt;
&lt;li&gt;Do not use &amp;amp;&amp;amp;, as it may cause set -e to behave unexpectedly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推荐模板： Avoid using X, as it can cause Y to behave unexpectedly.&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;Avoid using eval, as it can introduce security risks.&lt;/p&gt;
&lt;p&gt;Avoid using sudo pip, as it can break your system Python.&lt;/p&gt;
&lt;p&gt;Avoid using latest, as it can lead to non-reproducible builds.&lt;/p&gt;
&lt;h2 id="words"&gt;Words
&lt;/h2&gt;&lt;h3 id="coax"&gt;coax
&lt;/h3&gt;&lt;p&gt;coax 是一个非常地道、常用、而且在育儿语境里特别合适的词 👍
它的感觉正好介于「引导 / 哄 / 劝 / 诱导」之间，比 force 温和，比 encourage 更“有技巧”。&lt;/p&gt;
&lt;p&gt;一、coax 的核心含义&lt;/p&gt;
&lt;p&gt;coax = 通过温柔、耐心、示范、哄劝的方式，让对方做某事&lt;/p&gt;
&lt;p&gt;to persuade someone to do something gently and patiently&lt;/p&gt;
&lt;p&gt;中文最贴切的翻译：&lt;/p&gt;
&lt;p&gt;哄着、劝着、诱导着、慢慢引导&lt;/p&gt;
&lt;p&gt;它不包含强迫，而是：&lt;/p&gt;
&lt;p&gt;软的&lt;/p&gt;
&lt;p&gt;温柔的&lt;/p&gt;
&lt;p&gt;有技巧的&lt;/p&gt;
&lt;p&gt;有耐心的&lt;/p&gt;
&lt;p&gt;二、常用吗？&lt;/p&gt;
&lt;p&gt;非常常用，尤其在：&lt;/p&gt;
&lt;p&gt;育儿 👶&lt;/p&gt;
&lt;p&gt;教学 👩‍🏫&lt;/p&gt;
&lt;p&gt;说服、安抚 😌&lt;/p&gt;
&lt;p&gt;与小孩、动物互动 🐶&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;p&gt;coax a baby to eat&lt;/p&gt;
&lt;p&gt;coax a child into bed&lt;/p&gt;
&lt;p&gt;coax a toddler to drink water&lt;/p&gt;
&lt;p&gt;coax a cat out from under the bed&lt;/p&gt;
&lt;p&gt;👉 在“对小孩”的语境里，coax 比 persuade / convince 更自然。&lt;/p&gt;
&lt;p&gt;三、典型使用结构
1️⃣ coax sb to do sth（最常见）&lt;/p&gt;
&lt;p&gt;She coaxed the baby to drink some water.
她哄着宝宝喝了点水。&lt;/p&gt;
&lt;p&gt;He tried to coax his son to finish dinner.
他试着哄儿子把饭吃完。&lt;/p&gt;
&lt;p&gt;2️⃣ coax sb into doing sth（强调过程）&lt;/p&gt;
&lt;p&gt;She coaxed him into taking a nap.
她慢慢哄他去睡觉。&lt;/p&gt;
&lt;p&gt;3️⃣ gently / slowly / patiently + coax（常搭配）&lt;/p&gt;
&lt;p&gt;gently coax&lt;/p&gt;
&lt;p&gt;slowly coax&lt;/p&gt;
&lt;p&gt;patiently coax&lt;/p&gt;
&lt;h3 id="stealth"&gt;stealth
&lt;/h3&gt;&lt;p&gt;the fact of doing something in a quiet or secret way偷偷摸摸；不声张的活动；秘密行动&lt;/p&gt;
&lt;p&gt;context: &amp;ldquo;Big Pickle&amp;rdquo; is a specialized, &amp;ldquo;stealth&amp;rdquo; AI coding model currently available for free on the OpenCode Zen platform, often touted for its high-quality coding capabilities and agentic (task-automation) performance.&lt;/p&gt;
&lt;h3 id="tout"&gt;tout
&lt;/h3&gt;&lt;p&gt;/taʊt/&lt;/p&gt;
&lt;p&gt;to try to persuade people that somebody/something is important or valuable by praising them/it 标榜；吹捧；吹嘘&lt;/p&gt;
&lt;h3 id="cache-stampede--thundering-herd"&gt;Cache Stampede / Thundering Herd
&lt;/h3&gt;</description></item><item><title>Flutter Android build issue: Build was configured to prefer settings repositories over project repositories but repository 'injected_offline_android' was added by settings file 'settings.gradle.kts'</title><link>https://k.fseasy.top/p/26-0112-gradle-dynamic-plugin-conflict/</link><pubDate>Mon, 12 Jan 2026 13:30:20 +0800</pubDate><guid>https://k.fseasy.top/p/26-0112-gradle-dynamic-plugin-conflict/</guid><description>&lt;!-- 开始写作 --&gt;
&lt;h2 id="error"&gt;Error
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FAILURE: Build failed with an exception.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* Where:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Settings file &lt;span class="s1"&gt;&amp;#39;/home/fseasy/workspace/github/vox-echo/android/settings.gradle.kts&amp;#39;&lt;/span&gt; line: &lt;span class="m"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* What went wrong:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error resolving plugin &lt;span class="o"&gt;[&lt;/span&gt;id: &lt;span class="s1"&gt;&amp;#39;com.android.application&amp;#39;&lt;/span&gt;, version: &lt;span class="s1"&gt;&amp;#39;8.11.1&amp;#39;&lt;/span&gt;, apply: false&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; Build was configured to prefer settings repositories over project repositories but repository &lt;span class="s1"&gt;&amp;#39;injected_offline_android&amp;#39;&lt;/span&gt; was added by settings file &lt;span class="s1"&gt;&amp;#39;settings.gradle.kts&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="solve-log"&gt;Solve Log
&lt;/h2&gt;&lt;p&gt;折腾了一天，ChatGPT、 Android Studio 和千问轮番指导，都是不行。在这种 hard 模式下，LLM 前后逻辑矛盾，气得骂人。
我尝试脱离这个项目，创建了官方 sample 项目，结果还是报这个错误——我就奇怪了，如果真是 flutter 的问题，那不得是 P0 bug?
尝试搜索了下，发现一个 Issue 是说回退 gradlew 的版本，回到 8.1.1; 整啊，还换了 java 版本，最后发现又报了 file reference 的问题，
傻了。LLM 说还是版本问题，心凉。&lt;/p&gt;
&lt;p&gt;最后又去 flutter issues 里搜 ，&amp;ldquo;injected_offline_android&amp;rdquo; 这个一点都没有；&amp;quot; Build was configured to prefer settings repositories over project repositories&amp;quot; 这个还有比较新的——终于啊终于，找到了 &lt;a class="link" href="https://github.com/flutter/flutter/issues/174035" target="_blank" rel="noopener"
&gt;Android build fails if environment contains global repositories defined via allProjects.repositories &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;真正原因是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I found that build fails when system has global init.gradle file with repositories defined via allProjects.repositories (in our case we need it for other projects to be able to access internal Artifactory) due to the RepositoriesMode set to FAIL_ON_PROJECT_REPOS in flutter_tools package.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;总结下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;有一个全局的 init.gradle, 把当前项目 gradle 给做了 Inject 处理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flutter_tools&lt;/code&gt; 又设置了 RepositoriesMode 为 FAIL_ON_PROJECT_REPOS；导致我们在 setting.gradle.tks 里自己再设置，根本无效 （LLM就是说要设置这个！但是一直无效，原来是被这个工具预先给设置了）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解决方法，人家也说得很清楚:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have a work around that I do not like very much, but it does get me unblocked for the current moment. This is in &lt;code&gt;~/.gradle/init.gradle&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Check if this is a Flutter project
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;isFlutterProject&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;currentDir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gradle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startParameter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentDir&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user.dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;currentDirPathLowerCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;absolutePath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentDirPathLowerCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;flutter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;currentDirPathLowerCase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;android&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;isFlutterProject&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Skip allprojects repository configuration for Flutter projects
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!is&lt;/span&gt;&lt;span class="n"&gt;FlutterProject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;allprojects&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;我就去我的 &lt;code&gt;~/.gradle/&lt;/code&gt; 下去看，还真有个,在 &lt;code&gt;~/.gradle/init.d/offline.gradle&lt;/code&gt;, 内容是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-4"&gt;&lt;a class="lnlinks" href="#hl-2-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-5"&gt;&lt;a class="lnlinks" href="#hl-2-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-6"&gt;&lt;a class="lnlinks" href="#hl-2-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-7"&gt;&lt;a class="lnlinks" href="#hl-2-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-8"&gt;&lt;a class="lnlinks" href="#hl-2-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-9"&gt;&lt;a class="lnlinks" href="#hl-2-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-10"&gt;&lt;a class="lnlinks" href="#hl-2-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="hl"&gt;&lt;span class="lnt" id="hl-2-11"&gt;&lt;a class="lnlinks" href="#hl-2-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="lnt" id="hl-2-12"&gt;&lt;a class="lnlinks" href="#hl-2-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-13"&gt;&lt;a class="lnlinks" href="#hl-2-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-14"&gt;&lt;a class="lnlinks" href="#hl-2-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-15"&gt;&lt;a class="lnlinks" href="#hl-2-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-16"&gt;&lt;a class="lnlinks" href="#hl-2-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-17"&gt;&lt;a class="lnlinks" href="#hl-2-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-18"&gt;&lt;a class="lnlinks" href="#hl-2-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-19"&gt;&lt;a class="lnlinks" href="#hl-2-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class="hl"&gt;&lt;span class="lnt" id="hl-2-20"&gt;&lt;a class="lnlinks" href="#hl-2-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="lnt" id="hl-2-21"&gt;&lt;a class="lnlinks" href="#hl-2-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-22"&gt;&lt;a class="lnlinks" href="#hl-2-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-23"&gt;&lt;a class="lnlinks" href="#hl-2-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-24"&gt;&lt;a class="lnlinks" href="#hl-2-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-25"&gt;&lt;a class="lnlinks" href="#hl-2-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;reposDir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.android/manual-offline-m2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;reposDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eachDir&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;allprojects&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;buildscript&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;maven&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;injected_offline_&lt;/span&gt;&lt;span class="si"&gt;${repo.name}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toURI&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;toURL&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;maven&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;injected_offline_&lt;/span&gt;&lt;span class="si"&gt;${repo.name}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toURI&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;toURL&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;好哇好哇，原来如此——这个 &lt;code&gt;injected_offline_android&lt;/code&gt; 果然是你给插进去的——想起之前 LLM 说去 Android Studio 里关掉 offline, 还是有道理的！
只是我也关了，却没用——这里看来根本没有修改这个 config 啊。&lt;/p&gt;
&lt;p&gt;然后我想，就这 1 个 issue 报错，说明这个不是共性问题，而是我自己机器的问题啊？&lt;/p&gt;
&lt;p&gt;看了下这个文件，原来是 2021 年就创建的？？真是时间的玫瑰，现在给绽放了。gradle 不知道迭代多少轮了，这中动态 inject 的，早就被抛弃了吧……
得，可算知道原因了，也不用写 if 了，直接给你删掉吧。&lt;/p&gt;
&lt;p&gt;重新编译，这个 &lt;code&gt;injected_offline&lt;/code&gt; 报错没了，但还是报了别的错——可能是我现在环境搞乱了（之前还装了 fvm 来降级 flutter）。得，回滚环境吧！
于是 fvm 准备装最新的——装的过程中，我手贱又开了 vscode，打开 flutter 插件就开始自动更新啥的——反正一会儿鼠标就动不了了。
可恶，又被这个系统恶心到了。&lt;/p&gt;
&lt;p&gt;直接强制关机，明日再战吧。&lt;/p&gt;
&lt;p&gt;次日重置环境，发现 fvm 安装的环境并不能改变全局的 flutter ——那我还要你干嘛——直接卸载了 fvm；
项目里删掉 android 重新 create, 结果发现下了好多 android sdk 的问题——估计是 java 版本问题？
忘了切回来了——赶紧改了 flutter jdk home, 指向了 Android sdk 用的 jdk, 再次编译。
怎么着——不到1分钟，apk就出来了。&lt;/p&gt;
&lt;p&gt;哎——如此丝滑的流程，硬是被我搞了这么久。&lt;/p&gt;
&lt;h2 id="经验总结"&gt;经验总结
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;gradle 这个报错太不清楚了——就说 &amp;lsquo;injected_offline_android&amp;rsquo; was added by settings file &amp;lsquo;settings.gradle.kts&amp;rsquo;**——但是我这个 settings.gradle.kts 根本没有这个啊？作为新手，完全不知道它会被 home 目录的 gradle 给控制——或者说，控制没关系，你倒是把报错信息搞得更指向清楚些啊。第一个锅，扣你头上。&lt;/li&gt;
&lt;li&gt;LLM: 其实都说到了核心问题，只是——它也不知道 gradle、flutter 的机制，所以来回倒腾，解决不了问题。还让人觉得跟它对话太愚蠢！&lt;/li&gt;
&lt;li&gt;自己好浮躁：其实看几个 issue 就可以快速解决的。自己太依赖 LLM 了，对 issue 这种交互式、信息密度低的，缺乏耐心。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;LLM 出来的结果，只能解决老旧问题、解决不了新问题。减少对它的依赖，老老实实搜 issue 更好！&lt;/p&gt;</description></item><item><title>#005 IT 热点速递 | Chatterbox TTS Turbo, Sopro TTS, 嵌入式框架 Embassy</title><link>https://k.fseasy.top/p/itsen-005-chatterbox-turbo/</link><pubDate>Fri, 09 Jan 2026 10:37:59 +0800</pubDate><guid>https://k.fseasy.top/p/itsen-005-chatterbox-turbo/</guid><description>&lt;p&gt;Hi, 各位读者朋友，欢迎回到 FS IT&amp;rsquo;s English Channel. 这是我们的第 5 期内容。&lt;/p&gt;
&lt;p&gt;本期我们来看 2 个 TTS 项目介绍和一个基于 Rust 的嵌入式框架。&lt;/p&gt;
&lt;h2 id="chatterbox-tts-turbo"&gt;Chatterbox TTS Turbo
&lt;/h2&gt;&lt;p&gt;Made with ♥️ by RESEMBLE.AI.&lt;/p&gt;
&lt;p&gt;github 地址：https://github.com/resemble-ai/chatterbox
HF 地址: &lt;a class="link" href="https://huggingface.co/spaces/ResembleAI/chatterbox-turbo-demo" target="_blank" rel="noopener"
&gt;https://huggingface.co/spaces/ResembleAI/chatterbox-turbo-demo&lt;/a&gt; (model-scope 上也可以找到，方便下载 model)&lt;/p&gt;
&lt;p&gt;关注到这个是因为前段时间（所以这个也没有“速递”了 :)）看到的 tweet:&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;This is the DeepSeek moment for Voice AI.&lt;/p&gt;
&lt;p&gt;Chatterbox Turbo is an MIT-licensed voice model that beats ElevenLabs Turbo &amp;amp; Cartesia Sonic 3!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;150ms time-to-first-sound&lt;/li&gt;
&lt;li&gt;Voice cloning from just 5-second audio&lt;/li&gt;
&lt;li&gt;Paralinguistic tags for real human expression&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;100% open-source.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;这里的 &lt;em&gt;Paralinguistic&lt;/em&gt;, 词典解释是 relating to communication through ways other than words, for example tone of voice, expressions on your face and actions，就是用来控制语调、语速、发声质量等的标记，如 &lt;code&gt;[laugh]&lt;/code&gt;, &lt;code&gt;[cough]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;这里介绍的是新发的 Turbo model，参数量 350M, 仅支持 English. Chatterbox-TTS 其实已经发布很久了（至少8个月），看下 Github 的描述：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;Chatterbox is a family of three state-of-the-art, open-source text-to-speech models by Resemble AI.&lt;/p&gt;
&lt;p&gt;We are excited to introduce Chatterbox-Turbo, our most efficient model yet. Built on a streamlined 350M parameter architecture, Turbo delivers high-quality speech with less compute and VRAM than our previous models. We have also distilled the speech-token-to-mel decoder, previously a bottleneck, reducing generation from 10 steps to just one, while retaining high-fidelity audio output.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;单词 &lt;em&gt;retain&lt;/em&gt;, To retain something means to continue to have that thing, 保留、保持，比较正式的一个词。看下面几个例句：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; retain 例句
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The interior of the shop still retains a nineteenth-century atmosphere.&lt;/p&gt;
&lt;p&gt;这家商店的内部装修仍然保留着19世纪的风格。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If left covered in a warm place, this rice will retain its heat for a good hour.&lt;/p&gt;
&lt;p&gt;如果加盖放在暖和的地方，这些米饭可以保温足足一个小时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;我自己跑了下这个 model, 模型下载下来一共 3.8G; 在我的 3060 12G 上可以跑起来，速度也还可以接受。需要一个 clone 音源，我拿之前 kokoro 的音频作为音源，跑了下结果，可以听下对比：&lt;/p&gt;
&lt;p&gt;Kokoro Output:&lt;/p&gt;
&lt;audio controls&gt;
&lt;source src="sage-kokoro.m4a" type="audio/mp4"&gt;
Your browser does not support the audio element.
&lt;/audio&gt;
&lt;p&gt;ChatterTTS Turbo&lt;/p&gt;
&lt;audio controls&gt;
&lt;source src="sage-chatterbox-turbo.m4a" type="audio/mp4"&gt;
Your browser does not support the audio element.
&lt;/audio&gt;
&lt;p&gt;这个例子来看，Chatterbox Turbo 效果不太好——主要体现在音质比较差。或许还是拿 TTS 的音频去做 clone 音源的问题。我之前测试它的 Demo，感觉它的结果更自然点，特别是配合上 paralinguistic tag, 不过在我这个设置下，确实没啥优势。&lt;/p&gt;
&lt;h2 id="sopro-tts"&gt;Sopro TTS
&lt;/h2&gt;&lt;p&gt;葡萄牙的一个个人开发者作品。Github 地址 &lt;a class="link" href="https://github.com/samuel-vitorino/sopro" target="_blank" rel="noopener"
&gt;https://github.com/samuel-vitorino/sopro&lt;/a&gt;&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;Sopro (from the Portuguese word for &amp;ldquo;breath/blow&amp;rdquo;) is a lightweight English text-to-speech model I trained as a side project. Sopro is composed of dilated convs (à la WaveNet) and lightweight cross-attention layers, instead of the common Transformer architecture. Even though Sopro is not SOTA across most voices and situations, I still think it&amp;rsquo;s a cool project made with a very low budget (trained on a single L40S GPU), and it can be improved with better data.&lt;/p&gt;
&lt;p&gt;Some of the main features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;169M parameters&lt;/li&gt;
&lt;li&gt;Streaming&lt;/li&gt;
&lt;li&gt;Zero-shot voice cloning&lt;/li&gt;
&lt;li&gt;0.25 RTF on CPU (measured on an M3 base model), meaning it generates 30 seconds of audio in 7.5 seconds&lt;/li&gt;
&lt;li&gt;3-12 seconds of reference audio for voice cloning&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;这个有点奇怪，听 demo 音频显然音质是很差的，但是 Hacker News 上倒是挺多赞的。
所以有一条评论是质疑的：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;I don&amp;rsquo;t understand the comments here at all. I played the audio and it sounds absolutely horrible, far worse than computer voices sounded fifteen years ago. Not even the most feeble minded person would mistake that as a human. Am I not hearing the same thing everyone else is hearing? It sounds straight up corrupted to me. Tested in different browsers, no difference.&lt;/p&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
feeble
&lt;/section&gt;
&lt;p&gt;If you describe someone or something as feeble, you mean that they are weak.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; feeble 例句
&lt;ul&gt;
&lt;li&gt;He&amp;rsquo;s a bit feeble nowadays.&lt;/li&gt;
&lt;li&gt;a feeble old man.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;feeble minded 字面指心智虚弱，也即愚蠢、智力极低的，是一个有点冒犯性的词语。&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
mistake A as/for B
&lt;/section&gt;
&lt;p&gt;If you mistake A as B, you wrongly believe that A is B, or think that A and B are the same thing.&lt;/p&gt;
&lt;p&gt;常见变体：mistake A for B（更常用、更自然）&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; mistake A as/for B 例句
&lt;ul&gt;
&lt;li&gt;I mistook him as a tourist because of his accent.&lt;/li&gt;
&lt;li&gt;From a distance, the object could easily be mistaken as a person.&lt;/li&gt;
&lt;li&gt;She was mistaken for someone else at the conference.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;也许 Hacker News 上也有软文推广吧。不过这个项目确实还挺有意思的——对机器资源有限又想要训练一个 TTS 的朋友，可以参考看看。&lt;/p&gt;
&lt;h2 id="embassy"&gt;Embassy
&lt;/h2&gt;&lt;p&gt;项目地址：https://github.com/embassy-rs/embassy&lt;/p&gt;
&lt;p&gt;一个用来写嵌入式程序的框架。对此方向不是特别了解，ChatGPT 介绍背景如下：&lt;/p&gt;
&lt;p&gt;Embassy programs are compiled into firmware and flashed directly onto microcontrollers. There is no operating system — the code runs on bare metal, and Embassy provides its own async executor to schedule tasks after power-on.&lt;/p&gt;
&lt;p&gt;基于 Rust + Async 来开发。&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;The Rust programming language is blazingly fast and memory-efficient, with no runtime, garbage collector, or OS. It catches a wide variety of bugs at compile time, thanks to its full memory- and thread-safety, and expressive type system.&lt;/p&gt;
&lt;p&gt;Rust&amp;rsquo;s async/await allows for unprecedentedly easy and efficient multitasking in embedded systems. Tasks get transformed at compile time into state machines that get run cooperatively. It requires no dynamic memory allocation and runs on a single stack, so no per-task stack size tuning is required. It obsoletes the need for a traditional RTOS with kernel context switching, and is faster and smaller than one!&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;blazingly: blazingly is used to emphasize that something is extremely intense or impressive, especially in informal or technical contexts.&lt;/p&gt;
&lt;p&gt;unprecedentedly: Unprecedentedly is used to say that something happens in a way or to an extent that has never happened before. 前所未有的&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
obsolete
&lt;/section&gt;
&lt;p&gt;/ˌɑːbsəˈliːt/，注意是 &lt;code&gt;iː&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;传统词典里只有形容词用法，Something that is obsolete is no longer needed because something better has been invented. 这里是动词，To obsolete something means to cause it to become outdated or unnecessary.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; obsolete 例句
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Smartphones obsoleted standalone GPS devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The system was obsoleted by a more efficient alternative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With technological changes many traditional skills have become obsolete.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So much equipment becomes obsolete almost as soon as it&amp;rsquo;s made.&lt;/p&gt;
&lt;p&gt;这么多设备几乎一生产出来就要被淘汰。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;有相关需求的朋友可以看看这个，依赖简单，看起来编译好刷到固件里就可以用了。&lt;/p&gt;
&lt;h2 id="end"&gt;End
&lt;/h2&gt;&lt;p&gt;好啦，这就是本期的内容啦。我们在继续缩减投入量，所以现在就不放 TTS 音频了。&lt;/p&gt;
&lt;p&gt;但是更新还是会继续的，所以 stay tuned for updates!&lt;/p&gt;</description></item><item><title>#004 IT 热点速递 | Mockito TimvdLippe: Stepping down as maintainer after 10 years</title><link>https://k.fseasy.top/p/itsen-004-mockito-timvdlippe/</link><pubDate>Mon, 29 Dec 2025 22:37:59 +0800</pubDate><guid>https://k.fseasy.top/p/itsen-004-mockito-timvdlippe/</guid><description>&lt;p&gt;Hi, 各位读者朋友，欢迎回到 FS IT&amp;rsquo;s English Channel. 这是我们的第 4 期内容。&lt;/p&gt;
&lt;p&gt;今天我们摘录部分 Mockito (&amp;ldquo;The most popular mocking framework for Java&amp;rdquo;) 核心维护者 TimvdLippe 宣布卸任的原文，
学习下当我们要选择离开某个职位时，该如何贴切表达吧 :)&lt;/p&gt;
&lt;p&gt;source：&lt;a class="link" href="https://github.com/mockito/mockito/issues/3777" target="_blank" rel="noopener"
&gt;Stepping down as maintainer after 10 years&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="stepping-down-as-maintainer-after-10-years"&gt;Stepping down as maintainer after 10 years
&lt;/h2&gt;&lt;p&gt;首先我们看下短语&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; Step down
&lt;/section&gt;
&lt;p&gt;If someone steps down, they leave an important job or position, especially one of responsibility.&lt;/p&gt;
&lt;p&gt;“辞去某个职位，卸任”。常用于主动让位、平稳交接的语境。反过来，step up 就是指上任、承担更重要职责。&lt;/p&gt;
&lt;p&gt;step down 后面常用介词 as 或者 from，as 后面常接具体的身份/角色；from 后面除了接职位，还可以是组织等。&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; Step down 例句
&lt;ul&gt;
&lt;li&gt;The CEO stepped down after ten years in charge.&lt;/li&gt;
&lt;li&gt;She announced that she would step down as project lead at the end of March.&lt;/li&gt;
&lt;li&gt;He stepped down from leadership after the transition.&lt;/li&gt;
&lt;li&gt;After the scandal, the minister was forced to step down from office. (scandal, 丑闻)&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;接下来看正文，首先是离任的声明。&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;In March 2026, I will be Mockito maintainer for 10 years (nearly a third of my whole life). Looking ahead, I decided that a decade milestone is a good moment to pass on maintainership to other folks. In the coming months until March, I will spend time ensuring a smooth transition in maintainership.&lt;/p&gt;
&lt;p&gt;In this issue I list several considerations why I made the decision. Communication and discussion of plans for future maintainership will be somewhere else, most likely in a separate GitHub issue. Stay tuned for that.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;关注 2 个短语。&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; pass on A to B
&lt;/section&gt;
&lt;p&gt;If someone passes on something to another person, they give it to them so that the other person can take responsibility for it or continue with it.&lt;/p&gt;
&lt;p&gt;“交接”。另一个常用的表交接的词是 hand over；要做对比的话，可以认为 pass on A to B 强调传承这种略虚的东西; hand over 偏重具体的事情或者流程本身。看下面的例句：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; Pass on A to B 例句
&lt;ul&gt;
&lt;li&gt;After a decade, he chose to pass on the torch to the next maintainers.&lt;/li&gt;
&lt;li&gt;She felt it was time to pass on her knowledge to the next generation.&lt;/li&gt;
&lt;li&gt;The maintainer is preparing to hand over the codebase.&lt;/li&gt;
&lt;li&gt;The founder handed over control of the company to a new CEO.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;最后，注意 &amp;ldquo;pass on&amp;rdquo; 本身有“拒绝”的含义，如 I&amp;rsquo;ll pass on the offer (我不考虑这个提议).&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; Stay tuned
&lt;/section&gt;
&lt;p&gt;If you say stay tuned, you are telling people to continue watching, listening, or paying attention because more information will be given later.&lt;/p&gt;
&lt;p&gt;“敬请关注”，应用非常广泛的词语。看下面的例句是否很熟悉：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; Stay tuned 例句
&lt;ul&gt;
&lt;li&gt;More details will be announced soon — stay tuned.&lt;/li&gt;
&lt;li&gt;We’re working on the next release. Stay tuned for updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;h2 id="energy-drain-because-of-jvm-agent-change"&gt;Energy drain because of JVM agent change
&lt;/h2&gt;&lt;p&gt;上面 2 段 Tim 说了决定，接下来就将展开 3 点理由。限于篇幅，我们就摘第一点来看。&lt;/p&gt;
&lt;p&gt;在看第一点前，先补充下背景（据 ChatGPT）：
Mockito 主要用 ByteBuddy 库修改底层字节码来实现 Mock；但是 JVM 22 出于安全考量限制了普通包(artifact)的字节码修改能力；
要想实现之前的类似能力，必须得编译成 Agent 类型的包。但 JVM 对 Agent 类型的支持尚不足够完善，配套工具链也没有完全建立。
也就是说，Mockito 要适配这种变更，不得不去踩坑！&lt;/p&gt;
&lt;p&gt;基于此背景，我们先看第一点的前半部分：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;As you might know, Mockito 5 shipped a breaking change where its main artifact is now an agent. That&amp;rsquo;s because starting JVM 22, the previous so-called &amp;ldquo;dynamic attachment of agents&amp;rdquo; is put behind a flag. This change makes sense from a security point-of-view and I support it.&lt;/p&gt;
&lt;p&gt;However, the way this was put forward to Mockito maintainers was energy draining to say the least. Mockito is probably the biggest user of such an agent and is often looked at for inspiration by other projects. As such, Mockito often pioneers on supporting JVM features, built on a solid foundation with ByteBuddy. Modules was such a feature that took months of hard work by Rafael to figure out, including providing feedback to JVM maintainers.&lt;/p&gt;
&lt;p&gt;Unfortunately such a collaborative way of working was not the case when discussing agents. To me, it felt like the feature was presented as a done deal because of security. While dynamic attachment is problematic in many ways, no alternative solutions were proposed. That&amp;rsquo;s okay, as Mockito pioneers on these solutions, yet in this case I felt we were left alone.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;先看单词&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; drain
&lt;/section&gt;
&lt;p&gt;非常重要的一个单词。动词形式有排空、使耗尽的意思；名词形式有下水道、排水管、消耗的含义。这段里都是和 energy 搭配，用了 2 个形式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Energy drain: 做名词，消耗&lt;/li&gt;
&lt;li&gt;(be) energy draining，现在分词做形容词&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际上 energy drain 或者 energy-draining 都是一个固定搭配，An energy drain is something that makes you feel very tired, either physically or mentally, because it requires a lot of effort or causes stress.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; Energy drain / Energy-draining 例句
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Constant meetings have become a real energy drain.&lt;/p&gt;
&lt;p&gt;没完没了的会议成了真正的精力消耗。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maintaining the project alone was an energy drain over time.&lt;/p&gt;
&lt;p&gt;长期独自维护这个项目逐渐消耗了他的精力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The process was slow and energy-draining.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Long-term maintainership can be energy-draining.&lt;/p&gt;
&lt;p&gt;长期的维护工作可能非常耗费精力。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;再看下面这个句子：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the way this was put forward to Mockito maintainers was energy draining to say the least.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;句子核心是 the way was energy-draining, this was put forward to Mockito maintainers 是后置定语从句，修饰 the way, 省略了关系代词 that/in which.&lt;/p&gt;
&lt;p&gt;其中两个重点短语：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; put forward
&lt;/section&gt;
&lt;p&gt;提出、提议. 常见于技术提案、标准讨论等正式场景。 If someone puts forward an idea, suggestion, or plan, they formally suggest it for consideration or discussion.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; put forward 例句
&lt;ul&gt;
&lt;li&gt;She put forward a proposal to change the review process&lt;/li&gt;
&lt;li&gt;Several options were put forward during the discussion.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; to say the least
&lt;/section&gt;
&lt;p&gt;固定短语，“至少可以说”、“往轻了说”（实际更严重）。在这句话里是一个表语气的插入语，一般放在句子末尾，正式书面语境下前面会加一个 dash 或者逗号与主句隔开。
You use to say the least to emphasize that a statement is an understatement, and that the real situation is stronger or more extreme than you have said.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; to say the least 例句
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The last few months have been difficult, to say the least.&lt;/p&gt;
&lt;p&gt;最近几个月很困难——实际情况更糟。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running the project alone was demanding, to say the least.&lt;/p&gt;
&lt;p&gt;独自运行这个项目非常吃力——远不止如此。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;最后列出其他比较重要的短语：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;so-called: 所谓的&lt;/li&gt;
&lt;li&gt;make sense: 有道理（高频口语）&lt;/li&gt;
&lt;li&gt;pioneer: n, 先锋；v, 当开拓者&lt;/li&gt;
&lt;li&gt;a done deal: 已经板上钉钉的事 (比较口语化)。&lt;em&gt;Once the contract is signed, the promotion is a done deal. 合同一签，升职就板上钉钉了。&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;yet (in this case&amp;hellip;): 但是。转折显得克制但带失望——“按理说不该这样”；对比: but, 转折强度普通、中性；however, 正式、书面，偏理性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;继续看着点的后半段：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;My personal take is that folks involved with the change severely underestimated the societal impact that it had. The fact that proper build support is non-existent to this day shows that agents are not a priority. That&amp;rsquo;s okay if it isn&amp;rsquo;t a priority, but when it was communicated with Mockito I perceived it as &amp;ldquo;Mockito is holding the JVM ecosystem back by using dynamic attachment, please switch immediately and figure it out on your own&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Here, the fact that I (and others) are volunteers doing their best for the project, is important to understand the societal impact. When you put individuals under pressure, who do this work in their own time out of goodwill, things crumble. It&amp;rsquo;s commonly joked about with XKCD&amp;rsquo;s on the fact that the whole open source world relies on a couple of individuals. That couldn&amp;rsquo;t be more true in this situation, where the collaborative system collapses when too much pressure is put on individual folks.&lt;/p&gt;
&lt;p&gt;This saga planted the seed to reconsider my position as maintainer.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;这里我们先看 2 个重点词汇/短语：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; hold back
&lt;/section&gt;
&lt;p&gt;这里是“阻碍，拖慢”。If something holds someone back, it prevents them from making progress or developing. 还有一个意思是“克制自己不去做某事”。&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; hold back 例句
&lt;ul&gt;
&lt;li&gt;I don&amp;rsquo;t want my availability to hold the project back.&lt;/li&gt;
&lt;li&gt;Outdated processes are holding the team back.&lt;/li&gt;
&lt;li&gt;She held back her anger during the meeting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; crumble
&lt;/section&gt;
&lt;p&gt;碎裂、崩溃、瓦解。If something crumbles, it breaks into small pieces, or begins to fall apart. If a system, organization, or feeling crumbles, it suddenly or gradually fails or loses its strength.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; crumble 例句
&lt;ul&gt;
&lt;li&gt;The old stone wall began to crumble.&lt;/li&gt;
&lt;li&gt;The biscuit crumbled in his hand. (biscuit /ˈbɪskɪt/, 饼干)&lt;/li&gt;
&lt;li&gt;Her confidence crumbled after the setback. (setback, 挫折)&lt;/li&gt;
&lt;li&gt;The system began to crumble under pressure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;再看最后一句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This saga planted the seed to reconsider my position as maintainer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比较漂亮。学习 2 个点：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; saga /ˈsɑːɡə/
&lt;/section&gt;
&lt;p&gt;原意是“长篇史诗”，这里指“持续很久、反复拉扯、让人 energy-draining 的一整套事情”。 A saga is a long and complicated series of events or experiences.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; saga 例句
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After all the delays, the saga of getting the project approved finally ended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The saga of our move across the country took months to resolve.&lt;/p&gt;
&lt;p&gt;我们跨州搬迁的“史诗级”折腾，耗时数月才尘埃落定。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; plant the seed (of/for/to) ...
&lt;/section&gt;
&lt;p&gt;种下&amp;hellip;的种子。中文里也很常用，在英语里也是一个地道的表达。You plant the seed when you start an idea that may grow in the future.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; plant the seed (of/for/to) 例句
&lt;ul&gt;
&lt;li&gt;Her question about sustainability planted the seed of doubt in the team’s mind about the current design. (sustainability, 可持续性)&lt;/li&gt;
&lt;li&gt;The workshop didn’t propose a solution — it simply planted the seed to rethink how we measure success.&lt;/li&gt;
&lt;li&gt;Early exposure to open-source projects can plant the seed of curiosity that grows into a lifelong career.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;最后简单列出其他重点词汇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;societal: /səˈsaɪətl/ 社会的。与 social 做对比，societal 强调社会“制度”的，social 更多指“人际、社交”层面的。&lt;/li&gt;
&lt;li&gt;perceived: 察觉到的，强调主管感受。扩展词: perception(感知), perceptron(感知器).&lt;/li&gt;
&lt;li&gt;out of goodwill: 出于善意&lt;/li&gt;
&lt;li&gt;XKCD: 指 &lt;a class="link" href="https://xkcd.com" target="_blank" rel="noopener"
&gt;https://xkcd.com&lt;/a&gt;，一个网络漫画网站。这里的 joke 应该就是 &lt;a class="link" href="https://xkcd.com/2347/" target="_blank" rel="noopener"
&gt;https://xkcd.com/2347/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="summing-it-up"&gt;Summing it up
&lt;/h2&gt;&lt;p&gt;最后我们摘录 Tim 总结部分的一段如下：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;While these points had impact on me as maintainer, my hypothesis is that it doesn&amp;rsquo;t apply to others in the same way. I know others are eager to work on Kotlin support for example. That&amp;rsquo;s why I concluded that a decade is enough time to have helped Mockito forward. Now it&amp;rsquo;s time for somebody else to take over, as I believe that&amp;rsquo;s in the best interest of Mockito as a project. Because ultimately that&amp;rsquo;s why I chose to become maintainer in the first place: I believed that with my work, I could improve Mockito for millions of software engineers.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;就重点说 1 个短语：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt; in the best interest of ...
&lt;/section&gt;
&lt;p&gt;对 &amp;hellip; 最有利，符合 &amp;hellip; 的最佳利益。If something is done in the best interest of a person or group, it is done to benefit them most effectively&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; in the best interest of ... 例句
&lt;ul&gt;
&lt;li&gt;The doctor made the decision in the best interest of the patient&amp;rsquo;s health.&lt;/li&gt;
&lt;li&gt;We postponed the release in the best interest of product quality and user safety.&lt;/li&gt;
&lt;li&gt;The court ruled that placing the child with her grandmother was in the best interest of the child.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;再来翻译最后一句话：Because ultimately that&amp;rsquo;s why I chose to become maintainer in the first place: I believed that with my work, I could improve Mockito for millions of software engineers.&lt;/p&gt;
&lt;p&gt;ChatGPT 翻译：因为归根结底，这就是我当初选择成为维护者的原因：我相信，通过我的工作，我能够让数百万软件工程师受益，并改善 Mockito 项目。&lt;/p&gt;
&lt;p&gt;抉择时刻，记得回望初心啊。&lt;/p&gt;
&lt;h2 id="end"&gt;End
&lt;/h2&gt;&lt;p&gt;好啦，这就是本期全部内容了。&lt;/p&gt;
&lt;p&gt;喜欢我们的内容，记得点赞评论和关注哦，下期再见!&lt;/p&gt;</description></item><item><title>#003 IT 热点速递 | 基于 Yaml 的简历渲染器 RenderCV, MicroQuickJS and 企业网络下实现稳定视频流的极简方法</title><link>https://k.fseasy.top/p/it-hot-003-rendercv/</link><pubDate>Tue, 23 Dec 2025 14:07:59 +0800</pubDate><guid>https://k.fseasy.top/p/it-hot-003-rendercv/</guid><description>&lt;p&gt;Hi, 各位朋友，这是本频道的第 3 期内容。我们开启新的系列—— IT 热点速递。本文选取了 GitHub trending 和 Hacker News 上的热门、有一定普适性的内容，希望对你的工作有所帮助。&lt;/p&gt;
&lt;h2 id="1-rendercv-resume-generator-for-academics-and-engineers"&gt;1. RenderCV: resume generator for academics and engineers
&lt;/h2&gt;&lt;p&gt;source: &lt;a class="link" href="https://github.com/rendercv/rendercv" target="_blank" rel="noopener"
&gt;https://github.com/rendercv/rendercv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;resume 这里是“简历”的含义，注意发音是 /&amp;lsquo;rɛzjuːmeɪ/，近似：REZ-you-may. 它还有“继续”的含义，此时发音 /rɪˈzuːm/ 近似：ri-ZOOM. 为了区分，有时做“简历”意时可以写成 résumé.&lt;/p&gt;
&lt;p&gt;简历, 在北美常用 resume 这个单词，而英式、欧洲用 CV (curriculum vitae).&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;Write your CV or resume as YAML, then run RenderCV by &lt;code&gt;rendercv render John_Doe_CV.yaml&lt;/code&gt;, and get a PDF with perfect typography. No template wrestling. No broken layouts. Consistent spacing, every time.
With RenderCV, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Version-control your CV — it&amp;rsquo;s just text.&lt;/li&gt;
&lt;li&gt;Focus on content — don&amp;rsquo;t worry about the formatting.&lt;/li&gt;
&lt;li&gt;Get perfect typography — pixel-perfect alignment and spacing, handled for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;typography: 排版&lt;/p&gt;
&lt;p&gt;wrestling: 有“摔跤”的含义，here means struggling with something difficult, awkward, or frustrating, rather than the sport - “较劲/折磨”。注意发音 /ˈre-sliŋ/, &lt;code&gt;t&lt;/code&gt; is silent.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; wrestling 例句
&lt;ul&gt;
&lt;li&gt;I spent hours wrestling with the configuration files.&lt;/li&gt;
&lt;li&gt;No more wrestling with CSS layouts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;h2 id="2-fabrice-bellard-releases-microquickjs"&gt;2. Fabrice Bellard Releases MicroQuickJS
&lt;/h2&gt;&lt;p&gt;source: &lt;a class="link" href="https://news.ycombinator.com/item?id=46367224" target="_blank" rel="noopener"
&gt;https://news.ycombinator.com/item?id=46367224&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今日 Hack News top1.&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;MicroQuickJS (aka. MQuickJS) is a Javascript engine targeted at embedded systems. It compiles and runs Javascript programs with as low as 10 kB of RAM. The whole engine requires about 100 kB of ROM (ARM Thumb-2 code) including the C library. The speed is comparable to QuickJS.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;引起如此热议的原因有 2 个: JS related; Fabrice Bellard (the developer) related.&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;(comment 1) This engine restricts JS in all of the ways I wished I could restrict the language back when I was working on JSC.
You can’t restrict JS that way on the web because of compatibility. But I totally buy that restricting it this way for embedded systems will result in something that sparks joy.&lt;/p&gt;
&lt;p&gt;(comment 2) Well, as Jeff Atwood famously said, &amp;ldquo;any application that can be written in JavaScript, will eventually be written in JavaScript&amp;rdquo;. I guess that applies to embedded systems too.&lt;/p&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
buy
&lt;/section&gt;
&lt;p&gt;注意这个 &lt;strong&gt;buy&lt;/strong&gt;, 非常 native 的用法。 If you buy an idea or explanation, you believe it, accept it, or find it convincing, 类似中文的 “买账”.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; buy (≈ believe) 常见用法
&lt;ul&gt;
&lt;li&gt;I buy that.&lt;/li&gt;
&lt;li&gt;Do you really buy this explanation?&lt;/li&gt;
&lt;li&gt;I don’t buy the idea that complexity is unavoidable.&lt;/li&gt;
&lt;li&gt;At first I was skeptical, but now I buy it. (skeptical, 怀疑的)&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
(comment 1) Fabrice Bellard is widely considered one of the most productive and versatile programmers alive.
&lt;p&gt;(comment 2) Fabrice is an absolute legend. Most people would be content with just making QEMU, but this guy makes TinyC and FFmpeg and QuickJS and MicroQuickJS and a bunch of other huge projects.
I am envious that I will never anywhere near his level of productivity.&lt;/p&gt;
&lt;p&gt;(comment 3) For all the praise he gets here, few seem interested in his methods: writing complete programs, based on robust computer science, with minimal dependencies and tooling.&lt;/p&gt;
&lt;p&gt;(comment 4) When I first read the source for his original QuickJS implementation I was amazed to discover he created the entirety of JavaScript in a single xxx thousand line C file (more or less).
That was a sort of defining moment in my personal coding; a lot of my websites and apps are now single file source wherever possible/practical.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;versatile: “多面手”,常用来形容人或者工具。&lt;/p&gt;
&lt;p&gt;be content with: If you are content with something, you are satisfied with it and do not want more or anything different. “满意，知足”。&lt;/p&gt;
&lt;p&gt;envious: adj 嫉妒的(动词 envy)&lt;/p&gt;
&lt;p&gt;a sort of: If you say a sort of something, you mean a type or kind of it, or something that is like it but not exactly the same. 口语里常用。&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; A sort of 例句
&lt;ul&gt;
&lt;li&gt;Quill acts as a sort of rich-text playground for web developers.&lt;/li&gt;
&lt;li&gt;The configuration file is a sort of blueprint for building the system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;h2 id="3-we-replaced-h264-streaming-with-jpeg-screenshots-and-it-worked-better"&gt;3. We replaced H.264 streaming with JPEG screenshots (and it worked better)
&lt;/h2&gt;&lt;p&gt;source: &lt;a class="link" href="https://news.ycombinator.com/item?id=46367475" target="_blank" rel="noopener"
&gt;https://news.ycombinator.com/item?id=46367475&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;基于 ChatGPT 摘要，我再重新组织了下重点，希望对你有所启发。&lt;/p&gt;
&lt;p&gt;The initial implementation used a modern video pipeline: hardware-accelerated H.264 encoding, WebSockets, and browser-side decoding. On paper, it delivered smooth, high-frame-rate video. In practice, it frequently failed. Many corporate networks aggressively restrict traffic, deprioritize UDP, or block WebRTC-related protocols altogether, leaving only HTTPS traffic on port 443 reliably usable.&lt;/p&gt;
&lt;p&gt;企业网络上对网络协议有限制，阻碍了新技术的应用。On paper, In practice 适合用在理想和实际的对比中；aggressively 激进地；deprioritize 使低优先.&lt;/p&gt;
&lt;p&gt;In the end, the most reliable solution turned out to be the simplest one: periodically serving JPEG screenshots over plain HTTPS. Despite being more than a decade old, this approach worked consistently across locked-down enterprise networks, degraded gracefully under poor conditions, and required far less infrastructure and client-side complexity.&lt;/p&gt;
&lt;p&gt;最简单的方法成为了最可靠的方法。turned out to be 适合用在结论处；periodically 定时地；locked-down, 封锁的, 高度受限的。&lt;/p&gt;
&lt;p&gt;The takeaway is not that modern streaming technologies are bad, but that real-world constraints matter more than theoretical elegance. Sometimes, shipping a robust product means choosing boring, well-understood tools — and accepting that older technology can still be the right answer.&lt;/p&gt;
&lt;p&gt;方法是为问题服务的。The takeaway is 适合做经验总结；elegance 优雅；ship a product 固定用法。&lt;/p&gt;
&lt;h2 id="end"&gt;End
&lt;/h2&gt;&lt;p&gt;好啦，这就是本期内容啦。如果对你有帮助，欢迎点赞收藏+关注哦。如果你喜欢看某个特定的主题，也欢迎评论。&lt;/p&gt;
&lt;p&gt;咱们下期再见啦。&lt;/p&gt;</description></item><item><title>Issue 002 读文档学英语 | Get started with Quill</title><link>https://k.fseasy.top/p/quill-doc/</link><pubDate>Sun, 21 Dec 2025 20:07:59 +0800</pubDate><guid>https://k.fseasy.top/p/quill-doc/</guid><description>&lt;img src="https://k.fseasy.top/p/quill-doc/quill-logo.svg" alt="Featured image of post Issue 002 读文档学英语 | Get started with Quill" /&gt;&lt;!-- https://quilljs.com/docs/quickstart --&gt;
&lt;p&gt;Hello，各位读者和听众朋友们，欢迎来到 FS IT&amp;rsquo;s English Channel，这是我们的第二期内容。&lt;/p&gt;
&lt;p&gt;前面两期内容都有点长，制作周期比较久，and the posts got practically no traffic, as expected :) 我这心里咚咚打起了退堂鼓——不过说好的更 6 个月看看，咱肯定不能现在就放弃了。投入肯定要控制下。简单回顾一下，录音、剪辑花了比较多时间，性价比太低，后续每周就只录 1 期的音频，其余期只做 TTS 音频。这样算是在保留核心功能的条件下降低了成本。就再跑下看看。&lt;/p&gt;
&lt;p&gt;今天我在调研 flutter 富文本编辑器时，毫无意外地发现了 Quill 这个牛皮的库。去看了下它的入门文档，写得是真的好啊。这就赶紧拿来做素材吧。&lt;/p&gt;
&lt;h2 id="prerequisite"&gt;Prerequisite
&lt;/h2&gt;&lt;p&gt;开始看 QuickStart 前，先来看 2 个前置单词吧：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
WYSIWYG
&lt;/section&gt;
&lt;p&gt;stands for &amp;ldquo;What You See is What You Get&amp;rdquo;, pronounced &amp;ldquo;wiz-ee-wig&amp;rdquo;. 像 MS Word 这种就是 WYSIWYG，开发环境下一般就指代富文本编辑器。&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; WYSIWYG 例句
&lt;ul&gt;
&lt;li&gt;WYSIWYG means &amp;ldquo;What You See Is What You Get&amp;rdquo;. It describes software in which the content looks the same while you edit it as it will when it is finished or published.&lt;/li&gt;
&lt;li&gt;Microsoft Word and Google Docs are classic examples of WYSIWYG editors where your formatted text on screen appears almost identically when printed or shared.&lt;/li&gt;
&lt;li&gt;What is the best WYSIWYG currently in Flutter right now?&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;hr&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
quill
&lt;/section&gt;
&lt;p&gt;羽毛笔，Quill 网站的 ico 就是它 &lt;img src="https://k.fseasy.top/p/quill-doc/quill-ico.png"
width="16"
height="16"
srcset="https://k.fseasy.top/p/quill-doc/quill-ico_hu_91858786469143db.png 480w, https://k.fseasy.top/p/quill-doc/quill-ico_hu_6240190c159fe216.png 1024w"
loading="lazy"
alt="quill-ico"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="240px"
&gt;. 看几个例句：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; quill 例句
&lt;ul&gt;
&lt;li&gt;A quill is a pen made from a large bird&amp;rsquo;s feather, used in the past for writing with ink.&lt;/li&gt;
&lt;li&gt;The manuscript was written in ink and quill.&lt;/li&gt;
&lt;li&gt;Quill is widely used for building rich text editors in web applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;h2 id="get-started-with-quill"&gt;Get Started With Quill
&lt;/h2&gt;&lt;p&gt;好啦，我们来看看 QuickStart 的内容吧，只有 3 个自然段。&lt;/p&gt;
&lt;p&gt;第一段如下：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;The best way to get started is to try a simple example. Quill is initialized with a DOM element to contain the editor. The contents of that element will become the initial contents of Quill.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;非常简洁流畅的一段，直接引出 simple example, 并对 initialization 做出说明。下面是它对应的中文翻译，试试你能不能基于中文翻译，写出类似的英语表达呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;中文翻译 (ChatGPT)&lt;br&gt;
最好的入门方式是从一个简单的示例开始。Quill 需要用一个 DOM 元素进行初始化，用来承载编辑器；该元素中的内容会作为 Quill 的初始内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我大概会这么翻译（已经经过 ChatGPT 修正语法）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Translation of FS&lt;br&gt;
The best way to get started is from a simple example. Quill needs a DOM element to initialize, and the editor will be rendered at that DOM element. The contents of the DOM element will be the initial contents of Quill.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;哇，是不是又臭又长。我让 ChatGPT 给优化一下表达，结果如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Optimized Translation (natural)&lt;br&gt;
The best way to get started is &lt;strong&gt;with&lt;/strong&gt; a simple example. Quill &lt;strong&gt;requires&lt;/strong&gt; a DOM element to initialize, and the editor will be rendered &lt;strong&gt;inside&lt;/strong&gt; that element. The contents of the DOM element will &lt;strong&gt;serve as&lt;/strong&gt; the initial content of Quill.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;修改点如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;from a simple example&amp;rdquo; → &amp;ldquo;with a simple example&amp;rdquo;，with 更准确&lt;/li&gt;
&lt;li&gt;needs → requires，requires 更正式&lt;/li&gt;
&lt;li&gt;&amp;ldquo;at that DOM element&amp;rdquo; → &amp;ldquo;inside that element&amp;rdquo;, 去掉冗余的 DOM, inside 更准确&lt;/li&gt;
&lt;li&gt;&amp;ldquo;will be the initial contents&amp;rdquo; → &amp;ldquo;will serve as the initial&amp;rdquo;, 这个改动比较神&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有一个更口语的版本：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Optimized Translation (informal)&lt;br&gt;
The &lt;strong&gt;easiest&lt;/strong&gt; way to get started is with a simple example. Quill &lt;strong&gt;needs&lt;/strong&gt; a DOM element to &lt;strong&gt;work&lt;/strong&gt;, and the editor will &lt;strong&gt;show up&lt;/strong&gt; inside that element. &lt;strong&gt;Whatever’s already in&lt;/strong&gt; the DOM element will &lt;strong&gt;become&lt;/strong&gt; the initial content in Quill.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;读起来确实流畅多了。&lt;/p&gt;
&lt;p&gt;但是啊但是，这些相比原文档都长了很多——最关键的点就是这句 “Quill 需要用一个 DOM 元素进行初始化，用来承载编辑器”，在原文里就一句话： Quill is initialized with a DOM element to contain the editor, 但翻译都是对着中文结构，是 2 个子句。 如果把中文翻译成 “Quill 是从一个用来承载编辑器的 DOM 元素初始化的” 应该就更容易实现精确地反向翻译了；只不过这个中文句子就会显得有点拗口。&lt;/p&gt;
&lt;p&gt;上面就是一个 inverse translation 的例子， 通过这种方法，是不是更能体会到中英地道表达的差异呢？对加深 Native English 的感觉应该是有用的吧 :) 大家可以多试试这种方法。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;下面一段只有一句话&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
And that's all there is to it!
&lt;/section&gt;
&lt;p&gt;能够猜到大概什么意思，但细究起来是不是感觉有点理解不了？我以前和公司财务对话就这个感觉——一个个都是很简单的词，但合起来，不知道 the exact meaning.&lt;/p&gt;
&lt;p&gt;询问 ChatGPT, 这是一句非常口语化的表达，意思是 “事情就这么简单” / “就这些没别的了”，常用在教程或解释之后。&lt;/p&gt;
&lt;p&gt;可以拆开成下面的部分来方便理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;that’s all：就这些&lt;/li&gt;
&lt;li&gt;there is：这&amp;hellip;&lt;/li&gt;
&lt;li&gt;to it：关于这件事&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，我们更应该直接去把整句背熟，在特定语境下争取脱口而出。&lt;/p&gt;
&lt;p&gt;看下面的例句：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; And that's all there is to it 例句
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You say &amp;ldquo;and that’s all there is to it!&amp;rdquo; to mean that something is very simple and does not require any more explanation or steps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To make this recipe, just mix flour, sugar, and eggs. Bake for 20 minutes, and that’s all there is to it.&lt;/p&gt;
&lt;p&gt;做这个食谱，只需混合面粉、糖和鸡蛋，烤 20 分钟，就这么简单。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting up the app is easy — download it, install it, and that’s all there is to it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;Bonus, 这句话的常用变体：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; That's all there is to it 变体
&lt;ul&gt;
&lt;li&gt;That&amp;rsquo;s really all there is to it. (加 really)&lt;/li&gt;
&lt;li&gt;That&amp;rsquo;s pretty much all there is to it. （pretty much, 口语高频词 = almost/nearly/basically）&lt;/li&gt;
&lt;li&gt;that&amp;rsquo;s it （很口语、略直接）&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;hr&gt;
&lt;p&gt;最后一段：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
&lt;p&gt;The real magic of Quill comes in its flexibility and extensibility. You can get an idea of what is possible by playing around with the demos throughout this site or head straight to the Interactive Playground. For an in-depth walkthrough, take a look at How to Customize Quill.&lt;/p&gt;
&lt;/section&gt;
&lt;p&gt;这段话里同样使用了大量地道口语，我们来一网打尽。&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
comes in
&lt;/section&gt;
&lt;p&gt;“体现在，来自于”。类似的词有 lies in, 但 lies in 更正式。come in 还有其他的一些常见含义，我们以后遇到了再说。&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; comes in 例句
&lt;ul&gt;
&lt;li&gt;If something comes in a particular way or comes in + abstract sense, it can mean it exists or appears in a particular form or way, sometimes close in meaning to &amp;ldquo;lies in&amp;rdquo; or &amp;ldquo;consists in&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;The difficulty of the task comes in the details.&lt;/li&gt;
&lt;li&gt;The beauty of the design comes in its simplicity.&lt;/li&gt;
&lt;li&gt;The advantage comes in how easy it is to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
get an idea of …
&lt;/section&gt;
&lt;p&gt;“了解 / 大致知道”。比 understand 更自然随意。看下面例句：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; get an idea of … 例句
&lt;ul&gt;
&lt;li&gt;If you get an idea of something, you begin to understand it, have a general understanding, or form a mental picture.&lt;/li&gt;
&lt;li&gt;This tutorial will help you get an idea of how the software works.&lt;/li&gt;
&lt;li&gt;By looking at the diagram, you can get an idea of the system architecture.&lt;/li&gt;
&lt;li&gt;He explained the process so I could get an idea of what was happening.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
play around with …
&lt;/section&gt;
&lt;p&gt;“玩 / 随便试”。非常口语化，比 experiment with 更轻松。看下面例句：&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; play around with … 例句
&lt;ul&gt;
&lt;li&gt;If you play around with something, you try it, experiment with it, or use it in a relaxed way to see what it does.&lt;/li&gt;
&lt;li&gt;You can play around with the settings to see what works best.&lt;/li&gt;
&lt;li&gt;I spent the afternoon playing around with the new API.&lt;/li&gt;
&lt;li&gt;I’m just playing around with the new library to see what it can do.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
head straight to …
&lt;/section&gt;
&lt;p&gt;“直接去 / 直奔”。非常地道口语，比 go directly to 更生动。&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; head straight to … 例句
&lt;ul&gt;
&lt;li&gt;If you head straight to a place or section, you go there directly, without stopping or detouring.&lt;/li&gt;
&lt;li&gt;Head straight to the &amp;ldquo;Settings&amp;rdquo; tab to configure the options.&lt;/li&gt;
&lt;li&gt;Users can head straight to the login page from the homepage.&lt;/li&gt;
&lt;li&gt;Click the icon to head straight to the advanced options.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
an in-depth walkthrough
&lt;/section&gt;
&lt;p&gt;“深入地&lt;strong&gt;逐步&lt;/strong&gt;学习”。walkthrough 指 step-by-step guide or demonstration.
类似表达的有 a detailed guide, a step-by-step guide.&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; an in-depth walkthrough 例句
&lt;ul&gt;
&lt;li&gt;An in-depth walkthrough is a detailed, step-by-step guide or demonstration that explains something thoroughly, often in software, games, or technical processes.&lt;/li&gt;
&lt;li&gt;The tutorial provides an in-depth walkthrough of the installation process.&lt;/li&gt;
&lt;li&gt;We prepared an in-depth walkthrough of the new feature for developers.&lt;/li&gt;
&lt;li&gt;This video offers an in-depth walkthrough of the software interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
take a look at …
&lt;/section&gt;
&lt;p&gt;“看一看”。非常常用的口语，比 read/check 等都口语。&lt;/p&gt;
&lt;section class="callout"&gt;
&lt;span class="hdot"&gt;&lt;/span&gt; take a look at 例句
&lt;ul&gt;
&lt;li&gt;If you take a look at something, you examine it, check it, or review it, often briefly or casually.&lt;/li&gt;
&lt;li&gt;Take a look at the new feature in the dashboard.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ll take a look at the code to see what&amp;rsquo;s wrong.&lt;/li&gt;
&lt;li&gt;Please take a look at the documentation before you start.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;h2 id="end"&gt;End
&lt;/h2&gt;&lt;p&gt;好了，QuickStart 部分就看完了，我们这期的内容也结束啦。短短的一篇文档，蕴含着这么多的地道表达，一定要多多练习，内化为自己的东西哈，与君共勉了。&lt;/p&gt;
&lt;p&gt;喜欢我们的内容，就点赞收藏吧，咱们下期再见。&lt;/p&gt;
&lt;h2 id="appendix-practice-materials"&gt;Appendix: Practice Materials
&lt;/h2&gt;&lt;hr&gt;
&lt;p&gt;WYSIWYG: WYSIWYG means &amp;ldquo;What You See Is What You Get&amp;rdquo;. It describes software in which the content looks the same while you edit it as it will when it is finished or published.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Word and Google Docs are classic examples of WYSIWYG editors where your formatted text on screen appears almost identically when printed or shared.&lt;/li&gt;
&lt;li&gt;What is the best WYSIWYG currently in Flutter right now?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;quill: A quill is a pen made from a large bird&amp;rsquo;s feather, used in the past for writing with ink.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The manuscript was written in ink and quill.&lt;/li&gt;
&lt;li&gt;Quill is widely used for building rich text editors in web applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;The best way to get started is to try a simple example. Quill is initialized with a DOM element to contain the editor. The contents of that element will become the initial contents of Quill.&lt;/p&gt;
&lt;p&gt;The best way to get started is with a simple example. Quill requires a DOM element to initialize, and the editor will be rendered inside that element. The contents of the DOM element will serve as the initial content of Quill.&lt;/p&gt;
&lt;h2 id="the-easiest-way-to-get-started-is-with-a-simple-example-quill-needs-a-dom-element-to-work-and-the-editor-will-show-up-inside-that-element-whatevers-already-in-the-dom-element-will-become-the-initial-content-in-quill"&gt;The easiest way to get started is with a simple example. Quill needs a DOM element to work, and the editor will show up inside that element. Whatever’s already in the DOM element will become the initial content in Quill.
&lt;/h2&gt;&lt;p&gt;And that&amp;rsquo;s all there is to it: You say &amp;ldquo;and that’s all there is to it!&amp;rdquo; to mean that something is very simple and does not require any more explanation or steps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To make this recipe, just mix flour, sugar, and eggs. Bake for 20 minutes, and that’s all there is to it.&lt;/li&gt;
&lt;li&gt;Setting up the app is easy — download it, install it, and that’s all there is to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Variants of &amp;ldquo;that&amp;rsquo;s all there is to it&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;That&amp;rsquo;s really all there is to it.&lt;/li&gt;
&lt;li&gt;That&amp;rsquo;s pretty much all there is to it.&lt;/li&gt;
&lt;li&gt;that&amp;rsquo;s it&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;The real magic of Quill comes in its flexibility and extensibility. You can get an idea of what is possible by playing around with the demos throughout this site or head straight to the Interactive Playground. For an in-depth walkthrough, take a look at How to Customize Quill.&lt;/p&gt;
&lt;p&gt;comes in: If something comes in a particular way or comes in + abstract sense, it can mean it exists or appears in a particular form or way, sometimes close in meaning to &amp;ldquo;lies in&amp;rdquo; or &amp;ldquo;consists in&amp;rdquo;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The difficulty of the task comes in the details.&lt;/li&gt;
&lt;li&gt;The beauty of the design comes in its simplicity.&lt;/li&gt;
&lt;li&gt;The advantage comes in how easy it is to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;get an idea of: If you get an idea of something, you begin to understand it, have a general understanding, or form a mental picture.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This tutorial will help you get an idea of how the software works.&lt;/li&gt;
&lt;li&gt;By looking at the diagram, you can get an idea of the system architecture.&lt;/li&gt;
&lt;li&gt;He explained the process so I could get an idea of what was happening.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;play around with: If you play around with something, you try it, experiment with it, or use it in a relaxed way to see what it does.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can play around with the settings to see what works best.&lt;/li&gt;
&lt;li&gt;I spent the afternoon playing around with the new API.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m just playing around with the new library to see what it can do.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;head straight to: If you head straight to a place or section, you go there directly, without stopping or detouring.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Head straight to the &amp;ldquo;Settings&amp;rdquo; tab to configure the options.&lt;/li&gt;
&lt;li&gt;Users can head straight to the login page from the homepage.&lt;/li&gt;
&lt;li&gt;Click the icon to head straight to the advanced options.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;an in-depth walkthrough: An in-depth walkthrough is a detailed, step-by-step guide or demonstration that explains something thoroughly, often in software, games, or technical processes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The tutorial provides an in-depth walkthrough of the installation process.&lt;/li&gt;
&lt;li&gt;We prepared an in-depth walkthrough of the new feature for developers.&lt;/li&gt;
&lt;li&gt;This video offers an in-depth walkthrough of the software interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;take a look at: If you take a look at something, you examine it, check it, or review it, often briefly or casually.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Take a look at the new feature in the dashboard.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ll take a look at the code to see what&amp;rsquo;s wrong.&lt;/li&gt;
&lt;li&gt;Please take a look at the documentation before you start.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Sharp, 苹果团队开源，1张 图片 1s 就可以重建 3D 场景？ELI5</title><link>https://k.fseasy.top/p/apple-sharp-synthesis/</link><pubDate>Tue, 16 Dec 2025 22:07:59 +0800</pubDate><guid>https://k.fseasy.top/p/apple-sharp-synthesis/</guid><description>&lt;img src="https://k.fseasy.top/p/apple-sharp-synthesis/perf.png" alt="Featured image of post Sharp, 苹果团队开源，1张 图片 1s 就可以重建 3D 场景？ELI5" /&gt;&lt;!-- Others
https://github.com/avaer/ml-sharp-example?tab=readme-ov-file (一个人跑的 ply 文件，可以直接合成图片的！)
---&gt;
&lt;p&gt;Hello，各位读者和听众朋友们，欢迎来到 FS IT&amp;rsquo;s English Channel，这是我们的第一期内容。&lt;/p&gt;
&lt;p&gt;今天我们来看下苹果团队最近开源的一个工作： &lt;a class="link" href="https://apple.github.io/ml-sharp/" target="_blank" rel="noopener"
&gt;SHARP&lt;/a&gt; (Single-image High-Accuracy Real-time Parallax)，是 CV (计算机视觉) 领域 Monocular View Synthesis (单目视图合成)方向，宣称只要 1 张照片，就可以在 A100 机器上 1s 渲染出新视角。&lt;/p&gt;
&lt;p&gt;听起来很有意思啊，就让我们一起来读读摘要和评论，看看这篇工作成色如何吧。&lt;/p&gt;
&lt;h2 id="abstract-part"&gt;Abstract Part
&lt;/h2&gt;&lt;p&gt;OK，正式看摘要部分前，先学习下 SHARP 里 P 对应的单词 Parallax：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
Parallax
&lt;/section&gt;
&lt;p&gt;是“视差”的意思，就是说当相机发生小幅移动时，画面中不同深度的物体会产生正确的相对位移（近处的位移大，远处的小）。这个词在 CV 里用得比较多。看看下面的例句吧：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; Parallax 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you look out of a moving train, nearby objects rush past, while distant mountains barely move. That’s parallax.&lt;/li&gt;
&lt;li&gt;High-quality parallax is what makes a scene feel truly 3D.&lt;/li&gt;
&lt;li&gt;Single-image parallax remains a challenging problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;好，明白了 Parallax，我们正式进入 Abstract 部分吧。&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
We present SHARP, an approach to photorealistic view synthesis from a single image. Given a single photograph, SHARP regresses the parameters of a 3D Gaussian representation of the depicted scene. This is done in less than a second on a standard GPU via a single feedforward pass through a neural network.
&lt;/section&gt;
&lt;p&gt;非常精炼的表述啊，先来看看这里面几个重点单词吧：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
present
&lt;/section&gt;
&lt;p&gt;表示正式地提出、介绍、公布（研究成果、方法、模型）；在论文开头非常常见的单词，类似单词的还有 propose, introduce. 下面的例句，背熟它们肯定有用：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; Present 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We present a novel framework for real-time rendering.&lt;/li&gt;
&lt;li&gt;This paper presents a new benchmark for image segmentation.&lt;/li&gt;
&lt;li&gt;We present experimental results demonstrating the effectiveness of our method.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
photorealistic
&lt;/section&gt;
&lt;p&gt;CV 里极其常见的单词，形容生成的图片/视频效果极其逼真——照片级别的真实，容易看出它是 photo + realistic 两个单词合成的，记忆起来是不是更简单了。类似单词有 high-fidelity, 但二者并不不等价。
看下下面的例句:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; photorealistic/high-fidelity 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our method produces photorealistic images under complex lighting conditions.&lt;/li&gt;
&lt;li&gt;The model achieves photorealistic view synthesis from a single input image.&lt;/li&gt;
&lt;li&gt;Our method generates high-fidelity 3D reconstructions with accurate geometry and textures.&lt;/li&gt;
&lt;li&gt;The system supports high-fidelity audio playback with minimal distortion.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
regress
&lt;/section&gt;
&lt;p&gt;很精确的一个单词，表示通过模型直接预测（连续值）参数——也就是对应 linear-regression 里的意思。一个单词就精确表达了模型的特点。看下类似的用法：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; regress 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The network regresses camera poses from monocular images.&lt;/li&gt;
&lt;li&gt;We train the model to regress depth maps directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
depicted
&lt;/section&gt;
&lt;p&gt;表示“（图像）呈现/描绘出的”，可以用 shown 来替代，但 depicted 更正式，且 depicted scene 在正式文本里也算是固定搭配了。看下相关的例句：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; depicted 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The model reconstructs the geometry of the depicted scene.&lt;/li&gt;
&lt;li&gt;The depicted scene may differ from actual gameplay. (游戏宣传里常见)&lt;/li&gt;
&lt;li&gt;The depicted scene represents a traditional family dinner. (博物馆中常见)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后看下这几个介词：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;an approach &lt;strong&gt;to&lt;/strong&gt; photorealistic view synthesis&lt;/p&gt;
&lt;p&gt;an approach 后面用 &lt;strong&gt;to&lt;/strong&gt; 是强搭配 (strong collocation).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is done &lt;strong&gt;in&lt;/strong&gt; less than a second &lt;strong&gt;on&lt;/strong&gt; a standard GPU &lt;strong&gt;via&lt;/strong&gt; a single feedforward pass &lt;strong&gt;through&lt;/strong&gt; a neural network.&lt;/p&gt;
&lt;p&gt;这句话堆叠了 4 个介词，清晰明确的说明了方法的 perf. 很漂亮，但是也会显得“堆叠”，可以改写成下面的 2 个子句，读起来没那么喘：&lt;/p&gt;
&lt;p&gt;This process completes in under one second on a standard GPU, requiring only a single feedforward pass through a neural network.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
The 3D Gaussian representation produced by SHARP can then be rendered in real time, yielding high-resolution photorealistic images for nearby views. The representation is metric, with absolute scale, supporting metric camera movements.
&lt;/section&gt;
&lt;p&gt;这里解释 2 个偏专业领域的词：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
nearby views
&lt;/section&gt;
&lt;p&gt;在计算机视觉里通常指“小视差范围内的新视角”，或者说“同一场景的相邻视角”，其与原视角接近，只有小幅度 viewpoint change. 这解释了 demo 里为啥新视角的结果看起来和原图差别不大。&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
metric
&lt;/section&gt;
&lt;p&gt;这里指“具有真实尺度的”，也就是能够对应到真实世界里的具体距离的。这在单目视图合成是比较关键的特性——一般来说，单目（一个眼睛）视图是确定不了具体距离的，只有一个相对的感受。但这里可以确定物体的具体距离（深度），这就让该方法的应用范围可以扩展到 AR 等场景。&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
Experimental results demonstrate that SHARP delivers robust zero-shot generalization across datasets. It sets a new state of the art on multiple datasets, reducing LPIPS by 25–34% and DISTS by 21–43% versus the best prior model, while lowering the synthesis time by three orders of magnitude.
&lt;/section&gt;
&lt;p&gt;重点看一个单词&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
deliver
&lt;/section&gt;
&lt;p&gt;用得非常漂亮的词，表示“成功实现/提供（预期的效果）”，这里可以换用 achieves, provides 或者 shows，但感觉都没有 delivers 读来舒服。除了这个“实现/提供”的含义，deliver 本身还常用于快递、送达场景。来看看相关例句吧：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; deliver 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The update delivers a better user experience.&lt;/li&gt;
&lt;li&gt;The package was delivered this morning.&lt;/li&gt;
&lt;li&gt;They deliver food within 30 minutes.&lt;/li&gt;
&lt;li&gt;The courier will deliver the documents tomorrow. (courier 快递员、快递公司、导游)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;再简单说下里面涉及的领域知识：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LPIPS(Learned Perceptual Image Patch Similarity), DISTS(Deep Image Structure and Texture Similarity) 都是衡量图像质量的指标；值越低越好。&lt;/li&gt;
&lt;li&gt;three orders of magnitude = 1000 倍；order of magnitude 是“数量级”的意思。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="comments-part"&gt;Comments part
&lt;/h2&gt;&lt;p&gt;好啦，读完论文的 abstract, 是不是有点不明觉厉？咱们来看看 Hacker News 上大家怎么看的吧。&lt;/p&gt;
&lt;p&gt;首先是第一条评论&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
"Unsplash &gt; Gen3C &gt; The fly video" is nightmare fuel. View at your own risk: [fly video](https://apple.github.io/ml-sharp/video_selections/Unsplash/gen3c_aligned/-6ebJNtXtWs_0000-0001.mp4)
&lt;/section&gt;
&lt;p&gt;看是典型的水评论，不过还是有 2 个短语值得学习：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
nightmare fuel
&lt;/section&gt;
&lt;p&gt;可以理解成“噩梦制造机”，或者意译“令人不适”。&lt;/p&gt;
&lt;p&gt;nightmare 是“噩梦”的意思，在评论里巨常见的词，老外很喜欢用这个。&lt;/p&gt;
&lt;p&gt;fuel: 不可数名词；本意是“燃料”的意思，这个场景里隐喻“情绪 / 反应的放大器”，常见于下面的口语句式：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; fuel 表示情绪/反应放大器的常见句式&lt;/p&gt;
&lt;p&gt;X is (pure / absolute) [emotion / reaction] fuel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;看下面的例句更直观些：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; fuel 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This design decision is anxiety fuel.&lt;/li&gt;
&lt;li&gt;This policy is rage fuel on social media.&lt;/li&gt;
&lt;li&gt;Lack of transparency is conspiracy fuel.&lt;/li&gt;
&lt;li&gt;Poor error messages are support-ticket fuel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
at your own risk
&lt;/section&gt;
&lt;p&gt;免责声明，“后果自负”的意思。在多伦多的公园里，基本都有块牌子，上面写着“No winter maintenance, Use at your own risk” :)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; at your own risk 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter the construction site at your own risk.
进入工地请自行承担风险。&lt;/li&gt;
&lt;li&gt;Use this software at your own risk. (这个更熟悉吧 :)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;看第二条评论：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
Can someone ELI5 what this does? I read the abstract and tried to find differences in the provided examples, but I don't understand (and don't see) what the "photorealistic" part is.
&lt;/section&gt;
&lt;p&gt;又来一个非常常见的互联网缩写&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
ELI5
&lt;/section&gt;
&lt;p&gt;= Explain Like I’m 5, “请用用最简单、直白的方式解释”；虽然这个词常用在论坛的字面交流里，但如果一定要读的话，可以有几种常见的读法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;E-LI five, “怡莱 five” (我看 Youtube 上有人这么读)&lt;/li&gt;
&lt;li&gt;E-L-I five. 按字母逐个读 (ChatGPT 推荐)&lt;/li&gt;
&lt;li&gt;Explain like i am five, 扩展读&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;看看下面的例句，下次就可以用上了：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; ELI5 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELI5 how this works.&lt;/li&gt;
&lt;li&gt;ELI5 the difference between A and B.&lt;/li&gt;
&lt;li&gt;ELI5 what Kubernetes actually does.&lt;/li&gt;
&lt;li&gt;ELI5 why this is better than previous SOTA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;好了，最后看这条评论&lt;/p&gt;
&lt;section class="st"&gt;
&lt;section class="src-tag"&gt;“ Source Text&lt;/section&gt;
This is a terrible presentation. The paper abstract is bordering on word salad, the demo images are meaningless and don’t show any clear difference to the previous SotA, the introduction talks about "nearby" views while the images appear to show zooming in, etc.
&lt;/section&gt;
&lt;p&gt;犀利吧，咱们看 2 个短语：&lt;/p&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
bordering on
&lt;/section&gt;
&lt;p&gt;这是一个非常好用的书面 + 评论词，意思是“踩在边缘/几乎算是”。也可以直接用 borders on, 看下面的一些例句：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; borders on 例句&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Her behavior borders on rude.&lt;/li&gt;
&lt;li&gt;The company&amp;rsquo;s practices border on illegal.
公司的做法几乎违法。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
&lt;span class="dot"&gt;&lt;/span&gt;
word salad
&lt;/section&gt;
&lt;p&gt;很有意思的词语，直译“词语沙拉”，常用来形容论文、演讲或写作里语言堆砌、概念乱七八糟的现象。最开始这个词是心理学里用来描述精神疾病患者说话混乱的状态，后来在网络上被广泛借用。
看下面的一些例句：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="hdot"&gt;&lt;/span&gt; word salad 例句&lt;/p&gt;
&lt;p&gt;The abstract is so dense, it’s practically a word salad.&lt;br&gt;
这篇摘要太难懂，几乎成了文字沙拉。
His explanation was just a word salad, I couldn’t follow.&lt;br&gt;
他的解释乱七八糟，我根本听不懂。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="eli5--人像实图测试"&gt;ELI5 &amp;amp; 人像实图测试
&lt;/h2&gt;&lt;p&gt;好啦，英语解释部分就完了。回到这篇论文 SHARP，它究竟是个啥，有啥意义？我也没看全文，借助 ChatGPT，简单描述下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一句话解释：输入 1 张照片，SHARP 网络跑一次就可以还原出它对应的 3D 世界，然后你就可以在这个 3D 世界里去调整视角，再渲染出新的照片。&lt;/li&gt;
&lt;li&gt;一种可能的应用场景：想象一下在外面拍完照回去，发现照片把人拍矮了；没事，用这个还原照片当时的 3D 场景，再调低镜头，重新渲一张仰拍图&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;真的有这么好用不？&lt;a class="link" href="https://github.com/apple/ml-sharp" target="_blank" rel="noopener"
&gt;代码+模型&lt;/a&gt; 已经开源了，我们可以来试试。&lt;/p&gt;
&lt;p&gt;根据我一点点的经验，在代码运行前我先把模型下下来，然而没想到啊，苹果就是苹果，在国内原地址（CDN）下载模型都能到 ~30MB/s, 是我多虑了。&lt;/p&gt;
&lt;p&gt;一切妥当，我精心挑选了 2 张年轻时骑青海湖的照片，这就跑起来吧：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: 选择人像是因为评论提及这个比较难，而且论文示例里没有这类；同时为规避版权问题选择自拍图。&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Nvidia 3060&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# PS: 千万别用 `-v` verbose 模式，不然满屏 \c 符号，直接把我电脑弄死机了&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sharp predict -i data/test-human-input/ -o output/test-human -c model-download/sharp_2572gikvuh.pt --device cuda
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:26,294 | INFO | Processing 2 valid image files.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:26,294 | INFO | Using device cuda&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:26,294 | INFO | Loading checkpoint from model-download/sharp_2572gikvuh.pt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:28,195 | INFO | Using preset ViT dinov2l16_384.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:30,682 | INFO | Using preset ViT dinov2l16_384.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:34,875 | INFO | Processing data/test-human-input/big-face.jpg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:35,023 | INFO | Running preprocessing.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:35,114 | INFO | Running inference.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:39,046 | INFO | Running postprocessing.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:41,349 | WARNING | Received 1 reflection matrices from SVD. Flipping them to rotations.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 00:03:41,777 | INFO | Saving 3DGS to output/test-human&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... omitted the log for another photo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Total took 30s (run with pre-downloaded model)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sharp render -i output/test-human -o output/test-human-renderings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2025-12-18 10:53:44,419 | INFO | Rendering output/test-human/small-face.ply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# W1218 10:53:45.065000 55284 torch/utils/cpp_extension.py:2425] TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# W1218 10:53:45.065000 55284 torch/utils/cpp_extension.py:2425] If this is not desired, please set os.environ[&amp;#39;TORCH_CUDA_ARCH_LIST&amp;#39;] to specific architectures.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... omitted the log for another photo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Total took 42s (second run, because it will compile cpp extension on the first run)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;来看看效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;原图1：小脸（原始分辨率 4624x2080, 这里有压缩，下同）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://k.fseasy.top/p/apple-sharp-synthesis/small-face.compress.jpg"
width="925"
height="416"
srcset="https://k.fseasy.top/p/apple-sharp-synthesis/small-face.compress_hu_1843ba7fdb2a4af1.jpg 480w, https://k.fseasy.top/p/apple-sharp-synthesis/small-face.compress_hu_1266776eed50a9b5.jpg 1024w"
loading="lazy"
alt="small-face"
class="gallery-image"
data-flex-grow="222"
data-flex-basis="533px"
&gt;&lt;/p&gt;
&lt;p&gt;渲染效果（直出分辨率 4624x2080）：&lt;/p&gt;
&lt;video controls width="100%" preload="metadata"&gt;
&lt;source src="small-face.compressed.mp4" type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;p&gt;别说，还可以啊！再来看看模型直出的 Gaussians Splatting 的结果（就是前面说的 3D 世界），我用的这个 &lt;a class="link" href="https://enter-tainer.github.io/browser-sharp/" target="_blank" rel="noopener"
&gt;web 工具&lt;/a&gt;.&lt;/p&gt;
&lt;video controls width="100%" preload="metadata"&gt;
&lt;source src="small-face-gaussians.compressed.mp4" type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;p&gt;我们可以看到：视角一旦大幅超过原图的角度，就没有对应的点云了，也即 unobserved regions.&lt;/p&gt;
&lt;p&gt;这就解释了为什么文章说只能渲染出 near view 了：因为视差太大的角度，从单张图片里根本无法准确还原。
要做到渲染出当前图片不存在的信息，可能超出了本文研究者的预期——不是不行，就是得重新设计数据、网络架构和训练方法了。
市面上现有的图像、视频生成模型也是可做到这点的，不过实现路径上和这个估计不太一样。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;原图2：大脸（原始分辨率 4624x3472）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://k.fseasy.top/p/apple-sharp-synthesis/big-face.compressed.jpg"
width="347"
height="463"
srcset="https://k.fseasy.top/p/apple-sharp-synthesis/big-face.compressed_hu_36bb45aafeb18c89.jpg 480w, https://k.fseasy.top/p/apple-sharp-synthesis/big-face.compressed_hu_55f57389df51844e.jpg 1024w"
loading="lazy"
alt="big-face"
class="gallery-image"
data-flex-grow="74"
data-flex-basis="179px"
&gt;&lt;/p&gt;
&lt;p&gt;我们换一个渲染角度，让它稍微大一点，渲染效果（直出分辨率 1744x2320）如下：&lt;/p&gt;
&lt;video controls width="100%" preload="metadata"&gt;
&lt;source src="big-face.compressed.mp4" type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;p&gt;调出其中的两个视角：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://k.fseasy.top/p/apple-sharp-synthesis/big-face.new-view.jpg"
width="702"
height="468"
srcset="https://k.fseasy.top/p/apple-sharp-synthesis/big-face.new-view_hu_e3c3f0f3da5c5390.jpg 480w, https://k.fseasy.top/p/apple-sharp-synthesis/big-face.new-view_hu_c5c4f45679b65836.jpg 1024w"
loading="lazy"
alt="big-face new view"
class="gallery-image"
data-flex-grow="150"
data-flex-basis="360px"
&gt;&lt;/p&gt;
&lt;p&gt;哈哈，基本勉强实现了前面说到的效果吧。可以看到边沿还是有 artifacts 的，应该是这个部分没有点云覆盖。&lt;/p&gt;
&lt;p&gt;Gaussians Splatting 结果&lt;/p&gt;
&lt;video controls width="100%" preload="metadata"&gt;
&lt;source src="big-face-gaussians.compressed.mp4" type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;p&gt;可以看到点云覆盖确实非常有限，基本限定在原图的视角。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好的，实操下来看，我认为在作者设定的预期里，人像的效果还是不错的。作为一个曾经短暂尝试学习 SLAM 失败的人来说，这个单目重建效果还很惊艳了。
那对这个效果，是否达到你的期望呢？&lt;/p&gt;
&lt;h2 id="the-end"&gt;The End
&lt;/h2&gt;&lt;p&gt;好啦，本期内容到此结束。喜欢的话就点个收藏，帮助频道慢慢成长吧。&lt;/p&gt;
&lt;p&gt;咱们下期再见！&lt;/p&gt;
&lt;h2 id="appendix-practice-materials"&gt;Appendix: Practice Materials
&lt;/h2&gt;&lt;p&gt;Parallax: Parallax is when an object appears to change its position because the person or instrument observing it has changed their position.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you look out of a moving train, nearby objects rush past, while distant mountains barely move. That’s parallax.&lt;/li&gt;
&lt;li&gt;High-quality parallax is what makes a scene feel truly 3D.&lt;/li&gt;
&lt;li&gt;Single-image parallax remains a challenging problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;We present SHARP, an approach to photorealistic view synthesis from a single image. Given a single photograph, SHARP regresses the parameters of a 3D Gaussian representation of the depicted scene. This is done in less than a second on a standard GPU via a single feedforward pass through a neural network.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Present: When you present information, you give it to people in a formal way.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We present a novel framework for real-time rendering.&lt;/li&gt;
&lt;li&gt;This paper presents a new benchmark for image segmentation.&lt;/li&gt;
&lt;li&gt;We present experimental results demonstrating the effectiveness of our method.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;photorealistic: If an image or video is photorealistic, it looks almost exactly like a real photograph, even though it was created using a computer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our method produces photorealistic images under complex lighting conditions.&lt;/li&gt;
&lt;li&gt;The model achieves photorealistic view synthesis from a single input image.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;high-fidelity: If something is high-fidelity, it is very accurate and detailed, and closely matches the original or real thing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our method generates high-fidelity 3D reconstructions with accurate geometry and textures.&lt;/li&gt;
&lt;li&gt;The system supports high-fidelity audio playback with minimal distortion.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;regress: In machine learning, if a model regresses a value, it predicts a continuous number, rather than choosing a class or category.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The network regresses camera poses from monocular images.&lt;/li&gt;
&lt;li&gt;We train the model to regress depth maps directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;depicted: If something is depicted in a picture, film, or text, it is shown or represented in that picture, film, or text.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The model reconstructs the geometry of the depicted scene.&lt;/li&gt;
&lt;li&gt;The depicted scene may differ from actual gameplay.&lt;/li&gt;
&lt;li&gt;The depicted scene represents a traditional family dinner.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Sharp is an approach to photorealistic view synthesis.&lt;/p&gt;
&lt;p&gt;This is done in less than a second on a standard GPU via a single feedforward pass through a neural network.&lt;/p&gt;
&lt;p&gt;This process completes in under one second on a standard GPU, requiring only a single feedforward pass through a neural network.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The 3D Gaussian representation produced by SHARP can then be rendered in real time, yielding high-resolution photorealistic images for nearby views. The representation is metric, with absolute scale, supporting metric camera movements.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Experimental results demonstrate that SHARP delivers robust zero-shot generalization across datasets. It sets a new state of the art on multiple datasets, reducing LPIPS by 25–34% and DISTS by 21–43% versus the best prior model, while lowering the synthesis time by three orders of magnitude.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;deliver: 1. If you deliver something that you have promised to do, make, or produce, you do, make, or produce it. 2. If you deliver something somewhere, you take it there.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The update delivers a better user experience.&lt;/li&gt;
&lt;li&gt;The package was delivered this morning.&lt;/li&gt;
&lt;li&gt;They deliver food within 30 minutes.&lt;/li&gt;
&lt;li&gt;The courier will deliver the documents tomorrow.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&amp;ldquo;Unsplash &amp;gt; Gen3C &amp;gt; The fly video&amp;rdquo; is nightmare fuel. View at your own risk.&lt;/p&gt;
&lt;p&gt;fuel: If something is described as fuel for a feeling or idea, it is something that causes it or makes it stronger.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This design decision is anxiety fuel.&lt;/li&gt;
&lt;li&gt;This policy is rage fuel on social media.&lt;/li&gt;
&lt;li&gt;Lack of transparency is conspiracy fuel.&lt;/li&gt;
&lt;li&gt;Poor error messages are support-ticket fuel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;at your own risk: If you do something at your own risk, you accept full responsibility for any problems or damage that may happen, and no one else is responsible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter the construction site at your own risk.&lt;/li&gt;
&lt;li&gt;Use this software at your own risk.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Can someone ELI5 what this does? I read the abstract and tried to find differences in the provided examples, but I don&amp;rsquo;t understand (and don&amp;rsquo;t see) what the &amp;ldquo;photorealistic&amp;rdquo; part is.&lt;/p&gt;
&lt;p&gt;ELI5: Explain Like I’m 5.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELI5 how this works.&lt;/li&gt;
&lt;li&gt;ELI5 the difference between A and B.&lt;/li&gt;
&lt;li&gt;ELI5 what Kubernetes actually does.&lt;/li&gt;
&lt;li&gt;ELI5 why this is better than previous SOTA.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;This is a terrible presentation. The paper abstract is bordering on word salad, the demo images are meaningless and don’t show any clear difference to the previous SotA, the introduction talks about &amp;ldquo;nearby&amp;rdquo; views while the images appear to show zooming in, etc.&lt;/p&gt;
&lt;p&gt;borders on: If something borders on a particular quality, it is very close to having that quality, often in a negative or critical sense.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Her behavior borders on rude.&lt;/li&gt;
&lt;li&gt;The company’s practices border on illegal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;word salad: If someone’s speech or writing is a word salad, it is full of words but has little clear meaning, and is difficult to understand.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The abstract is so dense, it’s practically a word salad.&lt;/li&gt;
&lt;li&gt;His explanation was just a word salad, I couldn’t follow.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>IT's English Channel: Issue 000, 从 cloudflare 宕机学习 Status Page 的英语表达</title><link>https://k.fseasy.top/p/itsen-issue-000/</link><pubDate>Mon, 15 Dec 2025 23:08:21 +0800</pubDate><guid>https://k.fseasy.top/p/itsen-issue-000/</guid><description>&lt;img src="https://k.fseasy.top/p/itsen-issue-000/cloudflare-down.desc.webp" alt="Featured image of post IT's English Channel: Issue 000, 从 cloudflare 宕机学习 Status Page 的英语表达" /&gt;&lt;p&gt;Hello, 各位读者和听众们，欢迎来到 FS IT&amp;rsquo;s English Channel.&lt;/p&gt;
&lt;h1 id="0-频道介绍"&gt;&lt;strong&gt;0.&lt;/strong&gt; 频道介绍
&lt;/h1&gt;&lt;p&gt;这是频道的第零期内容，所以先简单介绍下这个频道的定位、动机和内容构成。&lt;/p&gt;
&lt;h2 id="定位"&gt;定位
&lt;/h2&gt;&lt;p&gt;我们预期面向的受众是有英语学习需求或动机的 IT 、科技行业从业者。当然如果是随机的你又随机地遇到了这个频道，并且还觉得值得一看，那可就太好嘞。&lt;/p&gt;
&lt;h2 id="动机"&gt;动机
&lt;/h2&gt;&lt;p&gt;我之前有幸出国工作一年半，作为社恐，英语又不好，就主要通过“偷学别人的句子 + ChatGPT 解释扩展 + 重复跟读来”学习的英语。这不说效果显著吧，至少也比没有强。现在我辞职回国，没有班上，又不想落下英语和行业信息，本着自我监督和建立个人 IP 想法，就弄了这个频道。&lt;/p&gt;
&lt;h2 id="内容规划"&gt;内容规划
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;数据源是一手的英语 IT、科技新闻 &amp;amp; 知识；目前看应该会包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hacker News, TechChurch, The Verge X, Reddit 等&lt;/li&gt;
&lt;li&gt;技术 Docs/Papers&lt;/li&gt;
&lt;li&gt;Github 上的开源项目等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加工流程包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;筛选 (curating) 出有英语学习价值的单词、句子和段落；&lt;/li&gt;
&lt;li&gt;基于 AI 做一些重点解释和扩展；&lt;/li&gt;
&lt;li&gt;配上用于收听的全文音频；&lt;/li&gt;
&lt;li&gt;提供用于练习的资料：更结构化的英语部分文本，以及对应的 TTS 音频。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;版块设计：老实说现在没想好。因为 IT 领域也太广了，单独领域覆盖窄；且选择技术类文档阅评吧，没想好如何平衡技术内容完整性和英语知识点密度的问题。哎，搞自媒体不简单啊。目前就准备先做新闻类的文章，有必要时做一点深度扩展吧。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;更新频次：先保证一周 2 更，坚持 6 个月再说。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;盈利模式：应该就是常规的广告模式吧，不过长期目标的还是积累自己的品牌，方便后续推销自己开发的应用。扯太远了，先做好内容吧，其他都是不可求的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好，这就是本频道的一个 config 了，下面开始第零期的内容吧。&lt;/p&gt;
&lt;h1 id="1-本期内容"&gt;&lt;strong&gt;1.&lt;/strong&gt; 本期内容
&lt;/h1&gt;&lt;p&gt;本期内容围绕 Hacker News 上 &amp;ldquo;Cloudflare Down Again&amp;rdquo; 的话题，先看看 Hacker News 上的口语化评论，接着看下 Cloudflare status 页面上的书面描述，最后再来学习下 best practices for status pages.&lt;/p&gt;
&lt;h2 id="part1--cloudflare-down-again"&gt;Part1: &lt;br/&gt; Cloudflare Down Again
&lt;/h2&gt;&lt;p&gt;先看 Hacker News 上这个讨论的标题&lt;/p&gt;
&lt;section class="st text-center"&gt;
Cloudflare Down Again
&lt;/section&gt;
&lt;p&gt;它并非一个完整句子——只有主语 Cloudflare、形容词 Down 和副词 Again, 缺了谓语。可以补一个 is 句子就完整了。这种省略谓语系动词(linking verb, be verb)的句式，在标题这个位置是非常常见的（或者说这种就叫 headline-style），在推文、口语里也常用。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Q:&lt;/em&gt; 是不是也可以认为不是省略了 is, 而是把 Down 看做一个动词呢？&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A(ChatGPT):&lt;/em&gt; No，down 虽然有动词用法，但一般表示击倒、放倒 (e.g. He downed the opponent in 10 seconds) ，用得很少。这里做省略谓语的形容词讲更合适。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;扩展&lt;/strong&gt;&lt;br&gt;
表示网站挂了，除了是 is down, 也可以用 went down. 注意，is 是现在时(present tense)表示状态, went 用过去时 (past tense) 表示过去发生的行为。&lt;br&gt;
那进一步我们又有问题：这里标题省略的可能是 went 吗？答案是不太可能。因为英语标题默认只能省略系动词 be，而不能省略实义动词（如 went）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OK，标题看完，我们点进去看评论，这条评论挺有意思，我们拉出来：&lt;/p&gt;
&lt;section class="st"&gt;
Yes. Weird that https://www.cloudflarestatus.&lt;wbr&gt;com/ isn't reporting this properly. It should be full of red blinking lights.
&lt;/section&gt;
&lt;p&gt;我们先关注单词&lt;/p&gt;
&lt;section class="kp"&gt;weird&lt;/section&gt;
&lt;p&gt;collins 释义 &lt;em&gt;very strange or unusual and difficult to explain&lt;/em&gt;， “奇怪的” 意思。 这个单词我以前基本闻所未闻，但出国后发现这个词在 slack、论坛等口语化场景里用的频率极高，远超 strange 这个词。&lt;/p&gt;
&lt;p&gt;这种词频感受，与 collins 的词频统计是不符合的——在 collins 词频统计里，weird 是 2 星，但 strange 却有 4 星。其原因大概率是统计样本不一致：collins 统计的主要是（时效性不强的）书面语词频，不能很好反应快速变化的口语化词频。而 weird 恰恰是在现代互联网阶段（2010~）使用量暴增的。这是这类传统词典的缺陷。
不过好在现在有吃了全网数据的大模型在，我们一定程度上可以规避这种偏差了。&lt;/p&gt;
&lt;p&gt;对主评论是说 status page 没有及时反应当前宕机状态的问题，大家热烈进行了交流，我们接着来看 2 个有意思的子评论.&lt;/p&gt;
&lt;section class="st"&gt;
Yeah. I only work for a small company, but you can be certain we will not update the status page if only a small portion of customers are affected, and if we are fully down, rest assured there will be no available hands to keep the status page updated.
&lt;/section&gt;
&lt;p&gt;这个评论有点搞笑，或者说有点阴阳了。&lt;/p&gt;
&lt;p&gt;重点看 2 个短语：&lt;/p&gt;
&lt;section class="kp"&gt; you can be certain &lt;/section&gt;
&lt;p&gt;表示“你完全可以确定/毫无疑问”。 certain 是“确信的”含义。类似的可以用&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;you can be sure&lt;/li&gt;
&lt;li&gt;you can bet; (更口语)&lt;/li&gt;
&lt;li&gt;I guarantee&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;rest assured&lt;/section&gt;
&lt;p&gt;这是英语里常用的固定表达，意思是“请放心/尽管安心”。&lt;em&gt;rest&lt;/em&gt; = 放松、安心；assured = 得到保证的，有把握的；合起来就是一种“让对方安心”的表达。近似的表达是 don&amp;rsquo;t worry, 但 rest assured 语气更正式、坚定。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;rest assured 例句&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rest assured, we are handling the situation.&lt;/li&gt;
&lt;li&gt;You may rest assured that no data was lost.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;下一条评论&lt;/p&gt;
&lt;section class="st"&gt;
It’s wild how non(e) of the big corporations can make a functional status page.
&lt;/section&gt;
&lt;p&gt;看 2 个单词：&lt;/p&gt;
&lt;section class="kp"&gt;
wild
&lt;/section&gt;
&lt;p&gt;表示“离谱/夸张/不可思议/难以想象”。和 weird 类似, wild 也是口语里常用的词语，其语气既强烈又随意，看下下面的常见用法：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;That&amp;rsquo;s wild.&lt;br&gt;
一个短句，表达“太离谱”的感叹。&lt;/li&gt;
&lt;li&gt;He wen wild.&lt;br&gt;
情绪化/夸张的语气，说“他疯了”。&lt;/li&gt;
&lt;li&gt;The party was wild.&lt;br&gt;
积极、刺激的语气，“很嗨”的意思。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
functional
&lt;/section&gt;
&lt;p&gt;这里是“起作用的/运转正常的”的意思: &lt;em&gt;Functional equipment works or operates in the way that it is supposed to.&lt;/em&gt; 这个单词算是 IT 场景中常见的，如&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Is the API functional now?&lt;/li&gt;
&lt;li&gt;functional issues&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;但口语中，更常用 &lt;em&gt;Is it working now?&lt;/em&gt; 这种表达。&lt;/p&gt;
&lt;p&gt;好了，评论就看到这里。&lt;/p&gt;
&lt;h2 id="part2--cloudflare-status-page-content"&gt;Part2: &lt;br/&gt; Cloudflare status page content
&lt;/h2&gt;&lt;p&gt;点开前面评论提到的 &lt;a class="link" href="https://www.cloudflarestatus.com/" title="cloudflare status"
target="_blank" rel="noopener"
&gt;cloudflare status&lt;/a&gt;, 我们看到如下内容：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://k.fseasy.top/p/itsen-issue-000/cloudflare-down.desc.webp"
width="1041"
height="434"
srcset="https://k.fseasy.top/p/itsen-issue-000/cloudflare-down.desc_hu_fc739822e0d89f28.webp 480w, https://k.fseasy.top/p/itsen-issue-000/cloudflare-down.desc_hu_c4d51accd9848da.webp 1024w"
loading="lazy"
alt="status page screenshot"
class="gallery-image"
data-flex-grow="239"
data-flex-basis="575px"
&gt;&lt;/p&gt;
&lt;p&gt;先来看看标题栏：&lt;/p&gt;
&lt;section class="st text-center"&gt;
DTW (Detroit) on 2025-12-05
&lt;/section&gt;
&lt;p&gt;这个 DTW 是什么意思？&lt;/p&gt;
&lt;p&gt;Detroit 就是底特律，而 DTW 是 Detroit Metropolitan Wayne County Airport 的 IATA (International Air Transport Association)机场代码。原来，Cloudflare, AWS 等全球网络服务商，都用机场代码来代表机房/数据中心。IATA 代码是 3 个字母，可唯一对应世界范围的机场，且能方便查询到，的确很适合这种全球化的 IT 服务商。这还挺有意思的——犹记得我当时在百度时，应该是用的拼音缩写来表示机房位置，如 nj01, bj02 这种，相比起来拼音缩写感觉还是有点歧义的。&lt;/p&gt;
&lt;p&gt;再看两个加粗的内容：In progress, Scheduled, 都是表示状态。 In progress 表示“进行中”，Scheduled 表示“已安排，待执行”。这两个词语在项目管理中比较常见；特别的，WIP (Work in Progress) 是描述工作进度的常见缩写。&lt;/p&gt;
&lt;p&gt;接着看描述：&lt;/p&gt;
&lt;section class="st"&gt;
Scheduled maintenance is currently in progress. We will provide updates as necessary.
&lt;/section&gt;
重点词
&lt;section class="kp"&gt;
maintenance
&lt;/section&gt;
&lt;p&gt;“维护”的意思，在 IT 场景极为常用：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The server is down for maintenance.&lt;/li&gt;
&lt;li&gt;The site is currently in maintenance mode.&lt;/li&gt;
&lt;li&gt;This is a maintenance release focusing on stability.&lt;/li&gt;
&lt;li&gt;This code has a high maintenance cost. (要开新坑了:)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maintenance 对项目是很重要的，然而它的价值却往往被轻视了。这和扁鹊治病有点像，维护得好不出问题，体现不出价值；等挂了连夜 on call 修复，往往才体现出功/苦劳来。啊哈，看下一句&lt;/p&gt;
&lt;section class="st"&gt;
We will be performing scheduled maintenance in DTW (Detroit) datacenter on 2025-12-05 between 09:00 and 13:00 UTC.
&lt;/section&gt;
&lt;p&gt;经典句子，工作汇报肯定会用到类似的，背熟它没毛病。&lt;/p&gt;
&lt;p&gt;特别注意这个 &lt;em&gt;will be doing&lt;/em&gt; 结构，是将来进行时(Future continuous)，这在工作中用得也非常多——比如请假的时候。相比于一般将来时(Simple Future), 这种用法更常用在计划的、持续性活动中，给人一种“预先通知/准备”的感觉，比一般将来时更礼貌、柔和。看看例子：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;During the meeting, I will be presenting the new project. （安排/告知工作）&lt;/li&gt;
&lt;li&gt;OOO(out of office) next Friday. I will be attending a family event. (请假解释)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;section class="st"&gt;
Please make sure you are expecting this traffic to fail over elsewhere during this maintenance window as network interfaces in this datacenter may become temporarily unavailable.
&lt;/section&gt;
&lt;p&gt;比较典型的长句，as 这里断开，后半句是原因状语从句；可以用 &lt;em&gt;because&lt;/em&gt; 来替换 &lt;em&gt;as&lt;/em&gt;，但书面中 &lt;em&gt;as&lt;/em&gt; 会更加正式一点。&lt;/p&gt;
&lt;p&gt;先看一个关键短语：&lt;/p&gt;
&lt;section class="kp"&gt;
fail over
&lt;/section&gt;
&lt;p&gt;它是一个固定短语，也可以直接合起来，即 &lt;em&gt;failover&lt;/em&gt;，在 IT 网络运维里比较常用；表示“故障切换/备援切换”，放到原句中连起来就是“请确保你知晓（预期）流量会&lt;strong&gt;因故障自动切换到&lt;/strong&gt;其他地方”。&lt;/p&gt;
&lt;p&gt;最后看下单词&lt;/p&gt;
&lt;section class="kp"&gt;
temporarily
&lt;/section&gt;
&lt;p&gt;是“临时地”意思；对应的形容词是 temporary —— 我们常说的“临时文件”、tmp, temp 就对应/来自这个单词。&lt;/p&gt;
&lt;p&gt;OK，英语部分就看到这里为止。&lt;/p&gt;
&lt;p&gt;从当前页面得知，今天是有 Scheduled Maintenance, 不过 Hacker News 提到的宕机问题，应该与这个无关 —— 毕竟里面说到流量会自动 failover elsewhere. 嗯，看来状态页还真没更新啊？&lt;/p&gt;
&lt;h2 id="part-3--best-practices-for-status-pages"&gt;Part 3: &lt;br/&gt; Best Practices for Status Pages
&lt;/h2&gt;&lt;p&gt;围绕构建 Status Pages 的主题，我们最后来到 openstatus.dev 的 &lt;a class="link" href="https://docs.openstatus.dev/concept/best-practices-status-page" title="Best Practices for Status Pages"
target="_blank" rel="noopener"
&gt;Best Practices for Status Pages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;文章开篇论述了 Status Page 的重要性，并引出了后续的最佳实践。这段文本写得挺漂亮的，建议全文背诵，工作中用得上。&lt;/p&gt;
&lt;section class="st"&gt;
Status pages are essential tools for communicating service health and incidents to users. They build trust by providing transparency and should be a core component of any software company’s communication strategy. Following a set of best practices ensures your status page is effective and helpful.
&lt;/section&gt;
&lt;p&gt;这段话可以说 2 个点：&lt;/p&gt;
&lt;section class="kp"&gt;
transparency
&lt;/section&gt;
&lt;p&gt;是“透明性”的意思，看下面的例句：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;We value transparency in our decision-making process.&lt;/li&gt;
&lt;li&gt;The company increased financial transparency after the audit.&lt;br&gt;
公司在审计之后提高了财务透明度。&lt;/li&gt;
&lt;li&gt;We appreciate your transparency throughout the project.&lt;br&gt;
我们对你在整个项目中的坦诚和透明表示感谢。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
Following... 的句法结构
&lt;/section&gt;
&lt;p&gt;原句：Following a set of best practices ensures your status page is effective and helpful.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Following a set of best practices 是动名词短语(Gerund Phrase)做主语&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;ensues&lt;/em&gt; 是谓语，而后面整个是一个宾语从句，省略了 that.&lt;br&gt;
ensures + 宾语从句省略 &lt;em&gt;that&lt;/em&gt;, 是一种常见做法，能让语气更自然。不过注意不是所有动词都可以省略 &lt;em&gt;that&lt;/em&gt;, 省略前提是不引入歧义。复杂的咱搞不清，咱先记住类似的 &lt;em&gt;say, think, believe, know, hope&lt;/em&gt; 这些动词是可以省略的就行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;回到文章，整体论述后，具体实践部分有 4 大块，这里把每块的关键的信息挑出来：&lt;/p&gt;
&lt;section class="st"&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Maintain Transparency and Honesty&lt;/p&gt;
&lt;p&gt;Be upfront about issues, even minor ones. Hiding problems erodes user trust and can lead to more support requests.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;p&gt;有 2 个重要的单词：&lt;/p&gt;
&lt;section class="kp"&gt;
upfront
&lt;/section&gt;
&lt;p&gt;这里是“坦率的/诚实的”意思；此外常用的意思还有“预付的”/“提前的”&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;I want to be upfront with you — we may miss the deadline.&lt;/li&gt;
&lt;li&gt;There are no upfront fees — you pay only when you use it.&lt;br&gt;
没有前期费用——你只在使用时付费。&lt;/li&gt;
&lt;li&gt;The project demands significant upfront investment.&lt;br&gt;
这个项目需要大量的前期投资&lt;/li&gt;
&lt;li&gt;It’s better to settle expectations upfront.&lt;br&gt;
最好一开始就把预期谈好。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
erode
&lt;/section&gt;
&lt;p&gt;表示“侵蚀/削弱（权威、权利、市场份额等）”，是从物理上的“（岩石/土壤）侵蚀”引申出的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;New competitors are eroding their market share.&lt;br&gt;
新竞争者正在侵蚀他们的市场份额。&lt;/li&gt;
&lt;li&gt;Once exposed, soil is quickly eroded by wind and rain.&lt;br&gt;
一旦暴露在外，土壤很快就会被风雨侵蚀。&lt;/li&gt;
&lt;li&gt;Over time, the river eroded the banks and changed its course.&lt;br&gt;
随着时间推移，河流侵蚀了河岸并改变了河道。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="st"&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;Automate Where Possible&lt;/p&gt;
&lt;p&gt;Manual updates during an outage are prone to error and can be slow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;p&gt;2 个关键单词：&lt;/p&gt;
&lt;section class="kp"&gt;
outage
&lt;/section&gt;
&lt;p&gt;“停电、宕机、服务中断”的意思。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The service has been restored after a brief outage.&lt;br&gt;
在一次短暂宕机后，服务已恢复。&lt;/li&gt;
&lt;li&gt;A sudden outage left the entire building in the dark.&lt;br&gt;
一次突发停电使整栋楼陷入黑暗。&lt;/li&gt;
&lt;li&gt;Extended outages can erode user trust.&lt;br&gt;
长时间的宕机会削弱用户信任。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="kp"&gt;
prone
&lt;/section&gt;
&lt;p&gt;表示“有……（不好的）倾向；易于……的”；常见搭配就是这里的 &lt;em&gt;be prone to + 名词(e.g. mistakes, failure)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;还可以用 &lt;em&gt;-prone&lt;/em&gt; 后缀与名词连用构成形容词，如这里的 be prone to error 可以变成 be error-prone.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Young children are prone to getting sick in winter.&lt;br&gt;
小孩子冬天容易生病。&lt;/li&gt;
&lt;li&gt;The app is prone to crashes on older devices.&lt;br&gt;
这个应用在老设备上容易崩溃。&lt;/li&gt;
&lt;li&gt;He’s prone to exaggeration.
他有夸大的习惯。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;section class="st"&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;Provide Detailed Incident Communication&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Investigating: &amp;ldquo;We’re currently investigating an issue affecting user logins.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Identified: &amp;ldquo;We’ve identified the root cause as a database connection issue and are working on a fix.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Monitoring: &amp;ldquo;A fix has been deployed, and we’re monitoring the system’s performance.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Resolved: &amp;ldquo;The issue has been resolved, and all services are now operational.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;p&gt;第 3 点通过例子告诉我们如何来及时同步 incident 给客户。
整理下可能用到的表示状态的词：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center"&gt;word&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;operational&lt;/td&gt;
&lt;td&gt;正常运行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;degraded&lt;/td&gt;
&lt;td&gt;服务退化，性能下降&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;investigating&lt;/td&gt;
&lt;td&gt;事故正在调查中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;workaround&lt;/td&gt;
&lt;td&gt;应急方案，临时解决方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;identified&lt;/td&gt;
&lt;td&gt;问题已经找到了！&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;mitigated&lt;/td&gt;
&lt;td&gt;问题已缓解（但没完全修好）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;monitoring&lt;/td&gt;
&lt;td&gt;一个修复已经部署，正在监控当前状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;resolved&lt;/td&gt;
&lt;td&gt;指问题已经被解决&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;section class="st"&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Make it Easily Accessible
&lt;ul&gt;
&lt;li&gt;Prominent link: Place a link to your status page in your application’s footer, on your website, and in your support documentation.&lt;/li&gt;
&lt;li&gt;Custom Domain: Use a simple, memorable URL like status.yourcompany.&lt;wbr&gt;com.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;p&gt;第 4 点是要让状态页能被轻松找到。重点看下单词&lt;/p&gt;
&lt;section class="kp"&gt;
prominent
&lt;/section&gt;
&lt;p&gt;这里指“显眼的，容易被注意到的”；还有一个意思是“重要的；杰出的；著名的”。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The church tower was a prominent feature in the landscape.&lt;br&gt;
教堂的尖塔曾经是此地景观的重要特色。&lt;/li&gt;
&lt;li&gt;There was a prominent increase in user traffic last month.&lt;br&gt;
上个月用户流量出现了明显增长。&lt;/li&gt;
&lt;li&gt;She was prominent in the fashion industry.&lt;br&gt;
她曾在时装界名噪一时。&lt;/li&gt;
&lt;li&gt;He is a prominent figure in the tech industry.&lt;br&gt;
他是科技行业的知名人物。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;好啦，到此这份 Best Practices 就介绍完了。&lt;/p&gt;
&lt;p&gt;Status Page 目前基本都是自动检测+人工维护的混合方式。自动检测是实时的，但容易误报，无法细化问题，更无法同步修复情况；所以人工介入是必然的。一般来说，流程大概是后台自动监控 -&amp;gt; 有问题触发预警 -&amp;gt; page on-call, 然后相关人员就不得不开始放下手头的事情（或者没做完的梦 ：）来定位问题、拉群、打电话、请示领导、对外同步进展……&lt;/p&gt;
&lt;p&gt;Hacker News 上吐槽 Cloudflare status page 状态更新迟了，在业界估计也算正常吧。毕竟影响力这么大的服务，用户肯定第一时间就会发现问题；而公司内部，就算第一时间发现，也还需要走很多流程才能将状态同步到 Status Page 上，延迟是基本无法避免的，就看延迟多久了。&lt;/p&gt;
&lt;h1 id="2-end"&gt;&lt;strong&gt;2.&lt;/strong&gt; END
&lt;/h1&gt;&lt;p&gt;好了，所有内容到此结束。本期算是围绕 Status Page 这个主题, 学习了口语和书面的一些表达方法，希望对你有所帮助吧。&lt;/p&gt;
&lt;p&gt;如果你需要本文全部的英语内容做口语练习，就点第二条内容吧。&lt;/p&gt;
&lt;p&gt;下期再见。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;注1：本内容大量使用了 LLM、Collins/OALD 等资源。致谢。内容大概率有疏漏和错误，还请专业人士多多修正补充吧。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;注2：第 0 期内容有点太多了，对此表示深刻歉意！&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="3-appendix-英语材料文本"&gt;&lt;strong&gt;3.&lt;/strong&gt; Appendix: 英语材料(文本)
&lt;/h1&gt;&lt;p&gt;Cloudflare Down Again (Headline style, linking-verb is omitted)&lt;/p&gt;
&lt;p&gt;Cloudflare is down again.&lt;/p&gt;
&lt;p&gt;Cloudflare went down again.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Yes. Weird that &lt;a class="link" href="https://www.cloudflarestatus.com/" target="_blank" rel="noopener"
&gt;https://www.cloudflarestatus.com/&lt;/a&gt; isn&amp;rsquo;t reporting this properly. It should be full of red blinking lights.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;weird&lt;/strong&gt;: If you describe something or someone as weird, you mean that they are strange.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Yeah. I only work for a small company, but you can be certain we will not update the status page if only a small portion of customers are affected, and if we are fully down, rest assured there will be no available hands to keep the status page updated.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;you can be certain&lt;/strong&gt;: A strong way to say &amp;ldquo;you can be sure&amp;rdquo;, emphasizing confidence or guarantee about something.&lt;/p&gt;
&lt;p&gt;If she promised to help, you can be certain she will follow through.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Are you joining us for dinner?&amp;rdquo; — &amp;ldquo;You can bet.&amp;rdquo; (&lt;code&gt;you can bet&lt;/code&gt; - casual)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;rest assured&lt;/strong&gt;: A formal or reassuring way to say &amp;ldquo;be confident,&amp;rdquo; &amp;ldquo;don’t worry,&amp;rdquo; or &amp;ldquo;you can be sure.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Rest assured, we are handling the situation.&lt;/p&gt;
&lt;p&gt;You may rest assured that no data was lost&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;It’s wild how none of the big corporations can make a functional status page.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;wild&lt;/strong&gt;: Informal use to express amazement. Crazy / surprising / exciting&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s wild.&lt;/p&gt;
&lt;p&gt;He wen wild.&lt;/p&gt;
&lt;p&gt;The party was wild.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;functional&lt;/strong&gt;: Something that works well and serves its purpose.&lt;/p&gt;
&lt;p&gt;Is the API functional now?&lt;/p&gt;
&lt;p&gt;The software has several functional improvements in this update.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Cloudflare uses airport codes to represent its edge data centers/PoPs (Points of Presence).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Scheduled maintenance is currently in progress. We will provide updates as necessary.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;maintenance&lt;/strong&gt;: The act of keeping something in good condition – often refers to equipment, machinery, buildings, or systems.&lt;/p&gt;
&lt;p&gt;The server is down for maintenance.&lt;/p&gt;
&lt;p&gt;The site is currently in maintenance mode.&lt;/p&gt;
&lt;p&gt;This is a maintenance release focusing on stability.&lt;/p&gt;
&lt;p&gt;This code has a high maintenance cost.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;We will be performing scheduled maintenance in DTW datacenter on 2025-12-05 between 09:00 and 13:00 UTC.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future continuous&lt;/strong&gt;: will be doing&lt;/p&gt;
&lt;p&gt;During the meeting, I will be presenting the new project.&lt;/p&gt;
&lt;p&gt;OOO next Friday. I will be attending a family event.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Please make sure you are expecting this traffic to fail over elsewhere during this maintenance window as network interfaces in this datacenter may become temporarily unavailable.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Status pages are essential tools for communicating service health and incidents to users. They build trust by providing transparency and should be a core component of any software company’s communication strategy. Following a set of best practices ensures your status page is effective and helpful.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;transparency&lt;/strong&gt;: The quality of being open, clear, and honest&lt;/p&gt;
&lt;p&gt;We value transparency in our decision-making process.&lt;/p&gt;
&lt;p&gt;The company increased financial transparency after the audit.&lt;/p&gt;
&lt;p&gt;We appreciate your transparency throughout the project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Maintain Transparency and Honesty&lt;/p&gt;
&lt;p&gt;Be upfront about issues, even minor ones. Hiding problems erodes user trust and can lead to more support requests.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;upfront&lt;/strong&gt;: Honest and direct – describing someone who communicates clearly and openly; Paid or done in advance – often used in financial contexts; Positioned at the front – less common, literal meaning.&lt;/p&gt;
&lt;p&gt;I want to be upfront with you — we may miss the deadline.&lt;/p&gt;
&lt;p&gt;There are no upfront fees — you pay only when you use it.&lt;/p&gt;
&lt;p&gt;The project demands significant upfront investment.&lt;/p&gt;
&lt;p&gt;It’s better to settle expectations upfront.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;erode&lt;/strong&gt;: To gradually wear away or destroy something – often used literally for physical things like soil, rock, or materials; To weaken or gradually reduce something abstract – such as confidence, trust, or authority.&lt;/p&gt;
&lt;p&gt;New competitors are eroding their market share.&lt;/p&gt;
&lt;p&gt;Once exposed, soil is quickly eroded by wind and rain&lt;/p&gt;
&lt;p&gt;Over time, the river eroded the banks and changed its course.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Automate Where Possible&lt;/p&gt;
&lt;p&gt;Manual updates during an outage are prone to error and can be slow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;outage&lt;/strong&gt;: A period when a service or system is not working – often used for electricity, internet, or other utilities; A temporary interruption or failure – can also refer to any system, service, or operation being unavailable.&lt;/p&gt;
&lt;p&gt;The service has been restored after a brief outage.&lt;/p&gt;
&lt;p&gt;A sudden outage left the entire building in the dark.&lt;/p&gt;
&lt;p&gt;Extended outages can erode user trust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;prone&lt;/strong&gt;: Likely to experience something, usually negative – often used to describe a tendency or susceptibility.&lt;/p&gt;
&lt;p&gt;Young children are prone to getting sick in winter.&lt;/p&gt;
&lt;p&gt;The app is prone to crashes on older devices.&lt;/p&gt;
&lt;p&gt;He’s prone to exaggeration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Provide Detailed Incident Communication&lt;/p&gt;
&lt;p&gt;Investigating: &amp;ldquo;We’re currently investigating an issue affecting user logins.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Identified: &amp;ldquo;We’ve identified the root cause as a database connection issue and are working on a fix.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Monitoring: &amp;ldquo;A fix has been deployed, and we’re monitoring the system’s performance.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Resolved: &amp;ldquo;The issue has been resolved, and all services are now operational.&amp;rdquo;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Make it Easily Accessible&lt;/p&gt;
&lt;p&gt;Prominent link: Place a link to your status page in your application’s footer, on your website, and in your support documentation.&lt;/p&gt;
&lt;p&gt;Custom Domain: Use a simple, memorable URL like status.yourcompany.com.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;prominent&lt;/strong&gt;: Easily noticeable or standing out – often used for objects, features, or qualities; Important, well-known, or famous – often used for people, organizations, or ideas.&lt;/p&gt;
&lt;p&gt;The church tower was a prominent feature in the landscape.&lt;/p&gt;
&lt;p&gt;There was a prominent increase in user traffic last month.&lt;/p&gt;
&lt;p&gt;She was prominent in the fashion industry.&lt;/p&gt;
&lt;p&gt;He is a prominent figure in the tech industry.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--- CONTENT END ---&gt;</description></item><item><title>英语单词 25/1203</title><link>https://k.fseasy.top/p/enwords-251203/</link><pubDate>Wed, 03 Dec 2025 16:48:15 +0800</pubDate><guid>https://k.fseasy.top/p/enwords-251203/</guid><description>&lt;h2 id="catalog--inventory"&gt;Catalog &amp;amp; Inventory
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;The widget catalog has an inventory of commonly used widgets in the Material and Cupertino libraries.&lt;br&gt;
该 widget 目录汇总了 Material 和 Cupertino 组件库中常用的 widgets&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Catalog&lt;/strong&gt;: noun &lt;code&gt;/ˈkæt.ə.lɒɡ/&lt;/code&gt; A complete, organized list of items — often with descriptions, categories, or metadata — designed for browsing, reference, or selection.
中文常译为：目录、产品目录、分类清单、资源索引&lt;/p&gt;
&lt;p&gt;注意：不是简单“列表”（list），而是结构化、可检索、带组织逻辑的集合。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inventory&lt;/strong&gt;: noun &lt;code&gt;/ˈɪn.vən.tər.i/&lt;/code&gt; An official, comprehensive list of items — especially those held for use, sale, or reference; implies completeness, enumeration, and sometimes manageability.&lt;/p&gt;
&lt;p&gt;中文常译为：库存清单、清点清单、汇总表、资源总览;&lt;/p&gt;
&lt;p&gt;虽然字面有“库存”之意（如仓库货物），但在技术文档中几乎不指物理库存，而强调：系统性盘点 + 全面覆盖 + 可管理性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对比：&lt;/p&gt;
&lt;p&gt;❌ “has a list of…” → 可能只是随意罗列，无组织、无筛选&lt;/p&gt;
&lt;p&gt;✅ “has an inventory of…” → 强调权威性、完整性、实用性与可维护性（就像 IT 部门的资产 inventory）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tonal"&gt;Tonal
&lt;/h2&gt;&lt;p&gt;tonal（形容词）常见意思：&lt;/p&gt;
&lt;p&gt;音调的 / 音色的&lt;/p&gt;
&lt;p&gt;例：tonal quality of a voice → 声音的音色&lt;/p&gt;
&lt;p&gt;色调的 / 有色彩感的（在艺术、绘画里）&lt;/p&gt;
&lt;p&gt;例：a tonal painting → 色调画作&lt;/p&gt;
&lt;p&gt;在 Material Design 3 / Flutter 里：&lt;/p&gt;
&lt;p&gt;Tonal Button = “色调按钮”&lt;/p&gt;
&lt;p&gt;核心概念：&lt;/p&gt;
&lt;p&gt;有颜色填充，但颜色比 FilledButton 柔和&lt;/p&gt;
&lt;p&gt;比 OutlinedButton 更突出，但不抢眼&lt;/p&gt;
&lt;p&gt;作用就是通过色彩的“色调”来增加视觉层次&lt;/p&gt;
&lt;h2 id="obscure"&gt;obscure
&lt;/h2&gt;&lt;p&gt;not well known
• 无名的；鲜为人知的&lt;/p&gt;
&lt;p&gt;He was born around 1650 but his origins remain obscure.
他生于 1650 年前后,但身世不详。&lt;/p&gt;
&lt;p&gt;to make dark, dim, or indistinct
The soot on the lampshade obscured the light.&lt;/p&gt;
&lt;p&gt;to conceal(掩盖;隐藏) or hide by or as if by covering
… snow on glaciers can obscure deep crevasses.&lt;/p&gt;
&lt;h2 id="chevron-ˈʃevrən"&gt;chevron /ˈʃevrən/
&lt;/h2&gt;&lt;p&gt;找图标的时候发现这个单词: chevron-left, 向左的标识。&lt;/p&gt;
&lt;p&gt;V形;V形图案 A chevron is a V shape.&lt;/p&gt;
&lt;p&gt;The chevron or arrow road sign indicates a sharp bend to the left or right.&lt;/p&gt;
&lt;p&gt;V形或箭头路标表示有向左或向右的急转弯。&lt;/p&gt;
&lt;h2 id="grip-ɡrɪp"&gt;grip /ɡrɪp/
&lt;/h2&gt;&lt;p&gt;找图标时发现的,表示可以拖拽移动的图标。&lt;/p&gt;
&lt;p&gt;高频词。本意比较丰富，大致上有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;v/n 紧握抓牢;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;She gripped the rope.&lt;/p&gt;
&lt;p&gt;她紧紧抓住绳索。&lt;/p&gt;
&lt;p&gt;His strong hand eased the bag from her grip.&lt;/p&gt;
&lt;p&gt;他强有力的手迫使她松开了握紧袋子的双手。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;N-SING, 单数名词，掌握支配。&lt;/p&gt;
&lt;p&gt;The president maintains an iron grip on his country&amp;hellip;&lt;/p&gt;
&lt;p&gt;总统牢牢地控制着他的国家。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;v 强烈影响&lt;/p&gt;
&lt;p&gt;Pain gripped him&amp;hellip;&lt;/p&gt;
&lt;p&gt;他感到一阵剧痛。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;v 吸引，迷住&lt;/p&gt;
&lt;p&gt;The nation is gripped by the dramatic story.
举国上下都为那个戏剧性的故事牵动着。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;n 防滑，抓地力&lt;/p&gt;
&lt;p&gt;a new way of reinforcing rubber which gives car tyres better grip.&lt;/p&gt;
&lt;p&gt;加固橡胶以增强车胎抓地力的新方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;n 手提包，旅行袋&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;phrase: get to grips with 认真考虑并着手处理&lt;/p&gt;
&lt;p&gt;The government&amp;rsquo;s first task is to get to grips with the economy.&lt;/p&gt;
&lt;p&gt;政府的首要任务是处理好经济问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;phrase 镇定下来 get a grip&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;phrase: in the grip of 受制于，受&amp;hellip;深刻影响&lt;/p&gt;
&lt;p&gt;Britain is still in the grip of recession.&lt;/p&gt;
&lt;p&gt;英国依然没有摆脱经济衰退。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;phrase: lose you grip 失去信心，效率降低，驾驭不住&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;phrase: someone has a grip on reality 了解形势，理解现状&lt;/p&gt;
&lt;p&gt;Shakur loses his fragile grip on reality and starts blasting away at friends and foe alike.&lt;/p&gt;
&lt;p&gt;沙库尔丧失了对形势仅存的一点判断，无论对敌对友都开始大加挞伐。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Flutter Basic Notes</title><link>https://k.fseasy.top/p/flutter-baisc-notes/</link><pubDate>Tue, 02 Dec 2025 17:24:41 +0800</pubDate><guid>https://k.fseasy.top/p/flutter-baisc-notes/</guid><description>&lt;h2 id="layout"&gt;Layout
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;layout 是由自己和 parent 共同决定的：Constraints go down. Sizes go up. Parent sets the position.&lt;/p&gt;
&lt;p&gt;In the simplest example, the layout conversation looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A widget receives its constraints from its parent.&lt;/li&gt;
&lt;li&gt;A constraint is just a set of 4 doubles: a minimum and maximum width, and a minimum and maximum height.&lt;/li&gt;
&lt;li&gt;The widget determines what size it should be within those constraints, and passes its width and height back to the parent.&lt;/li&gt;
&lt;li&gt;The parent looks at the size it wants to be and how it should be aligned, and sets the widget&amp;rsquo;s position accordingly. Alignment can be set explicitly, using a variety of widgets like Center, and the alignment properties on Row and Column.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ListViews are commonly used when you have an unknown or very large (or infinite) number of list items. When this is the case, &lt;strong&gt;it&amp;rsquo;s best to use the ListView.builder constructor&lt;/strong&gt;. The builder constructor only builds the children that are currently visible on screen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="state-management"&gt;State Management
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.flutter.cn/get-started/fundamentals/state-management" target="_blank" rel="noopener"
&gt;原文档&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;这里都是讲的内建 (primitives)方式，实际开发中常用第三方库，如 riverpod, provider 等；&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;继承 StatefulWidget, 本身不存储任何状态，而是包含一个 &lt;code&gt;State&amp;lt;WidgetT&amp;gt;&lt;/code&gt; 类成员；这个成员由一个继承自 &lt;code&gt;Stage&amp;lt;WidgetT&amp;gt;&lt;/code&gt; 的子类构造。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Encapsulation: widget 本身不能看到/访问 State 里的内容 (后面看到，其实也可以定义成员；然后在 State 里可以通过 widget 变量来访问！)&lt;/li&gt;
&lt;li&gt;Object lifecycle: State object 和 它的成员在 Widget 初始化时构建，并直到它从屏幕中移除才销毁。这是 &lt;strong&gt;ephemeral state&lt;/strong&gt; (暂时状态).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;状态的共享/依赖：如果一个状态改变，如何把状态传递给需要的 widgets? 3 种方法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;widget constructor: 把依赖内容暴露为 contructor 变量——这样上层改了，重建时下游自然重建。
问题：似乎这只适合依赖的对象是当前类的子元素的情况？
另外，如果层次很深，就需要每层开洞（透传），也即 prob-drilling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;InherientWidget: 继承自 InherimentWidget, 就可以使用 Of 方法，把变量注入到 Context 里。
但这个 State 本身还需要实现一个是否相等的判断的函数，方便框架确定是否需要重绘。
provider 就是这个机制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;callback: widget 暴露一个 callback 函数给外部；外部可以自定义这个 callback 操作&lt;/p&gt;
&lt;p&gt;Flutter provides the &lt;code&gt;ValueChanged&lt;/code&gt; type, which declares a function callback with a single parameter:
&lt;code&gt;typedef ValueChanged&amp;lt;T&amp;gt; = void Function(T value);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;状态共享让别的 widget 获取到状态，但是还需要一个额外的触发机制来更行UI，从而让状态更新真的被应用（绘制）。 2 种触发更新 UI 的方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ChangeNotifier: 自定义一个类继承自 &lt;code&gt;ChangeNotifier&lt;/code&gt;，可以自定义需要的成员变量或函数；然后实例化成一个变量：
&lt;ul&gt;
&lt;li&gt;注册监听：需要根据状态更新 UI 的 widget，就在构建 Widget 时，用 &lt;code&gt;ListenableBuilder&lt;/code&gt; 包裹这个 Widget：将此实例变量传给其 &lt;code&gt;listenable&lt;/code&gt; 参数，然后在 builder 参数中访问此变量，构建 Widget.&lt;/li&gt;
&lt;li&gt;需要触发更新 UI 时，就调用实例的 &lt;code&gt;notifyListeners&lt;/code&gt; 接口（继承自 ChangeNotifier）.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ValueNotifier: 是 ChangeNotifier 的简化版。直接绑定一个值，这样就不用去创建一个继承自 ChangeNotifier 的类了。
&lt;ul&gt;
&lt;li&gt;通过 &lt;code&gt;ValueListenableBuilder&lt;/code&gt; 或者 &lt;code&gt;ListenableBuilder&lt;/code&gt; 来创建监听；前者的区别是 builder 函数直接将 value unpack 出来作为参数传递给 callback 了。&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;ValueNotifier.value&lt;/code&gt; 来访问值；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MVVM 组织代码： Model - ViewModel - View.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Model: server 侧的数据结构；可以与 Flutter 无任何关系。&lt;/li&gt;
&lt;li&gt;ViewModel: 与 Model 交互，同时暴露接口给 View. 一般继承自 ChangeNotifier, 这样 View 就可以使用它来注册监听，实时渲染改动。&lt;/li&gt;
&lt;li&gt;View: Widget (这里的话，都是用 ListenableBuilder 封装，这样方便更新)。注意它只会访问 ViewModel 实例，看不见 Model 的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="user-input"&gt;User Input
&lt;/h2&gt;&lt;h3 id="按钮"&gt;按钮
&lt;/h3&gt;&lt;p&gt;Buttons allow a user to initiate an action in the UI by clicking or tapping. The Material library provides a variety of button types that are functionally similar, but styled differently for various use cases, including:&lt;/p&gt;
&lt;p&gt;ElevatedButton: A button with some depth. Use elevated buttons to add dimension to otherwise mostly flat layouts. 在整体偏扁平的界面中，使用带立体感（有阴影）的按钮，可以增加层次和深度感。 dimension 在这里不是数学维度，指的是：立体感，层次感，深度（depth）&lt;/p&gt;
&lt;p&gt;FilledButton: A filled button that should be used for important, final actions that complete a flow, like Save, Join now, or Confirm. 实色按钮（primary color, 很显眼）
Tonal Button: A middle ground button between FilledButton and OutlinedButton. They&amp;rsquo;re useful in contexts where a lower-priority button requires more emphasis than an outline, like Next. 色调按钮（同色系但柔和，次要引导）
OutlinedButton: A button with text and a visible border. These buttons contain actions that are important, but aren&amp;rsquo;t the primary action in an app. 描边按钮（几乎无填充，低调）
TextButton: Clickable text, without a border. Since text buttons don&amp;rsquo;t have visible borders, they must rely on their position relative to other content for context.
IconButton: A button with an icon.
FloatingActionButton: An icon button that hovers over content to promote a primary action.&lt;/p&gt;
&lt;p&gt;Rich Text: Rich Text Editor code &lt;a class="link" href="https://github.com/flutter/samples/tree/main/simplistic_editor" target="_blank" rel="noopener"
&gt;https://github.com/flutter/samples/tree/main/simplistic_editor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Form App demo: &lt;a class="link" href="https://github.com/flutter/samples/tree/main/form_app/" target="_blank" rel="noopener"
&gt;https://github.com/flutter/samples/tree/main/form_app/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="语法"&gt;语法
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Calendar&amp;gt;{calendarView},&lt;/code&gt;: 泛型字面量构造函数； = Calendar&lt;T&gt;(child: calendarView) where T is the 推断的类型。&lt;/p&gt;
&lt;h2 id="tips"&gt;Tips
&lt;/h2&gt;&lt;p&gt;SizedBox(width: 18, child: SizedBox(child: Text(&amp;rsquo;$_favoriteCount&amp;rsquo;))),
当 Text 在 40 和 41 之间变化时，将文本放在 SizedBox 中并设置其宽度可防止出现明显的「跳跃」，因为这些值具有不同的宽度。&lt;/p&gt;
&lt;h2 id="examples"&gt;Examples
&lt;/h2&gt;&lt;p&gt;根据 size / 列表来动态创建元素。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inputs = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; children: List&amp;lt;Widget&amp;gt;.generate(inputs, (int index) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return InputChip(
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; label: Text(&amp;#39;Person ${index + 1}&amp;#39;),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; selected: selectedIndex == index,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; onSelected: (bool selected) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; setState(() {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (selectedIndex == index) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; selectedIndex = null;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; } else {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; selectedIndex = index;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; onDeleted: () {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; setState(() {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inputs = inputs - 1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }).toList(),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Dart 碎片记录</title><link>https://k.fseasy.top/p/dart-%E7%A2%8E%E7%89%87%E8%AE%B0%E5%BD%95/</link><pubDate>Fri, 28 Nov 2025 23:08:21 +0800</pubDate><guid>https://k.fseasy.top/p/dart-%E7%A2%8E%E7%89%87%E8%AE%B0%E5%BD%95/</guid><description>&lt;h2 id="basic-1"&gt;Basic 1
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dart" data-lang="Dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dart:math&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;show&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Compute π using the Monte Carlo method.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;await&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;estimate&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;computePi&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;π ≅ &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;estimate&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;/// Generates a stream of increasingly accurate estimates of π.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;computePi&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Inferred to be of type int
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generateRandom&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;inside&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isInsideUnitCircle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;inside&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Area of a circle is A = π⋅r², therefore π = A/r².
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// We consider only non-negative x and y (that is, the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// first quadrant), which doesn&amp;#39;t change the ratio.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// So, when given random points with x ∈ [0, 1],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// y ∈ [0, 1], the ratio of those inside the unit circle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// should approach π / 4. Therefore, the value of π
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// should be:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;generateRandom&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="kd"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nextDouble&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nextDouble&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;isInsideUnitCircle&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Stream: with &lt;code&gt;async*&lt;/code&gt; modifier, 异步生成器，返回这个 Stream&lt;/li&gt;
&lt;li&gt;Iterable: with &lt;code&gt;sync*&lt;/code&gt; modifer, 同步生成器，返回 Iterable&lt;/li&gt;
&lt;li&gt;async 异步， sync 同步，&lt;code&gt;*&lt;/code&gt; 表示是一个生成器；函数默认都是 sync 的，所以单独的 sync 不写&lt;/li&gt;
&lt;li&gt;async 返回的永远都是 &lt;code&gt;Feature&amp;lt;T&amp;gt;&lt;/code&gt;；但是对 main 函数，因为不会检查返回值，所以写成 &lt;code&gt;void&lt;/code&gt; 也没事 (正常该是 &lt;code&gt;Feature&amp;lt;void&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;main 可以是 sync, 也可以是 async.&lt;/li&gt;
&lt;li&gt;同步方法里，可以调用异步函数，但是没法用 await 关键字来等待异步返回；只用用 &lt;code&gt;.then&lt;/code&gt; 来串联其后续动作。
&lt;ul&gt;
&lt;li&gt;为什么不能去等异步的返回？程序层面不行。理论上可以 while + sleep + 检测标志位 来实现等待，但这失去了异步的价值？不过感觉还是不应该有这个限制的。&lt;/li&gt;
&lt;li&gt;但从 ChatGPT 描述，Dart 是单线程的，这么做会卡死 UI 或者死锁——如果是单线程，你去 while 检测肯定就锁死了。&lt;/li&gt;
&lt;li&gt;所以，要想用 await，就用 async. async 函数有传递性啊。&lt;/li&gt;
&lt;li&gt;同步函数就是去吊起一个操作的。如果有先后依赖关系，就得靠 then 来解决&lt;/li&gt;
&lt;li&gt;如果有多个依赖，还有 Future.wait([]).then((xxx) {xxx}) 来等待多个返回后再执行 then.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;类定义：字段、构造函数、方法；默认所有类都是 public；私有成员用前缀 &lt;code&gt;_&lt;/code&gt; 标识&lt;/li&gt;
&lt;li&gt;构造函数有几类：
&lt;ul&gt;
&lt;li&gt;普通构造函数：类同名的方法 &lt;code&gt;C&lt;/code&gt;；可以用 &lt;code&gt;this.xxx&lt;/code&gt; 来按&lt;strong&gt;位置对应关系&lt;/strong&gt;赋值字段； 只有 1 个&lt;/li&gt;
&lt;li&gt;命名构造函数：类名+&lt;code&gt;.&lt;/code&gt;+名字，&lt;code&gt;C.name&lt;/code&gt;. 可以有多个&lt;/li&gt;
&lt;li&gt;工厂函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;方法：特殊的 get 方法，使用箭头函数直接返回，有 &lt;code&gt;get&lt;/code&gt; 关键字&lt;/li&gt;
&lt;li&gt;单继承，使用 extends 关键字；&lt;/li&gt;
&lt;li&gt;mixin 混入，类似 interface，可以实现多继承&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="basic-2"&gt;Basic 2
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dart:convert&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;package:http/http.dart&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Package&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;latestVersion&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;latestVersion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Package{name: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="s1"&gt;, latestVersion: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;latestVersion&lt;/span&gt;&lt;span class="s1"&gt;, description: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="s1"&gt;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;httpPackageUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dart.dev&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/f/packages/http.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;httpPackageResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpPackageUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpPackageResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Failed to retrieve the http package!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpPackageResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;latestVersion&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;final 关键字：表示第一次赋值后不能再更改；无需要求静态赋值（可以运行时才知道值）；const 则表示值需要在编译时就是定值。
与 final 对应的是 &lt;code&gt;var&lt;/code&gt;，默认就是 var, 所以一般不写。&lt;/li&gt;
&lt;li&gt;toString 是从顶层 object 隐式继承的函数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;String?&lt;/code&gt; 里的 ? 表示可空 (null) 类型.
&lt;code&gt;!&lt;/code&gt; 非空断言;
&lt;code&gt;??&lt;/code&gt; 空合并操作符： &lt;code&gt;final b = a ?? &amp;quot;null-default&amp;quot;&lt;/code&gt;
&lt;code&gt;??=&lt;/code&gt; 空合并赋值： &lt;code&gt;b ??= &amp;quot;null-default&amp;quot;&lt;/code&gt;: 只有 b 是 null 时才执行这个赋值。&lt;/li&gt;
&lt;li&gt;Dart 的核心内建类型可以分成 7 类：
&lt;ul&gt;
&lt;li&gt;基本值类型：int, double, num, bool, String, Null&lt;/li&gt;
&lt;li&gt;对象体系：Object, Object?, dynamic&lt;/li&gt;
&lt;li&gt;集合：List, Set, Map, Iterable&lt;/li&gt;
&lt;li&gt;异步：Future, Stream, FutureOr&lt;/li&gt;
&lt;li&gt;运行时：Type, Function, Never&lt;/li&gt;
&lt;li&gt;时间：DateTime, Duration&lt;/li&gt;
&lt;li&gt;大数/实用类：BigInt, RegExp, Uri&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="basic-3"&gt;Basic 3
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ne"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;grey&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grey&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alignment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Alignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Matrix4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;rotateZ&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;3.1415927&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BoxDecoration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Lorem ipsum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bold24Roboto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;textAlign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TextAlign&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;完成旋转操作；&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Matrix4.identity()..rotateZ(15 * 3.1415927 / 180)&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;..&lt;/code&gt; 是级联运算符：不管函数返回啥，通过这个运算符，总是返回执行操作后得原对象。&lt;/li&gt;
&lt;li&gt;要想选择一个元素，使用这个方法！ Transform widget + Matrix.&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>工具代码记录</title><link>https://k.fseasy.top/p/%E5%B7%A5%E5%85%B7%E4%BB%A3%E7%A0%81%E8%AE%B0%E5%BD%95/</link><pubDate>Wed, 20 Dec 2023 00:04:49 +0800</pubDate><guid>https://k.fseasy.top/p/%E5%B7%A5%E5%85%B7%E4%BB%A3%E7%A0%81%E8%AE%B0%E5%BD%95/</guid><description>&lt;p&gt;记录一些自己写的、从别处学来的工具代码，方便随时使用。&lt;/p&gt;
&lt;h2 id="1-在新的进程中运行函数python"&gt;1. 在新的进程中运行函数(Python)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;: 有时执行一段代码，可能存在对全局环境有不可逆副作用，这时新开一个进程来跑这段代码，就可以随着进程释放将副作用消除。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用举例&lt;/strong&gt;： Whisper 运行会有内存/显存泄露，其泄露应该在非 Python 层，个人无法解决；而这个泄露又对持续运行的线上服务而言不可接受。这时新起进程来运行就可以解决这个问题。&lt;/p&gt;
&lt;h3 id="代码片段"&gt;代码片段
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Python" data-lang="Python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_in_independent_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_cuda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;make function run in another process(used to avoid memory leak or other bad side-effects)&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;concurrent.futures&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ProcessPoolExecutor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;multiprocessing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_cuda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cxt_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;forkserver&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cxt_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fork&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# logger.info(&amp;#34;Create independent process for function [%s] in [%s] mode&amp;#34;, fn.__name__, cxt_name)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cxt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;multiprocessing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cxt_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;ProcessPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mp_context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title/><link>https://k.fseasy.top/p/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://k.fseasy.top/p/</guid><description>&lt;p&gt;&lt;a class="link" href="https://huggingface.co/spaces/prithivMLmods/Qwen-Image-Edit-2509-LoRAs-Fast" target="_blank" rel="noopener"
&gt;https://huggingface.co/spaces/prithivMLmods/Qwen-Image-Edit-2509-LoRAs-Fast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;看起来这个还挺火的，可以看看怎么介绍下&lt;/p&gt;</description></item></channel></rss>