- 博客(627)
- 资源 (4)
- 收藏
- 关注
原创 StarRocks 的技术版图:在分析、检索与流处理之间找到位置
一句话定位:StarRocks 是一个用 C++ 与 Java 构建的 MPP 分析型数据库,强项在于;它与 ClickHouse 在同一赛道正面竞争,与 Elasticsearch 在“检索 vs. 分析”的边界上互补,与 Apache Doris 同源分流,而与 Flink 则是上下游的协作搭档。
2026-10-21 11:26:41
343
原创 从 Sinatra 到 Puma:吃透 Ruby Web 轻量生态(附 Logstash JRuby 踩坑实录)
Ruby Rack 生态Java Servlet 生态角色说明Web 容器;Puma 定位更接近 Tomcat,WEBrick 更偏向轻量内置服务器Rack 规范Servlet 规范容器与应用之间的统一接口契约JAX-RS 规范 / Jersey 实现轻量路由框架,专注请求分发与业务处理RailsSpring Boot + Spring MVC + JPA 全家桶全栈重型 Web 框架,内置开发全链路能力。
2026-10-08 17:23:44
276
原创 深入 Ruby:return 退出规则完全指南
Ruby 的return看似简单,实则和代码块机制深度绑定,形成了独特的上下文捕获行为。理解这些规则,尤其是普通块与 Lambda 的差异、ensure 的交互、各类边界场景的例外,能帮你避开很多隐蔽的逻辑 bug。最后记住一句话:方法 return 退自身,块中 return 看定义;Lambda 退自己,Proc 退外层;ensure 永远跑,还能盖返回吞异常。
2026-10-08 15:04:03
292
原创 Ruby 多线程、GVL(GIL)与 Mutex 完全指南
Ruby 的多线程机制不是简单的“有 GVL 所以没用”,也不是“有 GVL 所以天然安全”。GVL 的存在让单 Ractor 内的多线程在 CPU 密集场景受限,但在 IO 密集场景依然有很高的价值;而它带来的线程安全错觉,才是最多开发者踩坑的地方。理解 GVL 的现代语义、竞态的触发条件,以及正确使用 Mutex 和条件变量做同步,才能写出真正健壮、高效的 Ruby 并发代码。最后记住一句话:GVL 是虚拟机的锁,不是你的业务锁;只要共享可变状态,就永远不要假设线程安全。
2026-10-08 13:16:46
421
原创 Ruby `require` 完全指南:从 `$LOAD_PATH` 到 `require_relative`
load "config.rb" load "config.rb" # 常量重复赋值警告,方法重复定义load是执行脚本,不是引入模块。require在$LOAD_PATH里找、只加载一次、自动补扩展名,用于 gem 和标准库;相对当前文件找,用于项目内文件;load每次都执行、不记录去重,但查找和扩展名补全机制与require相似,用于热重载;autoload懒加载常量,底层仍走require,现代项目推荐用 Zeitwerk 管理;理解$LOAD_PATH和,就理解了 Ruby 加载机制的全部。
2026-10-08 10:41:23
347
原创 Ruby 核心模块:Enumerable 与 Comparable 完全指南
我们用一个自定义的「团队类」演示,只需要实现eachclass Team@members = ["张三", "李四", "王五", "赵六"]end# 只需要实现这一个核心方法# 约定:无块时返回 Enumerator,有块时 yield 每个元素def eachendend# select 过滤,用 p 展示数据结构("张") }# => ["张三"]# map 转换#{name先生" }# => ["张三先生", "李四先生", "王五先生", "赵六先生"]
2026-10-07 16:56:56
230
原创 Ruby 方法访问控制权限:public / protected / private 完全指南
Ruby 的方法访问控制是面向对象封装思想的具体实现,核心在于「暴露必要的接口,隐藏内部实现」。理解三个权限的边界,尤其是 private 在 Ruby 2.7 前后的调用规则差异,能帮你写出更符合 Ruby 规范、封装更合理的代码。最后记住一句话:public 对外,protected 类内共享,private 仅限自身。
2026-10-05 18:04:14
183
原创 深入 Ruby:Block、Proc、Lambda 核心区别与最佳实践
写在参数列表末尾的&blockendBlock、Proc、Lambda 是 Ruby 代码块机制的三层形态:从最轻量化的依附式代码块,到对象化的 Proc,再到行为严谨的 Lambda,各自有不同的适用场景和行为特性。理解它们的核心区别,尤其是return行为的调用栈限制和参数校验的差异,你就能避开 Ruby 开发中绝大多数代码块相关的 bug,写出更优雅、更健壮的代码。最后记住一句话:Block 用来遍历,Proc 用来封装代码片段,Lambda 用来当函数回调。
2026-10-05 11:07:26
334
原创 Ruby 方法参数完全指南:默认值、可变参数与关键字参数
Ruby 的参数系统灵活但有严格的内在规则:默认值解决可选参数问题,解决不定长位置参数问题,关键字参数解决配置项的清晰性与安全性问题。理解了这些参数的本质和坑点,你就能写出更优雅、更健壮的 Ruby 方法,避开绝大多数隐蔽的参数 bug。最后记住一句话:默认值警惕可变对象,关键字参数优先于老式 Hash,参数顺序严格遵守从左到右规则。
2026-10-04 19:27:45
269
原创 深入理解 Ruby 运算符:本质、分类、坑点与重载实战
运算符重载是 Ruby 面向对象的强大特性,但要遵循语义一致的原则,不要滥用。我们以一个Moneyend# 加法:返回新的 Money 对象end# 减法end# 相等判断:比较金额other.is_a?end# 支持和数字比较enddef to_s#{@amount元"endendputs m1 + m2 # 150 元puts m1 - m2 # 50 元Ruby 中二元运算符大多是方法,可以重载;逻辑运算符、赋值、范围、三元表达式属于语法,不能重载。
2026-10-04 18:55:59
250
原创 深入 Ruby 数组初始化:大多数开发者踩过的共享引用陷阱
数组初始化的共享引用坑,本质上是 Ruby「一切皆对象引用」+「可变/不可变对象」两大特性共同作用的结果。它不是语言缺陷,而是需要开发者理解和注意的特性。只造一个对象,大家共用;每次都造新对象,各自独立。理解了这个原理,你不仅能避开数组的坑,还能举一反三,避开 Hash、嵌套结构等所有同类问题。
2026-10-02 11:08:56
282
原创 Ruby Symbol 完全使用指南
Symbol 是 Ruby 「优雅表达」的基石之一,它的核心价值是用最轻量的方式表达标识符语义。记住一句话就够:当你要表达「一个名字、一个标签、一个状态」的时候用 Symbol;当你要处理「一段文本内容」的时候用 String。
2026-10-02 10:27:25
257
原创 深入理解 Ruby 可变对象与不可变对象的原理、坑点与最佳实践
不可变对象(Immutable):对象创建之后,其内存中的数据和状态无法被修改。任何对它的操作都会返回一个全新的对象。可变对象(Mutable):对象创建之后,可以直接修改其内存中的数据,操作完成后对象本身发生变化,不会生成新对象。⚠️关键误区:变量赋值 ≠ 对象修改变量只是指向对象的“标签”,给变量重新赋值只是让标签指向另一个对象,并没有修改原来的对象。判断对象是否被修改,最可靠的方式是看object_idputs a.object_id # 输出某个固定的对象ID。
2026-09-30 17:03:34
236
原创 Python requests:raise_for_status() 与 4xx/5xx 异常层次详解
用来检查 HTTP 状态码,4xx/5xx 时抛出。默认不会因为 4xx/5xx 抛异常,它会正常返回Response对象,代码继续执行。4xx/5xx 属于HTTP 应用层错误,不是网络传输层异常。网络层异常(连接失败、超时)在时就抛出;HTTP 应用层异常需要主动触发。抛出异常后,如果没人捕获,调用链会中断;如果调用者捕获了,就可以读取e.response来做错误处理。实际项目中,建议在 API 客户端边界捕获它,并转换成业务层能理解的错误。
2026-09-12 12:02:39
198
原创 AI Agent 执行引擎选型指南:PowerShell / Bash 和 Python,边界与最佳实践
很多人总喜欢争论“哪个工具更好”,但工程上从来没有更好,只有更合适。Shell 是它的“手脚”,用来直接触碰操作系统,轻量、原生、可靠;Python 是它的“大脑扩展”,用来处理复杂问题、调用海量生态。只靠 Shell,Agent 做不了复杂事;全靠 Python,Agent 会变得臃肿、脆弱、环境依赖严重。理解各自的边界,在合适的层级用合适的工具,多引擎协同,才是生产级 Agent 的正确路线。
2026-09-11 22:30:26
241
原创 从 BASIC 到 PowerShell:命令行界面半个世纪的演进逻辑
我们每天在 Windows 里点开的那个黑窗口,从最早的 BASIC 提示符到 CMD,再到现在的 PowerShell,看似只是一行行命令的堆砌,背后其实是整整六十年个人计算机架构的演进史。很多人用了很多年也没分清:CMD 到底是不是 DOS?PowerShell 和 bash 有什么本质区别?为什么现在的 AI Agent 全都弃用 CMD 转向 PowerShell?本文顺着历史线把这件事彻底说透。
2026-09-11 22:11:20
196
原创 深入理解 pip install .:安装当前目录项目的正确姿势
把当前目录下的 Python 项目构建并安装到当前 Python 环境。代表当前目录;当前目录必须包含setup.py或setup.cfg;它会构建 wheel、安装项目本身及其依赖;开发时更推荐;安装依赖列表用;建议始终在虚拟环境中操作。理解了这个命令,你就能更从容地处理本地 Python 项目的安装、测试与部署。
2026-09-10 15:02:06
56
原创 Python 自带虚拟环境管理:venv完全指南
venv是标准库,无需安装。创建环境用。激活只是修改PATH,不是必须的。直接调用或也可以。依赖管理用。删除环境直接删目录,不要移动环境。把.venv/加入.gitignore。掌握venv之后,你的 Python 项目就有了干净、独立、可复现的运行环境。对于大多数日常开发场景,它已经足够好用,而且完全不需要第三方工具。
2026-09-10 14:43:17
232
原创 Python 协程与阻塞调用:为什么 time.sleep() 会卡死事件循环?
asyncio 是单线程事件循环 + 协作式调度,一个任务阻塞,整个 loop 都会停。等同步调用都会阻塞事件循环。async def并不自动等于非阻塞,关键看内部有没有让出控制权。或。CPU 密集任务应交给进程池,避免 GIL 限制。这不是语法上的“不允许”,而是 asyncio 的使用纪律。事件循环线程只应做非阻塞、快速的事;阻塞 I/O 交给线程池,CPU 密集交给进程池。遵守这条原则,你的 Python 协程才能真正发挥出高并发的威力。
2026-09-10 10:24:45
235
原创 Python asyncio 中 Task.cancel() 的作用与使用场景
cancel()用于在不再需要结果时,协作式地请求任务停止。它不会强制杀死协程,而是通过给协程一个清理和退出的机会。
2026-09-10 10:05:29
192
原创 深入浅出 Python asyncio.Event():协程间的“红绿灯”与广播通信
是一个异步事件对象,内部维护了一个布尔标志(默认为False等待—— 如果标志为False,当前协程挂起,直到标志变为True。触发—— 将标志设为True,并唤醒所有正在等待的协程。重置—— 将标志重置为False。此外,可查询当前状态。是异步编程工具箱中的一把瑞士军刀——小巧、实用,专为协程间信号通知而生。理解它的粘性特性和使用边界,能让你在构建复杂异步系统时更加得心应手。希望本文的示例和说明能帮助你快速上手,并在实际项目中灵活运用。
2026-09-09 17:05:49
48
原创 深入理解 Python asyncio.gather:协程、Future 与并发的艺术
之所以能同时接收协程对象和 Future 对象,是因为它在内部通过将所有入参统一转换成 Future 语义。传入协程对象:简洁直观,适合大多数场景传入 Task/Future:适合需要精细控制任务生命周期的场景混合传入:兼具两者优势理解了这个机制,你就能更好地驾驭 Python 异步编程,写出更健壮、更高效的并发代码。同时,也要留意gather在异常处理上的特性,根据实际需求选择合适的异常处理策略,或者在 Python 3.11+ 中考虑使用更现代的TaskGroup。
2026-09-09 16:51:01
91
原创 深入理解 Python 的 `await`:从基础到实践
虽然日常开发中很少需要,但 Python 允许通过实现__await__# 注意:这里使用 yield from 是合法的,但更推荐直接 await 已有可等待对象return 42print(result) # 输出 42不过,绝大多数情况下我们只需使用内置的协程、任务和 Future 即可。await是异步协程中的“暂停点”,它让出控制权,等待可等待对象完成。它必须在async函数内部使用,且后面必须是协程、任务或 Future。通过await配合或,可以实现高效的并发。
2026-09-09 16:40:24
46
原创 Python asyncio 事件循环演进:从手动管理到现代化实践
Python 的异步生态一直在朝着“简洁、安全、明确”的方向演进。是启动的大门,请把守好。是内部的指南针,只在协程内使用。至于——请让它活在教科书里,而不是你的新代码里。遵循这些最佳实践,你的异步代码将更加健壮、可维护,也更容易被他人理解。
2026-09-09 16:08:06
318
原创 LLM Tools 工具调用协议 & JSON 描述文件格式
toolstype:固定function:工具函数元数据name:函数名,英文,无空格,标识符:工具用途描述,给LLM看,越清晰越好parameters,描述入参"tools": ["description": "获取指定城市的实时天气","city": {"type":"string","description":"城市名"}},模型输出工具调用放在content数组里回传结果消息类型。
2026-08-20 22:12:46
198
原创 思维链的“真假面”:Prompt约束的模拟思考 vs. API原生的深度推理
灵魂拷问:“思考是答案的原因,还是答案的结果?对于Prompt约束的文字:在大多数业务场景下,它是答案的结果(事后说明书)。它的主要受众是调试日志,而不是模型自身。对于API原生的深度推理:在复杂高难度任务中,它是答案的原因。没有那几百个内部隐藏Token的试错,模型无法收敛到正确答案。作为AI应用的开发者,我们不必纠结于“机器有没有真正的意识”。在大模型的世界里,思考不是一种状态,而是一种被严格计算和控制的资源分配策略。
2026-08-15 13:36:44
420
原创 CoT、Self-Ask、ReAct深度拆解:大模型推理范式的演进逻辑与真实边界
如果你只是让模型解一道数学题,CoT 就够了;但如果你要构建一个能自主查资料、写代码、订机票的 AI Agent,ReAct 是必不可少的框架。请一步一步思考:小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?—— 模型在内部生成一系列连贯的逻辑步骤,最终推导出答案。:思考 → 行动 → 观察 → 再思考 → 再行动……在实际的高级 Agent 系统中,。让大模型在给出最终答案之前,—— 模型在推理过程中,
2026-08-15 12:23:59
425
原创 深入剖析 Logstash JDBC 同步 OOM 疑案:当分页遇上 SQL Server 2008 与 jtds 1.2
你可能会想,用不也能实现分批吗?确实可以,但TOP N不依赖 id 的连续性:如果数据库中删除了大量数据导致 id 跳跃(比如从 1 万跳到 10 万),数学加法会导致单次拉取数据量锐减甚至空转;而TOP N会老老实实往下找,直到凑满 10 万条,保证每次拉取量绝对稳定。执行计划更优是 SQL Server 最经典高效的分页计划,直接定位索引树顺序扫描,极其迅速。在软件开发中,我们常常会遇到“概念上不冲突,但在特定老旧组件组合下却致命”的问题。
2026-07-01 11:14:49
366
原创 深入浅出 Java Stream 流式编程:从四大函数接口到惰性求值原理
所有中间操作仅记录操作逻辑,不会立刻执行;只有调用终端操作时,全部中间操作才会统一遍历执行,这是Stream性能优化的核心设计。Stream依托四大函数式接口实现Lambda编程,是函数式思想落地集合处理的产物;三阶段执行模型+惰性求值是Stream性能核心,中间攒逻辑、终端才执行;串行流优化代码可读性,并行流优化大数据计算,合理区分使用场景;日常开发优先使用Stream替代复杂嵌套for循环,提升代码简洁度,复杂算法场景可保留原生for循环。
2026-06-04 09:39:28
357
原创 Kafka 单分区顺序消费的极限与突围:从原理到实战
Kafka 的单分区顺序消费模型,本质上是在“顺序”和“并行”之间做一个清晰的选择。如果你追求绝对全局顺序,就必须接受单分区、单消费者的吞吐上限。如果你追求横向扩展,就需要将顺序要求放宽到局部(按 Key 分区),从而释放多分区、多消费者的并行能力。先看业务是否能接受局部有序,能则加分区,多部署消费者,这是最彻底的解法。若必须全局有序,就先尝试“批量拉取 + 并行处理 + 幂等”的轻量方案,把单分区性能尽可能压榨出来。当单机处理能力不足,再引入分发层,将消费与处理分离,用多服务器做无状态处理。
2026-05-14 09:48:09
603
原创 深入剖析Kafka:Offset机制的底层基石——消息有序性
接触Kafka时,我们总会绕不开两个核心概念:Offset(偏移量) 和消息有序性。很多人只知道Offset是记录消费位置的编号,却从来没深究过:Offset为什么能断点续传、能重启接着消费、能回溯重放?答案的核心只有一句话:Kafka的Offset整套机制,完全建立在分区消息有序性之上;一旦消息无序,Offset设计直接失效,整个消费位点逻辑彻底崩塌。
2026-05-13 21:58:21
424
原创 Kafka 核心原理超通俗详解|Offset、消费组、分区、持久化一次讲透
生产者:只有 Topic 概念,没有 GroupId,只负责发送消息,不关心消费进度、消费者分组消费者:必须配置 GroupId + Topic,记录 Offset、做负载均衡、分组消费Topic 收发共用,GroupId 消费者独有分区逻辑生产者分发写入,消费者按分配并行读取Offset 绑定消费组+主题+分区,与消费者实例无关GroupId 自定义、首次连接自动创建,线上严禁写错、随意修改Kafka 消息与消费位点全磁盘持久化,支持宕机不丢数据、历史回溯。
2026-05-13 21:12:52
572
原创 LangChain 自定义函数入链:让管道任意起舞
普通函数只提供了invoke。如果你希望函数在流式调用 (stream) 时也能逐块产出数据,那就必须继承Runnable并实现transform方法,或者使用生成器风格的。自动包装无法替你生成流式逻辑。word } " generator = RunnableGenerator(stream_predict) # generator 现在已经是一个支持 stream 的完整 Runnable。
2026-05-10 16:42:19
438
原创 Python 中 `|` 运算符的终极解析:从位运算到 LangChain 管道
回顾全文,遇到时,解释器会调用左操作数的__or__(或按需回退到右操作数的__ror__。整数实现了二进制或,集合实现了求并集,字典实现了合并,类型系统在编译器层面处理联合。而 LangChain 则沿着这条路走到了极致:通过重载__or__,将函数式编程的概念引入面向对象的 Python,创造出一种领域特定语言(DSL),让用户可以用管道顺序编写出清晰、可组合的 AI 工作流。从位运算到管道,Python 展现了它极高的灵活性。
2026-05-10 15:06:46
297
原创 LLM提示词工程简介
提示词工程不是玄学,而是一套设计 → 测试 → 优化的工程循环。用好“身份-指令-示例-背景”四板斧,配合Markdown和XML的结构化表达,你完全可以让模型的输出质量变得稳定可控。身份是否明确?模型知道要“演”谁吗?指令是否具体?输出格式、语气、禁止项是否无歧义?示例是否提供了完美范本?覆盖了边界情况吗?背景信息是否用标签隔离?来源是否清晰?进行过一轮对比测试了吗?(加示例 vs 不加示例)把这份清单刻在每次调优的流程里,你就能从“差不多能用”跃迁到“精确可靠”。
2026-05-10 11:02:59
396
原创 jstack 实战指南:从程序阻塞到 CPU 飙升的排查艺术
jstack是 Java 工程师的听诊器,无论是面对莫名其妙的线程阻塞,还是突然而至的 CPU 风暴,它都能提供第一手证据。掌握jstack不仅要会执行命令,更要会解读线程状态关联业务代码和对比多次快照。下次遇到线上“灵异”现象,不妨先冷静地掏出一份 Thread Dump——真相往往就藏在堆栈之中。
2026-05-08 15:05:07
432
原创 python-dotenv 完整教程(开发必用神器)
python-dotenv = Python 开发环境变量标准工具.env文件存储密钥 +加载本地用 .env,服务器用系统变量,代码不动.env必须进.gitignore读取:永远用os.getenv(变量, 默认值)
2026-05-03 11:34:31
347
原创 Python协程简介
常规函数:调用后一口气执行完毕,期间不会主动暂停。协程函数:执行过程中可以暂停并保存当前状态,把控制权交还给调度器,之后再从暂停的地方恢复执行。这种“自己让出执行权”的方式就叫做协作式。它不同于线程那种由操作系统强制切换的抢占式多任务。Python 从yield生成器演化而来,最终在 3.5 引入了async defawait语法,正式确立了原生协程。协程函数用async def定义,await挂起等待。事件循环是调度中心,单线程并发关键。并发执行主要靠和。异步生成器和异步推导式。
2026-04-26 20:15:15
476
原创 深入理解 Python GIL:从机制到释放时机
GIL 是CPython 解释器(Python 的官方实现,也是使用最广泛的实现)中的一个互斥锁。其核心规则非常简单:在任何时刻,一个 CPython 进程中只允许一个线程执行 Python 字节码。这意味着,即使你在多核 CPU 上开启了多个线程,同一时间也只能有一个线程在“跑 Python 代码”,其他线程都必须等待。GIL 是什么:CPython 中保护对象访问的全局锁,保证内存安全,但制约了多线程并行执行 Python 字节码。它何时释放:I/O 阻塞、时间片用完(
2026-04-26 18:08:57
433
固定管理系统
2011-10-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅