Canary: a small idea about service lifecycles
Who this is for: Python backend developers who have started wondering how the services in their app should relate to each other. This post is about how Canary Framework grew out of a small idea. Where it started: FastAPI is great, but I wanted one more layerI started with FastAPI. It is well designed and restrained: it does what it should and nothing more. But after using it for a while and comparing it with Spring in the Java world, I felt that Python has no single, unified framework. Fas...
Canary:一个关于服务生命周期的小想法
适用读者:用 Python 写后端、写着写着开始琢磨”服务之间的关系该怎么组织”的开发者。本篇聊聊 Canary Framework 是怎么从一个小想法长出来的。 起点:FastAPI 很好,但我还想要一层最开始我用的是 FastAPI。它设计得很好,也很克制:只做它该做的事。 但用久了,拿它和 Java 的 Spring 生态一对比,会感觉 Python 这边并没有一个统一的框架。FastAPI 有依赖注入,但没有 ORM 的部分;每个项目都要自己把各种库拼起来。 于是我就想,给自己设计一个小脚手架。 很多复杂业务,需要一层业务层来缓冲接口层和服务层之间的依赖关系。在 FastAPI 里做这件事是可以的,但需要预先做一个良好的设计——什么放在哪、谁依赖谁、谁先初始化。这对我来说是一个心智负担,至少我是这样感觉的。 而且在用 AI 写代码的时候,这种”靠约定维持”的结构很容易被 AI 的一些小想法带偏:今天在这里多建一个全局对象,明天在那里多加一段初始化,结构就慢慢散了。 每个服务都有自己的生命所以我开始想服务之间的关系。它其实和微服务的概念差不多:每个服务都有自己的生命...
给博客做一套液态玻璃(上):玻璃到底是什么
适用读者:想在网页上做出「真玻璃」质感的前端开发者。本篇讲原理:为什么 backdrop-filter: blur() 做不出玻璃,以及怎么用距离场和 SVG 滤镜把真正的折射做出来。下一篇讲怎么把它装进 Hexo + Butterfly。 从一个失败的起点说起想在网页上做玻璃,几乎所有教程都会给你这三行: 123background: rgba(255, 255, 255, 0.1);backdrop-filter: blur(12px);border: 1px solid rgba(255, 255, 255, 0.3); 这套东西做出来的是毛玻璃(frosted glass),不是玻璃。 去找一块真的玻璃,比如手机屏幕的边缘、一个玻璃杯的杯壁,你会发现: 玻璃中间几乎是完全透明的,不模糊 所有的「玻璃感」都集中在边缘:那里的背景是扭曲的,不是模糊的 边缘还会有一圈亮边,越接近边缘越亮 仔细看,扭曲的地方带一点彩边 上面那三行 CSS 里,没有一条在描述这四件事。 模糊是浴室玻璃,扭曲才是眼镜片。 玻璃的四个光学分量要在网页上重建玻璃,得先知道要重建什么。拆开来...
给博客做一套液态玻璃(下):在 Hexo + Butterfly 上实现
适用读者:用 Hexo + Butterfly 的人。上一篇讲了玻璃的原理,这一篇讲怎么把它装进 Butterfly:两个文件,不 fork 主题、不需要构建工具、不改一行主题源码。完整源码在文末,MIT 授权,随便用。 三条约束动手之前,先把限制写下来。这三条决定了后面所有的设计选择: 不能 fork 主题。 Butterfly 会更新,改了主题源码就等于放弃升级。 同屏几十个玻璃面。 文章页上卡片、侧栏、导航、代码块、表格、引用块全是玻璃。 不能降级成毛玻璃。 浏览器不支持时可以少一些效果,但不能退回 blur() 就算完事。 整体思路1CSS 变量 → 距离场 → 位移贴图 → SVG 滤镜 → backdrop-filter CSS 定义参数。 每档玻璃是一组自定义属性:折射强度、折射带宽度、倒角锐度、色散强度。 JS 读参数、生成贴图。 用距离场算出每个像素的表面斜率,编码进一张图的红绿通道。 SVG 执行。 feDisplacementMap 按贴图去弯曲 backdrop。 所有的面都是玻璃,只是权重不同最容易犯的错是「给卡片加个玻...
通过 archinstall 安装 Arch Linux
通过 archinstall 安装 Arch Linux 适用读者:对 Linux 有基本了解、想体验 Arch Linux 的开发者,以及希望了解 Arch 安装全过程的 Linux 新手。 前言:为什么选择 Arch Linux?Arch Linux 以”滚动更新”著称——软件包永远是最新的,不存在大版本跨越的升级阵痛。它不预装任何多余的东西,你安装什么就有什么,系统完全由你掌控。代价是:安装门槛比 Ubuntu、Fedora 等发行版要高一些。 好在官方提供了 archinstall 这个交互式安装脚本,极大降低了安装难度,同时不失对安装过程的精确控制。 一、准备工作1.1 下载 ISO 镜像前往 Arch Linux 官网下载最新 ISO: 1https://archlinux.org/download/ 国内推荐用镜像站加速下载: 清华大学镜像站:https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/ 中科大镜像站:https://mirrors.ustc.edu.cn/archlinux/iso/...
安装通用开发工具
安装通用开发工具 适用读者:已完成 Arch Linux 安装(无论实体机还是 WSL),想搭建完整开发环境的读者。本文所有步骤在两种环境下均适用。 前言:我们要装什么?一个典型的全栈开发环境需要: 工具 用途 git 版本控制,几乎所有项目必备 yay AUR 助手,扩展 Arch 软件源 sdkman Java/Maven 版本管理 nvm Node.js 版本管理 uv Python 虚拟环境和包管理(Rust 写的,极快) go Go 语言工具链 docker 容器化运行环境 neovim + LazyVim 高效终端编辑器 kitty GPU 加速终端模拟器(实体机) zip / unzip 压缩解压工具(sdkman 依赖) 一、安装 git(通过 pacman)为什么先用 pacman 安装 git? 后续安装 yay(AUR 助手)需要从 GitHub 克隆代码,而克隆就需要 git。pacman 是 Arch 内置的包管理器,git 在官方源里有,直接装: 1sudo pacman -...
通过 WSL 安装 Arch Linux
通过 WSL 安装 Arch Linux 适用读者:Windows 用户,想在不折腾物理机、不装双系统的情况下,在 Windows 里使用完整的 Arch Linux 开发环境。 前言:WSL 是什么?WSL(Windows Subsystem for Linux)是微软内置于 Windows 10/11 的 Linux 兼容层,让你可以在 Windows 里运行一个真实的 Linux 内核和发行版。WSL2 使用完整的 Linux 内核(而不是模拟层),性能接近原生,文件系统、网络、进程隔离都更完善。 WSL 的优点: 无需重启,Windows 和 Linux 同时运行 可以直接访问 Windows 文件(/mnt/c/ 等) 支持 GUI 应用(WSLg) 开发工具链(git、Python、Node.js、Docker 等)可以原生运行在 Linux 环境 WSL 默认只提供 Ubuntu,但 Arch Linux 可以通过第三方方式安装进来,享受 Arch 的滚动更新和 AUR 生态。 一、启用 WSL21.1 系统要求 Windows 10 版本 20...
中文环境配置和中文输入法
中文环境配置和中文输入法 适用读者:已完成前四篇配置、需要在 Arch Linux 上使用中文界面和输入法的读者。 前言:中文支持的两个层面在 Linux 上”用中文”包含两件事: 中文显示:系统界面、终端、应用程序能正确显示中文字符(需要正确的 locale 和字体) 中文输入:能通过拼音等方式输入汉字(需要输入法框架) 两者都需要配置,缺一不可。 一、配置系统中文环境(locale)1.1 什么是 locale?locale 是操作系统的本地化设置,决定系统使用的语言、字符编码、日期格式、货币符号等。zh_CN.UTF-8 就是”中国大陆简体中文、UTF-8 编码”的 locale。 1.2 生成中文 locale编辑 /etc/locale.gen,取消注释中文和英文的 UTF-8 行: 1sudo nano /etc/locale.gen 找到并去掉这两行的 #: 12en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8 然后生成: 1sudo locale-gen 为什么要同时保留英文 locale? 某些程序在中文 locale 下会产...
niri 和 Hyprland 配置(DMS)
niri 和 Hyprland 配置(DMS) 适用读者:已在实体机上安装 niri 或 Hyprland 的读者。WSL 用户跳过此篇(WSL 没有独立的 Wayland 显示服务器)。 前言:窗口管理器 ≠ 桌面环境安装完 niri 或 Hyprland 后,你会发现它们只是”窗口管理器”——负责排列、移动窗口。一个完整可用的桌面还需要: 状态栏(显示时间、网络、音量、电量) 应用启动器(搜索和打开应用) 通知系统(消息弹窗) 锁屏程序 壁纸管理 屏幕截图工具 剪贴板管理 把这些一个个手动安装配置,需要几天时间。DMS(Dank Material Shell) 是一个一站式的桌面 Shell,设计目标就是让 niri 和 Hyprland 开箱即用,界面遵循 Material Design 3 风格,外观现代、功能完整。 一、DMS 简介DMS 全称 DankMaterialShell,是基于 Quickshell(一个 QML 驱动的 Shell 框架)和 Go 构建的桌面 Shell。它能替代以下独立工具: 替代的工具 DMS 对应功能 Waybar...
LeetCode 1. Two Sum
题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 解题思路本题要求在一个数组中找出两个和为 target 的数,并返回它们的下标。最直观的做法是双重循环遍历,时间复杂度为 O(n²),但这不是最优解。 更高效的做法是使用哈希表。核心思路是:遍历数组,对于每个元素 nums[i],我们计算出它需要的配对值 target - nums[i],然后在哈希表中查找该配对值是否已经出现过。如果出现过,说明我们找到了答案,直接返回两个下标即可;如果没有出现,则将当前元素的值和下标存入哈希表,供后面的元素查找。 这样做的好处是: 每个元素只需要遍历一次,时间复杂度为 O(n) 通过哈希表的 O(1) 查找,快速判断配对值是否存在 一次遍历即可完成查找和存储,简洁高效 复杂度分析 时间复杂度:O(n),其中 n 是数组长度。只需要遍历一次数组,每次查找和插入哈希表都是 O(1)。 空间复杂度:O(n),哈希表中最多存储 n 个元...