博客 | Blog

使用 chatGPT 编写自动添加 beancount balance 断言语句

我使用 beancount 记账流程中的有一步是这样的,将每张信用卡的账单日添加到滴答清单中,每月重复。 每当到达账单日时,提醒我在 beancount 文件中添加一条对应帐目的 balance 断言语句,由于大部分信用卡 的出账是有滞后的,所以该balance断言通常需要同时加上!标记,便于后续账单出来后修改。

这个过程是比较机械的,所以我想到了使用 chatGPT 来自动化这个过程,这样我只需要在出账后手动更新自动添加 的断言语句,将金额修改为正确的还款金额,同时去除!标记。最终的脚本如下。

import datetime

def add_balance_statement(ledger_path, account, date, balance, currency):
    with open(ledger_path, 'a') as file:
        file.write(f"{date} balance {account} {balance} {currency}\n")

def auto_add_balance_statements(ledger_path, credit_cards):
    today = datetime.date.today()
    for card in credit_cards:
        bill_date = card['bill_date']
        accounts = card['accounts']
        balance = card['balance']
        currency = card['currency']
        if today.day == bill_date:
            for account in accounts:
                add_balance_statement(ledger_path, account, today, balance, currency)
                print(f"Balance statement added for {account} on {today}.")

# Specify the path to your Beancount ledger file
ledger_file_path = "<ledger_path>"

# Specify your credit card details (bill date, accounts, balance, and currency)
credit_cards = [
    {
        'bill_date': 1,  # Example: 1st of the month
        'accounts': [
            {'account': 'Assets:CreditCards:Card1:Account1', 'currency': 'USD'},  # Example: Account1 for Card1 with USD currency
            {'account': 'Assets:CreditCards:Card1:Account2', 'currency': 'EUR'},  # Example: Account2 for Card1 with EUR currency
        ],
        'balance': 1000.00,  # Example: Current balance for Card1
        'currency': 'USD'  # Example: Currency for Card1
    },
    {
        'bill_date': 15,  # Example: 15th of the month
        'accounts': [
            {'account': 'Assets:CreditCards:Card2:Account1', 'currency': 'USD'},  # Example: Account1 for Card2 with USD currency
            {'account': 'Assets:CreditCards:Card2:Account2', 'currency': 'GBP'},  # Example: Account2 for Card2 with GBP currency
        ],
        'balance': 2000.00,  # Example: Current balance for Card2
        'currency': 'USD'  # Example: Currency for Card2
    },
    # Add more credit card details as needed
]

# Call the function to automatically add balance statements
auto_add_balance_statements(ledger_file_path, credit_cards)

对于有兴趣的读者,可以看我和 chatgpt 的几轮对话。

...

MiniFlux Starred as Feed

Miniflux 是一个非常好用的 RSS 自托管方案,支持自建,支持多种客户端,支持多种订阅方式。 最近由于在折腾 Archivebox,需要将 Miniflux 中的 Starred Feed 作为一个 Feed 输出,以便于 导入星标条目到 Archivebox。 Miniflux 本身并不支持这个功能,但是其提供了 API,可以比较简单的导出 Starred 内容。

备选方案 #

如果是自己使用 Python 写的话,可以利用 https://github.com/miniflux/python-client 这个库,配合 feedgen 也能写个大概的,核心代码大概如下:

import miniflux
from feedgen.feed import FeedGenerator

client = miniflux.Client("https://miniflux.example.com", api_key="api_key")
entries = client.get_entries(starred=True, limit=50)

def create_rss_page(data):
    fg = FeedGenerator()
    fg.title('Miniflux Starred Feed')
    fg.link(href='https://miniflux.wogong.net', rel='self')
    fg.language('en')
    fg.description('Miniflux Starred Feed')

    for entry in data['entries']:
        fe = fg.add_entry()
        fe.id(entry['id'])
        fe.title(entry['title'])
        fe.link(href=entry['url'])
        fe.description('nothing')
        fe.author(name=entry['author'])
        fe.pubDate(entry['published_at'])

    rss_feed = fg.rss_str(pretty=True)
    fg.rss_file('rss.xml')
    return rss_feed

但是本着不自己造轮子的原则,找到了一些现成的工具,例如

...

Clash 作为网关的透明代理(更新)

距离上一篇介绍该主题的文章已经过去了接近三年,[Clash 作为网关的透明代理]({% post_url 2020-11-27-clash-transparent-proxy %}) 中间使用到的方案其实多次变更,例如使用了很长一段时间 的 shellclash,这个方案胜在省心,可以直接在支持的 路由器上部署,但是内核更新缓慢,作者对配置加了很多自定义设置,虽然出发点是为了方便大部分小白用户,但是 严重降低了自定义的能力。而且默认的一些设定大概率会导致 DNS 泄漏问题,关于这个话题可以参考 不良林的相关视频。这是不可接受的,因此前段时间又回归到使用 PVE 上虚拟机的方案。

简单摸索了一下最新方案发现 redir-host 模式已经被 Clash 官方放弃,不建议再使用。 TProxy 模式当然 没啥问题,但是毕竟得自己处理 iptables 规则。在没有性能瓶颈的情况下,更推荐使用 tun 模式,可以自动 处理路由等问题。下面简单介绍一下相关配置。

首先,在网关机器上打开 ipv4 转发, echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p

其次 Clash 配置文件头部添加如下

tun:
  enable: true
  stack: system # or gvisor
    #dns-hijack:
    #    - any:53
    #    - tcp://any:53
  auto-route: true
  auto-detect-interface: true
dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:53
  enhanced-mode: fake-ip       # redir-host or fake-ip
  fake-ip-range: 198.18.0.1/16    # Fake IP addresses pool CIDR
  use-hosts: true                 # lookup hosts and return IP record
  nameserver:
    - 114.114.114.114

最后在局域网的 DHCP 服务器设置网关为该机器 IP 即可,也可以手动在希望走代理机器的网关设置未该机器 IP。

...

用于 beancount 快速记账的 Telegram Bot

当年从随手记迁移到桌面记账方式(Excel/GnuCash/Beancount)后,确实有一段时间的不适应。 后来实在没有找到好用的移动端记账 APP,同时也适应了桌面记账,遂被驯化认为不需要在移动场景 记账。Costflow 出来之后没有第一时间尝试的原因也在于此,使用一段时间基于 costflow 语法 的 Telegram 机器人之后,发现经常是想要的账户没有配置,导致使用频率并不高。

前段时间的某一天突然意识到,为什么要提前配置账户信息呢?账户信息全部都在账本文件中,直接 查询账本文件不就可以避免冷启动的问题么。遂自己开坑写了一个新的记账机器人 beancount-bot

使用一月有余,今天完善了一下相关功能,更新了文档和使用例子。下面是几点简要说明:

  1. 适合手动记账党 :D
  2. 适合有自己服务器的人(境内服务器需要配置代理),部署在本地 NAS 上也是可行的
  3. 不兼容 costflow 语法,不需要账户信息的配置,账户的匹配是读取账本文件,类似编辑器的账户补全

在这里分享给大家,希望可以节省一点记账/对账的时间,有兴趣的欢迎尝试。

GitHub notification cannot clear bug

A few days ago I received a new type of spam email. Basically they create a GitHub repo and then spam everyone they want in the issues by @ them. Of course this gets banned after being reported. I do not do anything because I think someone else will do the reporting work.

Days later, when I log in to GitHub, I notice that there is a dot in the notification box, which means that there are unread notifications. So I tried to mark all notifications as read. The problem is that the spam notifications refuse to be deleted. Why is that? After checking I found that the spam repo has been deleted, maybe by GitHub. I tried everything in the Wed UI but failed.

...

在 cron/systemd timer 任务中的 git 认证

本文回答如何在 systemd timer 任务或者 cron 任务中进行 git 认证,方便进行 git pull/push 操作。

首先,不推荐 ssh-key 方式,不推荐,因为安全性和粒度控制不够。设置无 passphrase 的私钥(不安全),无法分 repo 控制权限。

推荐使用 https 配合 GitHub Personal Access Token 的方式,主要使用 gitcredentials - Providing usernames and passwords to Git,参考文档链接 https://git-scm.com/docs/gitcredentialshttps://git-scm.com/book/en/v2/Git-Tools-Credential-Storage

首先在 https://github.com/settings/apps 生成 Personal Access Token (PAT),建议使用细粒度的 token,降低泄露 token 的损失。

其次在需要操作的 repo 根目录进行设置

# 使用文件的方式储存认证信息
git config --local credential.helper store
# 使用路径来区分不同的认证信息
git config --local credential.useHttpPath true

设置完毕后手动操作一次,保存好 repo 的认证信息即可,认证信息储存在 ~/.git-credential.

数字生活 2023Q2

发现进行增量更新并不方便,还是在进行增量更新后附上一份最新的工具库清单。

  • 输入
    • miniflux
    • 播客重新用回 Overcast,解决了网络问题体验还是很棒的,小宇宙这种国产审查平台再也不见。
  • 输出
    • 几乎没有输出,所以也就没有变化。
  • 工具
    • 小票管理直接上传到 Google Drive,充分利用其强大的搜索能力(OCR),将前期 Google Keep 中积攒的通过 Google Takeout 导出并上传至 Drive。
  • 硬件
    • 新增了 rtx 4090 可别再说没有硬件条件做实验了
    • 电源适配器 小米 67W 2C1A
  • 信息流
    • 几乎放弃了 readwise 为什么呢?使用的摩擦力终究是大了一点点

最后,完整版本的工具库抄录如下

  • 输入
    • 社交网络:Twitter
    • 论坛:V2EX, hacker news
    • RSS 订阅 (miniflux),主要信息来源,订阅了包括博客、newsletter、微信公众号、微博时间线等内容
    • 视频:Youtube, Netflix, BiliBili
    • 音乐:Spotify
    • 播客:Spotify, Overcast
    • 书籍:Kindle, 墨案
  • 输出
    • 笔记:Obsidian
    • 博客
    • 书评:goodread
    • Twitter
  • 工具
    • 即时通信 telegram, Wechat
    • Dropbox, Google Drive 文件同步与备份,在线文档
    • Pinboard 网络书签
    • Cubox 作为个人网络收藏内容仓库
    • Toggl 时间记录
    • Anki 背诵
    • Instapaper 稍后阅读
    • Bitwarden 自建的密码管理及两步验证管理工具
    • RSSHub 自建 RSS 辅助工具
    • Clash Surge 代理工具
    • 滴答清单 待办管理工具
    • Google Calendar 个人日程管理
    • Beanocunt 个人金融数据
    • Airtable 个人物资管理 inventory
    • Google Drive 作为扫描小票收纳仓库
    • fastmail 托管邮件服务
    • Readwise 作为回顾工具
    • iCloud 2T 用于照片和备份
    • https://healthchecks.io/ 定时服务监控
    • https://uptimerobot.com 网络服务监控
  • 硬件
    • 计算机 MacBook Air M1 Mac Mini M2
    • 鼠标 鼠标 罗技(G)G304 LIGHTSPEED无线鼠标 鼠标 罗技(G)G102 有线鼠标 黑色
    • 键盘 PFU HHKB Professional HYBRID Type-S
    • iPhone 12, 128G MI10S
    • Apple Watch S8
    • AirPods Pro
  • 信息流
    • miniflux saved → Instapaper -> Cubox (IFTTT)
    • Douban RSS -> Pinboard (IFTTT)
    • Instapaper/Twitter → Pinboard (self)
    • Twitter liked + 书评 + etc -> Readwise -> Obsidian
    • Web -> Cubox (manual)

【译文】理查德·汉明《你和你的研究》

本文翻译自 https://www.cs.virginia.edu/~robins/YouAndYourResearch.html 最初了解该文来自 阮一峰 对该文的精简版介绍,https://www.ruanyifeng.com/blog/2016/04/you-and-your-research.html

理查德·汉明《你和你的研究》 #

贝尔通信研究所学术研讨会发言 1986 年 3 月 7 日 J. F. Kaiser  J. F. Kaiser 贝尔通信研究所 445 South Street
Morristown, NJ 07962-1910 jfk@bellcore.com

在贝尔通信研究学术报告系列的一个研讨会上,加利福尼亚州蒙特雷海军研究生院的教授、退休的贝尔实验室科学家理查德·W·哈明博士于 1986 年 3 月 7 日在莫里斯研究与工程中心向约 200 名贝尔核心员工和访客发表了一场非常有趣和激励人心的演讲,题为“你和你的研究”。这次演讲集中讨论了汉明对问题“为什么很少有科学家做出重大贡献,而很多人在长期内被遗忘?”的观察和研究。他在贝尔实验室工作了 30 年,拥有超过 40 年的经验,直接观察了许多科学家的行为,向科学家提出了非常尖锐的问题,问他们做了什么、如何做以及为什么做,他还研究了伟大科学家的生活和伟大贡献的产生,进行了内省并研究了创造力理论。这次演讲讨论了他在独立科学家的特性、能力、特点、工作习惯、态度和哲学方面所学到的东西。

为了使演讲中的信息更广泛地传播,本文对该演讲进行了仔细的录音转录。这份转录包括随后在问答环节中进行的讨论。与任何演讲一样,转录版本因为失去了演讲者的声音语调和手势而受到影响;必须听录音才能重新捕捉到演讲的那部分内容。虽然# 理查德·汉明的演讲录音完全可理解,但有些提问者的言论却不是。在录音不可理解的地方,我已经在括号中加入了我对提问者言论的印象。在有疑问且能确认提问者身份的情况下,我和每个提问者核实了对其言论解释的准确性。

关于理查德·W·汉明博士的介绍 #

作为贝尔通讯研究公司学术研讨会系列的演讲者,来自加利福尼亚州蒙特雷海军研究生院的理查德·W·汉明博士由贝尔通讯研究公司应用研究副总裁艾伦·G·钦诺威斯介绍。

Alan G. Chynoweth:各位同事,以及我了解到许多来自贝尔实验室的前同事今天也在这里与我们共聚一堂,我谨代表大家表示问候。今天是一个特别幸福的日子,我非常高兴地向大家介绍我多年的老朋友和同事 Richard Hamming,或者我们都熟知的 Dick Hamming。

汉明是数学和计算机科学领域中的伟大人物之一,我相信在座的观众不需要提醒。他在芝加哥大学和内布拉斯加大学接受了早期教育,并在伊利诺伊大学获得了博士学位;然后他在战争期间加入了洛斯阿拉莫斯项目。之后,于 1946 年,他加入了贝尔实验室。当然,那就是我遇到汉明的地方——当我加入贝尔实验室的物理研究组织时。那些日子里,我们习惯一起午餐,而这个来自数学领域的奇怪家伙总是很高兴加入我们。我们总是很高兴有他在一起,因为他带来了很多非正统的想法和观点。我可以向你保证那些午餐是很有启发性的。

虽然这些年来我们的职业道路并不是非常接近,但我一直在贝尔实验室的走廊里和碰到汉明,并一直非常钦佩他所做的事情。我认为事实证明了一切。要详细说明太长了,但是让我举个例子,他已经写了七本书,讲述了各种数学、计算机、编码和信息理论领域的书籍,其中三本已经进入了第二版。这毫无疑问证明了理查德·汉明的多产和地位。

我想上次见到他应该是在十年前的都柏林一个相当有趣的小型会议上,我们都是演讲者。像往常一样,他非常有趣。这只是他提出的挑衅性思想的又一个例子:我记得他说过,“有些波长人们看不见,有些声音人们听不到,也许计算机有些思维人们想不到。”有了理查德·汉明,我们不需要计算机。我认为我们将会听到一场非常有趣的演讲。

讲座:Richard W. Hamming 博士的 “你和你的研究” #

很高兴来到这里。我怀疑我是否配得上这样的介绍。我演讲的题目是:“你和你的研究”。这不是关于管理研究,而是关于你个人如何做你的研究。我可以讲另一个主题,但我现在不会,因为这次演讲是关于你的。我不是在谈论普通的研究,我说的是伟大的研究。为了描述伟大的研究,我偶尔也会说诺贝尔奖级别的工作,不过它不一定要获得诺贝尔奖,我说的是那些我们认为重要的事情。例如相对论、香农的信息理论,任何一种杰出的理论——我所说的就是这种东西。

那我是如何开始这项研究的呢?在洛斯阿拉莫斯,我被召来管理那些其他人已经运行起来的计算机,这样那些科学家和物理学家就可以回到他们的工作中。我认为我是一个替罪羊。我发现虽然身体上我和他们一样,但他们与我不同。坦白地说,我非常羡慕。我想知道他们与我不同的原因。我近距离看到了费曼,我也看到了费米和泰勒。我看到了奥本海默。我看到了汉斯 · 贝特:他是我的老板。我看到了许多非常有能力的人。我对那些做事的人和那些可能会做事的人之间的差异非常感兴趣。

当我来到贝尔实验室时,我加入了一个非常有成效的部门。那时 Bode 是部门主管;香农也在那里,还有其他人。我继续思考“为什么”和“有什么区别”。后来我通过阅读传记、自传,并向人们询问“你是怎么做到这一点的?”来进一步探究这些问题。我试图找出区别所在。这就是这次演讲的内容。

...

Kindle生词本导入Anki

不翻历史记录我都快忘记自己居然还写过关于 Anki 的文章,2021年这篇日常轻松制作Anki卡片。最近两年几乎没怎么长期使用 Anki,讽刺的是制作卡片轻松后导致卡片数量剧增,一段时间没有复习就积攒太多,再也无法跟上了。

最近重新拾起 Anki 是看到这篇文章,Augmenting Long-term Memory ,其实这篇文章在几年前也看过,这次重新阅读已然可以唤起对 Anki 的热情,重新出发首先删除了积攒的 500+待复习,(即使这样还有700+待学习)。接着根据文章建议,将所有需要背诵的内容整合到一个 deck 中,这也符合当初纸质笔记本的 All in One 原则,为此整理了散落在日常笔记中所有的 word 和 anki 标签内容,对了推荐 Obsidian + Anki 用户使用这个插件 https://github.com/Pseudonium/Obsidian_to_Anki,具体细节这里不赘述。

今天的主题当然是将 Kindle 的生词本导入 Anki 中,没想到宝藏博主 @wzyboy 在多年前的博客中早就提到了,Anki —— 高效的间隔重复记忆软件,根据对应的仓库 https://github.com/wzyboy/kindle_vocab_anki 完成基本没有问题,需要注意的有以下几点:

  1. vocab.db 文件所在的 system 文件夹是隐藏的,显示隐藏文件夹即可,或者直接输入地址;
  2. kindleunpack 可以处理 azw 文件,我使用 Calibre 将 azw 词典转换为 mobi 格式后,html 标记语言完全错乱,无法使用后续脚本,所以使用 DeDRM 后的 azw 格式词典即可;
  3. 添加卡片格式,导入卡片完全按照 Readme 即可,效果完美。

数字生活 2023Q1

  • 发现进行增量更新并不方便,还是在进行增量更新后附上一份最新的工具库清单。
  • 输入
    • miniflux
    • 播客几乎没怎么听
  • 输出
    • 几乎没有输出,所以也就没有变化
  • 工具
    • 使用Google Keep 作为小票管理工具 // 数据大了之后几乎打不开,目前放在相册,但是 iOS 的相册文字 OCR 搜索并不靠谱,目前就先放着吧
  • 硬件
    • 新增了 Mac Mini M2
  • 信息流
    • Twitter liked + 书评 + etc -> Readwise -> Obsidian
  • 最后,完整版本的工具库抄录如下
    • 输入
      • 社交网络:Twitter
      • 论坛:V2EX, hacker news
      • RSS 订阅(miniflux),主要信息来源,订阅了包括博客、newsletter、微信公众号、微博时间线等内容
      • 视频:Youtube, Netflix, BiliBili
      • 音乐:Spotify
      • 播客:Spotify,Overcast,小宇宙
      • 书籍:Kindle 墨案
    • 输出
      • 笔记:Obsidian
      • 博客
      • 书评:goodread
      • Twitter
    • 工具
      • 即时通信 telegram, Wechat
      • Dropbox, Google Drive 文件同步与备份,在线文档
      • Pinboard 网络书签
      • Cubox 作为个人网络收藏内容仓库
      • Toggl 时间记录
      • Anki 背诵
      • Instapaper 稍后阅读
      • Bitwarden 自建的密码管理及两步验证管理工具
      • RSSHub 自建 RSS 辅助工具
      • Surge 代理
      • 滴答清单 待办管理工具
      • Google Calendar 个人日程管理
      • Beanocunt 个人金融数据
      • Airtable 个人物资管理 inventory
      • iOS photoes 作为扫描小票收纳仓库
      • fastmail 托管邮件服务
      • Readwise 作为回顾工具
      • iCloud 2T 用于照片和备份
    • 硬件
      • 计算机 MacBook Air M1 Mac Mini M2
      • 鼠标 鼠标 罗技(G)G304 LIGHTSPEED无线鼠标 鼠标 罗技(G)G102 有线鼠标 黑色
      • 键盘 PFU HHKB Professional HYBRID Type-S
      • iPhone 12, 128G
      • Apple Watch S8
      • AirPods Pro
    • 信息流
      • miniflux saved → Instapaper -> Cubox (IFTTT)
      • Douban RSS -> Pinboard (IFTTT)
      • Instapaper/Twitter → Pinboard (self)
      • Twitter liked + 书评 + etc -> Readwise -> Obsidian
      • Web -> Cubox (manual)