- 博客(25)
- 收藏
- 关注
原创 CLR 这些年有啥变化吗?
如果你在 2002 年第一次接触 .NET Framework 1.0,那时候的 CLR(Common Language Runtime)还像个刚学走路的婴儿——只有简单的 JIT、垃圾回收、类型安全校验。### 从「托管」到「原生」:JIT 的进化早期的 CLR 用的是。如果你还在写 .NET Framework 时代的代码,强烈建议升级到 .NET 8+——同样的代码,在 CLR 新版本下能获得 2-5 倍的性能提升,这不是营销,而是 RyūJIT 和 GC 算法的实际效果。的 1024 连接限制。
2026-08-04 15:03:42
177
原创 Microservice Anti-patterns
查询时,可以使用CQRS模式,维护一个只读的聚合视图,避免同步调用链。服务A调用服务B,B调用C,C调用D……当链路中任一服务变慢,整个请求都会被阻塞,并且随着调用深度增加,故障概率呈指数级上升。这看似简单,却破坏了服务独立性——一个服务的schema变更会影响所有其他服务,且数据库成为性能瓶颈和单点故障。例如,一个“订单服务”负责订单创建、查询、状态变更,而不是拆分为“订单创建服务”、“订单查询服务”。与上帝服务相反,团队过度拆分,每个服务只负责一个极小的功能。服务A调用服务B,而服务B又回调服务A。
2026-08-03 14:35:15
198
原创 或许是领域建模的真相
它要求你:1. 把业务规则变成不可绕过的代码约束(私有字段、状态机、异常)2. 将领域模型与持久化模型彻底分离,保持业务代码纯净3. 用聚合边界平衡一致性与性能,用事件解决跨聚合的最终一致性4. 把建模当成持续重构的过程,而不是一次性的设计产物最后,我建议你忘掉那些华丽的术语。去读你的代码,找到那些“谁都能改”的公共字段,找到那些“什么都能干”的上帝服务,然后动手把它们拆掉、约束住。但真正的领域模型,回答的是“在这个系统里,什么操作是合法的”,而不是“现实世界长什么样”。,但领域里需要的是枚举状态机。
2026-08-03 14:34:07
222
原创 Java 泛型解析太痛苦?你可能需要一枚「蛋」
它让代码更安全、复用性更高,但当你试图在运行时获取泛型类型信息时,却常常陷入“类型擦除”的泥潭——就像面对一个坚硬的蛋壳,你敲不开它,看不到里面的内容。本文将深入剖析 Java 泛型解析的痛点,并介绍一种“蛋”一样的解决方案,它像一枚魔法蛋,能帮你轻松破壳而出,获取泛型的真实类型。这是因为匿名类继承自一个泛型父类(或接口),而子类在继承时会保留父类的泛型参数类型,这些信息被存储在字节码的。## 痛点场景:在运行时获取泛型参数在实际开发中,我们经常需要在运行时获取泛型类型,比如:- 创建泛型数组(如。
2026-07-30 16:51:40
157
原创 并发性能优化复盘
本文将通过一个真实案例的复盘,带你理解并发编程中的常见问题,并给出可落地的优化方案。## 问题背景:一个抢购系统的崩溃某天凌晨,我们的电商平台突然收到报警:抢购接口的响应时间从50ms飙升到5秒,大量请求超时。查看日志发现,数据库连接池耗尽,CPU使用率100%,系统几乎瘫痪。:乐观锁适用于低冲突场景,分段锁增加复杂性但提升性能,消息队列引入延迟但提高稳定性。:合理利用缓存减少数据库压力,用消息队列解耦,是应对高并发的经典模式。:从全局锁到分段锁,再到无锁编程,锁的粒度越细,并发性能越好。
2026-07-28 18:04:49
217
原创 代码复杂度的代价远比你想象得大
这是因为:- 修改一处逻辑可能影响多个分支- 测试用例数量随复杂度增长- 回归测试范围扩大## 用代码说话:复杂度的真实代价下面通过两个代码示例来直观感受复杂度的代价。## 什么是代码复杂度?:新成员理解高复杂度代码需要 1-2 周,简单代码只需 1-2 天## 总结代码复杂度不是抽象的概念,而是直接转化为实际的工程成本。:需要模拟 7-8 种不同场景才能覆盖所有路径更可怕的是,当业务需求变化时(比如增加新的支付方式),这段代码的修改成本极高:你需要在正确的位置插入新的分支,同时确保不影响现有逻辑。
2026-07-25 16:59:53
203
原创 .NET 搞 AI 不行?
# .NET 搞 AI 的真实能力### 1. 传统机器学习:ML.NETML.NET 是微软官方的机器学习框架,专为 .NET 开发者设计。### 3. 数据科学:.NET Interactive 和 DataFrame通过 .NET Interactive(Jupyter Notebook 的 .NET 版本),你可以用 C# 或 F# 进行数据探索和可视化。## 代码示例:用 ML.NET 做分类预测下面是一个经典鸢尾花分类的示例,展示 .NET 如何轻松完成机器学习任务。
2026-07-25 16:58:49
229
原创 15天学会AI应用开发(四)根据Token长度截断历史对话
无论是使用OpenAI的GPT模型、Claude还是其他大语言模型,每个模型都有固定的上下文窗口限制(如4096 token、8192 token等)。如果不加控制地累积历史对话,当总token数超过模型限制时,请求会被拒绝或截断,导致对话质量下降。## 基于Token长度的截断实现### 计算Token长度首先,我们需要一个函数来计算文本的token数。### 核心截断函数接下来,我们实现一个智能截断函数,它接收历史对话列表、最大token限制和系统提示,返回截断后的对话。对于其他模型,可以使用。
2026-07-24 18:47:34
214
原创 数据库查询优化器<1>查询重写 / 逻辑优化
,实现O(1)的查找,而原始子查询可能需要为每个外层行扫描内层表。表扫描时应用,先过滤城市为北京的客户,再与Order表连接,减少连接操作的数据量。—## 总结查询重写/逻辑优化是数据库查询优化器的基石,它通过一系列等价变换规则,将原始查询转换为更高效的逻辑形式。执行这段代码,你会发现两个查询结果一致,但重写后的执行过程中,Join操作的左侧数据量从2行减少到1行,效率更高。查询重写就是这样一个过程:它使用逻辑等价规则(如谓词下推、子查询展开、连接重排等),将查询转换为更优的代数形式,但保证结果相同。
2026-07-24 18:46:21
162
原创 .NET 生产环境调试实战指南
在生产环境中,.NET 应用程序可能会遇到性能瓶颈、内存泄漏、死锁或异常崩溃等问题。不同于开发环境,生产环境无法随意重启或附加调试器,因此掌握高效的调试技巧至关重要。本文将通过实际场景和代码示例,带你掌握生产环境下的调试核心方法。本文介绍了三种典型问题:内存泄漏、CPU 飙升和死锁,并提供了对应的调试工具和代码示例。## 二、常见问题场景与调试方法### 场景1:内存泄漏导致OOM(Out of Memory)#### 问题现象应用程序运行一段时间后,内存占用持续增长,最终抛出。状态,并检查其调用栈。
2026-07-23 16:39:27
170
原创 Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
对于上面的代码,调用 new Foo().Print() 会输出 0,调用 new Foo().Print() 会输出 0001-01-01T00:00:00,而调用 new Foo().Print() 则会输出 null。C# 的类型系统构建在 .NET 的类型系统之上,而众所周知 .NET 是一个有具现化泛型的类型系统的平台,意味着泛型参数不仅不会被擦除,还会根据泛型参数来分发甚至特化代码。对于 Brainfuck 源代码的解析,可以说是非常的简单,从左到右扫描一遍源代码就可以,这里就不详细说了。
2026-07-22 15:51:46
215
原创 下载Ollama并安装运行DeepSeek
逻辑推理等理工类问题。我是DeepSeek-R1,一个由深度求索公司开发的智能助手。你可以根据你的硬件情况选择,通常模型大小(参数量)越大,模型的理解和生成能力越强,但也会消耗更多的计算资源。目前deepseek-r1模型大小提供了7个选择:1.5b、7b、8b、14b、32b、70b、671b。下载文件大小不到200M,文件名为:Ollama-darwin.zip。这里Ollama默认给出的例子是下载/运行llama3.2大模型,我这里还是Intel-based的MAC,我这里选择macOS,点击下载。
2026-07-22 15:51:12
201
原创 从特征匹配到图像拼接
这并不是简单的按方向拼在一起,因为正确的单应性变换会反应真实镜头间的几何关系,图像的位置和大小都会发生改变。在图像 AB 分布进行画布填充时同步生成各自掩码,指导图像融合,可以理解为先分别生成两张已经对齐到同一画布上的图像,再根据掩码决定最终输出。首先要说明的是:这步和上一步并不是前后顺序关系,图像 A 并不是在已经包含 B 的画布上映射的,而是独立的,这和下一步融合有关。当参考图像复制或变换图像映射完成后,为其生成一组和画布尺寸相同的掩码,覆盖部分值为 1 ,反之为 0。
2026-07-21 15:15:58
255
原创 Normal 和 Fast 的值
如果我们直接设置UIScrollView的decelerationRate属性,系统始终会把设置的值调整为预定义的UIScrollViewDecelerationRateNormal或者UIScrollViewDecelerationRateFast。如果要设置的值比阈值大,那么就读入UIScrollViewDecelerationRateNormal,否则,读入UIScrollViewDecelerationRateFast。
2026-07-21 15:15:04
183
原创 ArithmeticGame.java
JOptionPane.showMessageDialog(this, "保存失败: " + ex.getMessage(), “错误”, JOptionPane.ERROR_MESSAGE);JOptionPane.showMessageDialog(this, "读取失败: " + ex.getMessage(), “错误”, JOptionPane.ERROR_MESSAGE);”, “提示”, JOptionPane.INFORMATION_MESSAGE);
2026-07-19 16:42:01
178
原创 Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
if (other.numerator == 0) throw new ArithmeticException(“除以零”);采用 CardLayout 实现三页切换(欢迎页 → 游戏页 → 结果页),避免多窗口跳转带来的状态同步问题。支持 + − × ÷ 四种运算,操作数涵盖整数、小数、分数。Fraction:封装分数的加减乘除与约分,支持带分数解析。四种难度梯度:简单 → 中等 → 困难 → 专家。分数类:支持加减乘除、约分、带分数/假分数转换。随机出题、按键提交、实时反馈、错题回顾。
2026-07-19 16:41:13
150
原创 tags 是给 play / task / handler / role 打上标记,执行 playbook 时可以: 只运行带指定标签的任务,跳过其他任务 排除某些标签任务不执行
ansible中关于tags的相关命令。
2026-07-18 15:22:41
217
原创 MemER 方法原理讲解
不要把机器人从开头到现在看到的所有画面都塞给模型,而是让一个高层视觉语言模型不断判断“现在该做哪个子任务”和“最近看到的哪些帧以后可能还要用”,再把这些被挑出来的关键帧作为长期视觉记忆喂回模型。一旦部署时低层策略卡顿、重试、失败恢复,历史分布就变了,模型更容易误判当前进度。keyframe_positions 是最近窗口中哪些帧值得保存,位置是 1-indexed,即 1 表示最近窗口第一帧,8 表示第八帧。prompt 文本会告诉模型前几张是“从完整历史中选出的重要帧”,后几张是“最近动作视频”。
2026-07-18 15:20:58
260
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅