admin 发布的文章

连续加班两周后,周六早上被朋友一个电话拽去爬山。出发前我还在纠结“要不要带电脑,也许路上能看两页文档”——现在想想挺好笑的。

山上的三个小时
没有信号,没有消息通知。前半个小时手机还会习惯性掏出来看一眼,后来干脆塞进背包最底层。取而代之的是:踩碎落叶的声音、半山腰突然出现的野猫、还有云层缝隙里漏下来的光。

朋友说了句话让我印象很深:“你有没有发现,我们盯着屏幕看 bug 可以看四五个小时,看风景却坚持不了四五个分钟。”

一些想到的
平时写代码遇到问题,习惯死磕,磕到深夜,第二天效率更低,形成恶性循环。但这次爬山途中,上周卡住我的一个逻辑问题,居然在毫无征兆的情况下想通了——不是在思考它的时候,而是在完全不思考它的时候。

后来查了资料,这好像是有心理学依据的:大脑在放松时会在“后台”继续处理未解决的问题。所以适度休息不是浪费时间,是另一种形式的工作。

下山之后
晚上回家,没有打开电脑。泡了杯茶,把这本拖了半年的书读了五十页,十一点前睡觉。周日早上醒来,精神好得不像话。

给自己的新规矩:

每周至少半天彻底离开屏幕;
卡壳超过一小时的问题,先放一放,出去走走往往有奇效;
身体是唯一不能重启的硬件。
生活不只是 0 和 1,还有山、风和一杯热茶。

月底看账单总是一头雾水:“这个月钱都花哪了?”记账 App 广告多、权限多,索性自己写了个极简脚本。

需求很简单
命令行快速记一笔:python jizhang.py 午饭 25
自动记录日期和分类
月底一条命令生成汇总
核心代码(约40行)

import sys, csv, os
from datetime import date
from collections import defaultdict

FILE = "bills.csv"

def add(item, amount):

with open(FILE, "a", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow([date.today(), item, amount])
print(f"已记录:{item} ¥{amount}")

def summary(month):

total = 0
cats = defaultdict(float)
with open(FILE, encoding="utf-8") as f:
    for row in csv.reader(f):
        if row[0].startswith(month):
            total += float(row[2])
            cats[row[1]] += float(row[2])
print(f"{month} 总支出:¥{total:.2f}")
for k, v in sorted(cats.items(), key=lambda x: -x[1]):
    bar = "█" * int(v / total * 20) if total else ""
    print(f"  {k:<8} ¥{v:<8.2f} {bar}")

if name == "__main__":

if sys.argv[1] == "汇总":
    summary(sys.argv[2])
else:
    add(sys.argv[1], float(sys.argv[2]))

效果
2026-06 总支出:¥3218.50
吃饭 ¥1280.00 ████████
交通 ¥420.00 ██
买书 ¥356.00 ██
...
一些感想
这个脚本技术上毫无难度,但带给我两点启发:

解决自己的问题,是最好的学习驱动力。为了加一个“按分类汇总”,我顺手学了 defaultdict 和 argparse;
工具不必完美,能用就行。数据存在 CSV 里想迁移时随时能拿走,反而比某些云同步 App 让我安心。
后续打算加上 matplotlib 画个饼图,学完再来更新。

记录一次让我后背发凉的 Git 事故,以及之后总结的经验。

事故经过
上周三,我在一个功能分支上写了三天的代码。当时想切换回主分支看个东西,随手敲了:

git checkout main
结果 Git 提示有未提交的修改,我没细看,直接上了 --force 的心思,先执行了:

git stash
然后鬼使神差地执行了:

git stash drop
当场傻眼——stash 列表空了,三天的修改看起来“消失”了。

抢救过程
冷静下来后想起一个知识点:Git 几乎不会真正删除数据,drop 只是把引用删了,对象还在。

找到被 drop 掉的 stash 记录

git fsck --unreachable | grep commit
会列出一堆“不可达”的 commit,挨个查看:

git show 一长串hash值
找到目标后恢复:

git stash apply 那个hash
三天的代码,失而复得。那一瞬间对 Git 的敬畏之心拉满。

三条教训
任何删除性操作前,先 git stash list 看一眼,确认操作对象;
改动到一半也要勤 commit,本地小提交不丢人,出事才是大事;
可以把 git reflog 当作后悔药,但别把“有后悔药”当作可以随便浪的理由。

注册这个域名的时候犹豫了很久,总觉得“等学得差不多了再写吧”。后来想明白一件事:学习这件事永远没有“差不多了”的时候,如果一直等,就永远不会开始。

决定写博客,主要有三个原因:

  1. 输出倒逼输入

以前看技术文章,看完就忘,感觉懂了,其实只是“看懂了”。费曼学习法说得好,能把一个东西讲清楚,才是真的理解。写博客就是强迫自己把零散的知识点串成体系。

  1. 给未来的自己留痕迹

去年折腾某个配置时踩过的坑,今年再遇到,翻遍聊天记录和收藏夹都找不到当时的解决方案。如果当时记下来,五分钟就能解决。

  1. 记录生活,不止代码

人这一生,记忆比想象中可靠得多的是文字。技术之外,读书、旅行、和一些突然的念头,也值得被留下来。

这个博客不追求流量,就是自己的一方小天地。如果能顺便帮到搜索而来的陌生朋友,那是意外之喜。

第一篇,就写到这里。以后尽量周更,做不到也不自责——毕竟,坚持下去比完美更重要。