读书是否是唯一重要的事?

不久之前和朋友约去了趟植物园,聊起读书是否是第一要务的时候产生了一些分歧,关于是否要去学习如何学习这一件事情产生了一些分歧。我站在的立场是读书是必须的,而我朋友则认为在有限的时间里面实践要优先于读书。而关于要不要学习如何学习这一件事情,他仍然坚持自己的实践而非去了解如何学习。

在我仔细思考,以及阅读了相关的文章之后慢慢地对我朋友的一些想法产生了一些理解。但在一些观点上我依然坚持我自己的看法。在我看来实践固然重要,但读书在我看来一样的重要,在我过去年的学习生活中,我曾经尝试过这种各样的媒介,但是没有一个能够提供图书所带来的成体系的知识。

两种读书的方式

首先我要来阐述一下,我自身的两种读书方式:

  • 为了快速获取[[知识]]而读书,比如学习一个概念或一门技术
  • 为了认识这个世界而读书,比如去理解什么是[[政治]],亦或是为了理解资本主义的运行方式而去看[[202009121000-牛津通识读本-资本主义]]。

恰好不久前看到 [[罗翔]] 老师的一段话,让我深有感触:

如果读书的目的是为了成功,其实很多书是没有必要读的,学习法律就天天读法律条文就可以了?还需要读莎士比亚吗?还需要读[[201910271449-论法的精神]]吗?没有必要啊,你的目的成功了,多读读成功学不就得了吗? 我们读书一定有两种目的,不否认有功利性的目的,比如要准备高考,要准备其他考试,但是更重要的一种读书是非功利性的读书,因为只有这种非功利性的读书,你才能够抵制成功主义的读书,你才能够坦然的接受自己的命运,坦然的接受自己的失败,一个人真正的成功不是在他辉煌的时候有多么的风光,但关键在于在挫折的时候,在低迷的时候,你是不是依然有勇气继续前行,这就是为什么我们依然要进行非功利性的阅读。因为只有非功利性的阅读,才能够给我们提供一种真正的人生勇气,去面对人生的大风大浪,每个人这一生一定会遭遇苦难,那在苦难的时候,你是否依然有继续活下去的勇气。

在我看来非功利性地读书才是真正让我可以静下来理解这个世界的方式,让我的心智可以更加接近真实的世界。

读书不是获取知识的唯一来源

虽然我认为读书是人进步非常重要的一环,但是我也知道读书不是获取[[知识]]唯一的来源。

既然提到了人类知识的来源,就要仔细的推敲人类的知识是从何而来的,[[洛克]]在[[人类理解论]]中对人类思维的方式做了概括性的描述:

  1. Combining several simple ideas into one compound one, and thus all complex ideas are made.
  2. The second is bringing two ideas, whether simple or complex, together, and setting them by one another so as to take a view of them at once, without uniting them into one, by which it gets all its ideas of relations.
  3. The third is separating them from all other ideas that accompany them in their real existence: this is called abstraction, and thus all its general ideas are made.

这一段话也被 Obsidian 描述在其帮助文档中,这一段话让我受益匪浅。那我继而追问,我们的 idea 从何而来,可以想到的便是,第一产生自我们自己(不管是根据自己的经验得来,还是观察这个社会总结而来),第二从别人那边吸收而来。

那么对应到我们的现实世界,我便认为从我们自身经验产生的 idea 可以以实践的方式获得,而从别人那边获取的 idea,以我自身的经验,图书便是非常重要的来源,当然如今这个信息化的时代还有许多其他的途径。任何产生新的 idea 的内容都是值得阅读的,对于走在一线的研究人员,期刊、文献可能是最重要的知识来源,对于在一线的开发人员,技术的实现原理 GitHub 上的代码可能是重要的知识来源。当认识到这一点之后便不会再局限与图书,读书固然是知识来源重要的一个来源,但是只要是能够产生新的 idea,并且可以和自己现有的 idea 产生新的碰撞的信息来源都是值得我们去阅读,了解的。

和我朋友所站的立场一样,我也认同实践的重要性,但是我认为光有实践是不行的。要从实践中获取经验,然后对经验反思总结和提炼,做到洛克在第三点中所说的那样,抽象化,形成新的思维模型和方法论。而这个「方法论」恰恰就是那些经典的图书所能带给我们的。

然而一旦通过图书获得了对某个观念,某个概念的基础认识之后,就应该通过理论去指导实践。读书无法代替实践,但是通过图书形成的理论可以让我走得更加自信。

读书的三个阶段

在[[202008161501-如何阅读一本书笔记]] 中作者 [[Mortimer J. Adler]] 提出了阅读的四个层次

  • [[基础阅读 basic reading]]
  • [[检视阅读 inspectional reading]]
  • [[分析阅读 analytical reading]]
  • [[主题阅读 syntopical reading]]

在结合自身的经验,我发现我经过这样三个阶段:

  • 在最开始的时候不知道看什么,漫无目的的阅读,没有作笔记,也没有写评价,最后什么没有收获
  • 然后开始有目的的阅读,比如喜欢看某一位作者的书,比如 [[密尔]],或者是为了了解一个主题去阅读相关的书籍,比如去看 [[哲学]],又或者只是为了学习一门技术比如去读 [[Spring 知识点]],这个阶段会围绕同一个主题进行大量的阅读,通过大量的阅读积累对其的认识,并在自己心里产生基础的概念
  • 在有了一定的基本知识体系之后再去阅读是为了接受新的、不同的思想,并将其拆解开放到自己的知识体系中。如果以哲学家为例,在了解了其基本观念之后,逐渐添加我是否支持其观点,有没有反驳他的观点,我能不能找到佐证。又如果是一门技术,新产生的技术解决了之前的什么问题,又会产生什么新的问题,这个技术细节为什么要这样实现,有没有更好的实现方式。

但这三个阶段都有一点要非常注意的事情就是,当我们去阅读的过程中,不仅要去了解作者的观点,也要将作者的观点溶化形成我们自己的观点,[[密尔]]、[[洛克]] 所生活的时代早已经过去,我们如今要思考的是,这些先哲们的思考对当今的生活有什么启示。

图书存在的问题

在说了这么多读书的必要性之后,还有必要在谈一谈图书存在的问题,我并不认为每一本都值得去阅读,在上面的提及的 [[检视阅读 inspectional reading]]中作者就说,在阅读时,你可以快速的先了解一下书的目录,在特定的时间中快速完成阅读,了解这是什么类型的图书,这本书在讨论什么内容。在有了这个基础之后再决定哪一部分内容需要仔细阅读,又或者可以直接不读,或者放着以后再读。

当以这样的方式进行读书的时候,会发现图书这样一些问题:

  • 有一些书因为出版时间较久,很多的内容已经过时,在技术领域尤其如此,往往几年时间技术就已经更新换代,之前书中的知识就便的没有作用,但是这个时候更要提醒自己,因为被代替便意味着有更好的方案出现,在哲学的领域也是一样,虽然观念在不断的变化,也也会从一个观念变化都另一个观念,这个观念的转变自身便是值得去了解的
  • 警惕作者大而全的理论框架,往往有一些作者想使用自己的理论框架去解释一切,这样的图书要不就是伟大的著作,要不就会在细节部分不断的被别人攻破,理性地看待这样的著作。

从被动接受信息变成主动获取信息

在经过了上面的三个阶段之后,会发现自身不自觉的从一种被动的接受信息的状态,变成了主动探索信息的状态。我很早以前就使用 InoReader 来作为每天的新闻信息来源,但是我发现这样的方式仅仅停留在了第一个阶段,看过即忘,没有形成自己的体系,所以渐渐的就不再去追寻最新的新闻,慢慢的从这个嘈杂的新消息中脱离出来了。

那这个时候产生的问题便是如何以最快的速度获取信息,我的方法便是「搜索」,我发现我关心的事情也不会那么多,有什么我不清楚或我想要了解的主题时,我便使用搜索的方式,先确定我大致可以参考的书目,比如最近我想要了解[[期权]],那么我先看看 Kindle Unlimited 中包含这个词的书有哪些,再 Google 搜索一下推荐书目,看过两三个页面之后大概就会有一个基础印象,那么接下来就是完成这些图书的阅读,并且总结出自己的知识体系,然后通过这个知识体系来指导我的实践。然后在真实的操作之中总结出自己的理论,再放入到自己的知识库中(对我而言就是我的Zettelkasten笔记库,和博客)。

[[主动学习]],有针对性的获取信息,不仅可以避免自己陷入信息的汪洋,也可以扩展自己的认知边界,将新的、不同的理论纳入到自己的知识体系,不断地完善自己零散的思维模式。最关键的是,当不断阅读自己的感兴趣的内容时,会自发的产生兴奋的状态,并且可以不断往外延伸出不同的主题,当我去了解洛克的时候,我又发现了[[霍布斯]],当再去了解[[西方哲学史]]的时候,又追溯到[[柏拉图]],[[亚里士多德]]等等,而当我对[[期权]]感兴趣的时候,又会好奇郁金香球茎泡沫事件的发生,继而不断地发现新的好奇的事物。


2021-05-01 study , learning , thinking , discuss , reading , book

Android 上的 RIME 输入法 trime 同文输入法使用

早之前就已经在 Linux 和 macOS 上配置了 RIME 并且一直使用到现在,但是在主力的 Android 上从最早的触宝输入法,后来切换成 Gboard,日常使用倒是没什么大问题,就是有一些词总是需要翻页才能找到,这让我非常不爽,就想手机上能不能用 RIME,于是就有了这篇水文。

开源地址:https://github.com/osfans/trime

Gboard 存在的问题

最大的问题便是词库不全,在桌面端虽然 [[RIME]] 也不能及时更新词库,但是只要我在 RIME 中输入一遍后,便再没有这个问题,并且 RIME 会记住你所造出来的词,并且根据输入习惯去调整该词出现的优先级,使用起来非常舒服。

另外一个便是 Gboard 没有同步桌面输入法的输入习惯,一是上面提到的词库问题,二便是词语出现的位置,我感受到我经常需要手动的去选择词语的位置。

为什么不使用搜狗、百度之类的输入法

这应该是一个被无数次提起,又被无数人遗忘的事情,就像我之前提到 的那样,很多人已经忘记了这些「云」输入法后台明文上传用户的输入,也很多人不知道其实搜狗输入法的云同步记录是无法让用户删除的。虽然我承认从 PC 切换到移动端的那几年个人的同步词库确实会有很多帮助,但实际上 RIME 也能轻松的做到。

惊喜

不过每一次从闭源到开源的切换,都让我有意外的收获,感慨开源社区的伟大,从 Dropbox 切换到 Syncthing,让我体会到了同步文件原来还可以这样迅速,再不用考虑 Dropbox 中心服务器的同步速度问题;从 Evernote 切换到 Joplin,[[Joplin]]不仅网页剪切速度快,并且还可以调用本地编辑器,比如 vim 对笔记内容进行编辑;从 LastPass 切换到 Bitwarden,发现原来 Linux 客户端可以这么好用,macOS 也可以充分利用 Touch ID。

尝试 Trime 同文输入法也是一样,在 Play Store 上安装之后用 Syncthing 把我桌面端的 rime-config 配置同步到了手机上,然后拷贝了配置到 sdcard 下面的 rime 文件夹,Deploy 一下直接就能用了。

安装和基础使用

在进入基础配置使用之前,最好先熟悉一下桌面版 RIME 的配置

RIME 使用 yaml 作为配置文件,在 RIME 的不同客户端中,会有一个单独的配置来配置该客户端相关的内容:

  • 在 macOS 上是 squirrel.yaml
  • 在 Windows 上是 weasel.yaml

而在 Android 上是 trime.yaml,安装完成后你可以在手机 sdcard 根目录的 rime 文件夹中看到该配置文件。

个人推荐在 Android 端使用 Syncthingrime 配置文件夹同步到电脑端,并使用 Vim 编辑,之后会实时同步到 Android 文件夹中,这样就避免了每次都需要使用 adb 把配置文件 push 到手机的麻烦。

同步之后可以看到文件夹下的相关配置,基本上和桌面版的 RIME 是一致的:

  • default.yaml,各输入方案共享的全局配置
  • default.custom.yaml,(可选)对 default.yaml 的修改,不会随着客户端的更新而被覆盖,所以对 default 的修改可以通过 patch 的方式放入该配置文件
  • xxx.schema.yaml,xxx 输入方案的配置
  • xxx.custom.yaml,(可选)对 xxx.schema.yaml 的自定义修改
  • xxx.dict.yaml, xxx 输入方案的词库(字典)

关于 Trime 的配置可以参考官方的wiki

如何进行主题配置

默认的主题并不是不能用,但如果你想更加个性化,你可以定制同文输入法键盘的任何地方。

在 Trime 的主题设置中,同一个主题可以包含多套配色。

主题中可以定义键盘布局,而配色则可以更改总体外观。

自定义键盘布局

Trime 已经内置了常用的键盘布局,在 trime.yaml 中搜索 preset_keyboards 就可以看到:

  • 40 键
  • 36 键
  • 30 键
  • 26 键
  • 预设数字键
  • 预设符号键
  • 预设注音键盘
  • 预设仓颉五代键盘
  • 仓颉六代
  • 五笔
  • 电码
  • 地球拼音

我个人比较倾向于使用 36 键的布局,比如 Gboard 的布局,在输入数字的时候会方便很多。

Screenshot_gboard_keyboard.jpg

在你所使用的主题中,比如 xxx.trime.yaml 中设定:

preset_keyboards:  
  double_pinyin_flypy:
    __include: /preset_keyboards/qwerty0

首先找到 preset_keyboards,如果没有自己手动创建,然后在它下面创建如上的配置。

reference


2021-04-15 rime , input-method , android , google-gboard

Obsidian 使用篇一:使用 markdown-clipper 全文保存网页

之前使用整理 Evernote 代替品 的时候就提出了我自己的一个需求,就是有一个完善的 Web Clip 系统,Evernote 和 WizNote 都做的比较不错。但 Obsidian 并没有提供类似的工具,不过幸好 Obsidian 使用 Markdown 来管理文档,这样的开放程度使得我可以寻找一个将网页变为 Markdown 的浏览器扩展就能做到。

经过一段时间的调研和搜索我发现了如下这些可选项:

这三个插件都是开源的,各自有各自的特点,markdown-clipper 是我最早使用的插件,点击一下就可以将整个网页保存成 markdown 文件并下载到本地,而 markdownload 则可以在点击之后先预览一下生成的 markdown 调整之后再下载本地。obsidian-clipper 则可以选中内容,然后点击之后自动打开 Obsidian,然后新建并保存内容,但该插件处于早期开发阶段可能会遇上一些问题。不过我个人在 Linux 下尝试还是非常不错的,并且开发者还挺活跃

全文存入到 Obsidian 并不是目的

不过一定要当心的是,别被可以无线膨胀的信息冲昏头脑,将网页内容存入 Obisidian 是为了后期阅读或消化,别放入之后便不再阅读。

所以我的方式是在 Obsidian 中单独新建了一个文件夹 Web Clip 所有摘录的文件第一站便是这个地方。一旦我有时间,就会向使用那个稍后阅读应用 Pocket/Instapaper 一样,将 Web Clip 文件夹中的内容按照次序阅读并拆解,并将重要的内容吸收到 Obsidian 之前的笔记体系中。一段时间之后 Web Clip 会自动清空。

Obsidian Clipper 设置

我经过一段时间的使用之后,觉得 Obsidian Clipper 的使用最直接,选中,点击,然后就自动打开 Obsidian 新建了笔记。但目前为止唯一让我不太满意的就是有的时候无法调用起 Obsidian。这个时候就使用 markdownload 作为辅助。

配置:

{zettel}-{title}
#obsidian-clipper #web-clipper #markdown-clipper

{clip}

Clipped from [{title}]({url}) at {datetime}.

总结

在使用一段时间之后,最终选定了 MarkDownload ,因为转换的 Markdown 文件格式最好,并且可以批量下载文章中的图片。


2021-04-02 obsidian , markdown , note , note-taking

使用了半年 macOS 之后 我又回到了 Linux 的怀抱

我在使用了半年 macOS 之后,又回到了 Linux 的怀抱,虽然 macOS 有其自身的优势,我也不否认 macOS 系统上软件生态的友好,但我发现即使我将日常开发主力机器装回到 Linux,也没有丧失操作系统的便捷性和易用性。这或许和我下意识的只使用跨平台的软件有关,并且最长使用的软件几乎都是一套快捷键。

一开始从一个系统切换到另一个系统的时候,难免会有一些东西需要学习,但是其内在的逻辑是一致的,操作系统无非是提高了上层应用运行时的环境。并且如今跨平台的软件越来越多,只要数据在我这里,无论在哪一个系统中都可以迅速地开始自己的工作。

契机

稳定性

这一次无意间迫使我回到 Linux 的原因之一就是我发现 macOS 并没有我想象的稳定,在最近的使用过程中经常发现一些古怪的问题,并且我无法自己解决,必须售后客服解决,这更让我意识到我不能完全依赖这一个系统,即使我每天备份,数据没有问题,但一旦发生致命性的问题,我依然需要借助客服去解决(当然这里要提一句苹果的售后客服确实是不错的)。

最近自动更新之后又发现了一个问题,/usr/libexec/secd 占用非常高的 CPU,然后导致风扇狂转。

Screen Shot 2021-04-22 at 8.52.18 PM.png

幸而这个问题,我简单的搜索了一下之后就找到了解决方法,删除 ~/Library/Keychains 目录并重启电脑。这个目录中保存了本地的 Keychain 一些密码,网上的说法大概率和 Keychain 的更新机制有关系。

流畅度

我一度以为 macOS 上的应用质量很高,但实际使用后发现,确实在日常使用上高于 Linux 上大多数的应用,但是 macOS 上依然会发生 Application Not Responding 的问题,即使我的配置是 i9+32G,也时不时的出现转圈。

跨平台的应用

  • Chrome 浏览器,登陆账号同步,就什么都有了。
  • Syncthing 同步工具,将数据和文档两边实时同步,辅助以 NextCloud
  • Terminal (Guake / kitty) 我都使用 F12 作为触发(macOS 上借助 Hammerspoon 脚本),可以快速的将终端调用出来
  • RIME (fcitx-rime / Squirrel) RIME 的两个版本,同一套配置和词库,输入习惯都可以同步
  • IntelliJ IDEA
  • Bitwarden 密码管理
  • SmartGit Git客户端
  • Telegram IM
  • GoldenDict 词典
  • VMware Fusion / VMware Workstation
  • Obsidian 笔记,笔记内容通过 Syncthing 同步,并定时加入 git ,具体见我的笔记跨设备同步方案
  • 等等

记录一下常用的命令:

Bitwarden

sudo snap install bitwarden

Chrome

sudo apt update
sudo apt install google-chrome-stable

config

zsh, tmux, vim, rime,

  • dotfiles
  • rime-conf

同步的配置

改键

之前在 Twitter 上看到一套将 Linux 上的快捷键和 macOS 映射成一致的解决方案:

但是,在经过我的尝试之后我还是没有使用上面的方案,在终端中 macOS 上也是使用 Ctrl,在 Linux 和 macOS 上使用大部分快捷键,我能用 vim-key-binding 就使用 Vim-key-binding 的,比如在 Chrome 中使用 Vimium,在 Obsidian 开启 Vim 快捷键映射,在 IDEA 中使用 Vim 插件,已经满足我大部分的日常使用。


2021-03-31 linux , macos , operating-system

重置 macOS S.M.C 和 NVRAM

今天用得好好的电脑突然三次黑屏,两次发生在早上刚刚使用的时候,一次发生在晚上回家之后。所以一怒之下就直接上官网联系了 Apple Support,但是也不知道是不是我直接登录的 .com 网站,在我提交了 Support 之后一分钟一个外国小哥打了电话过来,我一下子没反应过来,只能用着不那么熟练的英语开始了 macOS 修复之路。

我简单地向这位技术小哥描述了我的问题,大致意思就是系统突然崩溃了三次,然后在聊的过程之中,经过他的提醒,我发现出现问题的时候都是系统从睡眠状态中恢复,并刚开机不久,在打字的过程中,突然风扇很响一声,电脑就黑屏了。

虽然这个时候能启动,并且启动之后运行有没有问题,但是技术小哥还是提议清理一下系统的缓存,和 NVRAM,虽然在讲电话的过程中我并不知道 NVRAM 是什么,但后来查了发现 macOS 会在这一块区域存放一些硬件配置信息。

在技术指导的过程中,发现我的硬盘剩余空间只剩下了 27G,技术就判断这可能是因为磁盘空间不足导致,睡眠的时候一些系统的内存的缓存问题而导致的系统故障,然后又指导我清理了一下系统 Cache。

我就在技术的指导下,进行了一系列的操作,总结如下。如果有人遇到了相同的问题,可以自行先试试了。

重置 S.M.C

我在网上查询技术小哥让我执行的操作时,发现其实做的第一步就是重置了 S.M.C。

技术先让我正常关机,等 Mac 完全关机之后,让我按下左边的 Shift,Control 和 Option 按键,然后同时按下电源键(Touch ID 开机键)并持续 10 秒时间。这个是重置 MacBooks S.M.C 的方法。这个步骤之后,重新按下电源键,笔记本会正常启动。

20210331213513-reset-macbook-pro-smc.png

S.M.C 是 System Management Controller 的缩写,这是电脑上的一块微控制器,在 Intel 芯片的 Mac 上同来处理不同的电源,灯光,传感器等等硬件。

如果 Mac 不响应电源按键也可以尝试使用上面的步骤进行重置。

当你发现电池无法正常充电, Mac 无法识别插入 USB-C 端口的设备,或者键盘背光无法正常工作,或者睡眠功能运行不正常的时候,重置 S.M.C 可能是有用的。其他的症状比如系统的风扇高速运转,或者即使没有运行很多应用程序但 Mac 也运行迟钝,这时候重置 S.M.C 可能有效。

An S.M.C. reset may help if you notice things like the battery is not charging properly, the Mac does not recognize devices plugged into its USB-C port, the keyboard backlight is not working correctly or the sleep function is out of whack. Other symptoms include the computer fan’s running at high speed or the Mac’s acting sluggish, even if you are not using a lot of processor-hogging programs.

Apple’s support site has a full guide to the S.M.C. reset process for all its Intel-based Macs, including those with removable batteries and desktop models. The guide also lists a series of things you should try before resetting the S.M.C. While performing a reset does not generate an alert box or notification, you can tell if you were successful if the odd Mac behavior stops. (You may also have to redo any preferences for your display and power-management settings.)

重置 S.M.C 可能修复一些不确定的错误行为,但不会对任何电源的损坏或者硬件的故障有任何帮助。

reset NVRAM

现在的 Mac 会在 nonvolatile random access memory(NVRAM) 的地方存储一些设置。如果 Mac 无法操作音量,屏幕分辨率,时区信息,或启动影片,那么极有可能是存放在 NVRAM 中的信息损坏了。

你通过如下的方式可以 重置 NVRAM 或 PRAM

  • 首先关闭 Mac
  • 然后同时按下 Option, Command, P and R 键
  • 当你听到开机启动的声音,或者在 Mac Pro 上看到 Apple logo 出现并消失,松开这些按键,让系统完成启动过程

清理系统缓存

在执行这一步之前请一点先做好系统的全盘备份,使用 Time Machine 将系统备份到外置存储中。

然后打开 Finder:

20210326225923-mac-finder-go-library.png

在打开的文件夹中删除 Caches 文件夹:

20210326225953-library-delete-caches.png

我在执行完这一步之后释放了大约100G的空间。

reference


2021-03-24 macos , apple , apple-support , nvram , operating-system

从 VMware Fusion 中迁移虚拟机到 VMware Workstation

用了半年多 macOS,虽然不错,但工作用还是觉得 Linux 比较顺手,所以经过了半年时间还是从 macOS 切换回了 Linux。然而需要解决的一个问题便是我之前的 macOS 上使用 VMware Fusion 的个人授权安装了一个 Windows 用来进行一些调试,现在有一些配置因为需要依赖外部人员进行操作,证书之类的,只能想办法把 Fusion 上的虚拟机转移到 Linux 下的 VMware Workstation 中。

前提知识

在正式迁移之前先了解一下磁盘上的几类文件,这些文件都是和 VMware 虚拟机相关的。

VMX 文件

VMware 虚拟化软件比如 VMware Workstation 和 VMware Fusion 的配置文件。

存储使用「新建虚拟机向导」创建的虚拟机设置;包括内存、硬盘和处理器限制等。

VMX 文件使用纯文本格式保存,并包含配置 属性=值

比如,内存限制是

memsize = "2048"

表示虚拟机允许的最大内存为 2G。

Fusion 保存的 VMX 文件通常存储在 .vmwarevm 包内。

VMDK 文件

VMDK 文件表示 Virtual Machine Disk,是虚拟机的虚拟硬盘格式。通常 vmdk 文件包含这虚拟机所需要的所有文件。

导出

经过一些调研,虽然 VMware的官网 写着可以通过菜单里面的 Export 来将虚拟机导出成 OVF 格式,但是我一查发现我用的并不是 Fusion Pro 版本,也没有这一个选项。

所以只能另找办法,后来发现有人发现了 VMware 这个命令行工具可以进行转换。

cd /Applications/VMware\ Fusion.app/Contents/Library/VMware\ OVF\ Tool/

./ovftool  <PATH TO SOURCE VM's .vmx file>   <PATH TO OUTPUT ova file>

# example

./ovftool --acceptAllEulas ~/Documents/Virtual\ Machines.localized/CentOS\ 6.5.vmwarevm/CentOS\ 6.5.vmx      /tmp/CentOS6.5.ova

但还没进行尝试,就发现原来 VMware Workstation 和 Fusion 只是两个操作系统上的不同实现,其实虚拟机部分还是相同的,查看其硬盘上的文件,发现结构类似,文件类型也差不多,所以就萌生了先 scp 导过来看一下能不能直接使用的想法,经过一段时间的拷贝,发现 Linux 下的 Workstation 可以直接识别。

问题

在迁移了 Windows 第一次启动的时候,报了一个错:

was created by a VMware product that is incompatible with this version of VMware Workstation and cannot be used. Cannot open the configuration file.

这个错一看就知道可能是版本不兼容的问题,我的 Fusion 是最新的 12 版本,而 Workstation 则是很多年前安装的 15 版本。后来查到可以通过修改 vmx 配置文件解决。

修改 vmx 中的 virtualHW.version 版本到一个比较低的版本即可。

二者对应的版本可以通过如下这张表进行查看。

Virtual Hardware VersionProducts
19ESXi 7.0 U2(7.0.2)
18ESXi 7.0 U1 (7.0.1)
Fusion 12.x
Workstation Pro 16.x
Workstation Player 16.x
17ESXi 7.0  (7.0.0)
16Fusion 11.x
Workstation Pro 15.x
Workstation Player 15.x
15ESXi 6.7 U2
14ESXi 6.7
Fusion 10.x
Workstation Pro 14.x
Workstation Player 14.x
13ESXi 6.5
12Fusion 8.x
Workstation Pro 12.x
Workstation Player 12.x
11ESXi 6.0
Fusion 7.x
Workstation 11.x
Player 7.x
10ESXi 5.5
Fusion 6.x
Workstation 10.x
Player 6.x
9ESXi 5.1
Fusion 5.x
Workstation 9.x
Player 5.x
8ESXi 5.0
Fusion 4.x
Workstation 8.x
Player 4.x
7ESXi/ESX 4.x
Fusion 3.x
Fusion 2.x
Workstation 7.x
Workstation 6.5.x
Player 3.x
Server 2.x
6Workstation 6.0.x
4ESX 3.x
ACE 2.x
Fusion 1.x
Player 2.x
3 and 4ACE 1.x
Lab Manager 2.x
Player 1.x
Server 1.x
Workstation 5.x
Workstation 4.x
3ESX 2.x
GSX Server 3.x

调整 VMware 虚拟机自适应窗口

在菜单栏 View 选择 Fit Guest Now.

Other

Step 1

Copy the VMDK file from the VMware Workstation virtual machine to the Mac running VMware Fusion.

Step 2

Open VMware Fusion and create a new virtual machine.

Step 3

Click “Continue without disk.”

Step 4

Click “Use an existing virtual disk,” then double-click the VMDK file and click “Continue.”

Step 5

Choose the operating system type, if prompted, then click “Continue.”

Step 6

Select whether or not to run the virtual machine automatically.

Step 7

Click “Customize Settings” to adjust the virtual machine’s allocated resources, such as CPUs and RAM.

Close the settings window and then power on the virtual machine.


2021-03-24 vmware , vmware-workstation , vmware-fusion , virtual-machine , vm , windows

VMware Workstation 虚拟机网络设置

总结一下 VMware Workstation 和 Fusion 中的虚拟机网络设置的选项。

Bridged

虚拟机通过桥接,直接连接到物理网络。虚拟机会和主机在同一个子网中。比如你的宿主机的 IP 是 192.168.1.100,并且所在的网络中存在一个 HDCP 服务器(比如路由器等),那么虚拟机就会获得一个 192.168.1.x 的 IP 地址,表现成网络中的另外一台电脑一样。

NAT

Used to share the host’s IP address,这种模式给予了虚拟机连接到 Network Address Translation 网络的能力, 虚拟机会自动才 VMware Workstation DHCP 服务器获取一个 IP 地址,子网掩码。

这个 IP 和宿主机的网络不在同一个子网中,这个地址通过宿主机网络地址转化过。

Host-only

一个和宿主机共享的私有的网络,虚拟机会被隔离在这个私有网络中,无法去访问宿主机本地网络和互联网。运行在 Host-only 网络下的虚拟机通过内部的 DHCP 服务器获取 IP 地址。你可以在这样的网络中运行一系列的虚拟机,他们之间可以网络通信。

事实上,如果禁用了和宿主机之间的网络和 DHCP,你就可以获得一个完全私有的网络。通常情况下,如果想要虚拟机访问互联网,你需要使用虚拟机的路由,比如 pfSense, VyOS 等等。

Custom

指定虚拟网络。

  • vmnet0 is bridged to eth0
  • vmnet1 is a host-only network on subnet 172.16.220.0.
  • vmnet8 is NAT network on a private subnet 172.16.231.0.

Virtual Network Editor

在 VMware Workstation 的 Edit 菜单中,可以看到 Virtual Network Editor 选项。

在这个菜单中可以对虚拟网络进行管理。

在其中管理的虚拟网络,可以在虚拟机网络的 Custom 中进行使用。

LAN Segments

LAN Segments 是 VMware Workstation 在 9 之后增加的功能。和其他网络设定不同,LAN Segments 只能通过每一个虚拟机的网络去管理。

LAN Segments 创建了一个没有 DHCP 的完全隔离的私有网络,这意味你必须给虚拟机分配一个 LAN segment。你必须要配置一个静态IP地址,或者使用自己的 DHCP 服务器。

相较于其他网络设置的好处是,你可以创建任意多个 LAN segments,并且可以指定你自己的名字来区别。这个功能在设置复杂的虚拟网络的时候尤其有用。

reference


2021-03-23 vmware , vmware-workstation , vm , virtual-machine , linux , ip , network

在 Linux 上使用 Clash 作代理

去年年中的时候切换到 macOS,一直用了 ClashX,时隔半年又迁移回了 Linux,发现原先使用的 V2rayL 虽然能用,但是有些简陋,并且不支持分流,并且如果一个地址失效了,还需要手动地进行切换。所以看到 Linux 的 Clash 可以自动进行流量切换的时候,就试一下。

Clash 是 Go 语言实现的,跨平台代理工具,支持 Shadowsocks/v2ray,支持规则分流等等。

可以在官方页面下载

Linux 下载对应的 linux-amd64 即可。

安装

下载对应的二进制,比如默认放到 ~/Downloads 目录,在终端进入该目录。

gunzip clash-linux-amd64-v0.18.0.gz
sudo mv clash-linux-amd64-v1.4.2 /usr/local/bin/clash
sudo chmod +x /usr/local/bin/clash
./clash

clash 启动后会在 ~/.config/clash 目录生成配置文件。

ls -al ~/.config/clash
.rw-r--r--   10 einverne 23 Mar 19:30 config.yaml
.rw-r--r-- 4.0M einverne 23 Mar 19:30 Country.mmdb

修改配置

比如说对于我使用的代理,在后台复制地址之后,在网址的后面增加 &flag=clash 获取 clash 的配置文件,右击网页 Save as,选择仅网页内容,下载到本地, sub.html

然后将查看 sub.html 内容,应该是一个 yaml 格式的文件。将此格式的文件替换默认的配置。

cat ~/Downloads/sub.html > ~/.config/clash/config.yaml

然后重新执行 /usr/local/bin/clash

此时检查一下配置中的 socks 端口,我一般用本地的 1080,修改一下:

socks-port: 1080

然后再运行。去浏览器中,访问 youtube.com 检查一下。

如果正常访问即完成了配置。

配置开机启动

在配置开机启动之前,将配置文件移动到 /etc 目录:

sudo mv ~/.config/clash /etc

以后修改配置都记住修改 /etc/clash 目录下的这个配置文件。

然后使用 vi 增加 systemd 配置 sudo vi /systemd/system/clash.service 放入如下内容:

[Unit]
Description=Clash Daemon

[Service]
ExecStart=/usr/local/bin/clash -d /etc/clash/
Restart=on-failure

[Install]
WantedBy=multi-user.target

启用 clash service:

sudo systemctl enable clash.service

手动启动 clash.service:

sudo systemctl start clash.service

可以使用 systemd 提供的 disable, stop 等等命令来管理。

如果要查看 Clash service 的日志可以使用:

journalctl -e -u clash.service

如果想要将日志单独记录到文件,可以使用 systemd 的 StandardOutputStandardError 将日志定向到文件中。这部分可以参考 systemd 的文档

# Works only in systemd v240 and newer!
StandardOutput=append:/var/log/clash/log.log
StandardError=append:/var/log/clash/error.log

远程管理端口

Clash 提供了默认的 9090 端口作为远端管理端口,在配置中可以看到:

external-controller: '127.0.0.1:9090'

这样的配置。

可以使用 Clash 远程管理的页面进行管理: http://clash.razord.top/#/proxies

这个页面要求提供,Host,Port,Secret 三个输入:

  • Host: 127.0.0.1
  • Port: 9090
  • Secret: 配置文件配置的 secret

其中 Secret 是在配置文件中通过:

secret: 'xxx'

进行配置的。

感谢 BobMaster 在评论里面提供其他解决方式,有兴趣可以尝试 v2rayA, 或 Qv2ray


2021-03-15 linux , clash , clashx , macos , proxy , socks , v2ray

使用 Beancount 记账篇二:各类账单导入

在上一篇如何给 Beancount 账户命名 的文章中,我们已经迈出了 Beancount 使用的第一步,建立一套属于自己的账户系统,之后所有的资金就会在这些账户之间流转。复式记账讲求账户的流入与流出。

那接下来就是 Beancount 真正关键的地方,熟悉并导入以前的帐本。使用 Beancount 就会想着如何将之前的账单导入到 Beancount。

但人的惰性总是让我们不会每一笔交易都事无巨细的记录下来,所以我的方式便是固定一个时间,然后对上一个周期内的账单进行一次性批量处理,比如在信用卡账单日对信用卡消费做处理,或者在月末对微信账单进行处理。

这样就使得我需要有地方可以直接导出我的账单,下面就是我经常使用的账单导出整理的方式。因为微信,京东等日常消费的账户绑定了信用卡,其中还涉及到了信用卡负债账户的部分,所以我的选择可以分成两个部分。一个就是从源头上,导出并处理信用卡账单,另一部分就是消费账户的账单,比如微信,京东的账单。

这两部分的优缺点都非常明显:

  • 微信,京东的账单可以将账单的具体明细列举的非常清晰,而信用卡账单则比较简陋
  • 但是信用卡账单可以方便地和 Liabilities 账户关联起来,而微信和京东则需要提取付款账户来进行判断,才能合理地将账单划分到账户

正因为这两个的区别,目前我还在混合使用这两个方法,不过以信用卡账单为主。

交行信用卡账单导入 Beancount

我目前主要使用的卡片是交通银行的,所以这里整理了一下交通银行账单的处理过程。不过大体思路都是相差不多的。

交通银行每个月的账单日都会发一份电子邮件到邮箱,在邮件中列出了记账周期中的消费记录,利用 Download table as csv 这个开源的 Chrome 插件,或者也可以使用 Table capture,可以将账单导出成 CSV 格式,然后用 vim 简单处理一下,比如把第一列删除,可以得到如下格式的文件:

"交易日期","记账日期","卡末四位","交易说明","交易金额","入账金额"
"2011/01/16","2011/01/17","2987","消费 支付宝 - xxx科技有限公司","RMB 6.30","RMB 6.30"
"2011/01/18","2011/01/19","2987","消费 支付宝 - xxx科技有限公司","RMB 0.90","RMB 0.90"
"2011/01/19","2011/01/20","2987","消费 食堂","RMB 100.00","RMB 100.00"

然后批量将金额中的 RMB 去掉。%s/RMB //g,然后保存到 datas/comm-2021.01.csv 文件中。随后执行:

bean-extract config.py datas/comm-2021.01.csv > beans/comm-2021.01.bean

只要 config.py 中设置的账户分类能够覆盖账单中的关键字,基本上就完工了。如果有些账单分入了错误的账户,那么手动的调整一下 config.py 再执行一次。

├── README.md
├── account
│   ├── assets.bean
│   ├── crypto.bean
│   ├── equity.bean
│   ├── expenses.bean
│   ├── income.bean
│   ├── liabilities.bean
│   ├── securities.bean
│   └── vesting.bean
├── beans
│   ├── 2020.bean
│   ├── 2021
│   │   ├── 01.bean
│   │   ├── 02.bean
│   │   ├── 03.bean
│   │   └── 04.bean
│   ├── 2021.bean
│   ├── alipay_record_20190101_20191231.bean
│   ├── alipay_record_20200101_20201231.bean
│   ├── assets-broker.bean
│   ├── comm-2021.01.bean
│   ├── comm-2021.02.bean
│   ├── comm-2021.03.bean
│   ├── 微信支付账单(20200701-20200930).bean
│   └── 微信支付账单(20201001-20201231).bean
├── config.py
├── datas
│   ├── alipay_record_20190101_20191231.csv
│   ├── alipay_record_20200101_20201231.csv
│   ├── comm-2021.01.csv
│   ├── comm-2021.02.csv
│   ├── comm-2021.03.csv
│   ├── 微信支付账单(20200701-20200930).csv
│   └── 微信支付账单(20201001-20201231).csv
├── importers
│   └── beanmaker.py
├── main.bean
├── processing.sh
├── requirements.txt
└── strip_blank.py

其中,account 目录是定义了各类的账户,下面的账单整理主要涉及的目录是 datasbeans 目录。我将账单的原始文件放在 datas 目录中,而 beans 则存放处理过后的 bean 文件。

微信账单的导入 Beancount

微信的账单可以通过,钱包 -> 账单 -> 常见问题 -> 账单下载导出,但是需要注意的是,每次导出只能跨 3 个月。导出的账单会发送到邮箱中。账单格式是 CSV。在邮件附件中下载的压缩包需要密码,解压的密码会通过官方的账号发送到微信通知。

解压之后会得到如下格式的文件:

微信支付账单明细,,,,,,,,
微信昵称:[xxx],,,,,,,,
起始时间:[2018-01-01 00:00:00] 终止时间:[2018-03-31 23:59:59],,,,,,,,
导出类型:[全部],,,,,,,,
导出时间:[2020-02-28 12:59:49],,,,,,,,
,,,,,,,,
共207笔记录,,,,,,,,
收入:137笔 xxxx.34元,,,,,,,,
支出:66笔 xxxx.60元,,,,,,,,
中性交易:4笔 xxxx.13元,,,,,,,,
注:,,,,,,,,
1. 充值/提现/理财通购买/零钱通存取/信用卡还款等交易,将计入中性交易,,,,,,,,
2. 本明细仅展示当前账单中的交易,不包括已删除的记录,,,,,,,,
3. 本明细仅供个人对账使用,,,,,,,,
,,,,,,,,
----------------------微信支付账单明细列表--------------------,,,,,,,,
交易时间,交易类型,交易对方,商品,收/支,金额(元),支付方式,当前状态,交易单号,商户单号,备注
2018-03-31 21:35:09,微信红包,/,"/",支出,¥100.00,零钱,支付成功,1000039501180331000xxxxxxxxxxxxxxxxx	,10000395012018033xxxxxxxxxxxxxx	,"/"

可以看到前16行都是一些注释信息,并不是正式的交易数据。真正的交易数据从 17 行开始。有这样一份数据就可以使用脚本到入成 Beancount 文件。

Vim 下将文件格式转换成 UTF-8 避免不必要的麻烦:

:set fileencoding=utf-8
:w

支付宝账单的导入 Beancount

支付宝的账单可以通过网页端,在我的账单页面选择时间范围,单次跨度不能超过 1 年,然后在页面底部点击「下载查询结果」,导出的格式为 CSV 格式。

支付宝交易记录明细查询
账号:[xxxxxxxx@xxxxx.com]
起始日期:[2019-01-01 00:00:00]    终止日期:[2020-01-01 00:00:00]
---------------------------------交易记录明细列表------------------------------------
交易号                  ,商家订单号               ,交易创建时间              ,付款时间                ,最近修改时间              ,交易来源地     ,类型              ,交易对方            ,商品名称                ,金额(元)   ,收/支     ,交易状态    ,服务费(元)   ,成功退款(元)  ,备注                  ,资金状态     ,
2019123122001456xxxxxxxxxxxx	,M201912317xxxxxxx   	,2019-12-31 13:26:28 ,2019-12-31 13:26:29 ,2019-12-31 13:26:29 ,其他(包括阿里巴巴和外部商家),即时到账交易          ,中国铁路网络有限公司      ,火车票                 ,493.50  ,支出      ,交易成功    ,0.00     ,0.00     ,                    ,已支出      ,
20191231343073829431 	,                    	,2019-12-31 05:39:17 ,                    ,2019-12-31 05:39:17 ,支付宝网站     ,即时到账交易          ,博时基金管理有限公司      ,余额宝-2019.12.30-收益发放 ,2.83    ,        ,交易成功    ,0.00     ,0.00     ,                    ,已收入      ,

京东账单导出及导入 Beancount

京东不提供历史交易记录的导出,这就使得我们得从京东后台的我的订单中手动的将账单导出。

受到 zsxsoft 使用 userscript 脚本的启发。经过一定的修改

到订单页面直接在浏览器自动生成 Beancount,粘贴即可。


2021-02-12 beancount , accounting , bookkeeping , double-entry , bill-import , linux , wechat , alipay

使用 Beancount 记账篇一:给账户命名

在之前整理复式记账 的文章中曾短暂的提及过 Beancount,上一篇文章简单介绍了一下 Beancount,现在经过一段时间的使用,也正好回顾总结一下自己的使用经历和经验。

要入门 Beancount 的使用,其中最重要的第一步便是充分的认识 Beancount 中的账户概念,在复式记账中资金都是在账户与账户之间流转,因此账户就非常重要。但是因为 Beancount 的入门难度要远远超过其他的记账软件,所以迈出第一步就变得至关重要,迈出了这第一步后面就会发现 Beancount 能带来远超预期的收益。

在 Beancount 中内置类几类账户,这几类账户会用来生成最后的 [[资产损益表]]、[[资产负债表]] 等等报表。这几类账户在之前的文章中也提及过:

  • Assets
  • Income
  • Expense
  • Liabilities
  • Equity

在 fava 展示损益表的时候会使用到 Income 和 Expense,而在展示负债表的时候会用到 Assets, Liabilities 和 Equity。

文件组织

在构建了一个完整的命名体系之前,可以先对 Beancount 帐本进行提前的规划。比如我以如下的方式管理:

├── account
│   ├── assets.bean
│   ├── equity.bean
│   ├── expenses.bean
│   ├── income.bean
│   ├── liabilities.bean
├── beans
│   ├── 2020.bean
│   ├── 2021
│   │   ├── 01.bean
│   │   ├── 02.bean
│   │   ├── 03.bean
│   │   └── 04.bean
│   ├── 微信\224\230账\215\225(20200701-20200930).bean
│   └── 微信\224\230账\215\225(20201001-20201231).bean
├── config.py
├── datas
│   ├── 微信\224\230账\215\225(20200701-20200930).csv
│   └── 微信\224\230账\215\225(20201001-20201231).csv
├── importers
│   └── beanmaker.py
├── main.bean
├── processing.sh
├── requirements.txt

说明:

  • account 账户中只定义 openclose 账户的语句,不同的名字命名的账户分开管理
  • beans 目录中是真正记录交易的地方
  • datas 目录则是账单的原始数据
  • main.bean 主帐本的定义
  • processing.sh 以及 importers 是处理原始账单数据的脚本

main.bean 中通过 include 语法将其他 bean 引入,同时还定义了一些可选项。

option "title" "ledger" ; "我的账本" ledger
option "operating_currency" "CNY" ; 帐本货币
option "operating_currency" "USD"

; fava
2016-04-14 custom "fava-option" "auto-reload" "true"

include "account/*.bean"
include "beans/*.bean"

剩下的其他几个文件一个是配置从原始账单自动生成对应 bean,以及提前预处理账单的脚本 processing.sh,这部分内容会在后续介绍多个类型账单导入的文章中介绍。

当然你并不需要按照这样的方式来管理,Beancount 完全支持在一个文件中记录所有的内容,就像这个演示 那样。

给 Assets 账户命名

对于个人而言,如果用最通俗的语言来解释 Assets 的话,「那就是你所拥有的资产」,这个资产包括现金,银行的存款,证券市场上的股票等等能够产生购买力的,或者能够用来清还债务的东西。

对于国内的场景,可能还会有账户叫做支付宝余额,或者微信零钱。那么有这样的概念之后就可以轻松的定义出这样的账户。

; 现金
2010-11-11 open Assets:Cash

; 支付宝
2015-11-11 open Assets:Alipay:Balance ;"余额"

; 微信余额
2010-01-01 open Assets:WeChat:Balance

; 老虎证券
2018-06-01 open Assets:Broker:US:Tiger

; 银行账户来
2010-11-11 open Assets:DebitCard:CMB CNY

去除上面这些比较好理解的实体账户,还有一类虚拟账户,比方说借钱给了张三10000元,那么就应该开一个「应收款」账户:

; 欠的钱
2000-01-01 open Assets:Receivables:Zhangsan CNY

记录一笔交易

2000-03-09 * "借钱给张三 100000"
  Assets:Receivables:Zhangsan 10000 CNY
  Assets:DebitCard:CMB   -10000 CNY

等张三将钱归还,就可以将此账户关闭:

2001-01-01 close Assets:Receivables:Zhangsan

但是如果要去通过 Beancount 来记录证券交易,那么便会稍微复杂一些。之后会再写新的文章进行总结。

给 Income 账户命名

收入账户也比较好理解,有多少收入便开通多少个收入账户。一般来说如果是月工资则会按序进入上面开的银行账户。如果年终有奖励则还会开一个 Bonus 的账户。

2010-11-11 open Income:Salary:Hooli CNY  	; "Regular Pay"
2010-11-11 open Income:Bonus:Hooli  CNY 	; "Annual bonus"

对于普通的收入账户比较明确,但是如果要记录比如未成熟的期权,股票等,则就稍微复杂一些,之后再用其他文章说明。

给 Expense 账户命名

开支账户是一个相对比较繁琐的账户,但理念非常容易理解。在普通的记账软件中,一般会对消费进行分类,那么就可以根据自己的真实情况将这一个分类搬到 Beancount 的 Expense 账户中。

如果之前没有使用过类似的记账软件,那么大概也会知道可能有那么几类,衣、食、住、行。日常生活的开支基本上这几大类也都覆盖了,其他的开支账户可以等用到的时候再建立。

可以来参考一下其他软件的账户分类。

对于开支账户,不建议设置很多,但也不建议设置得比较笼统,需要自己把握那个度。开设很多账户在记账的时候就会需要花费很多时间思考一笔交易被划分到哪个账户;而设置的比较少的时候,后期进行统计的时候就没有区分度。

在创建账户的时候也可以参考一些市面上成熟的应用的内置分类。

之前用过的一个叫做 Wallet 的应用的内部账户分类。

Food & Drinks
    Bar, cafe
    Groceries
    Restaurant, fast-food
Shopping
    Clothes & shoes
    Drug-store chemist
    Gifts
    Jewels
    Pets
    Stationery
Housing
    Energy
    Maintenance
    Mortgage
    Property insurance
    Rent
    Services
Transportation
    Business trips
    Long distance
    Public transport
    Taxi
Vehicle
    Fuel
    Leasing
    Parking
    Rentals
    Vehicle insurance
    Vehicle maintenance
Life & Entertainment
    Sport
    fitness
    Alcohol
    Book, audio, subscriptions
    Charity
    Wellness
Communication
    Internet
    Phone
    Postal Services
    Software

再比如 MoneyWiz 默认账户名

Automobile
  Accessories
  Car Insurance
  Gas/Fuel
  Lease
  Maintenance
  Other
  Parking
Bills
  Cable
  Electricity
  Gas
  Internet/Broadband
  Mobile Phone
  Other
  Phone
  Water
Clothing
  Accessories
  Clothes
  Jewelry
  Other
  Shoes
Digital
  Apps
  Books
  Movies
  Music
  Other
  Podcasts
  TV Shows
Food & Dining
  Dining/Eating Out
  Groceries
  Other
Health Care
  Dental
  Eye Care
  Health Insurance
  Medical
  Other
  Pharmacy
Housing
  Furniture/Accessories
  Home Insurance
  Maintenance
  Mortgage
  Other
  Rent
Leisure
  Entertainment
  Fitness/Sport
  Other
  Personal Care
Loans
  Other
  Taxes
  Transportation
  Travel

当然我觉得个人没有必要划分的这么细,可以在使用的过程中再逐步增加分类。

; 衣、鞋
2010-01-01 open Expenses:Dressup:Clothing

; 食
2010-01-01 open Expenses:Food:Drinks ;"饮料"
2010-01-01 open Expenses:Food:Fruits ;"水果"

; 住
2010-11-11 open Expenses:House:Rent              ; 房租
2010-11-11 open Expenses:House:WaterElectricity     ; 水费、电费
2010-01-01 open Expenses:House:Gas ;"燃气"

; 行
2010-11-11 open Expenses:Transport:Public
2010-11-11 open Expenses:Transport:Taxi

; other
2010-01-01 open Expenses:Digital

开支分类这个事情也可以做的比较智能一些,比如通过学习,自动进行分类

不过我个人还是觉得通过关键字自动进行开支账户的导入还是足够精确的。

给 Liabilities 账户命名

最常见的负债账户就是信用卡了,可以将开卡的时间以及开卡的银行记录下来。以后按月整理信用卡账单就会方便很多。

如果涉及到房贷等等,其实是差不多的。

比如开通一个交通银行信用卡的账户:

2010-11-11 open Liabilities:CreditCard:BOC CNY

和之前一样,在处理借款的时候,也可以用账户来追踪:

; 欠钱
2000-01-01 open Liabilities:Payables:Zhangsan CNY

Beancount 这样的纯文本记账工具,对于账户开通和关闭处理几乎没有成本,可以任性地添加账户。

命令规范

命名规范可以简化理解的成本,和代码规范一样,帐本被阅读的次数肯定要比记录的时候要多,尤其是当帐本越来越复杂的时候。一套有机完整的命名不仅可以让记账更人性化,也可以免去之后再去频繁修改账户名字的烦恼。

个人为 Beancount 的账户命名应该要遵守几点:

  • 账户名要尽量详细,但不应该太长,个人使用的习惯一般不会超过3级目录。
  • 帐户名有大到小整理,在 fava 界面中,多级账户会进行归类求和,可以清晰地看到上一级账户的总额
  • 在初始开通账户的时候尽量采用详细的多级账户,在未来合并账户的操作可以通过替换完成,但是拆分账户的操作则需要一一核对
  • 降低记账的认知负担,在确定好帐户名之后尽量可以通过直觉直接确定应该归属到哪一类账户。

附录

mint-categories

mint-categories https://www.mint.com/mint-categories

Expenses (all types)
  1. Rent/Mortgage
      a. Home Owners Association Dues
      b. Rental Insurance
      c. Home Owners Insurance
  2. Fixed Expenses
      a. Utilities
      b. Gas
      c. Electric
      d. Water/Trash/Sewer
      e. Cable/Internet/Phone
      f. Cell Phone
      g. Credit Cards
      h. Car Expenses
      i. Maintenance
      j. Gas
  3. Extra Expenses
      a. Grocery (Food)
      b. Clothes/Shoes/Hygiene
      c. Extra for Home Expenses
  4. Savings
      a. Savings Account. Speak with employer; some saving plans can pull from paycheck before taxes. That means less of your paycheck is taxable.
      b. Create an Emergency Fund; it should be at least 6 months of expenses. Emergencies can happen and drain a well-established savings account
  5. Taxes
      a. No explanation needed
  6. Fun Cash
      a. Out with friends
      b. Movies
      c. Vacations

GnuCash

  Adjustment
  Auto
      Fees
      Gas
      Parking
      Repair and Maintenance
  Bank Service Charge
  Books
  Cable
  Charity
  Clothes
  Computer
  Dining
  Education
  Entertainment
      Music/Movies
      Recreation
      Travel
  Gifts
  Groceries
  Hobbies
  Insurance
      Auto Insurance
      Health Insurance
      Life Insurance
  Laundry/Dry Cleaning
  Medical Expenses
  Miscellaneous
  Online Services
  Phone
  Public Transportation
  Subscriptions
  Supplies
  Taxes
      Federal
      Medicare
      Other Tax
      Social Security
      State/Province
  Utilities
      Electric
      Garbage collection
      Gas
      Water

其他模板


2021-02-11 beancount , accounting , bookkeeping , double-entry

电子书

最近文章

  • 读书是否是唯一重要的事? 不久之前和朋友约去了趟植物园,聊起读书是否是第一要务的时候产生了一些分歧,关于是否要去学习如何学习这一件事情产生了一些分歧。我站在的立场是读书是必须的,而我朋友则认为在有限的时间里面实践要优先于读书。而关于要不要学习如何学习这一件事情,他仍然坚持自己的实践而非去了解如何学习。
  • Android 上的 RIME 输入法 trime 同文输入法使用 早之前就已经在 Linux 和 macOS 上配置了 RIME 并且一直使用到现在,但是在主力的 Android 上从最早的触宝输入法,后来切换成 Gboard,日常使用倒是没什么大问题,就是有一些词总是需要翻页才能找到,这让我非常不爽,就想手机上能不能用 RIME,于是就有了这篇水文。
  • Obsidian 使用篇一:使用 markdown-clipper 全文保存网页 之前使用整理 Evernote 代替品 的时候就提出了我自己的一个需求,就是有一个完善的 Web Clip 系统,Evernote 和 WizNote 都做的比较不错。但 Obsidian 并没有提供类似的工具,不过幸好 Obsidian 使用 Markdown 来管理文档,这样的开放程度使得我可以寻找一个将网页变为 Markdown 的浏览器扩展就能做到。
  • 使用了半年 macOS 之后 我又回到了 Linux 的怀抱 我在使用了半年 macOS 之后,又回到了 Linux 的怀抱,虽然 macOS 有其自身的优势,我也不否认 macOS 系统上软件生态的友好,但我发现即使我将日常开发主力机器装回到 Linux,也没有丧失操作系统的便捷性和易用性。这或许和我下意识的只使用跨平台的软件有关,并且最长使用的软件几乎都是一套快捷键。
  • 重置 macOS S.M.C 和 NVRAM 今天用得好好的电脑突然三次黑屏,两次发生在早上刚刚使用的时候,一次发生在晚上回家之后。所以一怒之下就直接上官网联系了 Apple Support,但是也不知道是不是我直接登录的 .com 网站,在我提交了 Support 之后一分钟一个外国小哥打了电话过来,我一下子没反应过来,只能用着不那么熟练的英语开始了 macOS 修复之路。