Home avatar

东东东尼君

东尼君的世界

Loguru:替代标准logging的现代方案

日志是软件工程中最基础也是最重要的能力之一。无论是Web服务、AI应用、数据处理任务、自动化脚本、后台Worker,都离不开日志。Python标准库提供了logging。它功能强大,但实际工程使用中经常会遇到一些问题:

  • 配置复杂
  • 格式设置繁琐
  • 文件滚动需要额外配置
  • 多模块项目初始化麻烦

例如标准logging:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import logging

logger = logging.getLogger(__name__)

logger.setLevel(logging.INFO)

handler = logging.FileHandler('app.log')

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info("Application started")

简单记录一条日志到文件,需要很多代码。这也是为什么可以尝试用Loguru

百万级CSV导入MongoDB性能实战

在日常开发中CSV导入是一个比较常见的数据处理场景。例如:

  • 用户信息导入
  • 商品数据同步
  • 日志分析
  • 财务流水导入

很多项目开始都会写出类似下面的代码:

1
2
3
4
5
6
7
8
9
foreach(var line in FileReadLines(path))
{
  var user = Parse(line);

  if (!Validate(user))
    continue;

    await collection.InsertOneAsync(user);
}

数据只有几千条时,这段代码运行地非常流畅。然而,当数据增长到几十万甚至几百万条之后,问题便开始暴露出来:

  • CPU利用率很低
  • MongoDB写入速度跟不上
  • IO长时间阻塞
  • GC次数明显增加
  • 导入时间从几秒增长到数十分钟

C++ Pimpl设计模式详解

在阅读一些大型 C++ 项目源码时,经常会看到类似下面这样的代码:

1
2
3
4
5
6
7
8
class MyClass {
public:
  MyClass();
  ~MyClass();
private:
  class Impl;
  std::unique_ptr<Impl> impl_;
};

第一次看到这种写法,很多人都会疑惑:

  • 为什么真正的数据成员不放在类里面?
  • 为什么要多定义一个Impl类?
  • 为什么析构函数要放到.cpp中实现?
  • 这样设计有什么好处?

实际上,这就是C++中非常经典的Pimpl(Pointer to Implementation)设计模式。本文将从设计思想、实现方式、优缺点以及使用场景几个方面详细介绍Pimpl。

让Hugo支持HDevelop代码高亮

Hugo基于 Chroma 实现代码高亮,对 Go、Python、C++、Matlab 等主流语言都提供了开箱即用的支持。最近阅读机器视觉算法与应用 第2版 (Carsten Steger)时,需要在博客中展示 HDevelop 代码,却发现 Hugo 默认并不支持这种语言。与其退而求其次使用普通文本展示,不如直接扩展 Hugo 的语法高亮能力。因此本文记录整个实现过程,包括:

  • Hugo如何找到对应的Lexer
  • Chroma 的语法解析机制
  • 如何新增一个HDevelop Lexer
  • 最终让Hugo支持HDevelop代码高亮

PowerShell脚本实践指南

在软件开发、系统运维和DevOps 等领域,有一个永远存在的问题:大量重复性的工作正在消耗工程师的时间。每天登录服务器、检查日志、修改配置、部署应用、整理数据、生成报告……这些事情单次并不复杂,但重复几十次、几百次之后,就变成了巨大的时间成本。PowerShell(pwsh)就是解决这类问题的工具之一。它不仅是一门脚本语言,更是一套现代化自动化平台。本文将从基础语法开始,一直到脚本工程实践,全面介绍如何使用 pwsh 构建可靠、高效的自动化工具。

Effective Python 第2版 (Brett Slatkin)

作为一名开发者,学习一门语言通常会经历几个阶段。最开始,我们关注的是:“这个功能怎么实现?”然后逐渐编程:“这个实现是否合理?”再进一步:“这个设计能否支撑未来几年的维护?”Python也是如此。初学阶段,我们学习变量、函数、类、模块,然后利用框架和库快速完成需求。但真正进入工程开发后,会遇到更多问题:

  • 为什么有些代码难以测试?
  • 为什么简单的修改会影响到整个系统?
  • 为什么别人写的代码看起来更自然?
  • 为什么同样的功能,有些实现更加高效?

这些问题的答案,往往隐藏在语言细节和工程实践中,Effective Python 编写高质量 Python 代码的 90 个有效方法便是一份Python工程实践指南。

流畅的Python 第2版 (Luciano Ramalho)

流畅的Python是在Python社区较为知名的一本书。它不是基础入门书,而是一本答疑解惑的书。为什么Python这样设计?哪些能力是语言提供的?哪些模式是社区长期沉淀出来的?它不会告诉你如何写一个for循环,也不会教你如何调用某个 API。它关注的是 Python 代码背后的运行机制:

  • 对象如何协作?
  • 抽象如何建立?
  • 语言特性如何组合?

读完这本书最大的变化,不是记住了更多 Python API,而是开始用 Python 的方式思考问题。这也是高级 Python 开发者和普通 Python 使用者之间的重要区别。

Python中的__all__:模块公开API设计的关键工具

在Python项目中,我们经常会看到类似这样的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
__all__ = [
    "Field",
    "FormRequest",
    "Item",
    "Request",
    "Selector",
    "Spider",
    "__version__",
    "version_info",
]

很多初学者会疑惑:

  • __all__是做什么的?
  • 为什么需要它?
  • _xxx命名有什么区别?
  • 大型项目为什么经常使用?

本文将从基础语法到工程实践,深入理解 Python 的__all__