Taskwarrior Server Config Guide

Taskwarrior 3.x 同步服务器配置指南 本文介绍如何使用 Docker 部署 taskchampion-sync-server,为 Taskwarrior 3.x 提供跨设备同步功能。 背景知识 Taskwarrior 是一款强大的命令行任务管理工具。从 3.0 版本开始,官方不再支持 taskd 服务器,改用新的 taskchampion-sync-server。 与 taskd 相比,新同步服务器的优势: 无需手动配置 SSL 证书 无需预先创建用户账户 客户端数据端到端加密 部署和维护更简单 服务器端配置 使用 Docker 部署 创建数据目录并启动容器: sudo mkdir -p /var/lib/taskchampion-sync-server sudo chmod 777 /var/lib/taskchampion-sync-server docker run -d \ --name taskchampion \ -p 53589:8080 \ -e RUST_LOG=info \ -v taskchampion-data:/var/lib/taskchampion-sync-server \ --restart unless-stopped \ ghcr.io/gothenburgbitfactory/taskchampion-sync-server:main 端口说明:容器内部使用 8080,映射到宿主机的 53589(可自定义)。 配置防火墙 确保服务器防火墙开放相应端口。以常见的云服务器防火墙为例: 类型:入站 行动:允许 协议:TCP 目的端口:53589 验证服务运行 docker ps | grep taskchampion docker logs taskchampion 正常运行时应看到: ...

December 27, 2025 · 2 min · 298 words · Starslayerx

Python PEP 683: Immoral Objects

PEP 683 改变了 Python 原有引用计数的一些逻辑,下面简单介绍一下。 CPython 的“引用计数可变性”已经成为并发、性能和未来发展的系统性障碍。 引用对象导致 “逻辑不可变对象” ≠ “物理不可变对象” 在 Cpython 中 None True/False int, str, list 等内建对象 在运行时引用计数会频繁变动,这意味着内存内容在不断被写入,在底层并非真正的 immutable 引用计数写操作降低并发性能 CPU Cache Line 失效 Py_INCREF / Py_DECREF 会写内存 -> cache line invalidation 在多线程 / 多核环境中,同一个全局对象被频繁引用,会造成严重的缓存抖动 fork + Copy-on-Write 失效 父子进程共享内存页 只要引用计数一变 -> 页面被写 -> 触发 COW 只是“多拿了个引用”,却导致整页内存复制 为 free-threading (no GIL) 清扫道路 CPython 的引用计数本质是全局共享的可变状态,在无 GIL 下会产生高频数据竞争。 要么给 refcount 加锁(性能太差),要么让一部分的 refcount 不再变化。 该提案将“对象生命周期模型”划分成了两类对象 对象类型 生命周期 refcount 行为 普通对象 动态 正常增减 不朽对象 解释器级 固定,不参与 gc 这让后续优化和推理都更清晰,也会导致 sys.getrefcount() 不再具有语义价值,测试默认返回 2 的 23 次方减 1。

December 23, 2025 · 1 min · 84 words · Starslayerx

Python Tricks Part 5: Functions

函数是 Python 的基础模块,本篇会介绍 function application 函数定义、function application 函数应用、scoping rules 作用域规则、closures 闭包、decorators 装饰器和其他函数式编程特性。 特别关注不同的编程习惯 idioms、求值模型以及与函数相关的模式。 Default Arguments 你可以通过在函数定义处赋值的方式,给函数的参数添加默认值,例如: def split(line, delimiter=","): statements 当一个函数定义了默认参数的时候,其右侧都必须是含有默认值的可选参数。 默认函数参数会在函数首次定义的时候调用一次,这有时会导致出乎意料的行为: def func(x, items=[]): items.append(x) return items func(1) # returns [1] func(2) # returns [1, 2] func(3) # returns [1, 2, 3] 注意到每次掉都将函数默认值给修改了,要避免这种行为,使用 None 并进行检查: def func(x, items=None): if not items: items = [] items.append(x) return items 通常来说,建议只使用不可变对象作为默认参数值。 Variadic Arguments 可变参数 如果在最后一个参数前使用 asterisk 星号作为前缀,函数就可以接受可变数量的参数。 def product(first, *args): result = first for x in args: result = result *x return result product(10, 20) # 200 product(2, 3, 4, 5) # 120 在这个例子中,所有的额外参数都作为一个元组放在 args 变量中。 对于元组,你可以使用序列的标准操作处理,如迭代、切片,解包等。 Keyword Arguments 函数参考可以通过显示命名每个参数并指定值来提供函数参数。 这被称为 keyword arguments 关键字参数,例如: ...

December 19, 2025 · 16 min · 3236 words · Starslayerx

Python Tricks Part 4: Objects, Types and Protocols

Essential Concepts 每个存储在程序中的数据都是一个对象,每个对象都有一个 identity, type and value (身份、类型和值)。 例如 a = 42 会创建一个整数为 42 的类型,该对象的 identity 是内存中的一个数字,代表其在内存中的位置,a 是这个类的标签,指向这个特定的内存位置,标签本身并非对象的一部分。 object 对象的类型,也被称为 class 类,该类定义了对象的内部数据表示,和支持的方法。 当特定类型的对象创建后,该对象被称为该类的 instance “实例”。 当实例创建后,其 identity 就不会改变。 如果一个对象的值可以被修改,则该对象是可变的 mutable。 如果一个对象的值不可以被修改,则该对象是不可变的 unmutable。 一个持有对其他对象引用的对象,被称为容器。 对象通过其属性来表征,属性是于对象关联的值,通过点 . 运算符来访问。 属性可以是一个简单的值,例如一个数字,也可以是一个被调用以执行某些操作的函数。 这类函数被称为方法,例如下面这个例子 a = 34 # Create an integer n = a.number # Get the numberator (an attribute) b = [1, 2, 3] # Create a list b.append(4) # Add a new element using the append method Object Identity and Type 内置函数 id() 返回对象的 identity,该 identity 是一个整数,通常对应 object 的内存地址。 is 操作符会对比两个对象的 identity,type() 返回对象的类型。 ...

December 18, 2025 · 9 min · 1715 words · Starslayerx

Shell

Terminal 终端是提供文本用户界面的程序,早期终端是集成设备,键盘和屏幕集成在一起,现在终端知识简单的应用程序。 除了基本的输入输出外,终端还支持将所谓转义序列或转移码,用于光标和屏幕处理,并可能支持颜色。 例如,使用 Ctrl-h 会删除前面一个字符。 环境变量 TERM 可能使用了终端模拟器,其配置可以通过 infocmp 获得 # Reconstructed via infocmp from file: /usr/share/terminfo/74/tmux-256color tmux-256color|tmux with 256 colors, am, hs, km, mir, msgr, xenl, colors#256, cols#80, it#8, lines#24, pairs#32767, acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M, ... 显示内容看上去很混乱,这些是 Shell shell 是一个运行在终端内部的程序,充当命令解释器。 shell 通过流提供输入和输出处理,支持变量,有一些内置命令,处理命令执行和状态,支持交互式和脚本使用。 最初的 shell 叫做 Bourne shell sh,即作者名字命名,现在通常被 bash 替代,即 “Bourne Again Shell” 的缩写。 file -h /bin/sh Stream shell 为每个进程提供了三个默认的文件描述符 (FD),用于输入和输出: ...

December 18, 2025 · 5 min · 995 words · Starslayerx

Python Tricks Part 3: Program Structure and Control Flow

Exceptions 异常 exceptions 具有一些标准属性,这些属性在需要针对错误执行进一步操作的代码中可能非常有用。 e.args 这是引发异常时提供的元组,在大多数情况下,这是一个包含描述错误字符串的单元元素元组。 对于 OSError 异常,其值是一个包含整数错误码、字符串错误消息,以及可选文件名的 2 元组或 3 元组。 e.__cause__ 如果该异常是在处理另一个异常时有意引起的 raise ... from ...,Python 会将这两个异常链接起来,形成异常链。 e.__context__ 如果异常是处理异常时无意间导致的,则会产生 e.__context__。 e.__traceback__ 与异常相关联的堆栈回溯对象。 用于存储异常值的变量仅在相关的 except 块内部可以访问,一但控制论离开该块,该变量将变为未定义。 try: int('N/A') except ValueError as e: print('Failed:', e) print(e) # Fails -> NameError. 'e' not defined 多异常处理块通过多个异常子句指定: try: # do something except TypeError as e: # Handle Type error except ValueError as e: # Handle Value error 当然也可以在单个子句中处理多个异常类型 try: # do something except (TypeError, ValueError) as e: # Handle Type or Value error 可以使用 pass 忽略报错 ...

December 17, 2025 · 7 min · 1335 words · Starslayerx

Python Tricks Part 2: Operators, Expressions and Data Manipulation

Literals 整数 04 0b101010 # Binary 二进制 0o52 # Octal 八进制 0x2a # Hexadecimal 十六进制 浮点数,内部使用 IEEE 754 双精度存储 4.2 42. 4.2e+2 # 科学记数法 4.2E2 -4.2e-2 数字类型字面量还可以使用 _ 来方便阅读 123_456_789 Truth Values true: 非0数字、任何非空的字符串,列表,元组或字典 false: 0、None、空列表,元组或字典 Operations Involving Iterables 任何可迭代对象都可以展开,如 list, tuple and set,都通过星号(*)。 items = [1, 2, 3] a = [10, *items, 1] # [10, 1, 2, 3, 1] b = (*items, 10, *items) # [1, 2, 3, 10, 1, 2, 3] c = {10, 11, *items} # {10, 11, 1, 2, 3} 在上面例子中,item 简单的被粘贴到 list, tuple, set 中,就和手动输入进去一样。 有时候这种展开 expansion 被称为“展开操作符” splatting。 ...

December 16, 2025 · 2 min · 328 words · Starslayerx

Python Tricks Part 1: Basis

这篇文章总结一些平时容易被忽略的 Python 知识 Primitives, Variables and Expressions print(f"{year:>3d} {principal:0.2f}") >3d 指至少 3 位十进制数,右对齐 0.2f 指精度为 2 位的浮点数 Arithmetic Operators round(x, [n]): 该函数采用 Banker’s Rounding 银行家舍入法,也叫 四舍六入五成双,当要舍弃的数字正好是 5 时 前一位是偶数 → 向下舍去(向偶数靠拢) 如果前一位是奇数 → 向上进位(向偶数靠拢) 这样做的目的是减少舍入误差的累积,在统计学和金融计算中更为公平。 # 常规四舍五入(Python实际行为是银行家舍入) print(round(1.5)) # 2 (1是奇数,5进位) print(round(2.5)) # 2 (2是偶数,5舍去) print(round(3.5)) # 4 (3是奇数,5进位) print(round(4.5)) # 4 (4是偶数,5舍去) # 更复杂的例子 print(round(1.25, 1)) # 1.2 (2是偶数,5舍去) print(round(1.35, 1)) # 1.4 (3是奇数,5进位) print(round(1.251, 1)) # 1.3 (因为后面还有1,不是正好5,正常进位) 银行家舍入法是 IEEE 754 标准推荐的方式,Python、R、NumPy 等都采用这种舍入方式,能有效减少大量数据计算时的统计偏差。 Python 二进制运算符会将整数视为 2’s complement binary representation 二进制补码,并且符号位会在左侧无限扩展。 此外,Python 不会截断二进制,也不会溢出。 ...

December 15, 2025 · 4 min · 662 words · Starslayerx

Git cherry-pick

Patch Application 补丁应用类似下面这样(Codex 使用的 OpenAI Patch 是不是借鉴的这个?)的描述文件变更的文本文件,通常包含: 哪些文件被修改 具体的行级变更 上下文信息 # 创建补丁 git diff > changes.patch # 未暂存的修改 git diff --cached > changes.patch # 已暂存的修改 git format-patch HEAD~3 # 最近 3 次提交生成补丁 # 应用补丁 git apply changes.patch # 直接应用,不创建提交 git am changes.patch # 应用并创建提交(用于format-patch生成的) 命令如 git diff、git stach 和 git rebase 都使用 patch。 这种修改方法,如果产生冲突则需要手动处理。 3-Way Merge 三方合并则是一种智能的合并算法,使用三个版本来解决合并冲突: A - B (feature分支) / Base \ C - D (main分支) Base: 共同的祖先提交 Current: 当前分支的最新提交 Incoming: 要合并进来的分支的最新提交 合并过程: ...

December 8, 2025 · 1 min · 193 words · Starslayerx

Writing a good CLAUDE.md

如何编写一个好的 CLAUDE.md 注意:本文同样适用于 AGENTS.md,这是 CLAUDE.md 的开源等效文件,适用于 OpenCode、Zed、Cursor 和 Codex 等代理和工具。 原则:LLMs(基本上)是无状态的 LLMs 是无状态函数。它们的权重在用于推理时是冻结的,因此它们不会随时间学习。模型对你的代码库唯一了解的就是你输入给它的 tokens。 类似地,像 Claude Code 这样的编码代理工具通常需要你显式管理代理的记忆。CLAUDE.md(或 AGENTS.md)是默认情况下唯一会进入你与代理的每一次对话的文件。 这有三个重要含义: 编码代理在每个会话开始时对你的代码库一无所知。 代理必须在每次启动会话时被告知关于代码库的任何重要信息。 CLAUDE.md 是实现这一点的首选方式。 CLAUDE.md 让 Claude 了解你的代码库 由于 Claude 在每个会话开始时对你的代码库一无所知,你应该使用 CLAUDE.md 来引导 Claude 了解你的代码库。在高层次上,这意味着它应该涵盖: 是什么(WHAT):告诉 Claude 关于技术栈、项目结构。给 Claude 一张代码库地图。 这在 monorepos 中尤其重要!告诉 Claude 有哪些应用、有哪些共享包,以及每个部分的用途,这样它就知道在哪里查找内容 为什么(WHY):告诉 Claude 项目的目的以及仓库中所有内容的作用。项目不同部分的目的和功能是什么? 如何(HOW):告诉 Claude 应该如何在项目上工作。例如,你使用 bun 而不是 node?你需要包含它实际完成有意义工作所需的所有信息。Claude 如何验证它的更改?它如何运行测试、类型检查和编译步骤? 但你的做法很重要!不要试图把 Claude 可能需要运行的每个命令都塞进你的 CLAUDE.md 文件——你会得到次优结果。 Claude 经常忽略 CLAUDE.md 无论你使用哪个模型,你可能会注意到 Claude 经常忽略你的 CLAUDE.md 文件的内容。 你可以通过使用 ANTHROPIC_BASE_URL 在 claude code CLI 和 Anthropic API 之间放置一个日志代理来自己调查这一点。Claude code 在用户消息中注入以下系统提醒和你的 CLAUDE.md 文件: ...

December 2, 2025 · 2 min · 322 words · Starslayerx