Setsuna
type: channel
link: https://www.kok-s0s.top/
description: 人生主打一个随心所欲不逾矩
items: 模玩
items: 摄影
items: 东京之旅
items: 汕头杂谈
items: 做一个天气查询的 TUI 程序
items: 把悲伤留在山上
items: 造个 C++ 线程基类
items: 记一次「 包轮子 」的经历
items: Python -- 用 #ifndef 替换 #pragma once
items: ChatGpt 程序员的好伙伴

模玩
type: item
date: 2025-12-09T21:43:00+08:00

摄影
type: item
date: 2025-04-09T03:27:00+08:00

东京之旅
type: item
date: 2023-11-18T22:44:00+08:00
description: Why Tokyo？ 我想亲眼看看这个世界，未来应该还会去很多除了中国以外的地方，日本东京是第一站。 从小所看的日本文化作品 - 动漫｜电视剧｜电影 中国、美国和欧洲的我都有看，日本占比较多罢了。 小学时候， TVB 周一至周五下午的《放学 ICU》、各种粤语配音的动漫、周六上午的蒙面超人，周日的超级战队，基本有空就看；星空卫视和华娱卫视各个时间段的中配动漫也是有啥看啥。 初高中，疯狂网上冲浪，看土豆网优酷网各种影视网站，在上面追番。从那时候看番到现在都有个习惯，每个季度出的新番，我都会先看第一集，通过看第一集判断自己是否会感兴趣，是否选择继续追番。 基本上什么题材的文化作品我都看过。 而日本的动漫及影视的取材多来自于现实场景，想实际看看那些地方。 全文放在 Notion 那，该文有太多的照片，我懒的再将照片存储在该博客的服务器里了。

汕头杂谈
type: item
date: 2023-08-20T13:36:00+08:00
description: 杂谈杂谈，随便写写记录。 先上一个图！！！这个时代信息量真是太多了，每个发言者都有自己的视角，各位见仁见智啦！ 注意，这里的汕头，我可能主要指龙湖金平这两个区域，因为我工作地点在龙湖，住也在龙湖，金平龙湖大部分地方骑单车都能骑过去。可能我所看的汕头，主要也是这两个地方给我展现的。 至于汕头其它地区，澄海，潮阳，濠江，都是跟其它人一起开车去探索的，都是为了恰吃的；潮南区也就只是去过一次两英生态公园休闲下；南澳坐公交去，也就呆了半天就走了。 额外潮州市离龙湖蛮近，开车去过牌坊街和广济楼。 谈谈工作 0820 发，是因为此时我已经离职了！很多事也就能讲讲了。 汕头真法外之地！在这打工，有太多默认的，不合理的要求！ 真就除了公务员，其它绝大数工作都是单休的，很少有企业是双休的，顶多大小周。 节假日有时还需员工返回来加班。例如，过年放七天，它都要你回来上两天。不过我直接不理，去旅行了。 这里的企业加班大都是没有加班费用（我这个企业也没有），只能将加班的时长用于顶替正常上下班的时长，即周一至周五，某一天，你请假，只要额外加班了8小时，那你请的那一天假的工资照领。 我呆的这个企业是更看重加班时长的，加班时长在绩效考核评定占蛮大一部分。不过我每次都自评 C，次次也拿的 C，我打工，给多少钱做多少事，不求有功，但求无过，想要我积极一点，那就是另外的价钱。主要拿了最高的 A，也不会加多少工资，因为我的工资基数太低了 - 8000，而且它是算 20% 的工资，8000 的 20% 再乘以绩效系数 1.6，就 2560，就比我原工资多 560。正常工作时长，加上加班时长，算算时薪，低的无话可说，这我会拼？我佛的很！开心消消乐再充 20！！！ 我加班时长不多，但能按时按质完成任务，我 leader 就也奈何不了我，因为我很清楚，他绝不会主动将我辞退的，他不想给 N + 1 的。应该这么说，汕头的绝大多数企业就不会主动送人 N + 1，只会试图通过言语恶心员工，或者安排不合理的工作给员工，让员工主动有离职的想法。不过我都 hold 住了那些工作，这个企业的技术需求不难（之后我会出个视频说说），主要也是业务多，至于领导们的恶心发言（年轻人就是要多吃苦，多奉献，多加班，少谈钱），画大饼什么的。这些我都左耳进，右耳出，直接忽略，算是我这两年打工锻炼出来的能力，除了给钱能激励下我这打工人，至于说对工作更上进点，对我来说很难的。 N + 1 赔偿是指有劳动合同法第四十条规定的情形之一的，用人单位除了正常支付经济补偿金后，额外支付劳动者一个月工资，可以解除劳动合同。 N 就是根据员工在用人单位的工作年限，每满一年，补偿1个月的工资，不满半年的，算半个月，半年以上的，算1个月。 领导们老说员工要对工作有责任心，那谁对我们员工身心健康有责任心？ 我就这么说吧，身心健康真的很重要，要不然去医院看个病，得场病，有可能像个关不上的水龙头，那个钱似水一般哗哗地往外流。就真的，讲实话，有些疾病，医保也报销不了多少，得一场大病，可真就是极速返贫了。看我博客的大都和我年龄相仿，或许都会觉得自己身体很不错，我只能说，别太自信了，现代人可都有点亚健康在，保险点，可以的话，还是每年花个 3000 左右（南方医院的价格）做个全身检查，看看身体哪里会有问题，免得有一天就忽然爆出来，那到时，就可真叫做难顶。我个人认为每年花 3000 左右的身体检查费用还是挺值。 多喝水！心态好！目前个人努力的回报太低了，不值得太拼的，当然也不是说不去从外部汲取知识什么的，也不敢去做什么事情。只是我认为在目前这个社会发展阶段，在保障自己身心健康的前提下，再积极去搞钱比较合适。年轻人多搞钱还是要的。 所以我也算是蛮放肆的，不想加的班那就走吧，leader 说了我，说了我的那几天，我就安分点咯，之后不想加班，照走就走，就这一过程，我和 leader 如此反复多次。他说了我一年多，但就是不辞退我，说实话，有点失望，最终还是我主动离职，走了离职流程。我个人还真蛮想拿 N + 1 的。(T_T) 这加班现状我觉得汕头很难改变，至少五六年内都很难，一方面是我国目前的经济大家都能看得到，另一方面，讲道理，部分潮商属实很会压榨！ 就算想投诉企业，呃，潮汕耶！人际关系可太复杂了！某些力量也太强大了！行政效率也拉胯的不行，光是各个城市都会有的大学生就业补贴，它给我拖了整整半年才汇款到我账户上。 讲讲汕头非公务员的五险一金。 汕头公务员的五险一金很厉害，不是很了解，不展开，只是道听途说罢了。因为接触到的汕头公务员都感觉很谨慎，无法与这些人交换有效信息。 非公务员的五险都蛮一般的，不过有些企业还啥保障都没有，员工真主打一个奉献。 汕头公积金，大部分企业都是按照汕头最低工资标准 1730 缴纳的，直到今年7月，貌似汕头强制要求企业要按照员…

做一个天气查询的 TUI 程序
type: item
date: 2023-08-06T16:03:00+08:00
description: 目标驱动 - 逐步逐步做成这个 TUI 程序 起因 前几天逛 0xFFFF 社区，看到一个帖子 - 为什么我折腾这些小众技术？，主要有个回复让我脑子有点想法 -- 「 现在 GitHub 上出现了这么多活跃的 TUI 项目（支持显示全彩全分辨率图片甚至播放视频的 Terminal、IDE、漂亮的 TUI 文件管理器、音乐播放器等等），反倒是计算机届的文艺复兴了。 」 熟悉我开发习惯的就知道，我挺喜欢在终端 Terminal 下完成一些工作，就心想要不我也开发个小小 TUI 程序用用。 写该文的时候，Vim 的创作者 Brarm Moolenaar 去世了，这里 RIP 下，毕竟自大二起就使用着 Vim，这个东西对我开发真是非常便捷，感谢 Brarm Moolenaar 的贡献。 就想着可以做个简单天气查询的 TUI 程序。 因为我目前办公的位置离窗边蛮远，且现在天气热，太阳晒，全都拉上窗帘，我就看不见窗外啥天气了。 某日中午出去吃饭，居然下太阳雨，直接淋成「 落汤鸡 」。 同样的悲催事可不能再遭遇一次，现在离开座位，要出办公楼前，必看看天气预报，决定是否带个雨伞。 一般我看天气的步骤如下： 拿起手机解锁 滑到最左边的天气界面 那我想更懒惰点，反正每一天下来，我对着电脑比对着手机更多，且我每台电脑的终端我都不会关掉的，常驻后台。 不如做个 TUI 程序，这样我想查看天气的时候，步骤就变成了： 快捷键唤起终端 输入命令，按下回车，就可看到天气信息 且这样我每天就可以少拿起手机了。因为怎么说，我有时拿起手机看个天气，有可能不知不觉的刷了「 亿 」会儿手机，那放下手机，回到电脑前继续做些事情，脑子又可能会有点小卡壳，不知道自己刚才在干嘛（如果在敲代码，又可能会忘了某一个逻辑是要怎么做的，要花些时间回忆下）。 不过其实这影响也不大，只是我想着如果把工作任务早点做完，那我摸鱼就摸的更心安理得，好像更不错耶。（￣︶￣）↗ OK 清楚目标了，那就开始吧! 思考下吧！ 理解业务 这个东西的展现形态为一个 Terminal 下即可运行的程序。 运行这个程序，会显示我所在地的天气情况。 问题来了 - 我想要看到什么样的天气信息呢？ 明确下要展示的天气信息： 目前天气情况，即运行该程序那时刻的天气是咋样的，我要知道 未来天气情况，即未来几个小时或几天内的天气情况，我想知道 确定所用技术栈 我作为一个开发者，我掌握着什么样的技术栈，做这个东西用什么技术比较合适，这些要确定下来。 如果是在 Terminal 下运行的程序，那用很多语言都可以完成的，只不过我最近常用一门叫 Rust 的语言。 下面是我问 ChatGPT，用 Rust 做命令行程序的优势是什么，它给出的回答。见仁见智啦！ Rust 作为一种现代的系统级编程语言，拥有许多优势，使其成为开发命令行程序的理想选择。以下是 Rust 在开发命令行程序方面的一些优势： 1. 性能：Rust 是一门性能优秀的语言，它的执行速度接近于 C 和 C++，这使得命令行程序在处理大规模数据和复杂计算时表现出色。 2. 安全性：Rust 的所有权和借用系统能够在编译时检查内存安全性和数据竞争，有效地避免了许多常见的运行时错误和安全漏洞，使得命令行程序更加健壮和安全。 3. 并发支持：Rust 内置了对并发编程的支持，可以轻松地编写多线程的命令行程序，充分利用现代多核处理器的性能优势。 4. 轻量级：Rust 的标准库非常精简，这使得生成的可执行文件相对较小，节省了系统资源，并且适合用于开发轻量级的命令行工具。 5. 跨平台支持：Rust 提供了广泛的平台支持，可以轻松地在不同操作系统上运行编译好的命令行程序，这为开发跨平台工具提供了便利。 6. 依赖管理：Rust 的包管理器 Cargo 提供了简单易用的依赖管理功能，可以方便地引入外部库和工具，加速开发过程。 7. 社区和生态系统：Rust 社区非常活跃，并且拥有丰富的生态系统，你可以轻松地找到许多现成的库和工具，以及丰富的文档和教程，帮助你更高效地开发命令行程序。 综上所述，Rust 的性能、安全性、并发支持和跨平台能力使其成为开发命令行程序的优秀选择。无论是开发简单的工具还是复杂的命令行应用，Rust 都能够提供高效、安全和可靠的解决方案。 接下来就是关键的环节。 把业务需求翻译成技术需求 开发前准备相关资源 我这里的数据是有关天气的，那我就需要一个天气数据源。 这个网上选择很多，我这里用的是心知天气，调用它提供的 API 返回的数据格式为 JSON 类型，便于处理。 梳理出技术需求吧！ 调用心知天气的 API，获取天气数据；Rust 有提供 reqwest 库，可以用来发起网络请求； 能处理返回来的 JSON 数据，Rust 有提供 serde 库，可以用…

把悲伤留在山上
type: item
date: 2023-07-12T20:50:00+08:00
description: After10 - 把悲傷留在山上 有句歌词很棒「 请不要将这刻痛苦判下重罪 」 这几年，这个阶段，我完全认为有些问题根本不是我们个人的问题，而是「 其它 」导致的，未来的很多事情还是不好说的。 我谜语人，谨言慎行 doge。 保持内心平和吧！该干嘛干嘛。 作词：After10 作曲：After10 编曲：关礼琛、After10 年少你试过快乐透 每日像未活够 何以霎眼 你已累透 半夜 尚未可休 当天筑起 一些小岛 浸没了 消散以后 几多青春 几多理想 已经弃守 谁说中了 你已大透 发白日梦亦够 时间到了 叫你内疚 已尽力便好收 一艘方舟 轻轻飘走 心血只得到扣留 多么不甘 开不了口 化不了 但困在眼眸 曾经艰苦到底 一对手 哪管到审判前 这时候 花光了气力来奋斗 怎么去放手 曾经只想放低 高飞远走 作一个好借口 也许会变得富有 唯一颗初心 拒绝接受 回到这里 再进或退 也像活在梦里 回到过去 纵已逝去 昨日历炼不衰 伤心的追 开心的追 放下这一切顾虑 怎么的追 请不要将这刻痛苦判下重罪 曾经艰苦到底 一对手 哪管到审判前 这时候 花光了气力来奋斗 怎么去放手 曾经只想放低 高飞远走 作一个好借口 也许会变得富有 唯一颗初心 拒绝撤走 落寞时在街上 即使再输一仗 难声张 悲伤留在山上 只需放声高唱 回声响 一天你在那方 照着你的故事再闯 曾经艰苦到底 一对手 叫醒昨天理想 这时候 跟一个价值来奋斗 捉紧到永久 仍憧憬一对手 打出缺口 抱紧你相信的 挽手去踏破尽头 寻找这一代 自由

造个 C++ 线程基类
type: item
date: 2023-06-10T07:39:00+08:00
description: 写于 2023 年 3 月 24 日。 以剔除 Qt 的 QThread 为目标而诞生的项目。设计的线程基类能搭配类似 Qt 中的信号与槽机制来使用，且利用现代 C++ 提供的互斥量和条件变量，让函数能够同步或异步运行，这样派生类（某业务工作线程）能持有定时器（线程）来做些定时任务（异步）。 cxx_thread 起因 和 记一次「 包轮子 」的经历 的起因一样，只不过这个项目是为了剔除 Qt 的 QThread 而诞生的。 拆分目标 目标 -> 替换掉 QThread 分析下 QThread 这里主要看 QThread 的使用方式，看它如何被使用的。 第一种示例代码 class Worker : public QObject { Q_OBJECT public slots: void doWork(const QString &parameter) { QString result; /* ... here is the expensive or blocking operation ... */ emit resultReady(result); } signals: void resultReady(const QString &result); }; class Controller : public QObject { Q_OBJECT QThread workerThread; public: Controller() { Worker *worker = new Worker; worker->moveToThread(&workerThread); connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater); connect(this, &Controller::operate, worker, &Worker::doWork); connect(worker, &Worker::resultReady, this, &Controller::handleResults); workerThread.start(); } ~Controller() { workerThread.quit(); workerThread.wait(); } public slots: void handleResults(const QString &); signals: void operate(const QString &); }; 第一种是在一个继承自 QObject 的子类中，将 QThread 作为成员变量 workerThread，用 moveToThread() 函数将该类所创建的对象移动到 workerThread 中，connect() 函数将信号与槽连接起来，在槽函数中编写需要在线程中处理的逻辑代码。然后再调用 QThread 的 start() 函数来启动 workerThread，这样槽函数就能在一个新的线程中运行。 第二种示例代码 class WorkerThread : public QThread { Q_OBJECT void run() override { QString result; /* ... here is the expensive or blocking operation ... */ emit resultReady(result); } signals: void resultReady(const QString &s); }; void MyObject::startWorkInAThread() { WorkerThread *workerThread = new WorkerThread(this); connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults); connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater); workerThread->start(); } 第二种是写子类继承自 QThread，然后重写 run() 函数，这样就可以在 run() 函数中写线程的逻辑。 需要剔除 QThread 的代码中使用方式为第一种。 Signals and Slots Across Threads Qt 有提供一些信号与槽的连接选项 Qt::ConnectionType，这些选项能控制信号与槽的连接方式，比如是否是异步的，是否是阻塞的等等。 简单梳理需求 信号与槽…

记一次「 包轮子 」的经历
type: item
date: 2023-06-10T07:25:00+08:00
description: 写于 2023 年 3 月 17 日。 重新拾起 C++ 开发已经有 8 个月了，自己主导做的一件事情。 三个看法，一是记住 C++ 能不造轮子，就别造轮子了；二是能做单元测试的东西，就要做单元测试；三是好好利用 ChatGPT 之类的东西来优化代码 -/- doge cxx_crud_file 起因 被分配了一个任务，用现今的 C++ 标准改写一个原先用 Qt 编写的代码。就是要去除掉那些以 Q 开头的代码（QString、QVariant、QSetting 和 QFile 等等）。 重新用 C++ 标准改写的这份代码，扩展性就会更强，当然 Qt 的生态也不错，不过是业务需求如此罢了，不展开具体内容。 开始「 模仿 」 这份 Qt 编写的代码中有自己的文件读写工具类 FileTools（是根据实际业务产生的，即各种规定好的读写要求，怎么读取，怎么写入数据等等）。 用 Qt 构建的 FileTools 类， 其代码长度大概为两千多行左右 只不过这个类是基于 Qt 整个语言生态构造的，现在打算要去除 Qt 罢了。 我一开始，就是简单仿造这个 FileTools 类，函数名大致不变，函数内部的处理逻辑也大致不变，入参和返回值的类型由 Qt 的数据结构改成 C++ 标准下的，例如 QString 用 std::string 代替。 但其实，在修改这个 FileTools 类时，发现这其实算不上是个类，只是把功能函数全当作成员函数罢了，要使用这些函数时，就用这个类创建一个对象，通过这个对象来调用所需的功能函数。 大概是刚从前端转到做 C++ 的开发，我一开始也觉得没什么问题，就是 函数式编程 嘛。 但是 C++ 的一大精髓就是 OOP（面向对象开发），这个类弄得更像面向过程的。 且这个类里有蛮多方法其实可以继承复用的，阅读其中的代码，有点乱。 越开发，越能闻到代码传出的那股 「 坏味道 」。 该换思路来做。 开始「 包轮子 」 包包包，有现成的，优秀的，经过试验和测试的功能函数，我是绝对不会重复造轮子的，我是个很懒的开发者 /doge。 测试驱动开发 Test-Driven Development (TDD) VSCode | CMake | C++ | TDD 整个项目使用 GoogleTest 来做单元测试，开发过程中，先编写测试用例，然后再编写代码，最后再运行测试用例，看看是否通过，不通过，则修改代码，直到通过为止。 记住，测试代码应当与你功能代码的「 体量 」差不多大。 UFile 重新拾起 C++ 开发，看了蛮多 C++ 的书籍（《clean C++》、《Effective C++》等），以及看 cppreference 官网内容，感觉要做的文件读写工作。一些功能函数可以基于 C++ 标准提供的 <filesystem> 文件系统库来做。 UFile #ifndef UFILE_HPP_ #define UFILE_HPP_ #include <iostream> #include <string> #include "Tools.hpp" #if defined(__clang__) || defined(__GNUC__) #define CPP_STANDARD __cplusplus #elif defined(_MSC_VER) #define CPP_STANDARD _MSVC_LANG #endif #if CPP_STANDARD >= 201103L && CPP_STANDARD < 201703L #include <cstring> #include <experimental/filesystem> namespace fs = std::experimental::filesystem; #endif #if CPP_STANDARD >= 201703L #include <filesystem> namespace fs = std::filesystem; #endif class UFile { private: fs::path _p; public: explicit UFile(const std::string &path) : _p(path) {} explicit UFile(const fs::path &path) : _p(path) {} std::string path() { return _p.string(); } }; #endif // UFILE_HPP_ 将 <filesystem> 的 path 类作为私有变量使用； 因为要适配 Linux 和 Windows 平台以及不同的 C++ 标准，加个宏定义来做判断。 这样就是一个基类，接下来对各种类型处…

Python -- 用 #ifndef 替换 #pragma once
type: item
date: 2023-06-10T06:46:00+08:00
description: 写于 2023 年 3 月 2 日。 需要重复处理的文件过多了，就别 Ctrl C、Ctrl V 了,写点 Python 最合适了。 代码背景 #pragma once 和 #ifndef 都可用于防止头文件被两次编译。 不过 #pragma once 是依托微软编译器來使用，不支持跨平台。 #ifndef 的写法是 C++ 标准支持的，能够跨平台使用。 因此用 #ifndef 來替换掉原先代码中存在的 #pragma once。 用用 Python 利器 一般处理多文本文件，我就会分成两块： 遍历多文件，这里即 traverse_directory，目录遍历文件的代码可复用； 文件文本处理，这里即 replace_the_marco，文本处理的代码根据需求來做修改； import os def replace_the_marco(cur_file_name: str) -> bool: flag: bool = False basename: str = os.path.basename(cur_file_name) file_name: str = basename.split(".")[0].upper() suffix: str = basename.split(".")[1].upper() macro: str = file_name + "_" + suffix + "_" first_sentence: str = "#ifndef " + macro second_sentence: str = "#define " + macro third_sentence: str = "#endif // " + macro lines: list[str] = [] with open(cur_file_name, mode="r", encoding="utf-8") as file: index: int = 0 # 只找前三行 for line in file: temp_item: str = line.strip() if index < 3: if temp_item == "#pragma once": flag = True index = index + 1 lines.append(line) file.close() if flag: print("\nModify the macro for " + basename + "!\n") with open(cur_file_name, mode="w", encoding="utf-8") as file: for line in lines: if "#pragma once" in line: file.write("%s\n" % first_sentence) file.write("%s\n" % second_sentence) else: file.write("%s" % line) file.write("\n%s\n" % third_sentence) file.close() else: print("The " + basename + " does not need to be modified!\n") return flag def traverse_directory(cur_dir: str): for cur_dir_item in os.listdir(cur_dir): cur_path_name: str = cur_dir + "/" + cur_dir_item if cur_dir_item[-4:] == ".hpp" or cur_dir_item[-2:] == ".h": replace_the_marco(cur_path_name) elif os.path.isdir(cur_path_name): traverse_directory(cur_path_name) if __name__ == "__main__": folder_absolute_path: str = "" traverse_directory(folder_absolute_path) 小坑，遇到一些 Visual Studio 下创建的文件，格式为 ansi，需要转为 utf-8 才可再用上面的脚本处理，分另一个脚本文件处理此过程。这样跑完一个脚本，可以验证一个阶段。 import chardet import codecs import os def ansi_to_utf_8(cur_file_name: str): with open(cur_file_name, "rb") as f: r = …

ChatGpt 程序员的好伙伴
type: item
date: 2023-04-01T23:26:00+08:00
description: 水篇博文 /doge。 开头挂个教程 Learning Prompt 开头挂几个视频链接 使用 ChatGPT 的一些例子 超级小華 不高兴就喝水 个人感觉，如果说互联网的出现，将知识从 “实体” 形式转换为 “数字” 形式存储起来，让人们相较过往，更容易接触到各种各样的知识。那么，ChatGPT 这种可对话的 AI，很容易地将知识做一个整合，将整合的内容再反馈给提问者。 Web Searching Skills 过往，一般（说我自己），在计算机方面打算做一个小玩具（桌面计时器啦），会组合几个搜索的关键词，去 Google 上搜索，然后再从搜索结果中找到自己想要的答案。整个过程会花费掉一些时间，而且，搜索结果中的内容，往往不是自己想要的，还需要再花费一些时间去过滤掉不想要的内容。最终还要我自己整合出我所需要的信息。 但现在，我可以直接描述我打算做一个什么东西，ChatGPT 会给我一些尽可能接近的回答，我再继续追问，ChatGPT 返回的答案，会越来越接近我想要的答案。这个过程，相较我自己去搜索，会更加快速。 但我对于 ChatGPT 返回的回答，其所述说的知识准确性也是需要再三确认的。记住，最终做判断还是我们人类本身，AI 只是辅助我们做决策。 网络上有关 ChatGPT 这类 AI 的应用有很多视频或文章，基本现在各大资讯渠道有关这方面的资讯应该不少。我这里只介绍我个人所用到的，谈谈使用感受。 Easy 生成配置环境教程 太爽了，说清楚你什么系统（最好能说版本号就说），你要做什么事情，做这个事情大概会安装什么，做个甲方，给 ChatGPT 提需求，ChatGPT 就能从训练的数据（无数前人配置环境踩过的坑）中找到适合你的配置环境教程。当你想去学习某些新技术，很难再卡在配置环境那一环节了。 小白入门新技术，输出 “Hello World！”。 生成目标脚本 年初，还打算自我增值，学一波 Linux 下的 shell 脚本知识，ChatGPT 一出，我已经失去继续学习的欲望。我只要面向 ChatGPT 编程即可。而且本身 shell 脚本的很多知识就很模块化，将各种 shell 命令根据你所描述的需求去组合并不是一件难事（对 ChatGPT 而言）。不仅是 shell，对于 Python 这门脚本语言来说，ChatGPT 也能生成目标脚本去处理一些文本数据或者做一些自动化操作。 生成函数（函数式编程） 函数式编程中的函数 == 真正的数学函数，其引用透明，即只要使用相同的输入调用函数，将始终得到相同的输出。 这类函数让 ChatGPT 生成真是嘎嘎简单。只要你描述清楚你的需求，ChatGPT 就能生成你想要的函数。 这是我重新拾起 C++ 开发 5 个月后写的一个字符串分割函数（网上找了一份 Linux 下 C 语言，加了个 Windows 的版本，测试能跑就没管了）。 std::vector<std::string> split(const std::string &data, const std::string &separator) { std::vector<std::string> result; if (data == "") return result; #if defined(_MSC_VER) char *next_token = NULL; char *token = strtok_s((char *)data.c_str(), separator.c_str(), &next_token); while (token) { result.push_back(token); token = strtok_s(NULL, separator.c_str(), &next_token); } #elif defined(__GNUC__) char *token = strtok((char *)data.c_str(), separator.c_str()); while (token) { result.push_back(token); token = strtok(NULL, separator.c_str()); } #endif return result; } 这是 ChatGPT 生成的函数，我只是把我上面写的这个函数丢给它，让它帮我优化，就返回一个十分简练的函数，一对比，就很不错。ChatGPT 非常适合写这种和业务逻辑无关的函数。毕竟网络上的相关实现，想来这么多年也是积攒了不少。 std::vector<std::string> split(const std::string &data, const std::string &separator) { std::vector<std::st…