Kotlin 空安全详解:从可空类型到避免 NPE 的实用写法

Kotlin 把空安全做进了类型系统:类型默认非空,只有显式加上 `?` 才表示可能为 `null`。理解可空类型、编译期检查、平台类型和常见操作符后,能明显减少 `NullPointerException`,也更容易写出边界清晰的 Kotlin 代码。 Kotlin 的空安全经常被概括成“类型后面加个 `?`”,但真正难点不在语法,而在如何用类型表达业务语义、把空值处理留在合适的位置。

Kotlin 空安全详解:从可空类型到避免 NPE 的实用写法

如何在不停机情况下修改 SQL 触发器

跨数据库环境里,触发器几乎都不能直接“原地修改”。想在不停机前提下更新逻辑,可靠办法是把它当成一次受控的原子替换:先确认原定义,再在合适的会话和并发条件下执行 `DROP + CREATE`,最后用行为验证确认新逻辑已生效。

如何在不停机情况下修改 SQL 触发器

用 Python 提取 Word 文本框中的文字、表格和图片

本文介绍如何用 Python 配合 Spire.Doc 提取 Word 文本框里的文字、表格和图片,重点说明 `TextBox`、`Body.ChildObjects`、`Body.Tables` 与 `DocPicture` 的访问方式,并补充嵌套文本框、编码和换行等实务细节,便于做文档迁移与批量处理。 Word 文档里的文本框经常承载说明文字、表格和配图,但它们不属于正文主流程,批量处理时最容易被漏掉。

用 Python 提取 Word 文本框中的文字、表格和图片

PyCharm 怎么查看当前 Anaconda 环境安装了哪些包

在 PyCharm 里看 Anaconda 环境装了哪些包,最稳妥的办法不是盯着解释器页面,而是直接在 IDE 的 Terminal 里执行 `conda list`。这篇文章把查看方法、PyCharm 列表不实时的原因,以及如何确认当前终端确实处在目标环境中,按实际排查顺序梳理清楚。

PyCharm 怎么查看当前 Anaconda 环境安装了哪些包

Python 如何快速读取并展示大文件的最后 N 行日志?

读取大日志最后 N 行时,`readlines()[-N:]` 看似直接,实际会把整份文件读入内存,面对 GB 级日志很容易卡死或触发 `MemoryError`。这篇文章把可行方案拆开讲:命令行优先用 `tail -n N`,Python 自实现则要用二进制反向扫描,同时说明边界处理和第三方库的取舍。

Python 如何快速读取并展示大文件的最后 N 行日志?

Sequelize 防 SQL 注入,不是“用了 ORM 就够了”

Sequelize 的模型方法确实会自动做参数绑定,但这只覆盖“值”,并不覆盖列名、表名、排序字段这类 SQL 结构位。本文把几种最容易误判的场景拆开讲清:模型方法何时安全、`sequelize.query()` 为什么必须配合 `replacements`、`literal()` 与 `fn()` 为什么会绕过防护,以及动态字段该怎样用白名单收口。

Sequelize 防 SQL 注入,不是“用了 ORM 就够了”

怎样提高 CentOS PHP 日志性能

PHP 日志配置不只是排障工具,也会直接影响磁盘占用和 PHP-FPM 响应时间。本文围绕 CentOS 常见运行环境,整理出日志级别、异步写入、轮转、存储方式以及 PHP-FPM 配置几个关键优化点,并给出可直接落地的配置示例。

怎样提高 CentOS PHP 日志性能

Go 里的 io.Discard,不只是“丢数据”这么简单

`io.Discard` 是 Go 标准库里一个很小却很常用的对象:它实现了 `io.Writer`,但会把写入的数据直接丢掉。真正值得关注的不是“丢弃”本身,而是它在 HTTP 连接复用、日志开关、网络读取和测试替身中的实际价值,以及 `ReadFrom` 带来的性能收益。

Go 里的 io.Discard,不只是“丢数据”这么简单

Nginx 缓存策略怎样配置:把 proxy_cache 关键参数一次讲清

这篇文章用一套可直接上手的 Nginx 配置示例,把 `proxy_cache` 相关参数拆成路径、缓存键、缓存时长、绕过与重验证几部分来讲清楚。读完你可以判断哪些参数影响命中率、磁盘占用和后端压力,以及生产环境里最容易出问题的几个点。

Nginx 缓存策略怎样配置:把 proxy_cache 关键参数一次讲清