Hello world!:从第一行代码到环境自检与冒烟测试

每个程序员的电脑里,都住着一行 Hello world!。不管是写前端的、做嵌入式的,还是半路出家搞数据分析的,第一次敲下这行代码、按下运行键、盯着终端里的输出愣住两秒的时刻,基本可以算作职业生涯里的第一个"高光瞬间"。这行只有两个单词的小程序,看起来简单到不值一提,但它背后藏着的,是编程里最核心的一整套逻辑:写代码、编译或解释、运行、输出、退出。这篇文章想聊的,就是这个 Hello world! 本身——它从哪来,为什么所有课程都拿它当第一课,它在不同语言里有什么"方言",以及新手最容易在它身上踩到哪些坑。不夸张地说,把它彻底搞明白,你就已经摸到了程序世界的大门。

1. "Hello world!" 从哪来:一段被误读的起源

1.1 上世纪 70 年代的实验室往事

很多人以为 Hello world! 是跟着个人电脑一起出现的,其实它的历史比这还要早个十几年。上世纪 70 年代初,某通信研究机构里有一批工程师在做一门新的系统编程语言,配套要写一份内部培训手册。手册需要示例代码,于是有位工程师随手写了一个向终端输出一句问候的小程序,用的词就是 Hello world!。当时的终端还没有图形界面,所有交互都靠命令行完成,程序能做的事也只有"把一句话打印到屏幕上"这一件。这个细节在当时毫不起眼,直到 1978 年那本影响了整整一代人的 C 语言入门教材出版时,编写者为了让第一个示例足够简单、又能立刻展示程序能"产生输出",再次沿用了这行话。从那以后,Hello world! 就像被写进了行业基因,一代接一代地传了下来。

需要说明的是,这段历史在流传中版本很多,有人说是 1972 年,有人说是 1974 年,准确的年份和具体的功劳归属其实没那么重要。重要的是它传达了一个信号:最经典的东西,往往诞生于最朴素的场景——一个工程师只是需要一行能跑通的代码而已。后来各种编程书、在线教程、视频课程都照着这个套路来,等于大家在无意中完成了同一件事:给每个新手一个最低成本的起点。

1.2 为什么偏偏是这两个单词

那为什么是 Hello world! 而不是 Hello everyone、Good morning 之类?我自己的理解有三点。第一,足够短,两个单词加一个感叹号,手打不容易出错,就算初学者一个字母一个字母抠也能完成;第二,语义足够自然,程序第一次运行,就像你刚学会一门外语,开口第一句总得是打招呼;第三,它恰好引出了编程里最基础的概念——字符串。Hello 是字符串,空格的另一边 world! 也是字符串的一部分,这句话能顺理成章地告诉新手:带引号的文本就是字符串,程序输出的是文字而不是别的什么。

还有一个细节很多人没注意:后来不少书把它写成带逗号的 Hello, World!,有的则沿用不带逗号的 Hello world!。这让初学者在网上搜代码时经常感到困惑,其实两种写法都对,关键是你跟随的教材保持统一就行。到了今天,它已经变成了一种文化符号,甚至非程序员也认识这句话。

1.3 一段小小的"考古":它比图形界面还老

再往前翻,其实更古老的机器演示程序也有类似传统。上世纪五六十年代的大型机时代,工程师们就习惯用一个极短的程序来验证机器能不能正常工作,只是当时的输出选题往往是数字、字母表,或者自己所在机构的名字。Hello world! 之所以能从这些零散传统里胜出,靠的是它独一无二的"拟人感"——你在向整个世界打招呼,而系统回应了你。这种反馈在命令行时代特别珍贵,因为那个年代人和机器交流的全部体验,就只有终端上滚动的字符。回头看,这行代码能活到今天,靠的不只是技术上的简单,更是情感上的共鸣。

2. 为什么几乎所有入门课程都拿它开刀

2.1 最小可运行程序:一次完整的"沟通闭环"

编程入门最难的,往往不是某个语法,而是脑子里没有一个完整的"程序是怎么跑起来的"模型。Hello world! 的价值在于,它是你能写出来的最小的、可运行的、有输出的完整程序。我常用一个比喻:你写 Hello world! 的过程,相当于给计算机递了一张便条,上面写着"请把这句话原样显示在屏幕上"。计算机读完便条,理解了你的要求,然后真的照做了。这一来一回,就是一个完整的沟通闭环。

很多教材会跳过这个闭环,上来就教变量、循环、函数,结果初学者学了两个小时还停在"我到底在干嘛"的困惑里。而 Hello world! 五分钟内就能让你亲眼看到:我写的代码,变成了屏幕上实实在在的字符。这个正反馈一旦建立,后面学什么都顺。我自己带过几个零基础的朋友,无一例外,第一次成功输出时的表情都带着点惊喜。那不只是技术上的成功,更是一种"我居然能指挥计算机"的掌控感。

2.2 环境自检:新电脑、新语言的第一块试金石

Hello world! 的第二个实际用途,是验证开发环境。在我个人看来,这是它最被低估的功能。换了一台新电脑,装了一个新版本的编译器,或者配了一套新的集成开发环境,你要做的第一件事永远不是写业务逻辑,而是跑一个 Hello world!。因为它能一次性暴露所有最常见的问题:解释器没装好、环境变量没配对、编辑器保存格式不对、编译命令敲错、缺了某个依赖库。只要 Hello world! 能跑通,说明你的工具链基本是健康的,之后写任何代码都不会莫名其妙地卡在环境上。

我自己有个习惯,会在新环境里依次跑三件事:跑 Hello world!、打印当前语言版本号、输出系统信息。三步都正常,我才会开始干正事。看起来多花了三分钟,实际上能省下后面好几个小时的排错时间。尤其是团队协作场景,新人入职时配置环境的环节,一个 Hello world! 测试脚本能省去无数轮"我这里跑不了"的来回沟通。

2.3 为什么不直接教更"实用"的例子

也有人会问:既然要让新手尽快上手,为什么不直接写一个算数程序、网页小程序,或者更贴近生活的例子?原因很简单:那些例子背后的依赖太多了。一个网页版的 Hello world! 至少涉及服务器、端口、浏览器、前端渲染四层,任何一层出问题,新手都无法判断是自己代码错了还是环境错了。算数程序虽然逻辑简单,但它缺少"程序在主动做某件事"的直观感受。

Hello world! 的高明之处在于它把所有噪声都屏蔽掉了:不需要网络,不需要额外依赖,不需要理解复杂的库调用。你面对的只有"源码、编译器或解释器、终端输出"三个对象。在一个信息极度过载的世界里,能让新手在五分钟内获得一次纯粹的、成功的体验,这本身就是最好的教学设计。

3. 同一行文字,在不同语言里的"方言"

3.1 编译型语言:C、Go、Rust 的写法差异

先说编译型语言。这类语言的代码要先经过编译器翻译成机器能懂的指令,再生成一个可执行文件,之后才能运行。以 C 语言为例:

#include <stdio.h> int main(void) { printf("Hello world!\n"); return 0; }

这段代码里,#include <stdio.h>是把系统自带的输入输出工具引进来,int main(void)是程序入口,printf负责打印,return 0告诉操作系统"程序正常结束"。很啰嗦,但每一步都清清楚楚,没有任何隐藏动作。

再看 Go:

package main import "fmt" func main() { fmt.Println("Hello world!") }

Go 要求先声明package main,表示这是一个可执行的程序包,然后从func main()开始执行,输出函数是fmt.Println,结尾也不用写 return 0,默认正常退出。Rust 则更简洁一点:

fn main() { println!("Hello world!"); }

这里没有包声明,没有引入外部库,输出用的是带感叹号的宏println!。三种语言都在做同一件事,但对外部依赖、入口约定、函数命名都有自己的规矩。这就是语言设计哲学的差异:C 让你看见一切细节,Go 强调规范和内置工具,Rust 把省心和内存安全放在第一位。你从这几个例子就能初步感受到,学一门新语言时,真正要学的不是"打印这句话",而是这门语言的人是怎么想问题的。

3.2 解释型与脚本语言:Python、JavaScript、Shell

再看解释型语言和脚本语言。它们不需要事先编译,直接把源码丢给解释器就能执行。Python 的写法大概是所有语言里最省事的:

print("Hello world!")

JavaScript 在服务端运行时环境里长这样:

console.log("Hello world!");

Shell 里就更直接了:

echo "Hello world!"

这些语言把复杂度藏了起来,代价是运行效率通常不如编译型语言,而且错误往往要等到运行那一刻才暴露。对新手来说,解释型语言最大的好处是反馈快:改一行,立刻重跑,没有任何中间步骤。所以我建议完全零基础的人先从 Python 这类语言入门,先建立"写代码、看结果"的肌肉记忆,再去碰编译型语言里的那些底层细节。

3.3 先别急着抄,先看懂这几点差异

光抄代码没意义,我拿一个表格把常见语言的差异列出来,对照着看更直观:

语言类型程序入口输出方式句尾分号
C编译型int main(void)printf必须
Go编译型func main()fmt.Println不需要
Rust编译型fn main()println!不需要
Java编译型public static void mainSystem.out.println必须
Python解释型文件顶层print不需要
JavaScript解释型顶层console.log可选
Shell脚本顶层echo不需要

看出规律了吗?需要分号的语言,往往是那些需要明确"一条语句到此结束"的编译型语言;不需要分号的语言,则靠换行或缩进来判断边界。这不是随便定的,而是语言设计者对"程序员应该显式还是隐式"这个问题的不同回答。理解到这一层,你再看任何新语言,都会比别人快很多。另外注意 Java 的入口函数有一长串修饰符,这是因为 Java 规定程序入口必须是某个类的公有静态方法,理解这个前提之后,那一长串就不算难记了。

4. 新手最容易栽的坑:从"Hello world!"开始就在发生

4.1 标点符号的玄机:分号、引号、括号

我见过太多人卡在第一个示例上,不是因为脑子不灵光,而是因为标点。最常见的问题包括:字符串两边的引号只写了一半、漏写了分号、函数后面的括号不匹配。比如把printf("Hello world!\n");末尾的分号去掉:

printf("Hello world!\n")

编译器立刻报错。新手往往慌得不行,其实解法非常机械:从报错信息指出的那一行往上翻,逐个检查引号、括号、分号是否配对。我到现在调代码,最喜欢的依然是从标点开始查起,因为这是最高频的错误来源,没有之一。

另一个容易忽略的点是缩进。Python 尤其典型,下面这段代码会直接报缩进错误:

print("Hello world!") print("Hello again!")

缩进不是装饰,是语法的一部分。你可以不习惯它,但不能不尊重它。类似的还有把函数名print写成Print、把printf写成print f,这类大小写和空格错误,在编译型语言里尤其致命,因为编译器的错误提示有时指向行号而不是具体字符,新手经常被绕得团团转。

4.2 全角字符与中文引号的陷阱

这个坑非常中国特色。很多人用中文输入法写代码,结果把英文引号打成了中文引号“ ” ,把逗号打成了全角逗号,分号打成了全角分号。在混合使用输入法的状态下,这种错误极其隐蔽。比如:

print(“Hello world!”)

看起来和正常代码几乎一样,但解释器直接报语法错误。我建议所有新手在写代码时,把输入法切到英文半角状态,或者直接用代码编辑器自带的"自动切换输入法"功能。这个习惯越早养成,后面踩的坑越少。判断标准也很简单:如果英文半角状态下的双引号是直的",中文全角状态下是弯的“,一眼就能分辨。

4.3 输出乱码:编码问题第一次找上门

如果你在中文系统里尝试输出"你好,世界",大概率会看到一堆乱码。这其实是所有中文开发者迟早会面对的编码问题,只是它往往在第一个程序里就出现。原因不复杂:程序输出的字符要按某种编码规则解释,而不同系统默认的编码可能不一样。主流桌面系统的默认字符集和开源系统默认的 UTF-8 不完全一致,两边强行碰头就会出现字符错位。

解决办法也很常规:确保源码文件以 UTF-8 保存,并在终端里把字符集切到 UTF-8。乱码问题在 Hello world! 阶段解决掉,后面处理文件、数据库、网页传输都会省心很多。我见过不少项目,线上出了问题一路排查到数据库连接层,最后发现根源就是最初写原型时约定的编码不统一。编码这个东西,越早建立标准越省事。

4.4 程序"成功运行"不代表一切正常

最后提醒一个概念:程序能跑起来,不等于程序是对的。以换行为例,printf("Hello world!\n");和printf("Hello world!");在大多数场景下差别不大,可一旦你做日志处理、管道流处理,换行符就变成了关键差异。

更深一层是退出码。一个完整跑完的程序,最终会向系统返回一个退出码,0 通常代表正常,非 0 代表有异常。在终端里写完 Hello world! 之后,试着执行echo $?(类 Unix 环境)查看退出码,大概率会看到 0——这其实就是程序在向你汇报"我一切正常"。养成看退出码的习惯,会有助于尽早发现那些"看起来成功、实际上失败"的隐患。很多专业脚本会在关键步骤后检查退出码,这个习惯可以追溯到你写 Hello world! 的那一天。

5. 别小看它:把 Hello world! 变成一把万能探针

5.1 用最简单的程序验证工具链

前面提到,Hello world! 是环境自检的第一块试金石。这里我把它说得更具体一点。假设你刚配置好一个新的开发环境,不要急着开大项目,先跑一个最简单的程序,并按照下面的清单逐项确认:

  1. 编辑器能正常保存源码,文件后缀名正确;
  2. 命令行里能调用编译器或解释器;
  3. 如果是编译型语言,能顺利编译出可执行文件;
  4. 运行后能在预期的地方看到输出;
  5. 退出码为 0。

任何一步失败,都在告诉你环境里某个环节有问题,而排查范围已经被压缩得很小了。我见过不少同事在环境没配好的情况下硬着头皮写大项目,结果报错满天飞,最后才发现是环境变量的问题。先用 Hello world! 把环境问题排掉,是大项目开工前最划算的一笔时间投资。更进一步,你甚至可以把这条命令写进自动化脚本,作为每次环境配置后的自检步骤,团队里所有人都能受益。

5.2 从打印一句话到与程序对话

当你能熟练地写出 Hello world! 之后,下一步才是关键:让它从一句自言自语变成一次对话。最简单的进阶是让程序读取你输入的内容。以 Python 为例:

name = input("What's your name? ") print("Hello, " + name + "!")

运行之后,程序会停下来等你输入一个名字,然后回一句问候。这一步虽然只多了一行input,但意义完全不同:程序不再只是单向输出,而是开始接收信息、做出响应。再往下走,你可以试着从命令行参数里读取内容,比如用 C 语言读取argv:

#include <stdio.h> int main(int argc, char *argv[]) { if (argc > 1) { printf("Hello, %s!\n", argv[1]); } else { printf("Hello world!\n"); } return 0; }

编译后运行./hello 程序员,屏幕上就会变成Hello, 程序员!。到这里,程序已经从"只会说一句话"变成了"会根据输入改变行为"。别小看这两个例子,它们背后分别是输入输出、变量、条件判断、命令行参数——几乎覆盖了后续所有编程知识的根。

5.3 实战里它还能当"冒烟测试"

再往后走,你会在真实的工程场景里重新遇见 Hello world!,只是它换了身份,叫"冒烟测试"。拿后端服务来说,最稳妥的起步方式就是先搭一个极小的接口,访问任意路径就返回一行 Hello world!。这个接口能通,说明网络链路、框架路由、日志输出都是好的;然后你才往这个骨架上加数据库、加缓存、加业务逻辑。一旦后面出了问题,你永远能退回到那个最小的 Hello world! 版本去判断:是新增的模块坏了,还是基础环境一直就没好过。

这个思路套用到任何领域都成立:写脚本也好,配服务器也好,做嵌入式也好,永远保留一个"最小可运行"的版本作为底牌。Hello world! 教会我们的,远不止输出一句话,而是一种极其重要的工程思维——复杂系统要从最小闭环开始搭建,并且时刻留有一条后退的路。


我自己的习惯是,把各种语言的 Hello world! 模板整理成一个笔记,每次接触新语言、新框架、新环境,第一件事就是跑对应的模板。说实话,这些年它帮我省下的排错时间,比任何技巧都多。最后再分享一个小技巧:不要只把 Hello world! 当成"第一次"的仪式,多写几遍,改一改引号、去掉换行符、加一个循环让它打印十遍,这些看似无聊的改动,其实是在帮你的手指和大脑建立编程的语感。等你哪天真能用一行代码难住别人,再回头看那句 Hello world!,你会发现自己已经走出很远了。

相关新闻

DeepSeek开源Agent框架插件化设计深度拆解:从注册到执行链路

DeepSeek开源Agent框架插件化设计深度拆解:从注册到执行链路

1. 拆之前先想清楚&#xff1a;为什么要看这个框架第一次看到 DeepSeek 开源 Agent 框架的消息&#xff0c;我其实没太当回事。市面上 Agent 框架已经多到数不过来&#xff0c;从早期的任务编排库到后来的多智能体协作平台&#xff0c;大部分都是把 LLM 调用、工具注册、对话循…

2026/10/20 18:22:01 阅读更多 →
插件化Agent框架源码拆解:工具、执行器、记忆与规划器四层设计

插件化Agent框架源码拆解:工具、执行器、记忆与规划器四层设计

1. 拆之前先想清楚&#xff1a;为什么要看这个 Agent 框架大模型圈子里做应用的人&#xff0c;最近一年绕不开一个词——Agent。但真正动手写过 Agent 的人都知道&#xff0c;从"能聊天"到"能干活"之间隔着一道巨大的鸿沟。你让模型调用一个工具&#xff0…

2026/10/20 18:22:01 阅读更多 →
AI中台数据资产智能清查指令与核验模板实战指南

AI中台数据资产智能清查指令与核验模板实战指南

1. 数据资产清查为什么需要一套“指令模板”做过企业级AI中台落地的人都有一个共同感受&#xff1a;模型训练、推理服务、知识库检索这些“显性能力”往往被反复讨论&#xff0c;但真正拖慢项目进度的&#xff0c;反而是最不起眼的一环——系统里到底有哪些数据资产、它们分布在…

2026/10/20 18:22:01 阅读更多 →

最新新闻

MSA存储入门指南:从SAN协议到选型场景的全面解析

MSA存储入门指南:从SAN协议到选型场景的全面解析

简介&#xff1a;这份文档面向备考H3C认证工程师-MSA存储&#xff08;H3CNE-MSA&#xff09;的技术人员与H3C代理服务工程师&#xff0c;聚焦MSA存储设备基础配置与维护知识&#xff0c;帮助读者在有限时间内系统梳理考点、检验掌握程度。资源为1个docx文件&#xff0c;压缩包约…

2026/10/20 19:39:14 阅读更多 →
C语言大作业高分实践:工程结构、内存安全与评分对齐

C语言大作业高分实践:工程结构、内存安全与评分对齐

简介&#xff1a;这是一份面向高校C语言初学者与课程设计学生的高分期末大作业实战项目&#xff0c;完整实现了一个具备学生端与管理员双角色的学生成绩管理系统。资源包含可直接编译运行的C/Qt源码&#xff08;含18个.h头文件与18个.cpp实现文件&#xff09;、图形界面.ui文件…

2026/10/20 19:39:14 阅读更多 →
Redis Java客户端选型与实战:Jedis、Lettuce、Redisson对比

Redis Java客户端选型与实战:Jedis、Lettuce、Redisson对比

1. 先搞清楚需求&#xff0c;再选客户端写Java应用连Redis&#xff0c;第一步不是去翻依赖、复制代码&#xff0c;而是先想清楚&#xff1a;你的业务到底需要Redis做什么&#xff0c;以及你的应用是什么形态。这话可能听起来像废话&#xff0c;但我在实际项目里见过太多人一上来…

2026/10/20 19:39:14 阅读更多 →
轻量级AI助手ZeroClaw实战:有限算力下的部署与Agent落地

轻量级AI助手ZeroClaw实战:有限算力下的部署与Agent落地

1. 项目定位&#xff1a;为什么轻量级AI助手反而更实用去年年底我拿到一台配置平平的旧工作站&#xff0c;8GB内存、无独显、CPU还是几年前的型号&#xff0c;跑几个容器就喘。当时手头正好有个工具自动化需求&#xff1a;定时抓取内部系统数据&#xff0c;做简单清洗&#xff…

2026/10/20 19:39:14 阅读更多 →
单相桥式半控整流电路原理与Matlab/Simulink仿真建模分析

单相桥式半控整流电路原理与Matlab/Simulink仿真建模分析

单相桥式半控整流电路&#xff0c;这个名字在电力电子课程里出现的频率极高。很多电气工程专业的朋友第一次接触晶闸管整流&#xff0c;就是从它开始的。最近正好有人在问Matlab仿真的思路&#xff0c;我把自己做这个仿真报告的全过程梳理了一遍&#xff0c;从拓扑结构分析到模…

2026/10/20 19:39:14 阅读更多 →
Java动漫链接生成器:批量整理番剧资源链接的轻量工具

Java动漫链接生成器:批量整理番剧资源链接的轻量工具

简介&#xff1a;这是一款面向动漫资源采集与二次元工具开发者的轻量级命令行程序&#xff0c;基于Java实现&#xff0c;可根据指定标签批量生成动漫图片链接&#xff0c;适合需要批量获取Danbooru图源、做数据采集或练手Java命令行项目的开发者。资源包共17个文件&#xff0c;…

2026/10/20 19:38:12 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →