From 50c3d7ad735b9edf3eaaf9f47da1d93fd6d5c264 Mon Sep 17 00:00:00 2001
From: i-shm
open System |
编译器认为存在两个相同的 CopyTo 重载无法区分。但查阅文档发现,Vector<T> 的 CopyTo 方法实际上只有一个匹配的重载(接受 Span<T>),这似乎矛盾。
这是因为 F# 编译器处理泛型方法重载的方式:
-Vector<T> 可能实现了多个接口,导致编译器看到两个签名相同的 CopyTo 方法(例如通过不同接口继承)。仅我所知的一种解决方案是通过添加扩展方法显式指引编译器:
-type Vector<'T> with |
这种方法通过创建具体的类型路径,帮助编译器绕过复杂的重载解析逻辑。
-学艺不精,不知道这是不是语言设计的差异,可能 F# 倾向于要求更明确的类型信息以避免意外行为?或许当泛型类型继承多个接口时,有没有可能出现在具体类型中不易察觉的隐式重载冲突?
-在FDA监管的药物研发、临床试验和上市流程中,当一个已上市药物(通常指创新药,通过新药申请NDA获得批准)出现一种更低廉的制药方式,但其活性成分的分子式保持完全相同时,这种情况本质上涉及仿制药(generic drug)的开发或工艺优化申请,而非从零开始的全新药物研发。简单来说,不需要重新进行完整的临床试验(即I-III期的大规模人体试验),但必须通过简化的监管路径证明新制药方式生产的药物与原药在质量、安全性和疗效上等效。
-首先,理解核心前提:分子式完全相同意味着活性成分(active pharmaceutical ingredient, API)是相同的化学实体,例如从专利保护的原研药转向无专利保护的仿制药生产。这不同于生物制品(如单克隆抗体)的生物类似药,后者可能需要更多比较性临床试验。FDA将此类药物归类为“仿制药”,其审批路径是缩减新药申请(Abbreviated New Drug Application, ANDA),而非完整的NDA。ANDA的目的是避免重复证明已知的安全性和有效性数据,这些数据已在原药的NDA中确立[1]。
-FDA的《仿制药用户费用法案》(GDUFA)和相关指南明确规定,对于相同分子式的药物,新制药方式(如改进的合成路线、晶型优化或更高效的提取工艺)只需证明“生物等效性”(bioequivalence),而非全面临床试验。生物等效性研究通常包括:1)体外溶出测试(in vitro dissolution),评估药物在模拟生理条件下的释放速率;2)人体药代动力学研究(pharmacokinetic studies),在健康志愿者中比较新药与原药的吸收、分布、代谢和排泄曲线(如AUC和Cmax参数的90%置信区间在80%-125%内)。这些研究规模小,通常只需24-36名受试者,持续数周,而非数年[2]。如果新工艺导致杂质谱或稳定性变化,FDA可能要求额外的数据,如加速稳定性测试或毒性评估,但仍无需重复疗效试验,除非有证据显示潜在差异(如新杂质超过许可阈值)[3]。
-在实际操作中,这一路径大大降低了成本和时间:ANDA审批平均需10-15个月,费用远低于NDA的数亿美元和数年周期。新制药方式的低廉性往往源于规模化生产或工艺创新,但FDA要求申请者提交化学、制造和控制(CMC)信息,证明新工艺符合良好生产规范(cGMP)。例如,阿司匹林或扑热息痛等经典药物,其多种仿制药版本均通过此路径上市,而无需重新验证其止痛或抗炎疗效[4]。然而,如果新方式涉及重大变更(如从化学合成转为生物合成,尽管分子式相同),FDA可能视其为“混合型”申请,需要桥接研究来确认等效性。
-如果生物等效性未能证明(例如,新工艺导致生物利用度差异>20%),申请将被拒,或需额外桥接试验,这可能增加延误和成本。不过上市后监测(post-marketing surveillance)仍适用,包括不良事件报告(FAERS系统),以捕捉任何罕见差异。
-U.S. Food and Drug Administration. (2023). Frequently Asked Questions about Generic Drugs. Retrieved from https://www.fda.gov/drugs/generic-drugs/frequently-asked-questions-about-generic-drugs ↩︎
-U.S. Food and Drug Administration. (2019). Bioequivalence Studies with Pharmacokinetic Endpoints for Drugs Submitted Under an ANDA. Guidance for Industry. Retrieved from https://www.fda.gov/regulatory-information/search-fda-guidance-documents/bioequivalence-studies-pharmacokinetic-endpoints-drugs-submitted-under-abbreviated-new-drug ↩︎
-U.S. Food and Drug Administration. (2020). Changes to an Approved NDA or ANDA. Guidance for Industry. Retrieved from https://www.fda.gov/regulatory-information/search-fda-guidance-documents/changes-approved-nda-or-anda ↩︎
-U.S. Food and Drug Administration. (2023). Approved Drug Products with Therapeutic Equivalence Evaluations (Orange Book). Retrieved from https://www.fda.gov/drugs/drug-approvals-and-databases/approved-drug-products-therapeutic-equivalence-evaluations-orange-book ↩︎
-open System |
编译器认为存在两个相同的 CopyTo 重载无法区分。但查阅文档发现,Vector<T> 的 CopyTo 方法实际上只有一个匹配的重载(接受 Span<T>),这似乎矛盾。
这是因为 F# 编译器处理泛型方法重载的方式:
+Vector<T> 可能实现了多个接口,导致编译器看到两个签名相同的 CopyTo 方法(例如通过不同接口继承)。仅我所知的一种解决方案是通过添加扩展方法显式指引编译器:
+type Vector<'T> with |
这种方法通过创建具体的类型路径,帮助编译器绕过复杂的重载解析逻辑。
+学艺不精,不知道这是不是语言设计的差异,可能 F# 倾向于要求更明确的类型信息以避免意外行为?或许当泛型类型继承多个接口时,有没有可能出现在具体类型中不易察觉的隐式重载冲突?
+在FDA监管的药物研发、临床试验和上市流程中,当一个已上市药物(通常指创新药,通过新药申请NDA获得批准)出现一种更低廉的制药方式,但其活性成分的分子式保持完全相同时,这种情况本质上涉及仿制药(generic drug)的开发或工艺优化申请,而非从零开始的全新药物研发。简单来说,不需要重新进行完整的临床试验(即I-III期的大规模人体试验),但必须通过简化的监管路径证明新制药方式生产的药物与原药在质量、安全性和疗效上等效。
+首先,理解核心前提:分子式完全相同意味着活性成分(active pharmaceutical ingredient, API)是相同的化学实体,例如从专利保护的原研药转向无专利保护的仿制药生产。这不同于生物制品(如单克隆抗体)的生物类似药,后者可能需要更多比较性临床试验。FDA将此类药物归类为“仿制药”,其审批路径是缩减新药申请(Abbreviated New Drug Application, ANDA),而非完整的NDA。ANDA的目的是避免重复证明已知的安全性和有效性数据,这些数据已在原药的NDA中确立[1]。
+FDA的《仿制药用户费用法案》(GDUFA)和相关指南明确规定,对于相同分子式的药物,新制药方式(如改进的合成路线、晶型优化或更高效的提取工艺)只需证明“生物等效性”(bioequivalence),而非全面临床试验。生物等效性研究通常包括:1)体外溶出测试(in vitro dissolution),评估药物在模拟生理条件下的释放速率;2)人体药代动力学研究(pharmacokinetic studies),在健康志愿者中比较新药与原药的吸收、分布、代谢和排泄曲线(如AUC和Cmax参数的90%置信区间在80%-125%内)。这些研究规模小,通常只需24-36名受试者,持续数周,而非数年[2]。如果新工艺导致杂质谱或稳定性变化,FDA可能要求额外的数据,如加速稳定性测试或毒性评估,但仍无需重复疗效试验,除非有证据显示潜在差异(如新杂质超过许可阈值)[3]。
+在实际操作中,这一路径大大降低了成本和时间:ANDA审批平均需10-15个月,费用远低于NDA的数亿美元和数年周期。新制药方式的低廉性往往源于规模化生产或工艺创新,但FDA要求申请者提交化学、制造和控制(CMC)信息,证明新工艺符合良好生产规范(cGMP)。例如,阿司匹林或扑热息痛等经典药物,其多种仿制药版本均通过此路径上市,而无需重新验证其止痛或抗炎疗效[4]。然而,如果新方式涉及重大变更(如从化学合成转为生物合成,尽管分子式相同),FDA可能视其为“混合型”申请,需要桥接研究来确认等效性。
+如果生物等效性未能证明(例如,新工艺导致生物利用度差异>20%),申请将被拒,或需额外桥接试验,这可能增加延误和成本。不过上市后监测(post-marketing surveillance)仍适用,包括不良事件报告(FAERS系统),以捕捉任何罕见差异。
+U.S. Food and Drug Administration. (2023). Frequently Asked Questions about Generic Drugs. Retrieved from https://www.fda.gov/drugs/generic-drugs/frequently-asked-questions-about-generic-drugs ↩︎
+U.S. Food and Drug Administration. (2019). Bioequivalence Studies with Pharmacokinetic Endpoints for Drugs Submitted Under an ANDA. Guidance for Industry. Retrieved from https://www.fda.gov/regulatory-information/search-fda-guidance-documents/bioequivalence-studies-pharmacokinetic-endpoints-drugs-submitted-under-abbreviated-new-drug ↩︎
+U.S. Food and Drug Administration. (2020). Changes to an Approved NDA or ANDA. Guidance for Industry. Retrieved from https://www.fda.gov/regulatory-information/search-fda-guidance-documents/changes-approved-nda-or-anda ↩︎
+U.S. Food and Drug Administration. (2023). Approved Drug Products with Therapeutic Equivalence Evaluations (Orange Book). Retrieved from https://www.fda.gov/drugs/drug-approvals-and-databases/approved-drug-products-therapeutic-equivalence-evaluations-orange-book ↩︎
+G⁺ 细菌的细胞壁外层主要由 厚度约 20–80 nm 的肽聚糖(peptidoglycan) 组成,这层结构密集且富含交联的糖肽链,能够在脱色步骤中形成物理屏障,阻止酒精/丙酮的渗透,从而保留结晶紫‑碘复合物。
-与 G⁻ 细菌不同,G⁺ 细菌没有外膜(outer membrane)和脂多糖(LPS)层。外膜的缺失使得脱色剂难以进入细胞内部,进一步加强了紫色的保留。
-某些 G⁺ 细菌在细胞壁上表达的酶(如酸性磷酸酶)可与染料形成更为稳定的复合物,进一步提升染色的持久性。
-在呼吸道痰涂片中出现 “有荚膜的双球菌(capsulated diplococci)”,最典型的病原体是 肺炎链球菌(Streptococcus pneumoniae)。它是一种 革兰氏阳性(G⁺)、α‑hemolytic、嗜血清素 的双球菌,表面包裹有厚厚的多糖荚膜,正是该荚膜赋予它在显微镜下呈现明显的荧光或“胶状”外观。
-在痰涂片或血培养的显微镜检查中,观察到 G⁺ 双球菌提示肺炎链球菌感染的可能性较大,帮助临床医生在培养结果出来前就能启动经验性抗生素治疗(如 β‑lactam 类药物)。
-肺炎链球菌的荚膜多型性(> 90 种血清型)是疫苗设计的核心依据,同时也影响抗体介导的吞噬作用。了解其 G⁺ 特性有助于解释为何某些血清型(如 3 型)在免疫逃逸方面更具优势。
-]]>G⁺ 细菌的细胞壁外层主要由 厚度约 20–80 nm 的肽聚糖(peptidoglycan) 组成,这层结构密集且富含交联的糖肽链,能够在脱色步骤中形成物理屏障,阻止酒精/丙酮的渗透,从而保留结晶紫‑碘复合物。
+与 G⁻ 细菌不同,G⁺ 细菌没有外膜(outer membrane)和脂多糖(LPS)层。外膜的缺失使得脱色剂难以进入细胞内部,进一步加强了紫色的保留。
+某些 G⁺ 细菌在细胞壁上表达的酶(如酸性磷酸酶)可与染料形成更为稳定的复合物,进一步提升染色的持久性。
+在呼吸道痰涂片中出现 “有荚膜的双球菌(capsulated diplococci)”,最典型的病原体是 肺炎链球菌(Streptococcus pneumoniae)。它是一种 革兰氏阳性(G⁺)、α‑hemolytic、嗜血清素 的双球菌,表面包裹有厚厚的多糖荚膜,正是该荚膜赋予它在显微镜下呈现明显的荧光或“胶状”外观。
+在痰涂片或血培养的显微镜检查中,观察到 G⁺ 双球菌提示肺炎链球菌感染的可能性较大,帮助临床医生在培养结果出来前就能启动经验性抗生素治疗(如 β‑lactam 类药物)。
+肺炎链球菌的荚膜多型性(> 90 种血清型)是疫苗设计的核心依据,同时也影响抗体介导的吞噬作用。了解其 G⁺ 特性有助于解释为何某些血清型(如 3 型)在免疫逃逸方面更具优势。
+]]>正确顺序:
location = /api/auth/me { |
这里的顺序很重要。Nginx 匹配规则是:精确匹配 = 优先,然后是前缀匹配 ^~,然后是正则匹配,最后是普通前缀匹配。^~ 表示一旦匹配成功就不再检查正则。
let int_pow base exponent = |
其中 int_math_int_pow() 由 C 实现:
external int_math_int_pow : int -> int -> int = "Base_int_math_int_pow_stub" [@@noalloc] |
其实现在 src/int_math_stubs.c 中:
+static int64_t int_pow(int64_t base, int64_t exponent) { |
这是一个四分快速幂的实现,它是二分快速幂的一种变种。二分快速幂将指数分为两部分,然后递归地计算每一部分的结果。
+而四分快速幂将指数分为四部分,然后递归地计算每一部分的结果。
+这里通过将指数右移2位(相当于除以4)和使用位与操作来实现,进一步减少了乘法次数。
主要步骤:
+++mul[1]是基数和mul[3]的乘积,mul[2]是mul[1]的平方,mul[3]是mul[2]和基数的乘积
+
++这样做的目的是为了选择正确的乘数,因为指数被分解为4的倍数
+
这个实现的优点是它可以在对数时间内计算出幂运算,而且每次循环只需要4次乘法。这比标准的二分快速幂算法需要的乘法次数更少。
]]>zbg (short for Zero Bullshit Git) is a CLI tool for using git efficiently.let int_pow base exponent = |
其中 int_math_int_pow() 由 C 实现:
external int_math_int_pow : int -> int -> int = "Base_int_math_int_pow_stub" [@@noalloc] |
其实现在 src/int_math_stubs.c 中:
-static int64_t int_pow(int64_t base, int64_t exponent) { |
这是一个四分快速幂的实现,它是二分快速幂的一种变种。二分快速幂将指数分为两部分,然后递归地计算每一部分的结果。
-而四分快速幂将指数分为四部分,然后递归地计算每一部分的结果。
-这里通过将指数右移2位(相当于除以4)和使用位与操作来实现,进一步减少了乘法次数。
主要步骤:
---mul[1]是基数和mul[3]的乘积,mul[2]是mul[1]的平方,mul[3]是mul[2]和基数的乘积
-
--这样做的目的是为了选择正确的乘数,因为指数被分解为4的倍数
-
这个实现的优点是它可以在对数时间内计算出幂运算,而且每次循环只需要4次乘法。这比标准的二分快速幂算法需要的乘法次数更少。
]]>Ten years prior to presentation, he underwent surgical decompression for syringomyelia.
-A magnetic resonance imaging (MRI) scan of his cervical and thoracic spine performed 2 years prior to presentation revealed a recurrent syrinx extending from Cl C1 to T11, which was not resected because it did not cause symptoms at that time.
-On physical examination, he had mild tenderness to palpation and reduced range of motion of the left shoulder with abduction and flexion limited to 120° (normal range of motion, 180°).
-The left scapular muscles were atrophic, and pain and temperature sensation were reduced in his proximal left arm, and dorsal aspect of his left shoulder.
-His complete blood cell count, serum glucose levels, C-reactive protein levels, and erythrocyte sedimentation rate were normal.
-Results of tests for rheumatoid factor and antinuclear antibody were negative.
-Left shoulder radiograph showed complete absence of the left humeral head and a well-demarcated smooth osseous margin of the proximal humerus with associated soft tissue swelling and periarticular calcification.
-A chest radiograph taken 2 years prior revealed a normal left shoulder joint. The patient was hospitalized for further evaluation and treatment.
-这里提到了一种罕见的进展性疾病, 叫Charcot肩, 是一种神经性关节病变,特点是关节迅速被破坏和相关软组织肿胀。患者通常表现为肩部逐渐增大的肿胀,可能伴有疼痛或无痛,肩部无力和活动范围减少。
-大约80%的Charcot肩患者有脊髓空洞症, 表现为脊髓中的液体充满腔体
Ten years prior to presentation, he underwent surgical decompression for syringomyelia.
+A magnetic resonance imaging (MRI) scan of his cervical and thoracic spine performed 2 years prior to presentation revealed a recurrent syrinx extending from Cl C1 to T11, which was not resected because it did not cause symptoms at that time.
+On physical examination, he had mild tenderness to palpation and reduced range of motion of the left shoulder with abduction and flexion limited to 120° (normal range of motion, 180°).
+The left scapular muscles were atrophic, and pain and temperature sensation were reduced in his proximal left arm, and dorsal aspect of his left shoulder.
+His complete blood cell count, serum glucose levels, C-reactive protein levels, and erythrocyte sedimentation rate were normal.
+Results of tests for rheumatoid factor and antinuclear antibody were negative.
+Left shoulder radiograph showed complete absence of the left humeral head and a well-demarcated smooth osseous margin of the proximal humerus with associated soft tissue swelling and periarticular calcification.
+A chest radiograph taken 2 years prior revealed a normal left shoulder joint. The patient was hospitalized for further evaluation and treatment.
+这里提到了一种罕见的进展性疾病, 叫Charcot肩, 是一种神经性关节病变,特点是关节迅速被破坏和相关软组织肿胀。患者通常表现为肩部逐渐增大的肿胀,可能伴有疼痛或无痛,肩部无力和活动范围减少。
+大约80%的Charcot肩患者有脊髓空洞症, 表现为脊髓中的液体充满腔体
... |
编译错误:
-error: lifetime may not live long enough |
这是因为 handlers 里面的闭包捕获了一个引用,并且尝试返回一个包含该引用的值导致的。
细说就是:闭包内部使用了 self.clone() 来获取一个新的实例,然后在异步块中返回一个 JSON 对象,这个 JSON 对象依赖于 self.tree() 的结果。因为闭包捕获了 self 的引用,所以它必须保证 self 在闭包执行完毕后仍然有效。
解决这个问题的思路是:确保闭包中的所有引用都在闭包执行完毕之前就不再被使用。
-就是说,要将闭包的作用域限制在一个更短的生命周期内,或者使用其他方式来避免闭包捕获长期存在的引用:
|
... |
编译错误:
+error: lifetime may not live long enough |
这是因为 handlers 里面的闭包捕获了一个引用,并且尝试返回一个包含该引用的值导致的。
细说就是:闭包内部使用了 self.clone() 来获取一个新的实例,然后在异步块中返回一个 JSON 对象,这个 JSON 对象依赖于 self.tree() 的结果。因为闭包捕获了 self 的引用,所以它必须保证 self 在闭包执行完毕后仍然有效。
解决这个问题的思路是:确保闭包中的所有引用都在闭包执行完毕之前就不再被使用。
+就是说,要将闭包的作用域限制在一个更短的生命周期内,或者使用其他方式来避免闭包捕获长期存在的引用:
|
4. 调节脑-肠轴功能的药物(精神类药物)
对于伴有明显焦虑、抑郁或常规治疗无效的顽固性腹痛患者,医生可能会考虑使用低剂量的抗抑郁药。
-补充特定的益生菌菌株(如某些双歧杆菌和乳酸杆菌)有助于恢复肠道微生态平衡,改善腹胀和总体症状。不同菌株效果各异,需根据产品说明和医生建议选用。
-]]> -libdecor-gtk 时,可能会遇到以下警告:
-libdecor-gtk-WARNING: Failed to initialize GTK |
这是因为 VSCode 默认使用 X11,可以使用以下参数启动 VSCode:
-code --enable-features=UseOzonePlatform --ozone-platform=wayland |
我使用 Pop!_OS,此发行版使用 EFI 启动,故而可以在 /boot/efi/loader/loader.conf 中加上:
options quiet splash amdgpu.dcdebugmask=0x10 amdgpu.sg_display=0 |
对于其他使用 EFI 或 GRUB 启动的发行版也可以添加类似的参数尝试尝试。
-]]>class-validator 和 class-transformer 这两个库提供了以声明式的方式对 DTO 进行验证和转换。然而在处理布尔值时,如果在全局验证管道或仅仅是在局部同时开启了 enableImplicitConversion,可能会引入一个极其隐蔽且违反直觉的 Bug:前端传过来的布尔值恒为 true。
-假设正在开发一个电子商务平台的 API,需要实现一个产品列表的筛选功能。希望能够根据产品是否有库存 (hasStock)、是否为特色产品 (isFeatured) 等布尔条件进行筛选。
前端发出的请求 URL 可能如下所示: /products?filter[hasStock]=true&filter[isFeatured]=false
在 NestJS 后端,首先会在 main.ts 中配置一个全局的 ValidationPipe,以自动处理 DTO 的验证和转换。为了方便,通常会启用 enableImplicitConversion,期望它能自动将 URL 查询参数中的字符串(如 "123", "true")转换为 DTO 中定义的类型(number, boolean):
// main.ts |
接着,定义一个 ProductFilterDto 来接收这些筛选条件。
一个看似正确的 DTO 定义:
-// product-filter.dto.ts |
在控制器中使用这个 DTO:
-// products.controller.ts |
当请求 .../products?filter[isFeatured]=false 到达时,本来期望在 find 方法中得到的 filter.isFeatured 的值是布尔类型的 false。然而,控制台输出的结果却令人意外:{ isFeatured: true }
这个问题的根源在于 class-transformer 内部的转换执行顺序,以及 JavaScript 中 Boolean 函数的类型转换行为。
所有通过 URL 查询参数传递的值,其本质都是字符串。当 NestJS 接收到请求时,filter.isFeatured 的原始值是字符串 "false"。
ValidationPipe 启动 class-transformer 的转换流程。由于在全局管道中设置了 enableImplicitConversion: true,转换器会首先检查 DTO 属性的 TypeScript 类型。
class-transformer 看到 ProductFilterDto 中的 isFeatured 属性被声明为 boolean 类型。"false" 转换为布尔值。这个转换等同于执行 Boolean("false")。在 JavaScript 中,任何非空字符串(包括 "false")通过 Boolean() 构造函数转换后都会得到 true。true 值被作为该属性的转换结果。此时,即使尝试添加一个自定义的 @Transform 装饰器来手动处理这个问题,也为时已晚。
例如,定义一个 booleanTransformer:
// boolean-transformer.ts |
然后更新 dto:
-// product-filter.dto.ts (错误的尝试) |
流程会变成这样:
-Boolean("false") -> true。@Transform 装饰器执行:此时传递给 booleanTransformer 的 value 已经是上一步错误转换后的布尔值 true,而不是原始的字符串 "false"。转换函数无从下手。最终结果依然是 true。
any 绕过隐式转换要解决这个问题,核心在于阻止 class-transformer 进行那次错误的、优先的隐式转换,从而确保自定义 @Transform 函数能接收到最原始的字符串值。
最直接且侵入性最小的方法,是将 DTO 中相关属性的 TypeScript 类型从 boolean 改为 any。
修正后的 DTO 定义:
-// product-filter.dto.ts (正确的实现) |
这个改动虽然看起来放弃了 TypeScript 的类型检查,但在这个特定的场景下,它非常安全且有效。原因如下:
-class-transformer 看到属性类型是 any 时,它不知道该隐式转换成什么目标类型,因此会“跳过”这个属性的隐式转换步骤。@Transform 接管:如此一来,原始的字符串值("true" 或 "false")就能原封不动地传递给 robustBooleanTransformer 函数。该函数现在可以正确地将字符串转换为期望的布尔值。@IsBoolean 守门:在自定义转换完成后,@IsBoolean() 装饰器会进行最后的验证,确保存入 DTO 的最终值必须是 true 或 false。这保证了在业务逻辑中,该属性的类型是绝对安全的。好用,爱用。
+补充特定的益生菌菌株(如某些双歧杆菌和乳酸杆菌)有助于恢复肠道微生态平衡,改善腹胀和总体症状。不同菌株效果各异,需根据产品说明和医生建议选用。
+]]>libdecor-gtk 时,可能会遇到以下警告:
+libdecor-gtk-WARNING: Failed to initialize GTK |
这是因为 VSCode 默认使用 X11,可以使用以下参数启动 VSCode:
+code --enable-features=UseOzonePlatform --ozone-platform=wayland |
我使用 Pop!_OS,此发行版使用 EFI 启动,故而可以在 /boot/efi/loader/loader.conf 中加上:
options quiet splash amdgpu.dcdebugmask=0x10 amdgpu.sg_display=0 |
对于其他使用 EFI 或 GRUB 启动的发行版也可以添加类似的参数尝试尝试。
]]>class-validator 和 class-transformer 这两个库提供了以声明式的方式对 DTO 进行验证和转换。然而在处理布尔值时,如果在全局验证管道或仅仅是在局部同时开启了 enableImplicitConversion,可能会引入一个极其隐蔽且违反直觉的 Bug:前端传过来的布尔值恒为 true。
+假设正在开发一个电子商务平台的 API,需要实现一个产品列表的筛选功能。希望能够根据产品是否有库存 (hasStock)、是否为特色产品 (isFeatured) 等布尔条件进行筛选。
前端发出的请求 URL 可能如下所示: /products?filter[hasStock]=true&filter[isFeatured]=false
在 NestJS 后端,首先会在 main.ts 中配置一个全局的 ValidationPipe,以自动处理 DTO 的验证和转换。为了方便,通常会启用 enableImplicitConversion,期望它能自动将 URL 查询参数中的字符串(如 "123", "true")转换为 DTO 中定义的类型(number, boolean):
// main.ts |
接着,定义一个 ProductFilterDto 来接收这些筛选条件。
一个看似正确的 DTO 定义:
+// product-filter.dto.ts |
在控制器中使用这个 DTO:
+// products.controller.ts |
当请求 .../products?filter[isFeatured]=false 到达时,本来期望在 find 方法中得到的 filter.isFeatured 的值是布尔类型的 false。然而,控制台输出的结果却令人意外:{ isFeatured: true }
这个问题的根源在于 class-transformer 内部的转换执行顺序,以及 JavaScript 中 Boolean 函数的类型转换行为。
所有通过 URL 查询参数传递的值,其本质都是字符串。当 NestJS 接收到请求时,filter.isFeatured 的原始值是字符串 "false"。
ValidationPipe 启动 class-transformer 的转换流程。由于在全局管道中设置了 enableImplicitConversion: true,转换器会首先检查 DTO 属性的 TypeScript 类型。
class-transformer 看到 ProductFilterDto 中的 isFeatured 属性被声明为 boolean 类型。"false" 转换为布尔值。这个转换等同于执行 Boolean("false")。在 JavaScript 中,任何非空字符串(包括 "false")通过 Boolean() 构造函数转换后都会得到 true。true 值被作为该属性的转换结果。此时,即使尝试添加一个自定义的 @Transform 装饰器来手动处理这个问题,也为时已晚。
例如,定义一个 booleanTransformer:
// boolean-transformer.ts |
然后更新 dto:
+// product-filter.dto.ts (错误的尝试) |
流程会变成这样:
+Boolean("false") -> true。@Transform 装饰器执行:此时传递给 booleanTransformer 的 value 已经是上一步错误转换后的布尔值 true,而不是原始的字符串 "false"。转换函数无从下手。最终结果依然是 true。
any 绕过隐式转换要解决这个问题,核心在于阻止 class-transformer 进行那次错误的、优先的隐式转换,从而确保自定义 @Transform 函数能接收到最原始的字符串值。
最直接且侵入性最小的方法,是将 DTO 中相关属性的 TypeScript 类型从 boolean 改为 any。
修正后的 DTO 定义:
+// product-filter.dto.ts (正确的实现) |
这个改动虽然看起来放弃了 TypeScript 的类型检查,但在这个特定的场景下,它非常安全且有效。原因如下:
+class-transformer 看到属性类型是 any 时,它不知道该隐式转换成什么目标类型,因此会“跳过”这个属性的隐式转换步骤。@Transform 接管:如此一来,原始的字符串值("true" 或 "false")就能原封不动地传递给 robustBooleanTransformer 函数。该函数现在可以正确地将字符串转换为期望的布尔值。@IsBoolean 守门:在自定义转换完成后,@IsBoolean() 装饰器会进行最后的验证,确保存入 DTO 的最终值必须是 true 或 false。这保证了在业务逻辑中,该属性的类型是绝对安全的。好用,爱用。
]]>.m2/settings.xml. You can however set the :proxy config either in shadow-cljs.edn directly or ~/.shadow-cljs/config.edn.
+
+shadow-cljs.edn:
+{:source-paths ["src/main" |
.m2/settings.xml. You can however set the :proxy config either in shadow-cljs.edn directly or ~/.shadow-cljs/config.edn.
-
-shadow-cljs.edn:
-{:source-paths ["src/main" |
时光对谁都不温柔,愿意对我温柔的,只有身边陪我一起迎接时光洗礼的人。
-宇宙中也不会有什么声音, 视觉上再震撼的毁灭也只是发生在沉默之中。
-一切重新沉寂下来。
-]]>时光对谁都不温柔,愿意对我温柔的,只有身边陪我一起迎接时光洗礼的人。
+宇宙中也不会有什么声音, 视觉上再震撼的毁灭也只是发生在沉默之中。
+一切重新沉寂下来。
+]]>那在这之前呢?
在这之前我刚吃完一碗辣椒炒肉,
香
-]]> -衣服买大了,他们走路好急,地铁上只有老人没看手机,天怎么黑那么快是我起晚了吗,那个蹦蹦跳跳的女孩耳机里在听什么歌,我还在原地吗,我要再等等吗。
-家就像厚酒之后突然明晰的想象,时间不语,只是沉默,我沉默地走进时间,看着我和你的年龄相差越来越小。
-这雨天,世界都温柔的可以掐出水来。
]]>虽然我早已不强求世界上有这么一个人,
但我会一直等待,甚至期待你的到来。
我叫韩暮秋,幸会。
+]]> +衣服买大了,他们走路好急,地铁上只有老人没看手机,天怎么黑那么快是我起晚了吗,那个蹦蹦跳跳的女孩耳机里在听什么歌,我还在原地吗,我要再等等吗。
+家就像厚酒之后突然明晰的想象,时间不语,只是沉默,我沉默地走进时间,看着我和你的年龄相差越来越小。
+这雨天,世界都温柔的可以掐出水来。
]]>时间会带走了一个人,也带走了他的呼吸,他的声音,他掌心的温度。但似乎又留下了些什么
-光的颗粒在空气里浮动,在记忆里游走,她闭上眼睛,光从睫毛上滑过,像许多个早晨,像许多个傍晚,像她们再次相遇的无数个灿然的瞬间。她在其中走走停停,像一粒微尘,又像一颗星。
+时间会带走了一个人,也带走了他的呼吸,他的声音,他掌心的温度。但似乎又留下了些什么
+光的颗粒在空气里浮动,在记忆里游走,她闭上眼睛,光从睫毛上滑过,像许多个早晨,像许多个傍晚,像她们再次相遇的无数个灿然的瞬间。她在其中走走停停,像一粒微尘,又像一颗星。
]]>早上七点。
太阳完全绽放的光芒照亮了这个欣欣向荣的世界,有山、有海,有自由。
-]]> -世界很大,大到容纳下云海山川与深海,一定要去看看所有的色彩。世界也很小,小到只能让我一个人存在,原地转一圈,就足以填补了人生所有的空白。
我的家人太早回归了群星,而我还贪恋着人间烟火。
息止安所。
-]]> -“拍了啊,倒数,三、二、一……茄子!”
咔擦,画面定格,幸福定格,大家终于从苦难里彻底毕业了。
+]]> +临床诊断房颤需要记录到典型心律,再由医生结合病史确认。2024 年欧洲房颤指南把房颤诊断、卒中预防、症状控制和危险因素管理放在同一个长期管理框架中[1]。
+一张常规十二导联心电图首先观察三件事:有没有规律出现的 P 波;相邻 QRS 波群之间的 R-R 间期是否长短不一;QRS 波群是否增宽。三个特征需要一起判断。单独看到心率快、一次 R-R 间期变化,或者某个导联中的 P 波不清楚,都不足以完成房颤诊断。
+窦性心律中,心房由窦房结发出有序电活动。每次心室激动前,心电图通常可以看到一个形态相对稳定的 P 波。P 波代表心房去极化,随后电活动经过房室结传向心室,形成 QRS 波群。
+房颤时,心房电活动快速而无序,不能形成一次有效的整体收缩。心电图上常见的表现是找不到持续、规则、形态稳定的 P 波,QRS 波群之间的基线出现细小而不规则的波动。不同导联中的基线波动清晰度可能不同,肌肉震颤和电极接触不良也可能制造类似干扰。
+因此,“没有看到 P 波”不能机械地等同于房颤。需要把纸速、导联、基线质量和 R-R 间期一起纳入判断。
+房颤的另一个核心特征是心室节律不规则。由于房室结接收到的心房冲动没有固定规律,传到心室的冲动间隔会发生变化,表现为 R-R 间期长短不一,而且通常不存在可重复的规律。
+这和呼吸性窦性心律不齐不同。后者的 R-R 间期变化往往与呼吸周期有关,仍然可以找到规律的 P 波。房性早搏、室性早搏、房扑伴不规则传导和部分多源性房性心动过速,也可能造成节律不齐,需要结合完整心电图鉴别。
+心率是平均值,不能代替节律判断。一次记录显示 116 次/分,只能说明这段记录中的平均心室率偏快;它不能单独证明房颤,也不能单独判断症状严重程度。
+QRS 波群反映心室去极化。若 QRS 时限相对较窄,通常说明这次心室激动主要沿正常或接近正常的传导路径下传;若 QRS 明显增宽,则需要考虑束支传导阻滞、室内传导延迟、预激或室性心律等情况。
+房颤可以伴窄 QRS,也可以伴宽 QRS。快速房颤伴原有束支阻滞、差异性传导或预激时,QRS 可能增宽。因此,窄 QRS 只能说明当前记录中的室内传导没有明显增宽,不能推出“不会发生心脏骤停”,也不能替代对卒中、心衰和基础心脏病的评估。
+下面的图是教学示意,不是任何患者原始心电图的逐点重建。点击按钮后,可以分别突出 P 波、R-R 间期和 QRS 波群。
+教学示意|不代表任何患者的原始心电图
房扑也可能造成心房活动异常和心室节律不齐,但其心房电活动常呈现较规则的锯齿样扑动波,尤其在下壁导联中更容易观察到。房颤的基线活动通常更加无序,R-R 间期也更不规则。不过,真实心电图可能受到心率、房室传导比例、药物、导联质量和合并心律失常影响,不能只凭一小段波形截图下结论。
+智能手表和手环可以帮助发现异常节律,但“设备提示”与“临床确诊”不是同一件事。Apple Heart Study 纳入 419,297 名参与者;研究结果显示,设备提示具有筛查价值,但提示本身不等于确诊[2]。
+具有单导联心电图功能的设备,能够提供比单纯脉搏波更接近心电信号的记录。研究显示,单导联设备在部分心律识别任务中有帮助,但对不同类型的室上性心动过速,判读准确度仍低于标准十二导联心电图[3]。
+如果设备反复提示可能存在房颤,应保存原始记录,记录发生时间、持续时间和伴随症状,并到心内科接受标准心电图或动态心电图评估。不要依据手表提示自行开始抗凝,也不要因为一次“未发现房颤”就认为以后不会发生房颤。
+心电图回答的是“这段时间有没有记录到怎样的心律”。它不能单独回答患者长期卒中风险、出血风险、心脏结构和诱发因素。
+确诊或高度怀疑房颤后,医生还需要结合年龄、既往卒中或短暂性脑缺血发作、高血压、糖尿病、心力衰竭、血管疾病、肾功能、贫血、甲状腺功能和用药情况,判断后续检查与治疗方向。抗凝、控制心率、节律控制和危险因素管理需要放在同一套决策中,不能只盯着心率数字。
+如果同时出现单侧肢体无力、口角歪斜、言语含糊、突发视物异常、持续胸痛、晕厥或严重呼吸困难,应立即急诊处理。即使症状很快缓解,也不能排除短暂性脑缺血发作或其他急症。
+房颤心电图的识别可以从三个问题开始:有没有规则 P 波,R-R 间期是否绝对不规则,QRS 波群是否增宽。最有价值的判断来自这些特征的组合,而不是某一个数字或某一个设备提示。
+心电图确认的是当时记录到的电活动。患者是否需要抗凝、控制心率、恢复节律或进一步检查,还要结合卒中风险、出血风险、心脏结构和基础疾病综合决定。
+Van Gelder IC, et al. 2024 ESC Guidelines for the management of atrial fibrillation developed in collaboration with the EACTS. European Heart Journal. 2024;45(36):3314-3414. PMID: 39210723. DOI: 10.1093/eurheartj/ehae176. ↩︎
+Perez MV, et al. Large-Scale Assessment of a Smartwatch to Identify Atrial Fibrillation. New England Journal of Medicine. 2019;381:1909-1917. PMID: 31722151. DOI: 10.1056/NEJMoa1901183. ↩︎
+Vukadinovic D, et al. Diagnostic accuracy of Apple Watch Series 6 recorded single-lead ECGs for identifying supraventricular tachyarrhythmias: a comparative analysis with invasive electrophysiological study. Europace. 2024. PMID: 37985539. ↩︎
+