From 92f6996da990bbe944fb0b48305acd5d5c970da2 Mon Sep 17 00:00:00 2001 From: muqiuhan Date: Mon, 16 Mar 2026 14:29:05 +0000 Subject: deploy: 4038692e4b425756edcb51cf7973793e280812ae --- search.xml | 681 +++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 394 insertions(+), 287 deletions(-) (limited to 'search.xml') diff --git a/search.xml b/search.xml index 63943d9a..9dd24390 100644 --- a/search.xml +++ b/search.xml @@ -1076,6 +1076,31 @@ await prisma.$transaction(async tx => { Medicine + + Nginx 前后端同域分流 + /2026/03/16/Nginx-%E5%89%8D%E5%90%8E%E7%AB%AF%E5%90%8C%E5%9F%9F%E5%88%86%E6%B5%81/ + 今天我想在服务器上的 docker nginx 中配置:同一主域下,前端走 /,后端 API 走 /api/*,认证框架 Better Auth 走 /api/auth/*。后端还有自己的 /auth/* 业务接口。

+

例如 xxx.yyy.zzz 是前端,xxx.yyy.zzz/api 是后端,后端基于 NestJS 用了 better-auth 会自动挂 /auth 路径。

+

Nginx 跑在 Docker 容器里,配置和证书从宿主机挂载进去:

+
    +
  • /opt/nginx/conf.d → /etc/nginx/conf.d
  • +
  • /opt/nginx/ssl → /etc/nginx/ssl
  • +
  • /opt/nginx/nginx.conf → /etc/nginx/nginx.conf
  • +
+

容器通过 extra_hosts: host.docker.internal:host-gateway 访问宿主机服务,所以前后端进程可以继续跑在宿主机上(比如 PM2 管理),Nginx 容器只做反代。

+

遇到的第一个坑:/api/auth/* 和 /api/* 不能用同一个 rewrite 规则。

+

如果这么写:

+
location /api/ {
proxy_pass http://host.docker.internal:<backend>/;
}
+

Nginx 会把 /api 前缀裁掉。于是 /api/auth/sign-in/email 变成了 /auth/sign-in/email,但 better-auth 挂在 /api/auth/*,直接 404。

+

正确的做法是分开处理。更麻烦的是业务身份接口 /auth/me 也存在,如果后端业务接口是 /auth/me,而认证框架是 /api/auth/*,那 /api/auth/me 应该转发给业务而不是认证框架。

+

正确顺序:

+
location = /api/auth/me {
# 精确匹配,业务身份接口
rewrite ^/api(.*)$ $1 break;
proxy_pass http://host.docker.internal:<backend>;
}

location ^~ /api/auth/ {
# 认证框架路由,保留前缀
proxy_pass http://host.docker.internal:<auth-port>;
}

location ^~ /api/ {
# 其余 API,裁掉 /api
rewrite ^/api(.*)$ $1 break;
proxy_pass http://host.docker.internal:<backend>;
}

location / {
# 前端
proxy_pass http://host.docker.internal:<frontend>;
}
+

这里的顺序很重要。Nginx 匹配规则是:精确匹配 = 优先,然后是前缀匹配 ^~,然后是正则匹配,最后是普通前缀匹配。^~ 表示一旦匹配成功就不再检查正则。

+]]>
+ + Technique + +
OCaml Core.Int.pow 的实现 /2023/10/21/OCaml-Core-Int-pow-%E7%9A%84%E5%AE%9E%E7%8E%B0/ @@ -2194,28 +2219,6 @@ A relation table (also sometimes called a JOIN, link or pi

现在生成的 TypeScript 文件将会从 Js.shim.ts import 类型:

import type {Json_t as Js_Json_t} from '../../src/model/Js.shim.ts';
-]]> - - Technique - -
- - Rust NewType 模式 - /2023/05/03/Rust-NewType-%E6%A8%A1%E5%BC%8F/ - New Type模式是一种软件设计模式,用于在已有类型的基础上创建一个新的类型。在Rust中,这通常是通过定义一个结构体,其中只包含一个单一成员。这个结构体(New Type)对外提供了一个新的、独立的类型,用于对原始类型增加额外的语义或限制。

-

加强类型安全

-
struct Meters(f64);
struct Feet(f64);

let length_in_meters = Meters(100.0);
let length_in_feet = Feet(328.084);

// 编译器会防止以下代码执行,因为类型不匹配
// let wrong_length = Meters(length_in_feet); // 编译错误

// 正确的构造
fn add_lengths(length1: Meters, length2: Meters) -> Meters {
Meters(length1.0 + length2.0)
}
-

这个例子使用 newtype 模式避免将原始类型f64用于不同的量度,从而增强了类型的安全性。

-

实现特定 trait

-
struct Kilometers(f64);

impl Kilometers {
fn to_miles(&self) -> f64 {
self.0 * 0.621371
}
}

let distance = Kilometers(10.0);
println!("The distance in miles is {}", distance.to_miles());
-

这里,Kilometers有一个方法to_miles,该方法是不会影响其他f64数据的。如果我们有另一个表示温度的f64类型,就不会意外调用到与距离相关的方法。

-

New Type模式同样适用于对Box<dyn SomeTrait>类型的包装,这可以在需要动态分派(动态调用实现了某个接口的不同类型的对象的方法)的时候提供便利。通过创建一个New Type来包装这样的Box<dyn SomeTrait>类型,可以提供自定义的方法或实现更多的trait,同时也可以让API更加清晰和易于使用。

-

零成本抽象

-

在Rust中,New Type模式不仅是类型安全的,还是一种零成本抽象。这是因为Rust编译器在编译时期会进行足够的优化,以确保New Type的使用没有运行时开销。 Rust的零成本抽象原则确保了抽象不会引入额外的运行时成本。例如,当你使用Meters这样的New Type时,Rust确保:

-
    -
  1. 无额外内存开销:Meters只包含一个f64,在内存中的表现和单独的f64是一样的。
  2. -
  3. 无额外运行时开销:使用Meters时,性能和直接使用f64完全相同。编译器会移除任何关于New Type的包装和解包的代码。
  4. -
]]>
Technique @@ -2290,6 +2293,28 @@ A relation table (also sometimes called a JOIN, link or pi
  1. Vtable format to support dyn upcasting coercion https://rust-lang.github.io/dyn-upcasting-coercion-initiative/design-discussions/vtable-layout.*html*
+]]> + + Technique + +
+ + Rust NewType 模式 + /2023/05/03/Rust-NewType-%E6%A8%A1%E5%BC%8F/ + New Type模式是一种软件设计模式,用于在已有类型的基础上创建一个新的类型。在Rust中,这通常是通过定义一个结构体,其中只包含一个单一成员。这个结构体(New Type)对外提供了一个新的、独立的类型,用于对原始类型增加额外的语义或限制。

+

加强类型安全

+
struct Meters(f64);
struct Feet(f64);

let length_in_meters = Meters(100.0);
let length_in_feet = Feet(328.084);

// 编译器会防止以下代码执行,因为类型不匹配
// let wrong_length = Meters(length_in_feet); // 编译错误

// 正确的构造
fn add_lengths(length1: Meters, length2: Meters) -> Meters {
Meters(length1.0 + length2.0)
}
+

这个例子使用 newtype 模式避免将原始类型f64用于不同的量度,从而增强了类型的安全性。

+

实现特定 trait

+
struct Kilometers(f64);

impl Kilometers {
fn to_miles(&self) -> f64 {
self.0 * 0.621371
}
}

let distance = Kilometers(10.0);
println!("The distance in miles is {}", distance.to_miles());
+

这里,Kilometers有一个方法to_miles,该方法是不会影响其他f64数据的。如果我们有另一个表示温度的f64类型,就不会意外调用到与距离相关的方法。

+

New Type模式同样适用于对Box<dyn SomeTrait>类型的包装,这可以在需要动态分派(动态调用实现了某个接口的不同类型的对象的方法)的时候提供便利。通过创建一个New Type来包装这样的Box<dyn SomeTrait>类型,可以提供自定义的方法或实现更多的trait,同时也可以让API更加清晰和易于使用。

+

零成本抽象

+

在Rust中,New Type模式不仅是类型安全的,还是一种零成本抽象。这是因为Rust编译器在编译时期会进行足够的优化,以确保New Type的使用没有运行时开销。 Rust的零成本抽象原则确保了抽象不会引入额外的运行时成本。例如,当你使用Meters这样的New Type时,Rust确保:

+
    +
  1. 无额外内存开销:Meters只包含一个f64,在内存中的表现和单独的f64是一样的。
  2. +
  3. 无额外运行时开销:使用Meters时,性能和直接使用f64完全相同。编译器会移除任何关于New Type的包装和解包的代码。
  4. +
]]>
Technique @@ -2311,6 +2336,46 @@ A relation table (also sometimes called a JOIN, link or pi Technique
+ + TDD 和 DDD 的一些小想法 + /2025/03/20/TDD-%E5%92%8C-DDD-%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%83%B3%E6%B3%95/ + Test-Driven Development (TDD) 和 Domain-Driven Design (DDD) 是两种不同的软件开发方法论,各自有其独特的优缺点和应用场景。

+

Test-Driven Development (TDD)

+

优点:

+
    +
  1. 提高代码质量:通过编写测试来驱动开发,可以确保代码的正确性和可靠性。
  2. +
  3. 减少缺陷:早期发现和修复缺陷,减少后期的调试和维护成本。
  4. +
  5. 促进可维护性:代码更加模块化和可测试,便于后续的维护和扩展。
  6. +
  7. 文档化:测试代码本身就是一种文档,描述了系统的行为和期望。
  8. +
  9. 提高开发速度:虽然初期可能会慢一些,但长期来看,由于减少了重构和调试的时间,开发速度会提高。
  10. +
+

缺点:

+
    +
  1. 初期投入大:需要在开发前编写测试,初期投入的时间和精力较大。
  2. +
  3. 学习曲线陡峭:对新手开发者来说,学习和掌握TDD需要一定的时间。
  4. +
  5. 过度依赖测试:可能导致过度依赖单元测试,忽略了系统的整体性能和用户体验。
  6. +
+

Domain-Driven Design (DDD)

+

优点:

+
    +
  1. 聚焦领域:通过深入理解业务领域,确保软件系统与业务需求紧密结合。
  2. +
  3. 模型驱动:建立一个清晰的领域模型,帮助开发者和业务专家共同理解系统。
  4. +
  5. 可维护性:通过明确的领域模型和边界,系统结构更加清晰,便于维护和扩展。
  6. +
  7. 沟通桥梁:提供了一种通用的语言(Ubiquitous Language),促进开发团队和业务团队之间的沟通。
  8. +
+

缺点:

+
    +
  1. 复杂性高:DDD方法论较为复杂,需要深入理解领域模型和设计模式。
  2. +
  3. 初期投入大:需要大量的时间和精力进行领域分析和建模。
  4. +
  5. 适用范围有限:对于简单的系统或小型项目,DDD可能显得过于复杂和冗余。
  6. +
+
+

TDD 和 DDD 并不冲突,实际上它们可以互补。TDD 可以帮助确保代码的正确性和可靠性,而 DDD 可以确保系统与业务需求紧密结合。在进行 TDD 时,可以使用 DDD 的领域模型和 Ubiquitous Language 来编写测试用例,确保测试覆盖了业务需求。在进行 DDD 时,可以使用 TDD 来驱动实现,确保每个领域模型的实现。

+]]>
+ + Technique + +
Scala 3 (Capture Checking) /2025/03/25/Scala-3-Capture-Checking/ @@ -2461,46 +2526,6 @@ A relation table (also sometimes called a JOIN, link or pi

Scala 3 提供了几个与 Capture Checking 相关的编译选项,。-Xprint:cc 选项会打印出带有推断捕获类型的程序代码 1。这对于理解编译器是如何推断捕获集的以及调试与类型相关的错误非常有用。另一个选项是 -Ycc-debug,它提供了关于 Capture Checking 过程的详细的、面向实现的的信息。这个选项对于需要深入了解 Capture Checking 器工作原理或者遇到复杂问题的开发者来说很有帮助。这些编译选项是使用 Capture Checking 的开发者的重要工具,它们允许开发者检查编译器的推理并诊断问题。

Capture Checking被实现为一个传播约束求解器,它在标准的类型检查阶段之后运行,未知的捕获集由约束变量表示。在类型中显式编写的捕获集被求解器视为常量。类型之间的子类型要求会转化为它们各自捕获集上的子捕获测试。求解器根据程序的结构和类型约束,将 Capability 传播给约束变量及其超集。捕获集的映射受到类型参数的变性(协变、逆变、不变)的影响。装箱(boxing)和拆箱(unboxing)是用于隐藏和恢复捕获集的虚拟操作,特别是在类型参数的上下文中用于管理捕获隧道。-Ycc-debug 的输出提供了关于变量依赖关系和Capture Checking器在编译过程中的状态的深入信息。

-]]> - - Technique - -
- - TDD 和 DDD 的一些小想法 - /2025/03/20/TDD-%E5%92%8C-DDD-%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%83%B3%E6%B3%95/ - Test-Driven Development (TDD) 和 Domain-Driven Design (DDD) 是两种不同的软件开发方法论,各自有其独特的优缺点和应用场景。

-

Test-Driven Development (TDD)

-

优点:

-
    -
  1. 提高代码质量:通过编写测试来驱动开发,可以确保代码的正确性和可靠性。
  2. -
  3. 减少缺陷:早期发现和修复缺陷,减少后期的调试和维护成本。
  4. -
  5. 促进可维护性:代码更加模块化和可测试,便于后续的维护和扩展。
  6. -
  7. 文档化:测试代码本身就是一种文档,描述了系统的行为和期望。
  8. -
  9. 提高开发速度:虽然初期可能会慢一些,但长期来看,由于减少了重构和调试的时间,开发速度会提高。
  10. -
-

缺点:

-
    -
  1. 初期投入大:需要在开发前编写测试,初期投入的时间和精力较大。
  2. -
  3. 学习曲线陡峭:对新手开发者来说,学习和掌握TDD需要一定的时间。
  4. -
  5. 过度依赖测试:可能导致过度依赖单元测试,忽略了系统的整体性能和用户体验。
  6. -
-

Domain-Driven Design (DDD)

-

优点:

-
    -
  1. 聚焦领域:通过深入理解业务领域,确保软件系统与业务需求紧密结合。
  2. -
  3. 模型驱动:建立一个清晰的领域模型,帮助开发者和业务专家共同理解系统。
  4. -
  5. 可维护性:通过明确的领域模型和边界,系统结构更加清晰,便于维护和扩展。
  6. -
  7. 沟通桥梁:提供了一种通用的语言(Ubiquitous Language),促进开发团队和业务团队之间的沟通。
  8. -
-

缺点:

-
    -
  1. 复杂性高:DDD方法论较为复杂,需要深入理解领域模型和设计模式。
  2. -
  3. 初期投入大:需要大量的时间和精力进行领域分析和建模。
  4. -
  5. 适用范围有限:对于简单的系统或小型项目,DDD可能显得过于复杂和冗余。
  6. -
-
-

TDD 和 DDD 并不冲突,实际上它们可以互补。TDD 可以帮助确保代码的正确性和可靠性,而 DDD 可以确保系统与业务需求紧密结合。在进行 TDD 时,可以使用 DDD 的领域模型和 Ubiquitous Language 来编写测试用例,确保测试覆盖了业务需求。在进行 DDD 时,可以使用 TDD 来驱动实现,确保每个领域模型的实现。

]]>
Technique @@ -2604,11 +2629,11 @@ A relation table (also sometimes called a JOIN, link or pi J -->|有效| K[长期维持] J -->|部分有效| L[联合口服加巴喷丁] J -->|无效| M[重新评估诊断] -

急性控制阶段为12周。重度瘙痒(VAS≥7分)或炎症明显者,先用外用强效糖皮质激素快速控制,选用丙酸氯倍他索0.05%乳膏或卤米松0.05%乳膏,每日12次,薄涂于瘙痒区域,疗程不超过2周,联合润肤剂(尿素10%~20%或神经酰胺类)。

+

急性控制阶段为 1~2 周。重度瘙痒(VAS≥7分)或炎症明显者,先用外用强效糖皮质激素快速控制,选用丙酸氯倍他索0.05%乳膏或卤米松0.05%乳膏,每日 1~2 次,薄涂于瘙痒区域,疗程不超过2周,联合润肤剂(尿素10%~20%或神经酰胺类)。

过渡阶段为第2~3周,逐步过渡至他克莫司。激素减量(隔日使用或换用弱效激素),同时启动他克莫司0.03%软膏每日2次,两药可交替使用(晨用激素,晚用他克莫司)。

维持阶段为第4周起。他克莫司0.03%或0.1%软膏每日2次,症状控制后可减至每日1次或隔日使用,润肤剂持续使用,无固定疗程限制。

-

制剂选择方面,初始使用0.03%浓度(刺激性较低),耐受良好者可换用0.1%浓度(疗效更强),软膏基质优于乳膏(保湿性更好)。使用方法为清洁皮肤后薄涂于患处,轻柔按摩至吸收,避免大面积使用(单次<10%体表面积),避免封包(增加系统吸收),涂抹后洗手。预处理减轻刺激的方法包括:首次使用前冷敷510分钟;或先使用润肤剂,待吸收后再涂他克莫司;刺激感通常12周后缓解。

-

基础治疗包括润肤剂每日至少1次(沐浴后立即使用)、抬高患肢每日数次每次1530分钟、压力治疗(需排除动脉疾病后使用)。外用治疗效果不足者可联合口服药物:加巴喷丁100300 mg qn起始,缓慢加量;普瑞巴林25~75 mg qn起始;米氮平7.5~15 mg qn(心衰患者需谨慎)。

+

制剂选择方面,初始使用0.03%浓度(刺激性较低),耐受良好者可换用0.1%浓度(疗效更强),软膏基质优于乳膏(保湿性更好)。使用方法为清洁皮肤后薄涂于患处,轻柔按摩至吸收,避免大面积使用(单次<10%体表面积),避免封包(增加系统吸收),涂抹后洗手。预处理减轻刺激的方法包括:首次使用前冷敷 5~10 分钟;或先使用润肤剂,待吸收后再涂他克莫司;刺激感通常1~2周后缓解。

+

基础治疗包括润肤剂每日至少1次(沐浴后立即使用)、抬高患肢每日数次每次 15~30 分钟、压力治疗(需排除动脉疾病后使用)。外用治疗效果不足者可联合口服药物:加巴喷丁100~300 mg qn起始,缓慢加量;普瑞巴林25~75 mg qn起始;米氮平7.5~15 mg qn(心衰患者需谨慎)。


监测与随访

疗效评估采用瘙痒视觉模拟评分(VAS,0~10分)、5-D Itch Scale多维瘙痒评估、皮肤病生活质量指数(DLQI)、患者主观满意度。评估时点为基线、治疗1周、治疗2周、治疗4周,此后每月评估。有效标准为VAS下降≥3分,或瘙痒对睡眠影响显著减少,或患者主观满意度≥满意。

@@ -3492,6 +3517,17 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Life
+ + tick thread在Multicore OCaml中的作用 + /2023/08/15/tick-thread%E5%9C%A8Multicore-OCaml%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8/ + Multicore OCaml的程序在启动时会运行一个 tick thread,其实现如下:

+
/* The tick thread: posts a SIGPREEMPTION signal periodically */

static void * caml_thread_tick(void * arg)
{
struct timeval timeout;
sigset_t mask;

/* Block all signals so that we don't try to execute an OCaml signal handler*/
sigfillset(&mask);
pthread_sigmask(SIG_BLOCK, &mask, NULL);
while(! caml_tick_thread_stop) {
/* select() seems to be the most efficient way to suspend the
thread for sub-second intervals */
timeout.tv_sec = 0;
timeout.tv_usec = Thread_timeout * 1000;
select(0, NULL, NULL, NULL, &timeout);
/* The preemption signal should never cause a callback, so don't
go through caml_handle_signal(), just record signal delivery via
caml_record_signal(). */
caml_record_signal(SIGPREEMPTION);
}
return NULL;
}
+

这是因为Multicore OCaml的GC目前需要一个进程(或一个Domain)中的所有线程一起参与以避免并发访问。如果一个线程在system call上被阻塞,那么整个Domain就会被卡住,直到该线程可以参与当前的垃圾收集。为了避免这个问题,tick 线程可以代替被阻塞的线程执行垃圾收集操作。

+]]>
+ + Technique + +
使用 Runed intersection observer 与 tanstack query 实现通用的惰性加载组件 /2025/07/31/svelte-lazyquery/ @@ -3553,17 +3589,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的
  • https://runed.dev/docs/utilities/use-intersection-observer
  • https://tanstack.com/table/latest/docs/introduction
  • -]]> - - Technique - -
    - - tick thread在Multicore OCaml中的作用 - /2023/08/15/tick-thread%E5%9C%A8Multicore-OCaml%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8/ - Multicore OCaml的程序在启动时会运行一个 tick thread,其实现如下:

    -
    /* The tick thread: posts a SIGPREEMPTION signal periodically */

    static void * caml_thread_tick(void * arg)
    {
    struct timeval timeout;
    sigset_t mask;

    /* Block all signals so that we don't try to execute an OCaml signal handler*/
    sigfillset(&mask);
    pthread_sigmask(SIG_BLOCK, &mask, NULL);
    while(! caml_tick_thread_stop) {
    /* select() seems to be the most efficient way to suspend the
    thread for sub-second intervals */
    timeout.tv_sec = 0;
    timeout.tv_usec = Thread_timeout * 1000;
    select(0, NULL, NULL, NULL, &timeout);
    /* The preemption signal should never cause a callback, so don't
    go through caml_handle_signal(), just record signal delivery via
    caml_record_signal(). */
    caml_record_signal(SIGPREEMPTION);
    }
    return NULL;
    }
    -

    这是因为Multicore OCaml的GC目前需要一个进程(或一个Domain)中的所有线程一起参与以避免并发访问。如果一个线程在system call上被阻塞,那么整个Domain就会被卡住,直到该线程可以参与当前的垃圾收集。为了避免这个问题,tick 线程可以代替被阻塞的线程执行垃圾收集操作。

    ]]>
    Technique @@ -3863,34 +3888,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的

    然后我就在山峰浮现出第一缕阳光时,笑着对这个世界说:“我爱你,会永远爱你,永远最爱你。”

    我爱这个因为有我而变得温柔的世界。

    这将是我与周遭的一切,热爱一生,共度一生的地方。

    -]]> - - gallery - -
    - - 二〇二五年三月十七日 - /2025/03/17/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E4%B8%89%E6%9C%88%E5%8D%81%E4%B8%83%E6%97%A5/ - 人类其实根本无法同时拥有对死亡的坦然和对生活的眷恋。

    -

    看见死亡,看见新生,看见朝露凝于叶尖,看见惊雷震碎山月,

    -

    它们是因缘聚散吗?

    -

    那露珠消散后去了哪里?

    -

    此有故彼有,此生故彼灭。

    -

    当晨光加热露珠表面至 深度时,表层水分子动能突破氢键束缚(键能约 )。
    -这种相变并非整齐划一的队列解散,而是呈现量子隧穿效应——单个水分子以 量级的涨落,在液态与气态间振荡,直到完全脱离范德华力作用半径(约 )。

    -

    逃逸的 H2O 分子并非直线升空,而是在空气分子碰撞下进行三维随机游走。
    -根据爱因斯坦-斯托克斯方程,其扩散系数 (25℃标准大气压)。这意味着单个水分子在1秒内将形成半径约 的概率云,与数十亿同伴共同形成水汽。

    -

    水中捞月,伸手时,涟漪碎了三千世界。

    -

    人类的眉睫处有十方虚空,三藏经书不过指月之指,

    -

    看见儿时门前溪水倒流,看见婴孩啼哭时眼底星河闪烁。

    -

    看见生死之幕薄如蝉翼,和众生颠倒梦想处。

    -

    某些水分子可能抵达对流层顶(约 ),在那里被极地涡旋捕获。

    -

    经过 天的环球旅行后,其中 的分子将逃逸到太空,携带着地球的熵增印记。

    -

    它们的氧原子核内,八个质子正以 年半衰期等待质子衰变。

    -

    诸法从本来,常自寂灭相。

    -

    那在这之前呢?

    -

    在这之前我刚吃完一碗辣椒炒肉,

    -

    香

    ]]>
    gallery @@ -3939,6 +3936,34 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的

    虽然我早已不强求世界上有这么一个人,

    但我会一直等待,甚至期待你的到来。

    我叫韩暮秋,幸会。

    +]]> + + gallery + +
    + + 二〇二五年三月十七日 + /2025/03/17/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E4%B8%89%E6%9C%88%E5%8D%81%E4%B8%83%E6%97%A5/ + 人类其实根本无法同时拥有对死亡的坦然和对生活的眷恋。

    +

    看见死亡,看见新生,看见朝露凝于叶尖,看见惊雷震碎山月,

    +

    它们是因缘聚散吗?

    +

    那露珠消散后去了哪里?

    +

    此有故彼有,此生故彼灭。

    +

    当晨光加热露珠表面至 深度时,表层水分子动能突破氢键束缚(键能约 )。
    +这种相变并非整齐划一的队列解散,而是呈现量子隧穿效应——单个水分子以 量级的涨落,在液态与气态间振荡,直到完全脱离范德华力作用半径(约 )。

    +

    逃逸的 H2O 分子并非直线升空,而是在空气分子碰撞下进行三维随机游走。
    +根据爱因斯坦-斯托克斯方程,其扩散系数 (25℃标准大气压)。这意味着单个水分子在1秒内将形成半径约 的概率云,与数十亿同伴共同形成水汽。

    +

    水中捞月,伸手时,涟漪碎了三千世界。

    +

    人类的眉睫处有十方虚空,三藏经书不过指月之指,

    +

    看见儿时门前溪水倒流,看见婴孩啼哭时眼底星河闪烁。

    +

    看见生死之幕薄如蝉翼,和众生颠倒梦想处。

    +

    某些水分子可能抵达对流层顶(约 ),在那里被极地涡旋捕获。

    +

    经过 天的环球旅行后,其中 的分子将逃逸到太空,携带着地球的熵增印记。

    +

    它们的氧原子核内,八个质子正以 年半衰期等待质子衰变。

    +

    诸法从本来,常自寂灭相。

    +

    那在这之前呢?

    +

    在这之前我刚吃完一碗辣椒炒肉,

    +

    香

    ]]>
    gallery @@ -4139,37 +4164,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的

    睡前我把被子铺在床上。藏青布贴着皮肤,暖得像奶奶的怀抱。我抱着被子滚了滚,闻到橘子皮的香,闻到太阳的香,闻到奶奶身旁桂花树的香味。

    桂花香,看不见摸不着,却一直绕着我。

    今年风里的桂花香比去年更浓,深夜的月光洒在被子上,我摸着被子上的补丁睡着了,梦里看见奶奶坐在阳台晒被子,阳光照在她的白发上,她回头对我笑:“乐乐,过来帮奶奶翻下被子。” 我跑过去,接过她手里的被子,指尖碰到她的手掌,暖得像晒过的太阳。

    -]]> - - gallery - -
    - - 二〇二五年十一月二十六日 - /2025/11/26/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E5%85%AD%E6%97%A5/ - 我蹲在地铁口的台阶上,指尖戳着手机屏保里的枇杷树。屏幕亮度调得很低,像浸在晚春的雾里,那是去年清明回家拍的,老家后山上的枇杷树正开着花,淡白色的瓣子落得他肩头都是,陈桉站在树底下笑,说我像个移动的花筐。

    -

    吸了吸鼻子,风裹着槐花香吹过来,混着煎饼果子的油味,我把手机塞进包里。包里还装着早上买的包子,凉得发硬。

    -

    地铁呼啸着进站,我跟着人群挤上去,肩膀被撞了一下,电脑包的背带勒得锁骨发疼。旁边的阿姨抱着个小孩,小孩手里举着根糖葫芦,糖稀滴在我的裤子上,留下个黏糊糊的印子。我盯着那个印子,忽然想起小时候陈桉带我去镇上买糖葫芦,我咬得太急,糖稀粘在下巴上,陈桉用袖子给我擦,结果把我的脸擦得更花,两个人笑得上气不接下气,连卖糖葫芦的老爷爷都跟着笑。

    -

    "下一站,国贸。"地铁广播里的女声冷冰冰的。我拽了拽背包带,往车门方向挪了挪。国贸站的人永远那么多,像一群被挤散的蚂蚁,我跟着人流往出口走,鞋子踩在瓷砖上,发出沉闷的响声。

    -

    出了地铁口,天空已经暗下来,写字楼的灯光像撒了一地碎钻。我抬头看了眼自己公司的楼层,窗户里还亮着灯,叹了口气,摸出手机给同事发消息:“我到楼下了,需求改好了吗?”

    -

    同时回复得很快:"改好了,就等你过来审。"后面跟着个哭脸表情。

    -

    我把手机放进兜里,往写字楼走。路过便利店的时候停下来,买了瓶冰可乐。可乐罐贴在脸上,凉意透过皮肤渗进骨头里,想起去年晚春,陈桉带我去山上玩,我们坐在山顶的石头上,陈桉举着瓶橘子汽水,说:“暮秋,你看,山下的房子像不像积木?”,顺着她的手指看过去,真的,那些低矮的房子挤在一起,像我们小时候玩的积木。陈桉又说:“等我长大了,要站在更高的地方,看更远的风景。”,我问:"那我呢?"陈桉笑:“你当然要跟着我啊,不然谁给我买橘子汽水?”

    -

    回过神,接过可乐,付了钱。走出便利店,风更大了,吹得我的头发乱飘,用手理了理,继续往写字楼走。

    -

    加班到十点,出来的时候街上的人已经很少了,路灯把影子拉得很长。

    -

    我拦了辆出租车,报了地址。司机师傅开着收音机,里面在放老歌:“春风它吹醒了大地,吹绿了杨柳,吹开了桃花…”

    -

    我靠在椅背上,看着窗外的夜景,忽然想起老家的晚春。老家的晚春没有这么多灯光,只有星星,像撒在天上的碎银子。陈桉说,那些星星是祖先的眼睛,在看着我们。

    -

    老城区的巷子里,楼道里的灯坏了,我摸着墙往上走。走到三楼,掏出钥匙开门,门轴发出刺耳的响声。房间里很冷,把电脑放在桌子上,打开空调,然后去卫生间洗脸。镜子里的自己脸色苍白,眼睛下面有淡淡的黑眼圈,嘴唇干得裂开了。我挤了点洗面奶,揉出泡沫,往脸上抹。

    -

    洗完脸,坐在沙发上,打开电脑,翻出自己写的日记。日记里有很多关于陈桉的内容:“今天陈桉带我去山上摘枇杷,她爬树的时候摔了一跤,胳膊擦破了皮,却笑着给我递枇杷,说’这个最甜’”,“陈桉要去外地读书了,说等她毕业,要回来当老师,教孩子们认识星星”,“昨天梦见陈桉,她站在山巅,风把她的衬衫吹起来,像小时候那样喊我’暮秋,快上来’,但我怎么跑都靠近不了”…

    -

    手机在沙发上震动,我拿起来看,是陈桉的消息:"暮秋,今天山上的枇杷开始结果了,比去年的大。"后面跟着张照片,照片里的枇杷挂在枝头,青绿色的,像小拳头。

    -

    我盯着照片,手指在屏幕上划了划,回复:“我昨天梦见你了,你站在山巅喊我。”

    -

    陈桉回复得很快:"那是因为我想你了啊。"后面跟着个笑脸表情。

    -

    我笑了笑,把手机放下。走到窗户边,推开窗户,风卷着晚春的味道进来——有槐花香,有青草味,还有一点点枇杷花的味道。抬头看星星,天上的星星很少,但很亮,像家乡的星星。想起陈桉说的,那些星星是祖先的眼睛,在看着我们。

    -

    忽然听见楼下有猫叫,探出头去,看见一只黑白相间的猫,正蹲在楼下的台阶上,盯着我看,我对着猫招了招手,猫叫了一声,转身跑了。

    -

    再缩回身子,关上窗户,回到沙发上。拿起手机,又看了看陈桉的消息。然后,我打开日记,写下:“今天的晚春,风里有枇杷花的味道。我梦见陈桉,她站在山巅,喊我’暮秋,快上来’。我想,也许我该回去看看了。”

    -

    放下笔,静静地靠在沙发上,闭上眼睛。窗外的风还在吹,吹得窗帘沙沙作响。又想起小时候,陈桉带我去山上玩,我们躺在草地上,看星星。陈桉说:“暮秋,等我们老了,还要一起去山上看星星。”,我问:"那如果我走了呢?"陈桉说:“那我就站在山巅,喊你的名字,直到你听见。”

    -

    我笑了,眼泪却顺着眼角流下来,摸出手机,给陈桉发了条消息:“明年晚春,我回去陪你摘枇杷。”

    -

    消息送达那一刻,突然听见窗外的风里,有个熟悉的声音在喊:“暮秋,快上来。”

    -

    我睁开眼睛,窗外的星星很亮,像陈桉的眼睛。

    ]]>
    gallery @@ -4219,23 +4213,54 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的
    - 二〇二五年十二月二十五日 - /2025/12/25/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/ - 那是南方最寻常不过的一个盛夏,空气里裹挟着滚烫的水汽,只要伸手一抓,就能攥出一把湿漉漉的燥热。

    -

    六月初,蝉鸣渐渐凄厉,它们躲在老槐树繁茂的叶簇里,振动着腹部的薄膜,声音一整片、一整块地压下来。

    -

    我坐在老屋的门槛上,看着院子里的树影在地上缓慢地挪动。

    -

    我是一个木讷的人。这种木讷并非天生智力迟钝,而是一种对世界反应的滞后。当同龄的孩子已经学会用讨巧的话语换取糖果时,我还在盯着墙角的青苔发呆;当生活把一记记重锤砸在我身上时,我往往要过上好几年,才能感觉到那种迟来的、钻心的疼。

    -

    “暮秋,去把院子里的落叶扫了。”奶奶在屋里喊。

    -

    我应了一声,声音很轻,像是被热浪瞬间吞噬了一样。

    -

    拿起那把已经磨秃了的竹扫帚,一下一下地划过地面。风吹过,树叶沙沙作响,那是另一种声音,如果说蝉鸣是狂热的领唱,那么风吹树响就是低沉的和声。

    -

    我停下动作,仰头看去。阳光穿透叶缝,碎金般落在我的脸上。那一刻,我突然觉得这些声音构成了一支宏大的歌。那是生命的歌,热烈、盲目、甚至有些近乎自毁的决绝。

    -

    而我,只是这支歌里一个错位的音符。

    -

    那年,生活像是一场烧过头的夏日,突然陷入了死寂。她某个午后平静地对我说:“暮秋,你太安静了,安静得让我觉得这房间里只有我一个人。”

    -

    我没有挽留,只是木讷地点了点头。

    -

    我开始漫无目的地游荡。我带着父亲留下的那台旧相机,背着一个简单的行囊,从蝉鸣不止的内陆小城出发,一路向南。我想去看看那支歌的终点在哪里。

    -

    旅途中,我依然是那个木讷的旁观者。

    -

    我在绿皮火车上坐了三十个小时,对座的年轻人滔滔不绝地讲述着他的创业梦想,我只是偶尔点头,递给他一瓶矿泉水。他在中途下车时拍拍我的肩膀。

    -

    我笑了笑,没说话。其实我不是在听,我只是在感受。感受车轮撞击轨道的节奏,感受窗外飞速掠过的电线杆,感受那些在烈日下弯腰劳作的背影。

    + 二〇二五年十一月二十六日 + /2025/11/26/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E5%85%AD%E6%97%A5/ + 我蹲在地铁口的台阶上,指尖戳着手机屏保里的枇杷树。屏幕亮度调得很低,像浸在晚春的雾里,那是去年清明回家拍的,老家后山上的枇杷树正开着花,淡白色的瓣子落得他肩头都是,陈桉站在树底下笑,说我像个移动的花筐。

    +

    吸了吸鼻子,风裹着槐花香吹过来,混着煎饼果子的油味,我把手机塞进包里。包里还装着早上买的包子,凉得发硬。

    +

    地铁呼啸着进站,我跟着人群挤上去,肩膀被撞了一下,电脑包的背带勒得锁骨发疼。旁边的阿姨抱着个小孩,小孩手里举着根糖葫芦,糖稀滴在我的裤子上,留下个黏糊糊的印子。我盯着那个印子,忽然想起小时候陈桉带我去镇上买糖葫芦,我咬得太急,糖稀粘在下巴上,陈桉用袖子给我擦,结果把我的脸擦得更花,两个人笑得上气不接下气,连卖糖葫芦的老爷爷都跟着笑。

    +

    "下一站,国贸。"地铁广播里的女声冷冰冰的。我拽了拽背包带,往车门方向挪了挪。国贸站的人永远那么多,像一群被挤散的蚂蚁,我跟着人流往出口走,鞋子踩在瓷砖上,发出沉闷的响声。

    +

    出了地铁口,天空已经暗下来,写字楼的灯光像撒了一地碎钻。我抬头看了眼自己公司的楼层,窗户里还亮着灯,叹了口气,摸出手机给同事发消息:“我到楼下了,需求改好了吗?”

    +

    同时回复得很快:"改好了,就等你过来审。"后面跟着个哭脸表情。

    +

    我把手机放进兜里,往写字楼走。路过便利店的时候停下来,买了瓶冰可乐。可乐罐贴在脸上,凉意透过皮肤渗进骨头里,想起去年晚春,陈桉带我去山上玩,我们坐在山顶的石头上,陈桉举着瓶橘子汽水,说:“暮秋,你看,山下的房子像不像积木?”,顺着她的手指看过去,真的,那些低矮的房子挤在一起,像我们小时候玩的积木。陈桉又说:“等我长大了,要站在更高的地方,看更远的风景。”,我问:"那我呢?"陈桉笑:“你当然要跟着我啊,不然谁给我买橘子汽水?”

    +

    回过神,接过可乐,付了钱。走出便利店,风更大了,吹得我的头发乱飘,用手理了理,继续往写字楼走。

    +

    加班到十点,出来的时候街上的人已经很少了,路灯把影子拉得很长。

    +

    我拦了辆出租车,报了地址。司机师傅开着收音机,里面在放老歌:“春风它吹醒了大地,吹绿了杨柳,吹开了桃花…”

    +

    我靠在椅背上,看着窗外的夜景,忽然想起老家的晚春。老家的晚春没有这么多灯光,只有星星,像撒在天上的碎银子。陈桉说,那些星星是祖先的眼睛,在看着我们。

    +

    老城区的巷子里,楼道里的灯坏了,我摸着墙往上走。走到三楼,掏出钥匙开门,门轴发出刺耳的响声。房间里很冷,把电脑放在桌子上,打开空调,然后去卫生间洗脸。镜子里的自己脸色苍白,眼睛下面有淡淡的黑眼圈,嘴唇干得裂开了。我挤了点洗面奶,揉出泡沫,往脸上抹。

    +

    洗完脸,坐在沙发上,打开电脑,翻出自己写的日记。日记里有很多关于陈桉的内容:“今天陈桉带我去山上摘枇杷,她爬树的时候摔了一跤,胳膊擦破了皮,却笑着给我递枇杷,说’这个最甜’”,“陈桉要去外地读书了,说等她毕业,要回来当老师,教孩子们认识星星”,“昨天梦见陈桉,她站在山巅,风把她的衬衫吹起来,像小时候那样喊我’暮秋,快上来’,但我怎么跑都靠近不了”…

    +

    手机在沙发上震动,我拿起来看,是陈桉的消息:"暮秋,今天山上的枇杷开始结果了,比去年的大。"后面跟着张照片,照片里的枇杷挂在枝头,青绿色的,像小拳头。

    +

    我盯着照片,手指在屏幕上划了划,回复:“我昨天梦见你了,你站在山巅喊我。”

    +

    陈桉回复得很快:"那是因为我想你了啊。"后面跟着个笑脸表情。

    +

    我笑了笑,把手机放下。走到窗户边,推开窗户,风卷着晚春的味道进来——有槐花香,有青草味,还有一点点枇杷花的味道。抬头看星星,天上的星星很少,但很亮,像家乡的星星。想起陈桉说的,那些星星是祖先的眼睛,在看着我们。

    +

    忽然听见楼下有猫叫,探出头去,看见一只黑白相间的猫,正蹲在楼下的台阶上,盯着我看,我对着猫招了招手,猫叫了一声,转身跑了。

    +

    再缩回身子,关上窗户,回到沙发上。拿起手机,又看了看陈桉的消息。然后,我打开日记,写下:“今天的晚春,风里有枇杷花的味道。我梦见陈桉,她站在山巅,喊我’暮秋,快上来’。我想,也许我该回去看看了。”

    +

    放下笔,静静地靠在沙发上,闭上眼睛。窗外的风还在吹,吹得窗帘沙沙作响。又想起小时候,陈桉带我去山上玩,我们躺在草地上,看星星。陈桉说:“暮秋,等我们老了,还要一起去山上看星星。”,我问:"那如果我走了呢?"陈桉说:“那我就站在山巅,喊你的名字,直到你听见。”

    +

    我笑了,眼泪却顺着眼角流下来,摸出手机,给陈桉发了条消息:“明年晚春,我回去陪你摘枇杷。”

    +

    消息送达那一刻,突然听见窗外的风里,有个熟悉的声音在喊:“暮秋,快上来。”

    +

    我睁开眼睛,窗外的星星很亮,像陈桉的眼睛。

    +]]>
    + + gallery + +
    + + 二〇二五年十二月二十五日 + /2025/12/25/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/ + 那是南方最寻常不过的一个盛夏,空气里裹挟着滚烫的水汽,只要伸手一抓,就能攥出一把湿漉漉的燥热。

    +

    六月初,蝉鸣渐渐凄厉,它们躲在老槐树繁茂的叶簇里,振动着腹部的薄膜,声音一整片、一整块地压下来。

    +

    我坐在老屋的门槛上,看着院子里的树影在地上缓慢地挪动。

    +

    我是一个木讷的人。这种木讷并非天生智力迟钝,而是一种对世界反应的滞后。当同龄的孩子已经学会用讨巧的话语换取糖果时,我还在盯着墙角的青苔发呆;当生活把一记记重锤砸在我身上时,我往往要过上好几年,才能感觉到那种迟来的、钻心的疼。

    +

    “暮秋,去把院子里的落叶扫了。”奶奶在屋里喊。

    +

    我应了一声,声音很轻,像是被热浪瞬间吞噬了一样。

    +

    拿起那把已经磨秃了的竹扫帚,一下一下地划过地面。风吹过,树叶沙沙作响,那是另一种声音,如果说蝉鸣是狂热的领唱,那么风吹树响就是低沉的和声。

    +

    我停下动作,仰头看去。阳光穿透叶缝,碎金般落在我的脸上。那一刻,我突然觉得这些声音构成了一支宏大的歌。那是生命的歌,热烈、盲目、甚至有些近乎自毁的决绝。

    +

    而我,只是这支歌里一个错位的音符。

    +

    那年,生活像是一场烧过头的夏日,突然陷入了死寂。她某个午后平静地对我说:“暮秋,你太安静了,安静得让我觉得这房间里只有我一个人。”

    +

    我没有挽留,只是木讷地点了点头。

    +

    我开始漫无目的地游荡。我带着父亲留下的那台旧相机,背着一个简单的行囊,从蝉鸣不止的内陆小城出发,一路向南。我想去看看那支歌的终点在哪里。

    +

    旅途中,我依然是那个木讷的旁观者。

    +

    我在绿皮火车上坐了三十个小时,对座的年轻人滔滔不绝地讲述着他的创业梦想,我只是偶尔点头,递给他一瓶矿泉水。他在中途下车时拍拍我的肩膀。

    +

    我笑了笑,没说话。其实我不是在听,我只是在感受。感受车轮撞击轨道的节奏,感受窗外飞速掠过的电线杆,感受那些在烈日下弯腰劳作的背影。

    我路过很多森林,路过很多村庄。每一处都有蝉鸣,每一处都有风声。那些声音交织在一起,不断地提醒我:生命在燃烧,生命在消耗,生命在不顾一切地奔向某个注定荒凉的结局。

    我变得越来越沉默,但内心的那种滞后感却在慢慢消融。那些积压了十几年的情绪——童年的孤独、少年的压抑、成年的挫败,像是一块块坚冰,在漫长的夏日行进中,开始有了裂缝。

    我开始意识到,我的木讷或许是一种自我保护。因为感知太慢,所以痛苦也来得慢;但也因为感知太慢,我错过了太多本该热烈拥抱的瞬间。

    @@ -4550,18 +4575,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 做一件事,无关心态,只要去做就是了。发挥最大的主观能动性,遇到问题就解决,碰到障碍就破开,需要帮助就求助。别因为所谓的自信就盲目冒进,也别因为所谓的自卑就胆小退缩,那俩玩意都不存在。

    尊重事情本身的客观发展规律,什么样的人匹配什么样的事,什么样的条件匹配什么样的理想。别把心态想得太重要,更别花太多时间精力去建设心态,客观规律不会因为心态就发生奇迹般地转变。

    你最好趁早学会尊重客观规律。

    -]]>
    - - gallery - -
    - - 二〇二四年八月一日 - /2024/08/02/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%85%AB%E6%9C%88%E4%B8%80%E6%97%A5/ - 阿公烧烟成老瘾,
    -阿公饮酒会面红,
    -他说日子要开心,
    -他说人生要尽兴。

    ]]>
    gallery @@ -4585,6 +4598,18 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的

    早上七点。

    太阳完全绽放的光芒照亮了这个欣欣向荣的世界,有山、有海,有自由。

    +]]> + + gallery + +
    + + 二〇二四年八月一日 + /2024/08/02/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%85%AB%E6%9C%88%E4%B8%80%E6%97%A5/ + 阿公烧烟成老瘾,
    +阿公饮酒会面红,
    +他说日子要开心,
    +他说人生要尽兴。

    ]]>
    gallery @@ -4665,15 +4690,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 二零二一年二月十四日 /2021/02/14/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%80%E5%B9%B4%E4%BA%8C%E6%9C%88%E5%8D%81%E5%9B%9B%E6%97%A5/ 把酒从铁罐子里面赶出来,赶到脸上,被眼泪驱逐,混着干涸的血,揉着尘埃,尝尽酸甜苦辣

    -]]>
    - - gallery - -
    - - 二零二三年一月二十一日 - /2023/01/21/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%80%E6%97%A5/ - 我踏着烟火若隐若现, 我生来就是为了把这个世界的消息带到下一个世界去。

    ]]>
    gallery @@ -4692,6 +4708,15 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的

    韩暮秋,息止安所。

    +]]> + + gallery + +
    + + 二零二三年一月二十一日 + /2023/01/21/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%80%E6%97%A5/ + 我踏着烟火若隐若现, 我生来就是为了把这个世界的消息带到下一个世界去。

    ]]>
    gallery @@ -4750,21 +4775,21 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的
    - 二零二三年二月二十四日 - /2023/02/24/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/ - 黑色的袋子里装满了药,这种袋子我都是用来装垃圾的,它被昏昏欲睡的老人家抱在怀里,里面的药丸随着颠簸的车厢敲打罐子,老人家醒了,她的眼睛比袋子还浑浊。

    -

    她看着我说到站了,我拉着她的手下车,该回家了,等下还要去买支圆珠笔,中性笔没法在药盒子上写用法用量。

    + 二零二三年二月二日 + /2023/02/02/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E6%97%A5/ + 我不知道这些黑乎乎的东西从哪来的,它们填满了这黄铜色的硬币每一处,像机油,像泥泞,它们随着这五角钱硬币一起从我手上换走了一袋糖果,那是一个蓬头垢面,满身泥灰的小孩,他起身看着这个给他糖果的叔叔,我蹲下看着我拥有糖果的童年。
    +​
    +​这事很恐怖,意味着我在这个地方又多了一丝牵挂,多了一个不离开的理由。

    ]]>
    gallery
    - 二零二三年二月二日 - /2023/02/02/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E6%97%A5/ - 我不知道这些黑乎乎的东西从哪来的,它们填满了这黄铜色的硬币每一处,像机油,像泥泞,它们随着这五角钱硬币一起从我手上换走了一袋糖果,那是一个蓬头垢面,满身泥灰的小孩,他起身看着这个给他糖果的叔叔,我蹲下看着我拥有糖果的童年。
    -​
    -​这事很恐怖,意味着我在这个地方又多了一丝牵挂,多了一个不离开的理由。

    + 二零二三年二月二十四日 + /2023/02/24/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/ + 黑色的袋子里装满了药,这种袋子我都是用来装垃圾的,它被昏昏欲睡的老人家抱在怀里,里面的药丸随着颠簸的车厢敲打罐子,老人家醒了,她的眼睛比袋子还浑浊。

    +

    她看着我说到站了,我拉着她的手下车,该回家了,等下还要去买支圆珠笔,中性笔没法在药盒子上写用法用量。

    ]]>
    gallery @@ -4840,6 +4865,15 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的

    岁月中的某个文明中的某个人,曾经也骑着骆驼向远方,又是哪个人,吟着佛门心语站在我身旁,我听见大漠的念经声。

    我不是个有耐心的人, 抄经书对我来说是种折磨, 我只能选择把经文抄在大地上, 黄沙上, 用自己的双腿一点点写, 用耳去倾听狂风卷积的声音。

    我生来就是为了把这个世界的消息和秘密带到下一个世界去。

    +]]>
    + + gallery + +
    + + 二零二二年一月一日 + /2022/01/01/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E4%B8%80%E6%9C%88%E4%B8%80%E6%97%A5/ + 我在一声叹息中恍过了宁静和繁华,目的明确的化成一捧黄土,被风带到这树荫底下,看草萌木长,看人来人往。

    ]]>
    gallery @@ -4857,15 +4891,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的

    生活是属于每个人自己的感受,不属于任何别人的看法。

    人们时常流出浑浊的眼泪,并不是因为人们时常悲伤,人们在高兴时甚至是在什么事都没有的平静时刻,也会有泪流出,然后举起被社会,岁月刮伤的手指,擦去眼泪,如同掸去身上的稻草。

    也许是困苦的生活损坏了人们的记忆,面对往事人们时常显得木讷,常常以不知所措的微笑搪塞过去,对自己的经历缺乏热情,仿佛是道听途说般只记得零星几点,即便是这零星几点也都是自身之外的记忆,用一两句话表达了一切。

    -]]> - - gallery - -
    - - 二零二二年一月一日 - /2022/01/01/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E4%B8%80%E6%9C%88%E4%B8%80%E6%97%A5/ - 我在一声叹息中恍过了宁静和繁华,目的明确的化成一捧黄土,被风带到这树荫底下,看草萌木长,看人来人往。

    ]]>
    gallery @@ -4935,18 +4960,18 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的
    - 二零二零年十二月二十六日 - /2020/12/26/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E9%9B%B6%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%85%AD%E6%97%A5/ - 我被包裹在吊床中,两颗香樟树支撑着它,仲夏的热浪砸在粗壮的香樟树上,叶子一屈,抱住了热浪,可随即而来的是不知从哪浇来的阳光,叶子承受不住这样的力量,被砸的孔洞百出,砸的香气落满树下的人间。

    + 二零二零年十二月八日 + /2020/12/08/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E9%9B%B6%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E5%85%AB%E6%97%A5/ + 它们勇敢的站在烈日下, 像人类一样无所畏惧, 却又恐惧的躲在黑暗中, 像当初的它们一样无处可逃。

    ]]>
    gallery
    - 二零二零年十二月八日 - /2020/12/08/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E9%9B%B6%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E5%85%AB%E6%97%A5/ - 它们勇敢的站在烈日下, 像人类一样无所畏惧, 却又恐惧的躲在黑暗中, 像当初的它们一样无处可逃。

    + 二零二零年十二月二十六日 + /2020/12/26/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E9%9B%B6%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%85%AD%E6%97%A5/ + 我被包裹在吊床中,两颗香樟树支撑着它,仲夏的热浪砸在粗壮的香樟树上,叶子一屈,抱住了热浪,可随即而来的是不知从哪浇来的阳光,叶子承受不住这样的力量,被砸的孔洞百出,砸的香气落满树下的人间。

    ]]>
    gallery @@ -5554,33 +5579,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Design
    - - 实时搜索中的防抖函数 - /2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/ - 在实现实时搜索功能时,通常会使用输入框的事件监听器来捕获用户的输入变化,并在输入变化时发送搜索请求。为了避免过多的请求导致服务器负担过重,通常会使用“防抖”(debounce)技术来控制请求的频率。

    -

    实现步骤

    -
      -
    1. 监听输入框的变化:使用input事件监听器来捕获用户的输入变化。
    2. -
    3. 防抖处理:使用防抖函数来限制请求的频率。防抖函数会在用户停止输入一段时间后才发送请求。
    4. -
    5. 发送请求:在防抖函数中调用搜索请求。
    6. -
    -

    防抖函数示例

    -

    以下是一个简单的防抖函数示例:

    -
    function debounce(func, wait) {
    let timeout;
    return function(...args) {
    const context = this;
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(context, args), wait);
    };
    }
    -

    实现实时搜索

    -

    假设你有一个输入框用于搜索患者:

    -
    <script>
    import { onMount } from 'svelte';
    import { patientsStore } from '$lib/stores/patients.svelte';

    let searchTerm = '';

    // 防抖函数
    function debounce(func, wait) {
    let timeout;
    return function(...args) {
    const context = this;
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(context, args), wait);
    };
    }

    // 搜索函数
    const searchPatients = debounce(async (term) => {
    if (term) {
    // 发送搜索请求
    const response = await fetch(`/api/search-patients?query=${term}`);
    const data = await response.json();
    patientsStore.mbglPatients = data;
    } else {
    // 清空搜索结果或恢复默认数据
    patientsStore.mbglPatients = [];
    }
    }, 300); // 300ms 的防抖时间

    // 监听输入框变化
    function handleInput(event) {
    searchTerm = event.target.value;
    searchPatients(searchTerm);
    }
    </script>

    <input type="text" placeholder="搜索患者..." on:input={handleInput} bind:value={searchTerm} />
    -

    请求发送间隔

    -
      -
    • 防抖时间:通常设置为 300ms 到 500ms 之间。这个时间足够让用户完成输入并减少不必要的请求。
    • -
    • 考虑用户体验:防抖时间过短可能导致过多请求,过长则可能让用户感到延迟。300ms 是一个常用的折中值。
    • -
    -

    通过这种方式,你可以实现一个高效的实时搜索功能,既能保证用户体验,又能减少服务器的负担。

    -]]>
    - - Technique - -
    库欣综合征 /2025/10/29/%E5%BA%93%E6%AC%A3%E7%BB%BC%E5%90%88%E5%BE%81/ @@ -5689,6 +5687,33 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Medicine + + 实时搜索中的防抖函数 + /2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/ + 在实现实时搜索功能时,通常会使用输入框的事件监听器来捕获用户的输入变化,并在输入变化时发送搜索请求。为了避免过多的请求导致服务器负担过重,通常会使用“防抖”(debounce)技术来控制请求的频率。

    +

    实现步骤

    +
      +
    1. 监听输入框的变化:使用input事件监听器来捕获用户的输入变化。
    2. +
    3. 防抖处理:使用防抖函数来限制请求的频率。防抖函数会在用户停止输入一段时间后才发送请求。
    4. +
    5. 发送请求:在防抖函数中调用搜索请求。
    6. +
    +

    防抖函数示例

    +

    以下是一个简单的防抖函数示例:

    +
    function debounce(func, wait) {
    let timeout;
    return function(...args) {
    const context = this;
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(context, args), wait);
    };
    }
    +

    实现实时搜索

    +

    假设你有一个输入框用于搜索患者:

    +
    <script>
    import { onMount } from 'svelte';
    import { patientsStore } from '$lib/stores/patients.svelte';

    let searchTerm = '';

    // 防抖函数
    function debounce(func, wait) {
    let timeout;
    return function(...args) {
    const context = this;
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(context, args), wait);
    };
    }

    // 搜索函数
    const searchPatients = debounce(async (term) => {
    if (term) {
    // 发送搜索请求
    const response = await fetch(`/api/search-patients?query=${term}`);
    const data = await response.json();
    patientsStore.mbglPatients = data;
    } else {
    // 清空搜索结果或恢复默认数据
    patientsStore.mbglPatients = [];
    }
    }, 300); // 300ms 的防抖时间

    // 监听输入框变化
    function handleInput(event) {
    searchTerm = event.target.value;
    searchPatients(searchTerm);
    }
    </script>

    <input type="text" placeholder="搜索患者..." on:input={handleInput} bind:value={searchTerm} />
    +

    请求发送间隔

    +
      +
    • 防抖时间:通常设置为 300ms 到 500ms 之间。这个时间足够让用户完成输入并减少不必要的请求。
    • +
    • 考虑用户体验:防抖时间过短可能导致过多请求,过长则可能让用户感到延迟。300ms 是一个常用的折中值。
    • +
    +

    通过这种方式,你可以实现一个高效的实时搜索功能,既能保证用户体验,又能减少服务器的负担。

    +]]>
    + + Technique + +
    急诊与灾难医学--烧伤 /2024/01/25/%E6%80%A5%E8%AF%8A%E4%B8%8E%E7%81%BE%E9%9A%BE%E5%8C%BB%E5%AD%A6-%E7%83%A7%E4%BC%A4/ @@ -6055,69 +6080,6 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Life - - 气胸 - /2023/03/01/%E6%B0%94%E8%83%B8/ - 气胸.jpg

    -

    这个病多见于瘦高的年轻男性,一般感觉起来就是:

    -
      -
    1. 胸腔有刺痛感,针刺的感觉,想想那种拿小针针撮你小胸胸的感觉。
    2. -
    3. 胸闷,就像有东西压在胸口。
    4. -
    5. 呼吸困难,就像有人捂住你的口鼻,有点窒息的感觉。
    6. -
    -

    通俗来讲造成这种感觉的原因是肺泡破裂,肺漏气了。然后气体在胸腔里聚集就压缩了肺。

    -

    气胸2.jpeg
    -图中是一位右侧气胸患者(图中右面)的电脑断层扫描影像。在胸腔的边缘有着引流管,而图中黑色一片就是邻近于肺膜间(黑)和肋骨(白)的内腔。心脏则在图中央。医学专科胸腔医学、胸腔外科学症状胸痛、呼吸困难、疲劳常见始发于突发性肇因未知、创伤风险因子慢性阻塞性肺病(COPD)、结核病、抽烟诊断方法胸部X光、超声波、电脑断层扫描相似疾病或共病肺部大疱、血胸预防禁烟或戒烟治疗保守治疗、空针穿刺、胸管置放、肋膜黏连术盛行率约每10万人中20例外伤性气胸。

    -

    临床表现

    -

    在医学上的临床表现中,气胸具有如下症状:
    -患者常有持重物、屏气、剧烈运动等诱发因素,但也有在睡眠中发生气胸者,病人突感一侧胸痛、气急、憋气,可有咳嗽、但痰少,小量闭合性气胸先有气急,但数小时后逐渐平稳,X线也不一定能显示肺压缩。若积气量较大者或者原来已有广泛肺部疾患,病人常不能平卧。如果侧卧,则被迫使气胸患侧在上,以减轻气急。病人呼吸困难程度与积气量的多寡以及原来肺内病变范围有关。当有胸膜粘连和肺功能减损时,即使小量局限性气胸也可能明显胸痛和气急。

    -

    初步诊断方式

    -

    突发一侧胸痛,伴有呼吸困难并有气胸体征,即可作出初步诊断。X线显示气胸征是确诊依据。在无条件或病情危重不允许作X线检查时,可在患侧胸腔积气体征最明确处试穿,抽气测压,若为正压且抽出气体,说明有气胸存在,即应抽出气体以缓解症状,并观察抽气后胸腔内压力的变化以判断气胸类型。在原有严重哮喘或肺气肿基础上并发气胸时,气急、胸闷等症状有时不易觉察,要与原先症状仔细比较。

    -

    类似病症需要区别开来

    -
      -
    1. 支气管哮喘和阻塞性肺气肿: 有气急和呼吸困难,体征亦与自发性气胸相似,但肺气肿呼吸困难是长期缓慢加重的,支气管哮喘病人有多年哮喘反复发作史。当哮喘和肺气肿病人呼吸困难突然加重且有胸痛,应考虑并发气胸的可能,X线检查可以作出鉴别。
    2. -
    3. 急性心肌梗塞: 病人亦有急起胸痛、胸闷、甚至呼吸困难、休克等临床表现,但常有高血压、动脉粥样硬化、冠心病史。体征、心电图和X线胸透有助于诊断。
    4. -
    5. 肺栓塞: 有胸痛、呼吸困难和紫绀等酷似自发性气胸的临床表现,但病人往往有咯血和低热,并常有下肢或盆腔栓塞性静脉炎、骨折、严重心脏病、心房纤颤等病史,或发生在长期卧床的老年患者。体检和X线检查有助于鉴别。
    6. -
    7. 肺大疱: 位于肺周边部位的肺大疱有时在X线下被误为气胸。肺大疱可因先天发育形成,也可因支气管内活瓣阻塞而形成张力性囊腔或巨型空腔,起病缓慢,气急不剧烈,从不同角度作胸部透视,可见肺大疱或支气管源囊肿为圆形或卵圆形透光区,在大疱的边缘看不到发线状气胸线,疱内有细小的条纹理,为肺小叶或血管的残遗物。肺大疱向周围膨胀,将肺压向肺尖区、肋膈角和心膈角,而气胸则呈胸外侧的透光带,其中无肺纹可见。肺大疱内压力与大气压相仿,抽气后,大疱容积无显著改变。
    8. -
    9. 主动脉夹层: 夹层分离突然发生时多数患者突感胸部疼痛,向胸前及背部放射,随夹层涉及范围而可以延至腹部、下肢、臂及颈部。疼痛剧烈难以忍受,起病后即达高峰,呈刀割或撕裂样。少数起病缓慢者疼痛可以不著。必须与气胸相鉴别。
    10. -
    11. 其他如消化性溃疡穿孔,膈疝、胸膜炎和肺癌等,有时因急起的胸痛,上腹痛和气急等,亦应注意与自发性气胸鉴别。
    12. -
    -

    建议至医院就诊明确病因,例如是不是最常见的肺大疱引起,还是肺部其他疾病引起,病因治疗,以免延误病情。

    -
    -

    如果是肺大疱引起: 肺大疱先天性支气管发育异常,粘膜皱襞呈瓣膜状,软骨发育不良,引起活瓣作用所致。如果有胸闷、气短的症状,而且反复发作,建议手术治疗。如果没有任何症状可以观察,内科治疗。 病人的症状主要与大疱的数目、大小以及是否伴有炎症,肺大疱是否破裂密切相关。首先、小范围的先天性肺大疱一般不会直接导致死亡。 但是、大范围的先天性肺大疱或者出现严重并发症时,有可能引起死亡:

    -
      -
    1. 直接原因。巨大的肺大疱,因为气体交换困难,多有不同程度的呼吸困难,有的病人因而失去劳动力,甚至行动亦受到限制或者窒息可能。
    2. -
    3. 间接原因。主要是出现并发症时,先天性肺大疱绝大多数是不感染的,但如果感冒等原因引起肺部分泌物增多,引流肺大疱的支气管堵塞,肺大疱支气管内充满炎性分泌物,患者可出现发热、咳嗽、咳痰等感染症状,严重时可以导致菌血症、败血症、脓毒血症导致生命危险。而且肺大疱引起的自发性血胸,多数由肺尖部的大疱或大疱周围的肺组织与胸顶粘连及粘连撕裂活动出血。由于肺、心脏、膈肌运动的去纤维化作用,胸腔内的血液不凝固,因此出血很难自动停止。临床症状可因出血的快慢而不同,出血缓慢时,患者可表现为逐渐加重的胸闷,呼吸困难,X线可见膈角变钝,或胸腔积液的抛物线影像。出血迅速时,短期内可以有休克表现。其次,大范围的先天性肺大疱导致机体长期处于气体交换困难,缺氧时,能导致能促使肺原性心脏病的发生,甚至多器官功能衰竭。
    4. -
    -
    -
    -

    先天性肺大疱破裂也可以危及生命,破裂时会并发自发性气胸,有突然胸痛,呼吸困难。若肺大疱破裂后形成活瓣,吸气时胸腔负压增高,气体进入胸腔,呼气时活瓣关闭,气体不能排出,尤其是咳嗽时,声门关闭气道压力增高,气体进入胸腔,声门开放后,气道压力减低,裂口又闭合,每一次呼吸和咳嗽都使胸腔内气体量增加,就形成张力性气胸。 张力性气胸时患侧肺组织完全萎缩,纵隔被推向健侧,在健侧肺组织亦被压缩的同时心脏大血管移位,大静脉扭曲变形,影响血液回流,造成呼吸循环严重障碍。有可能出现很快的心肺功能衰竭,导致死亡。

    -
    -

    急救

    -
      -
    1. -

      胸部损伤: 胸部如果被刺穿,需要立即覆盖伤处,并以凡士林或胶布密封,以免空气继续经伤处流入。无菌的胶布是较理想的选择, 但是所有气密的物质,例如玻璃纸和香烟盒也可以用。密封后,需要开一个小孔(振动筏)来使吸气时排出空气。胸部刺穿的患者需要密切监察,防止引发对生命有危险的张力性气胸。

      -
    2. -
    3. -

      入院前护理: 多数救护员可以进行针刺抽气, 以减低胸部的压力。 如果情况恶化,导管抽气也可能需要,包括有知觉的病人。可能的话,进行额外的治疗和即时送病人到医院治疗。没有经过适当的治疗的话,气胸患者是不能用飞机运送的。

      -
    4. -
    -

    流行病学

    -

    经年龄调整后的年均发病率﹝AAIR﹞显示,男性患上气胸的机会较女性高出三至六倍。菲什曼在研究中提出以每十万人年计算,男女患上原发性气胸的AAIR分别为7.4和1.2。身高比平均值较高的人,他们患上气胸的AAIR也相对增加 - 至少为76英寸(1.93米)高的人,每十万人年约有200个案例。瘦削的身材也似乎增加了患上原发性气胸的风险。

    -

    此外,男性和女性烟民患上原发性气胸,相对于同性别的非吸烟者患上的机会高出约22倍和9倍。而个人吸烟的程度越凶,风险会有“大于线性”的效果:比方说每天吸食10支香烟的人,会比非吸烟者高出20倍患上气胸的机会;每天消耗20支香烟的,则会高出约100倍。

    -

    在继发自发性气胸的病例当中,男性和女性的AAIR大概为6.3和2.0,而复发的风险则取决于患者本身有否任何潜在的肺病及其严重性。一旦发生了第二次气胸,病人之后再复发的机会极高。目前来说没有周详的研究调查儿童的发病率,但估计是每年约十万份之5至10。

    -

    除外张力性气胸以外,因为气胸而死亡的案例是非常罕见的。据英国统计数字显示,每年每一百万人当中会有1.26位男性和0.62位女性会因为气胸死亡,其中中老年和继发性气胸的患者会有较高的死亡风险。

    -

    引用

    - -]]>
    - - Medicine - -
    灯笼草 /2023/06/22/%E7%81%AF%E7%AC%BC%E8%8D%89/ @@ -6182,6 +6144,69 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Life + + 气胸 + /2023/03/01/%E6%B0%94%E8%83%B8/ + 气胸.jpg

    +

    这个病多见于瘦高的年轻男性,一般感觉起来就是:

    +
      +
    1. 胸腔有刺痛感,针刺的感觉,想想那种拿小针针撮你小胸胸的感觉。
    2. +
    3. 胸闷,就像有东西压在胸口。
    4. +
    5. 呼吸困难,就像有人捂住你的口鼻,有点窒息的感觉。
    6. +
    +

    通俗来讲造成这种感觉的原因是肺泡破裂,肺漏气了。然后气体在胸腔里聚集就压缩了肺。

    +

    气胸2.jpeg
    +图中是一位右侧气胸患者(图中右面)的电脑断层扫描影像。在胸腔的边缘有着引流管,而图中黑色一片就是邻近于肺膜间(黑)和肋骨(白)的内腔。心脏则在图中央。医学专科胸腔医学、胸腔外科学症状胸痛、呼吸困难、疲劳常见始发于突发性肇因未知、创伤风险因子慢性阻塞性肺病(COPD)、结核病、抽烟诊断方法胸部X光、超声波、电脑断层扫描相似疾病或共病肺部大疱、血胸预防禁烟或戒烟治疗保守治疗、空针穿刺、胸管置放、肋膜黏连术盛行率约每10万人中20例外伤性气胸。

    +

    临床表现

    +

    在医学上的临床表现中,气胸具有如下症状:
    +患者常有持重物、屏气、剧烈运动等诱发因素,但也有在睡眠中发生气胸者,病人突感一侧胸痛、气急、憋气,可有咳嗽、但痰少,小量闭合性气胸先有气急,但数小时后逐渐平稳,X线也不一定能显示肺压缩。若积气量较大者或者原来已有广泛肺部疾患,病人常不能平卧。如果侧卧,则被迫使气胸患侧在上,以减轻气急。病人呼吸困难程度与积气量的多寡以及原来肺内病变范围有关。当有胸膜粘连和肺功能减损时,即使小量局限性气胸也可能明显胸痛和气急。

    +

    初步诊断方式

    +

    突发一侧胸痛,伴有呼吸困难并有气胸体征,即可作出初步诊断。X线显示气胸征是确诊依据。在无条件或病情危重不允许作X线检查时,可在患侧胸腔积气体征最明确处试穿,抽气测压,若为正压且抽出气体,说明有气胸存在,即应抽出气体以缓解症状,并观察抽气后胸腔内压力的变化以判断气胸类型。在原有严重哮喘或肺气肿基础上并发气胸时,气急、胸闷等症状有时不易觉察,要与原先症状仔细比较。

    +

    类似病症需要区别开来

    +
      +
    1. 支气管哮喘和阻塞性肺气肿: 有气急和呼吸困难,体征亦与自发性气胸相似,但肺气肿呼吸困难是长期缓慢加重的,支气管哮喘病人有多年哮喘反复发作史。当哮喘和肺气肿病人呼吸困难突然加重且有胸痛,应考虑并发气胸的可能,X线检查可以作出鉴别。
    2. +
    3. 急性心肌梗塞: 病人亦有急起胸痛、胸闷、甚至呼吸困难、休克等临床表现,但常有高血压、动脉粥样硬化、冠心病史。体征、心电图和X线胸透有助于诊断。
    4. +
    5. 肺栓塞: 有胸痛、呼吸困难和紫绀等酷似自发性气胸的临床表现,但病人往往有咯血和低热,并常有下肢或盆腔栓塞性静脉炎、骨折、严重心脏病、心房纤颤等病史,或发生在长期卧床的老年患者。体检和X线检查有助于鉴别。
    6. +
    7. 肺大疱: 位于肺周边部位的肺大疱有时在X线下被误为气胸。肺大疱可因先天发育形成,也可因支气管内活瓣阻塞而形成张力性囊腔或巨型空腔,起病缓慢,气急不剧烈,从不同角度作胸部透视,可见肺大疱或支气管源囊肿为圆形或卵圆形透光区,在大疱的边缘看不到发线状气胸线,疱内有细小的条纹理,为肺小叶或血管的残遗物。肺大疱向周围膨胀,将肺压向肺尖区、肋膈角和心膈角,而气胸则呈胸外侧的透光带,其中无肺纹可见。肺大疱内压力与大气压相仿,抽气后,大疱容积无显著改变。
    8. +
    9. 主动脉夹层: 夹层分离突然发生时多数患者突感胸部疼痛,向胸前及背部放射,随夹层涉及范围而可以延至腹部、下肢、臂及颈部。疼痛剧烈难以忍受,起病后即达高峰,呈刀割或撕裂样。少数起病缓慢者疼痛可以不著。必须与气胸相鉴别。
    10. +
    11. 其他如消化性溃疡穿孔,膈疝、胸膜炎和肺癌等,有时因急起的胸痛,上腹痛和气急等,亦应注意与自发性气胸鉴别。
    12. +
    +

    建议至医院就诊明确病因,例如是不是最常见的肺大疱引起,还是肺部其他疾病引起,病因治疗,以免延误病情。

    +
    +

    如果是肺大疱引起: 肺大疱先天性支气管发育异常,粘膜皱襞呈瓣膜状,软骨发育不良,引起活瓣作用所致。如果有胸闷、气短的症状,而且反复发作,建议手术治疗。如果没有任何症状可以观察,内科治疗。 病人的症状主要与大疱的数目、大小以及是否伴有炎症,肺大疱是否破裂密切相关。首先、小范围的先天性肺大疱一般不会直接导致死亡。 但是、大范围的先天性肺大疱或者出现严重并发症时,有可能引起死亡:

    +
      +
    1. 直接原因。巨大的肺大疱,因为气体交换困难,多有不同程度的呼吸困难,有的病人因而失去劳动力,甚至行动亦受到限制或者窒息可能。
    2. +
    3. 间接原因。主要是出现并发症时,先天性肺大疱绝大多数是不感染的,但如果感冒等原因引起肺部分泌物增多,引流肺大疱的支气管堵塞,肺大疱支气管内充满炎性分泌物,患者可出现发热、咳嗽、咳痰等感染症状,严重时可以导致菌血症、败血症、脓毒血症导致生命危险。而且肺大疱引起的自发性血胸,多数由肺尖部的大疱或大疱周围的肺组织与胸顶粘连及粘连撕裂活动出血。由于肺、心脏、膈肌运动的去纤维化作用,胸腔内的血液不凝固,因此出血很难自动停止。临床症状可因出血的快慢而不同,出血缓慢时,患者可表现为逐渐加重的胸闷,呼吸困难,X线可见膈角变钝,或胸腔积液的抛物线影像。出血迅速时,短期内可以有休克表现。其次,大范围的先天性肺大疱导致机体长期处于气体交换困难,缺氧时,能导致能促使肺原性心脏病的发生,甚至多器官功能衰竭。
    4. +
    +
    +
    +

    先天性肺大疱破裂也可以危及生命,破裂时会并发自发性气胸,有突然胸痛,呼吸困难。若肺大疱破裂后形成活瓣,吸气时胸腔负压增高,气体进入胸腔,呼气时活瓣关闭,气体不能排出,尤其是咳嗽时,声门关闭气道压力增高,气体进入胸腔,声门开放后,气道压力减低,裂口又闭合,每一次呼吸和咳嗽都使胸腔内气体量增加,就形成张力性气胸。 张力性气胸时患侧肺组织完全萎缩,纵隔被推向健侧,在健侧肺组织亦被压缩的同时心脏大血管移位,大静脉扭曲变形,影响血液回流,造成呼吸循环严重障碍。有可能出现很快的心肺功能衰竭,导致死亡。

    +
    +

    急救

    +
      +
    1. +

      胸部损伤: 胸部如果被刺穿,需要立即覆盖伤处,并以凡士林或胶布密封,以免空气继续经伤处流入。无菌的胶布是较理想的选择, 但是所有气密的物质,例如玻璃纸和香烟盒也可以用。密封后,需要开一个小孔(振动筏)来使吸气时排出空气。胸部刺穿的患者需要密切监察,防止引发对生命有危险的张力性气胸。

      +
    2. +
    3. +

      入院前护理: 多数救护员可以进行针刺抽气, 以减低胸部的压力。 如果情况恶化,导管抽气也可能需要,包括有知觉的病人。可能的话,进行额外的治疗和即时送病人到医院治疗。没有经过适当的治疗的话,气胸患者是不能用飞机运送的。

      +
    4. +
    +

    流行病学

    +

    经年龄调整后的年均发病率﹝AAIR﹞显示,男性患上气胸的机会较女性高出三至六倍。菲什曼在研究中提出以每十万人年计算,男女患上原发性气胸的AAIR分别为7.4和1.2。身高比平均值较高的人,他们患上气胸的AAIR也相对增加 - 至少为76英寸(1.93米)高的人,每十万人年约有200个案例。瘦削的身材也似乎增加了患上原发性气胸的风险。

    +

    此外,男性和女性烟民患上原发性气胸,相对于同性别的非吸烟者患上的机会高出约22倍和9倍。而个人吸烟的程度越凶,风险会有“大于线性”的效果:比方说每天吸食10支香烟的人,会比非吸烟者高出20倍患上气胸的机会;每天消耗20支香烟的,则会高出约100倍。

    +

    在继发自发性气胸的病例当中,男性和女性的AAIR大概为6.3和2.0,而复发的风险则取决于患者本身有否任何潜在的肺病及其严重性。一旦发生了第二次气胸,病人之后再复发的机会极高。目前来说没有周详的研究调查儿童的发病率,但估计是每年约十万份之5至10。

    +

    除外张力性气胸以外,因为气胸而死亡的案例是非常罕见的。据英国统计数字显示,每年每一百万人当中会有1.26位男性和0.62位女性会因为气胸死亡,其中中老年和继发性气胸的患者会有较高的死亡风险。

    +

    引用

    + +]]>
    + + Medicine + +
    直系血亲之间不能直接输血 /2024/08/12/%E7%9B%B4%E7%B3%BB%E8%A1%80%E4%BA%B2%E4%B9%8B%E9%97%B4%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E8%BE%93%E8%A1%80/ @@ -6405,6 +6430,44 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Medicine + + 简单说说 FHIR Transaction Bundle + /2026/03/12/%E7%AE%80%E5%8D%95%E8%AF%B4%E8%AF%B4-FHIR-Transaction-Bundle/ + FHIR Transaction Bundle 主要解决这一类问题:

    +
    +

    假设你要创建一个 Patient,再创建一个属于这个患者的 Observation,两个必须同时成功或同时失败。用普通 REST API,你得先 POST Patient,拿到 ID,再 POST Observation,如果中间失败了还得自己回滚。FHIR 的 transaction 就是把这个流程标准化成类似数据库的事务操作或说是 “原子操作” ,整组操作要么全成功,要么全失败,而且可以在同一个 bundle 里直接引用还没创建的资源。

    +
    +

    transaction bundle 和 batch bundle 的区别是,batch 把多个请求一起提交,每个独立处理,一部分成功一部分失败是允许的。Transaction 是把所有请求当原子单元处理,任一失败则整体回滚。Medplum 文档说得很直接:batch 是独立处理,transaction 是原子处理。

    +

    然后看一个最基础的例子。同时创建 Patient 和 Observation,Observation 引用这个新建的 Patient:

    +
    {
    "resourceType": "Bundle",
    "type": "transaction",
    "entry": [
    {
    "fullUrl": "urn:uuid:patient-1",
    "request": {
    "method": "POST",
    "url": "Patient"
    },
    "resource": {
    "resourceType": "Patient",
    "name": [{ "family": "Doe", "given": ["Jane"] }]
    }
    },
    {
    "fullUrl": "urn:uuid:observation-1",
    "request": {
    "method": "POST",
    "url": "Observation"
    },
    "resource": {
    "resourceType": "Observation",
    "status": "final",
    "code": { "text": "Body Weight" },
    "subject": { "reference": "urn:uuid:patient-1" },
    "valueQuantity": { "value": 68, "unit": "kg" }
    }
    }
    ]
    }
    +

    这里的关键是 fullUrl 和 urn:uuid。fullUrl 给 bundle 内还没创建的资源一个临时身份,其他资源通过这个 urn:uuid 引用它。服务端创建资源后会把内部引用替换成真实地址。

    +

    FHIR R4 规范对 transaction 有几个硬性规则,这些规则直接影响你怎么设计 bundle。

    +

    第一,原子性,要么全成功要么全失败。

    +

    第二,处理结果不依赖 entry 顺序。这是我踩坑的地方。不能把 transaction 当成"按顺序执行的脚本"。FHIR 明确规定了服务端处理顺序:先 DELETE,再 POST,再 PUT/PATCH,最后 GET 和解析条件引用。所以写 bundle 的时候不能依赖"先 A 再 B"这种逻辑。

    +

    第三,同一资源身份在一个 transaction 中只能出现一次。这是规范层面的限制,不是"可能出问题",而是规范直接说 SHALL fail。

    +

    举个反面例子。我想在一个 transaction 里先 PATCH 一个资源补审计字段,再 DELETE 同一个资源:

    +
    {
    "resourceType": "Bundle",
    "type": "transaction",
    "entry": [
    {
    "request": { "method": "PATCH", "url": "Observation/obs-1" },
    "resource": { "resourceType": "Parameters" }
    },
    {
    "request": { "method": "DELETE", "url": "Observation/obs-1" }
    }
    ]
    }
    +

    这个 bundle 从规范层面就不合法。原因有两个:一是服务端不会按你写的顺序处理,DELETE 先于 PATCH;二是同一个资源 Observation/obs-1 在 transaction 里出现了两次,构成身份重叠,规范要求失败。

    +

    再说 DELETE。FHIR 的 DELETE 不是物理删除。从普通读取角度看,资源返回 410 Gone;从搜索角度看,资源不再出现;但如果服务端维护版本历史,_history 里仍然有记录,而且删除本身会形成一个"被标记为 deleted 的特殊历史版本"。规范还提到被删除的资源可以通过后续 PUT update “bring back to life”。

    +

    这对审计设计有直接影响。如果想把删除审计写在主资源的 extension 里(比如 deletedBy、deletedAt),就不能用一个 transaction 搞定,因为同一个资源不能既 PATCH 又 DELETE。你得接受两步法:先更新资源写审计信息,再执行 DELETE。代价是多出一个预删除版本,但好处是审计信息确实留在了主资源历史里。

    +

    什么时候该用 transaction?比如多资源必须原子操作的场景,资源间存在内部引用的场景,希望服务端负责一致性边界的场景。

    +

    什么时候不该用?比如只是想减少 HTTP 请求次数的,用 batch;bundle 太大事务太重的,某些资源本来就适合异步处理的。

    +

    参考资料

    + +]]>
    + + Technique + +
    纯牛奶可以加点啥 /2023/03/01/%E7%BA%AF%E7%89%9B%E5%A5%B6%E5%8F%AF%E4%BB%A5%E5%8A%A0%E7%82%B9%E5%95%A5/ @@ -6454,6 +6517,34 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Medicine + + 老年人营养不良误区 + /2026/02/16/%E8%80%81%E5%B9%B4%E4%BA%BA%E8%90%A5%E5%85%BB%E8%AF%AF%E5%8C%BA/ + 老年人营养不良已成为全球公共卫生领域的重大挑战,据世界卫生组织数据,约有25%的老年人群处于营养不良或风险状态中[1]。这一问题往往源于生理退行性变化,如胃肠道功能减退、咀嚼吞咽困难以及慢性疾病的影响,导致能量摄入与消耗失衡。一个临床案例中,一位86岁女性患者因反流性食管炎未及时干预,叠加不良饮食习惯,出现腹胀、食欲减退、体重急剧下降至40公斤左右,并伴随癌胚抗原(CEA)升高至11.5 μg/L,提示炎症相关营养障碍。该案例凸显了老年人常见营养误区如何放大疾病风险,进而诱发肌少症、免疫功能低下甚至多器官衰竭。以下基于循证医学证据,对四个典型误区进行详细剖析:

    +

    误区一: 认为稀饭易消化且养胃,故适合老年人每日三餐以此为主。这种认知源于传统饮食文化,但忽略了稀饭的营养组成。稀饭以精制米为主,含水量高达90%以上,蛋白质仅约2-3 g/100 g,缺乏必需氨基酸、维生素B族及矿物质如铁、锌,导致长期摄入易引发低蛋白血症和微量元素缺乏。生理上,老年人胃酸分泌减少20%-50%,肠道吸收效率下降,若饮食单一,膳食纤维摄入不足将加剧便秘和肠道菌群失调,进一步抑制食欲。流行病学研究显示,依赖稀饭为主食的老年人群营养不良发生率升高2-3倍,常伴随贫血和骨密度降低[2]。临床证据表明,此类饮食模式可诱发隐匿性炎症,CEA等标志物异常风险增加15%-20%。正确路径为构建均衡膳食结构:每日主食以粗细粮搭配,如全谷物米饭或燕麦粥,提供膳食纤维15-25 g;蛋白质摄入目标1.0-1.2 g/kg体重,例如通过鱼虾、瘦肉、豆制品及奶类补充,每餐至少包含20 g优质蛋白;蔬果优先深色品种如菠菜、西兰花,富含抗氧化物以对抗氧化应激。若摄入不足,可在医师指导下引入口服营养补充剂,如含支链氨基酸的配方,每日1-2包,监测血清白蛋白水平以评估疗效。

    +

    误区二: 强调吃饱才有精力,故鼓励老年人一次性进食过量。这种习惯虽意在补充能量,却违背老年生理特点。老年人胃容量缩小至年轻人的70%,消化酶活性降低30%,过饱进食将导致胃排空延迟,诱发胃食管反流和消化不良。机制上,饱餐后血液大量转向消化道,脑心供血相对减少,易引发低血压或心律失常,尤其对伴高血压者风险更高。队列研究证实,每日热量摄入超过需求20%的老年人,慢性胃炎复发率增加1.5倍,并与营养吸收障碍相关[3]。在案例中,患者反流性食管炎即由此类习惯加重,表现为打嗝、胸闷。干预策略采用“三餐两点”模式:正餐控制在七分饱,即进食至无饥饿感但不胀满,每餐热量占总摄入的25%-30%;加餐选低脂水果或坚果,如上午苹果一片(约100 kcal),下午酸奶一杯(150 ml),总日摄入1500-2000 kcal,根据基础代谢率调整。监测指标包括餐后血糖和体重曲线,每周复测以避免低血糖风险。

    +

    误区三: 视“老来瘦”为福寿象征,认为体重减轻有益健康。这种观点忽略了老年瘦身往往源于肌肉流失,而非脂肪减少。肌少症(sarcopenia)定义为骨骼肌质量和功能丧失,全球老年人群患病率达10%-50%,与跌倒、骨折及死亡率升高相关[4]。生理基础在于激素水平下降,如睾酮和生长激素减少30%,叠加炎症因子(如IL-6)升高,导致蛋白合成抑制。影像学证据显示,肌少症患者CEA等炎症标志物异常概率增加25%,如案例中患者“皮包骨头”状态即为典型。瘦弱并非健康标志,而是营养不良的信号,易并发衰弱综合征。优化方案聚焦抗肌少症营养:每日蛋白质摄入提升至1.2-1.5 g/kg,优先富含亮氨酸来源如鸡蛋、乳清蛋白;结合维生素D补充(800-2000 IU/日)和ω-3脂肪酸(鱼油1-2 g/日),以促进肌合成。运动干预如每周3次阻力训练(举重5-10 kg),监测肌力握力和生物电阻抗分析(BIA)以量化肌肉质量,每3个月复评。

    +

    误区四: 相信汤羹浓缩营养精华,多饮鸡汤或骨头汤可滋补身体。这种误解源于汤汁外观油腻诱人,但实际营养价值有限。肉汤脂肪含量高(每100 ml鸡汤约5-10 g),嘌呤达50-100 mg,长期摄入易诱发高尿酸血症和血脂异常。机制上,汤中可溶性蛋白仅占总量的10%-20%,多数营养留在肉渣中,而高钠(>500 mg/100 ml)加重水钠潴留,对心衰或肾功能不全者危害显著。meta分析显示,每周>3次肉汤摄入的老年人,高血压风险升高1.8倍,肥胖发生率增加[5]。案例患者素食偏好虽避开部分风险,但整体营养失衡仍需矫正。推荐替代为清淡汤品,如蔬菜豆腐汤,每日饮水1.5-1.7 L白开水以维持电解质平衡;若需汤类,限量骨汤每周2次<200 ml,并监测血尿酸和脂质谱。

    +
    +
    +
      +
    1. World Health Organization. Nutrition for older adults. WHO Guidelines, 2023. Available at: https://www.who.int/publications/i/item/9789240073929 ↩︎

      +
    2. +
    3. Volkert D, et al. ESPEN guideline on clinical nutrition and hydration in geriatrics. Clin Nutr. 2019;38(1):10-47. doi:10.1016/j.clnu.2018.03.030 ↩︎

      +
    4. +
    5. Bellia A, et al. Overeating and gastrointestinal symptoms in the elderly. Nutrients. 2021;13(5):1567. doi:10.3390/nu13051567 ↩︎

      +
    6. +
    7. Cruz-Jentoft AJ, et al. Sarcopenia: European consensus on definition and diagnosis. Age Ageing. 2010;39(4):412-23. doi:10.1093/ageing/afq034 ↩︎

      +
    8. +
    9. Zhang Y, et al. Meat soup consumption and hyperuricemia risk in older adults: A cohort study. J Nutr Health Aging. 2022;26(4):345-52. doi:10.1007/s12603-022-1765-3 ↩︎

      +
    10. +
    +
    +]]>
    + + Life + +
    肝功能检查化验单阅读指南 /2023/10/13/%E8%82%9D%E5%8A%9F%E8%83%BD%E6%A3%80%E6%9F%A5%E5%8C%96%E9%AA%8C%E5%8D%95/ @@ -6727,6 +6818,22 @@ NestJS 依赖其底层 HTTP 适配器(默认为 Express)来解析传入的 Life + + 药物研发中的制药成本 + /2026/01/09/%E8%8D%AF%E7%89%A9%E7%A0%94%E5%8F%91%E4%B8%AD%E7%9A%84%E5%88%B6%E8%8D%AF%E6%88%90%E6%9C%AC/ + 在药物研发的全链条中,从靶点发现、临床前研究、临床试验(I-III期)、监管审批到上市后监测,“制药成本” 主要指化学、制造和控制环节的支出,包括活性药物成分的合成、制剂开发、规模化生产验证以及符合良好生产规范(cGMP)的设施投资。

    +

    这一成本并非研发链条的最大组成部分,而是相对次要的环节,通常占比约 5% 至 15%,具体取决于药物类型、分子复杂度和开发阶段的资源分配。

    +

    总体而言,新药研发的总成本高企(平均每款成功药物约21-30亿美元),其中临床试验往往主导支出格局,而制药成本在早期阶段更侧重于小批量 GMP 生产,用于支持毒理学和人体试验,在后期则扩展到商业化验证,但其在全链中的权重仍被临床数据生成和监管合规所稀释。

    +

    从 Tufts 药物开发研究中心的长期分析报告中可以看出,在成功带出一款新药的平均成本中,临床前和发现阶段约占 22%,临床试验阶段高达 59%,而CMC 和制造相关支出仅约 9%,剩余部分为监管、知识产权和行政开销。

    +

    这一分布反映了制药行业的风险导向:失败率极高(约 90% 的候选药物在临床中夭折),导致早期投资虽多但分散,而后期临床验证需巨额资金以招募患者和监测疗效。

    +

    Deloitte 的制药行业报告中提到了一些细节:对于小分子化学药物,制造成本占比可能低至 5-8%,因为合成路线相对成熟,但对于生物制品如单克隆抗体或基因疗法,这一比例可升至 10-15%,源于复杂的细胞培养、纯化和无菌填充工艺,这些步骤需专用设备和严格的生物安全控制。FDA 的年度报告也证实,ANDA 或 BLA 申请中,CMC 模块的审查虽关键,但其预算需求远低于临床部分,仅需证明工艺可重复性和稳定性,而非重复疗效试验。

    +

    传统口服小分子药的制药成本较低,因为原料采购和制剂标准化程度高,其他比较特别的个性化疗法如 CAR-T 细胞产品,其制造涉及患者特异性生产,导致单位成本飙升(可达数十万美元/剂),从而拉高全链比例。全球供应链波动(如原料短缺或地缘风险)或工艺优化(如连续流合成技术)也会动态影响支出,例如采用绿色化学可将 API 成本降低 20-30%。

    +

    总体上,制药成本虽小,但上市后其重要性才开始体现出来,因为一旦药物获批,制造效率直接决定利润率,平均占销售成本的 20-40%。

    +]]>
    + + Medicine + +
    藿香正气水和藿香正气口服液的区别 /2024/09/01/%E8%97%BF%E9%A6%99%E6%AD%A3%E6%B0%94%E6%B0%B4%E5%92%8C%E8%97%BF%E9%A6%99%E6%AD%A3%E6%B0%94%E5%8F%A3%E6%9C%8D%E6%B6%B2%E7%9A%84%E5%8C%BA%E5%88%AB/ -- cgit v1.2.3