《要钱还是要生活》书摘

black smartphone screengrab

作者:[美]维姬·罗宾,[美]乔·多明格斯

  • 财务自由的意思就是不必再为了钱而工作。
  • 读任何有关金钱的书都只有一个理由:让自己有能力过上更好的生活。
  • 年轻人步入社会后,他们的学士学位保证不了他们的收入足够偿还债务。在他们所处的世界里,无论从事什么工作,每个人都是YO YO族: You’re On Your Own(自生自灭)
  • 这些年轻人的人生规划不是在职场步步高升,而是追求人生意义,采用更弹性、自由、创新的工作方式,不局限在某个职位,而是关注自己整体的职业生涯
  • “拥有更多”是一个欲望的无底洞。无论你现在有多少钱,若一心想着“更多就会更好”,你就会以不断获取为头等大事。
  • 财商(FI1)、财务诚信(FI2)、财务自由(FI3)和财务依存(FI4)。
  • 完美无缺的职场生活要有足够多的挑战,让人感到有趣;要有足够多的安适,让人身心惬意;要有足够好的人际关系,让人神清气爽;要有足够多的空间,让人有成就感;要有足够充足的时间,让人能够完成工作;要有足够多的闲暇,让人精神焕发;要有足够多的价值,让人觉得自己不可或缺;要有足够多的乐趣,让人乐在其中;还要有足够多的收入,让人可以付账单……凡此种种。
  • 如果日复一日的工作让我们感到幸福快乐,那么,烦躁与不便就可以忽略。如果我们能相信自己从事的工作确实在使世界变得更美好,那么,我们会毫无怨言地牺牲睡眠和社交生活。如果我们用辛苦工作换取不错的收入,不仅让我们感到短暂的快乐,同时还有满足感与成就感,那么,我们多花些时间在工作上也心甘情愿。然而日益明显的事实是,除了最低限度的舒适之外,金钱并没有带来我们所追求的幸福。
  • “更多就会更好”的观念必然导致不满情绪。如果你努力为拥有一切而活,你拥有的就永远不够多
  • “足够”是一种无所畏惧的状态,一种胸有成竹的状态,一种坦坦荡荡、有自知之明的状态。它是指充分欣赏和享受金钱给生活带来的一切,但绝不购买不需要、不想要的东西。
  • 因此,断舍离不是让你随意地丢弃物品,而是为迎接新事物清理空间、腾出空间。尽管这些理念是不言而喻的,但许多人对接受这些理念怀有或明或暗的抗拒。只要一提起缩减规模、开源节流,总让人以为是因为生活艰苦、穷困潦倒。
  • 凡是在你身边、对你无用却占用空间的,那都是废物。
  • 在对改变有害行为进行抉择时,反责与分辨是有区别的。反责关乎羞愧与责怪、善与恶,分辨则是厘清事实与谎言。沉浸在责怪和羞愧情绪中会拖慢你迈向财务自由的进度。反责会让你停滞不前、灰心丧气、心绪不宁。分辨则会照亮潜在的陷阱,这样你就可以绕开它们。
  • 约翰·斯图尔特·密尔曾经说过:“人所渴望的不是富有,而是比别人更富有。”换言之,一旦富有变成了跟我们一样的人都能达到的状态,那它就不复为富有。
  • 你要做的就是保持自觉。所谓自觉就是:当你思考和感知的时候,你很清楚自己在想什么、感知什么。
  • 低级兴奋来自外在奖励,深层兴奋则来自“生命被用来达到你自认为崇高非凡的目的”。低级兴奋是短暂的,深度兴奋则能持久。你的满足感是内在衡量深度兴奋的标尺。
  • “财务自由”包含的一个内容就是“不需要用钱来满足需要”,这与对“财务自由”的误解正相反,误解就是:所谓“财务自由”就是有足够多的钱雇人为我打理一切事情。
  • 会计方式无所谓对错。你要选择能给予所需信息的方式,这样,你瞥一眼挂图就能知道自己的当前状况和未来走向
  • “简约”和“极简主义”这两个词概括出了无多余负累之特点,但也有些清苦的苦行僧意味。“收纳”技巧强化了追求快乐之愿望,但仍主要着眼于物品,而不是更深层次的时间、金钱和满足感等问题。“节俭”一词曾经堪当此任,但到了20世纪中叶,它变得像大萧条时代的祖父母一样让人感到古怪。
  • 浪费不是指拥有的东西多,而是指未能享受它们。要衡量你在节俭方面是否成功,不必看你的吝啬程度,要看你对物质世界的享受程度
  • 北美的“更多会更好,永远都不够”的心态不符合节俭的定义,并不仅仅是因为有多余,也是因为欠缺对我们已拥有东西的享受
  • 节俭是我们所追求的平衡。节俭是能够高效地从你所在的世界中收获幸福。节俭是恰当使用(发音正好与“正当”相近),也就是明智地管理金钱、时间、精力、空间和财产
  • 替代原则说:“当你想购物时,花点时间追溯到需求所在,问问自己最能满足这个需求的创意还是消费。
  • 节俭的一个基本原则就是避免欠债。
  • 贷款买车和分期付款购买大件也一样,如果有低利率或零利率优惠,而且你能做到按时还款,那就可以考虑。
  • 预防是关键。充分利用你所买的健康保险的附带服务,包括预防性问诊和检查、生活指导、心理健康检查和健康俱乐部会籍
  • 简单易行的养老生活投资》
  • 许多财务自由人士表示,当孩子意识到他们必须花自己的钱去买想要的东西时,他们很快就变得节俭和有创业精神。
  • 另一个小窍门是在亲子时刻尽量以创意代替金钱,包括规划生日聚会(自制蛋糕以及土豆布袋赛跑和扔水气球等老式游戏既有趣又省钱)和万圣节活动(手工制作服装很有意思,而且更令人难忘)
  • 金钱作为交换媒介的前提是交易双方一致认为它有价值
  • 金钱并没有我们赋予它的种种意义,也不等于金融体系中的严峻现实,它是我们选择用生命能量去换取的东西
  • 认识到“金钱是用生命能量换来的”只需要一瞬间,践行这个真理却是持续一生的发现之旅。
  • 富有只存在于同其他人或物的对比中。富有是比我现在拥有的要多得多。富有是比其他大多数人拥有的要多得多
  • 这个例子中,你花掉的每一美元代表你生命中的6分钟。下次掏出20美元买一件逢见必买之物时想想这个数字吧。扪心自问:这个东西值我花120分钟的生命能量吗?它与我花两个小时在路上奔波、开车去上班或者挖掘未来客户等值吗
  • 凡此种种情形,都起因于同一个思想根源:钱就是钱,爱就是爱,两者永远不该有交集。检讨一下你自己的态度吧,你是否在用高尚的哲学理想或精神理想为财务上的糊涂状态开脱呢
  • 人生亦然,一点点的蒙蔽造假就会让穿透云层的光亮减弱。因此,你要意志坚定、锲而不舍、绝不妥协
  • 辨别力与我们人人都拥有的天赋有关,那就是:懂得真理何在,看得清全局,明白我们真正想要的是此生有所作为
  • 记住,无论哪个问题,在末尾加上一句“为什么”会让它更有深度。无论哪个问题,补充一句“我给出的答案对社会有何影响”会让它更有广度。
  • 《笨人的节俭生活》(Frugal Living for Dummies)
  • 凡是你买了并不使用的东西,凡是你扔掉的东西,凡是你消耗了却并未产生愉悦感的东西,那都是浪费金钱,是浪费你的生命能量、浪费地球上有限的资源。
  • 诗人纪伯伦告诉我们:“工作是眼睛能看见的爱。
  • 《石器时代经济学》(Stone Age Economics)
  • 《工作无止境》(Work Without End)
  • 我们(作为一个社会)关于休闲的概念经历了翻天覆地的变化。它曾经被认为是日常生活中令人向往的文明教养的表现,现在逐渐变得让人忌惮,提醒人们想起大萧条岁月里的失业情况。随着休闲的价值下降,工作的价值上升,对充分就业的倡导,再伴以广告业的发展,造就了民众越来越重视工作、重视挣更多的钱以便消费更多的资源
  • 让一份职业令人满意的是成长潜力、沟通渠道、工作兴趣、赏识认可,不是报酬
  • “工作”是指一切生产性的或有目的的活动,有偿就业则是众多这种活动中的一种
  • 凡是我们所做的与人生目标一致的事情都叫“工作”。通过斩断这一联系,我们找回自己的人生
  • 我们把犹如圆枘的自我强塞进一个叫作“职业”的方凿,越发让人觉得生活的内容就是从一个固定列表中进行挑选。除非你是艺术家或企业家,否则你的工作内容通常就是配合别人的议程,并因为这种效劳而得到报酬。职场有一种微妙却普遍的事不关己的气氛,觉得我们总是在替别人效力,总是在设法取悦地位比自己高一点的人。在大公司里,多数员工根本不知道他们辛辛苦苦执行的计划由谁制订。
  • 挂图每天都在提醒她:把生命能量卖得越贵,她就能越早把时间重新掌握到自己手中。
  • 第七步不过就是珍惜你的生命能量和增加你的收入,因为有偿就业的唯一目的就是获得报酬。你这样做不是出于贪婪或竞争,而是出于自尊和对生命的感激。
  • 本总额,将结果填入挂图: (资本×当前长期利率)÷ 12 =月度投资收入
  • 交叉跨越点”为我们提供了“财务自由”的最终定义。在月度投资收入超过月度支出的那个交叉跨越点,你将实现传统意义上的财务自由。你将从职业以外的来源获得被动收入。
  • 如果你把生活看得比职业更重要,并且能够设想只需要在一个有限的、可预见的时间范围内为了钱而工作,那么你工作起来可能会更有干劲、更讲诚信。当你意识到自己只需要为了钱而工作有限的一段时间,你在学会珍惜生命能量时开始具备的自信、振作、奉献、诚信、以工作能力为荣和高度负责的品质就会显现出来。
  • 对于那些不实现财务自由不罢休的人来说,本计划的一个基石就是:现在专心挣钱,以便今后不必挣钱。所以你是集中、有意地在有限的一段时间内挣钱(不出卖正直诚信,也不危及健康)。
  • 资本、缓冲资金、缓存金,它们是财务自由的三大支柱。
  • 选择”是财务自由的真正核心。它跟金钱无关,它关乎你往哪里投放最宝贵的资源:你的时间,你的注意力,你的生命
  • (资本×当前长期利率)÷ 12 =月度投资收入
  • 《通往财富的简单道路》(The Simple Path to Wealth)一书作者J. L.柯林斯(J. L. Collins
  • 书《极简主义:过有意义的生活》(Minimalism :Live a Meaningful Life)

每个人都需要一个战略

two people drawing on whiteboard

如果说,如何拥有一个稳定的个人评价体系 谈的是「选择和目标」,那么今天要聊的就是达成目标的路线。

每个人都需要有一个属于自己的战略,来逐渐的达成自己的目标。目标搭配着战略,剩下的便只有努力达成战略过程中的每一个 Milestone,最终达成自己的目标了。

战略的重要性不言而喻。

接下来的重点是:什么是战略?

战略或策略,是指为实现某种目标(如政治、军事、经济、商业或国家利益等方面的目标)而制定的高层次、全方位的长期行动计划。

维基百科

从维基百科的描述当中,我们可以抽出几个关键的定义

  • 战略的设定应该是达成某个目标:先有目标再有战略,而不是先有战略再想目标。
  • 战略应该是长期行动计划:战略意味着你要做一个偏长期的规划,这个规划可能是一年、三年、五年,甚至是十年。但肯定不是一星期,两星期的,那个叫计划或 Todo。
  • 战略应该是高层次、全方位的计划:高层次意味着战略关注的是一个在长周期下有效的事情, 而非短期有价值的。追求的更多的是长期价值;而全方位则提醒我们,战略不止我们能一眼看到的东西,还包括我们需要仔细思考才能意识到的问题。

但上面的这些似乎还是有点模糊,不具备可执行性,那是否有一些更具有可执行性的建议?

1. 战略的核心是聚焦

战略的重点不在于你要做什么,因为那个已经被目标定义。反而,战略要定义你不要做什么。我们选择做一件事的理由可能不重要,但我们选择不做一件事的理由非常的重要,因为他代表着背后的思考。

同样的,战略因为是一个更长期的过程,我们必须确定哪些事情是重要的,而重要的事情,往往只有很少的几件。如果你的战略有 30 条,那大概率不是战略,而是战术。

2. 战略要找到关键点

战略是要解决一个更加长期的问题和方案,在这个过程中,你需要做的是尽可能的找到其中的关键点位,通过撬动一个关键点位,来降低自己后续的实现成本。如果战略虽然制定,但却没有找到关键点位,可能会让你的目标离你越来越远。

不过,如果你的能力和判断力不足以让你找到战略的核心关键点也不影响,可以先设定一个指标,先快速尝试一下, 并推演当前的指标和手段是否可以持续产生效果和价值,再决定战略的关键点。

一些核心的判断点包括:

  • 不要边污染边治理:边污染边治理意味着你永生无法达到目标,你可以无限逼近目标,但永远无法达成目标。
  • 权责对等:在设计战略体系的时候,往往会遇到需要和他人协作共同达成。在涉及到和他人共同协作的时候,一定要注意权责对等。以及,要尝试为他人的部分设定 Plan B ,不要出现一着不慎,满盘皆输的局面。

我不后悔我学的是 EE

blue and black circuit board

我并不是一个学 CS (Computer Science)出身的工程师,我是一个学 EE(Electrical Engineering)的工程师。我的大学本科专业是 —— 电子信息科学与技术(Electronic Information Science and Technology)。

虽然本科不是 CS ,没办法如其他从业者一般,系统性的学习数据结构、计算机原理等一系列基础课程,给我的计算机从业带来了一定遗憾。但好在这些经典内容我可以通过 Mooc、自己阅读相关的图书来获得,虽然不能说学的就比人家科班的好,但好在是够用。

此外,软件行业的从业比较依赖你的实战能力,我因为喜欢 CS,所以其实从初中就开始 Coding ,当我毕业的时候,已经 Coding 了近 10 年,越过最基础的那些痛苦的日子,倒是也不影响我就业。

反倒是 EE 的背景,赋予了我无限的可能。我可以从事前端、后端的工作,但同时也可以成为一个嵌入式工程师(毕竟大学整这玩意的),也可以自己亲自上手设计板子、焊板子,给我了不一样的可能性和未来。

反倒是出身于 CS 的同学,因为所学内容和所工作内容的高度一致性,很难表现出背后的交叉价值,比较难有更多的选择。

我不后悔我学的是 EE。

不过,我还是会拿自己学 EE 来打趣:「当年报志愿的时候不懂,打电话给招办,问这个是不是 IT 行业,人家说是,我就报了。没想到这个是偏电子的 IT…」

不删旧文章

MacBook Pro near white open book

我的博客的一个特色是,我很少删除旧文章。

一个核心的原因是在我看来,这些旧文章虽然拙劣、天真、单纯,但从某种视角上,那是我的过去。我没必要修改我的旧文章,来掩盖自己的过去。我不太需要所有人都认为我是完美的。

当然,另外一个重要的原因可能是我懒得去修改自己之前的文章了。毕竟目前已经一千多篇文章了,实在是懒得更新了。

倘若我要写一篇文章,且和之前的文章相关,我可能会选择在文章当中引用旧文章,从而方便读者了解到之前我的思考轨迹。

而不删除旧文章获得的一个好处便是,我的思考轨迹,我如何变成如今的我都有迹可循。

Kindle 之于我,到底意味着什么?

5430447568ebabfac404a65fa9b88433

我写 Kindle 并不多,往往是用 Kindle。最近写的 Kindle 的文章,也不过这三篇

我用 Kindle 读了很多的书,了解了很大的世界。但另一方面,我确实也很少只用 Kindle。实际上, Kindle 于我,真的就是一个随身的图书馆,我会在这个随身图书馆里放着各种图书来看。

如果只说 Kindle 的实体阅读器,也就到此为止了。不过除了这些,我还常去浏览 Kindle 的网站,看看 Kindle 商店最近上了什么新书。

d2b5ca33bd970f64a6301fa75ae2eb22 4

Kindle 商店的停运,于我而言,便是缺少了一个重要的发现图书的途径。有朋友会建议豆瓣也不错,但对于我来说,豆瓣大部分时候是用来记录我要读哪本书和我读过哪本书的,很少用来发现图书。除非是我要对图书进行专题方向的研究,则会通过某本书所在的豆列来查找更多的图书。

d2b5ca33bd970f64a6301fa75ae2eb22 5

不看豆瓣的图书,可能是因为他上面总是新书速递,大部分书都是我不喜欢的,久而久之就不怎么看了。

此外,我偶尔还会用微信读书的书单功能,来查看一些有意思的图书。不过因为没有 PC 版,发现新书的概率终究是低了一些。

唉,少了一个能发现书的途径。

我已经很久没有去图书馆了

girl reading book

在看订阅的 Newsletter 的时候,看到这样一段话。突然想起来,我似乎很久很久没有正经的去图书馆了。偶尔在商场里看到书店还会进去看一看,专门去图书馆真的是很少再去了。

d2b5ca33bd970f64a6301fa75ae2eb22 3

回想小时候,我常泡在图书馆里,周末往往是从吃完午饭呆到吃晚饭,一看就是看好几个小时。图书馆比较远,我有些时候也会去别的大型公立书店读书(新亚书店),放学以后就从家里走去书店看书,看几个小时再回家。

而从上了初中以后,因为学业的压力,就不怎么去书店的看书了。再加上初中开始,我将不少的时间投放在计算机上,去书店就越来越少了。

上了大学,我重新回到了有闲的状态,但我也再没回到过图书馆了。更多的时候,我都是直接买实体书了。毕竟我看的书大多是计算机相关的,等图书馆采购不知道猴年马月了。再加上大学时做了不少外包项目,也赚了一些钱,有钱就自己买。在大学时, 我除了买实体书,还买了 Kindle ,并订阅了 Kindle Unlimited 的,毕竟一年百来块,图书却可以一直借,很划算。

有钱,让图书馆离我越来越远了。回想一下,小时候喜欢去图书馆,大概是因为那个时候没钱买书,所以不得不去图书馆“白嫖”了。

如何拥有一个稳定的个人评价体系

floating green leaf plant on person's hand

人这一生难免会遇到不靠谱的朋友、上级、前辈,他们会在各种方面对你进行 PUA 。而一个对抗 PUA 的很重要的手段,便是构建一个稳定的自我认知和自我评价体系。

我们现在生活当中,接受着外部大量的信息和评价。对于我们身边的绝大多数人来说,我们不可避免在的在过去被父母拿来和其他同龄人对比(别人家孩子),也会有不少人因此留下阴影。在被对比的过程中,难免就会产生不健康的逆反心理和错误的自我认知和自我评价。

在我看来,一个稳定的自我认知源自于以己为本的自我评价体系。以己为本不意味着你不需要参考外界的信息,但你的出发点应该是你自己,而不是别人。父母的对比往往就是以他人为本,指责孩子为什么不如他人,他人才是基准。而以己为本的评价体系,则是以自己为基准,看自己和他人有哪些差距,如何缩小甚至完全没有差距。

而关于具体的制定自我评价的体系,我的建议是:

  1. 先明确「我是谁」。
  2. 再明确「我想要达成的目标」,这个目标可以是一个人,但不能是你直接联系得到的人(最好是已经去世的人,因为对于他们的评价已经基本定型,不会出现现在的明星塌房的事情)。
  3. 再明确「我和目标中间的人的水平」,这个目标同样可以是一个人,类似的,应该是一个你无法直接联系到的人。
  4. 当你明确了自己想要的目标之后,你已经大致知道他在历史上的位置。

现在,要解决的问题是,如何找到自己在历史上的位置。

前面我们提到,制定的目标需要是一个摸不到的、最好是已经去世,已经盖棺定论的人。而我们的参考系相对就没有这么麻烦。我们可以选择身边我们认为最厉害的人作为参考,进行对比,并通过对比找到自己的不足,补全这些不足。当我们已经超越了当下我们所定义的参考系之后,就可以重新寻找新的参考基准,并校准自己的认知。

在确立参考坐标系后,再不断的通过参考人来校准,从而让我们获得一个相对稳定且明确增长的个人评价。这样的个人评价体系在面对日常生活过程中的 PUA ,可以简单从容的去面对:你的评价是否是有价值的?对于我达成我的终极目标是否有效?。就算对方想要 PUA 你,也会因为无法动摇你内心的自我评价,而无法对你产生危害。

祝你拥有一个稳定的个人评价体系。

周报你可以不给别人看,但要自己写

white floral on white book page

在 V2ex 上有两个对立的帖子,写周报的意义何在?我个人觉得要认真写日报、周报、开好站会~

我自己的观点是:

  • 周报、日报可以不给别人看,但你应该自己给自己写一个周报/日报。这是为了帮你自己更好的做总结和记录,在日后需要的时候,有可用的资料。

我其实能理解那些反馈日报/周报的人的想法,在一个社交的场景下,周报和日报很快会流于形式,变成同侪压力( Peer Pressure),大家自然厌恶这样的内容和形式。但大家讨厌的是这种压力和无意义的竞争,而不是讨厌日报、周报本身。如果我将压力和记录拆开,则可以更好的看待日报、周报这些东西。

我们的生活当中需要处理太多的事情,这些事情往往在当下被我们一件件的处理掉,然后被我们抛之脑后。但这些小事,对于我们来说同样也是珍贵的经历和回忆。当日后我们希望回溯的时候,没有当下的记录,是一个十分困难的事情。

这也是后来为什么我开始写日记,记录每天零零碎碎的琐事。哪怕我的日历里只有几张照片、 几个地名、零零散散的只言片语,也可以帮我在日后重新回溯历史,成为我宝贵的记录。

从医生的“医学研”演化到工程师的“产学研“

medical professionals working

最近在听「发热电台」,在最新的一期节目当中,提到了医生职业体系当中对于医生的要求:医学研一把抓。

  • :医生的本质工作,治病救人。一个好的医生应当是能够治病救人的。有治病救人的结果出来。
  • :医生的教学工作,带实习生。一个好的医生的成长周期是很长的,期间则得益于前辈们的提携,才能逐渐成长为一个优秀的医生。
  • :医生的研究工作,在医生的体系内, 论文是一个评职称非常重要的评估因素。一个好的医生需要有自己的研究成果。

上面这三点让医生们苦不堪言(毕竟我国医疗资源不足,医生们完成医的任务就已经精疲力竭了),纷纷吐槽。

但我从中却注意到,似乎我们常见的职业当中,很多并没有类似的要求。而实际上,医生的“医学研”的设定帮助医生延长了自己的职业生命周期。

将其迁移至软件工程师领域,则是产学研一把抓

  • :产是软件工程师的本质工作,负责完成工作中的任务,将想法变为现实。这也是大多数软件工程师的日常。
  • :学和医生的定义类似。好的工程师应该试着将自己掌握的知识教授给学生。这些学生可以是你身边的实习生,也可以是你在社交网络上的粉丝。重要的是将知识传承下去,以及通过教授验证自己是否真的学会了。
  • :研则和医生略有不同。一方面,你可以通过类似医生的方式,撰写论文, 提交自己的研究报告给各期刊,来完成自己的研究工作。另一方面,你的研究工作可以和你自己工作使用的各项基础依赖结合,以开源的方式来展示你的研究成功。

当然,我能想到,这样的三条达成是很难的。但就如同医生一样,当你能做好这三条的时候,大概率你的职业生涯也会被延长,不用担心所谓的 35 岁危机。

别只顾着低头拿牌

person playing poker

对于大部分普通的青年人而言,最大的问题不是不努力,而是没有努力的方向。

我们常看到青年们在学校中追逐着自己身边人的脚步,别人做什么,自己也做什么。他人拿到了什么样的奖项,我就一定要拿到什么样的奖项。

但从未思考过,到底什么是想要的?无限制的拿牌只会让你在焦虑当中深深的陷下去 —— 毕竟感觉自己拿到了更多的牌,应该就能赢了。

现实往往不是那么的简单,我们看到别人能赢,是因为他规划好了自己的路线,而我们没有按照自己的规划去拿牌,最后虽然手上牌多,但不能帮助自己很好的达成目标,一切都是白搭。

更好的方式是 —— 想明白自己想要的是什么,然后在想要的方向上努力去拿牌,然后达成自己的目标,成功和牌。

以终为始,很重要。

线性内容与非线形内容:兼谈电子书与实体书

person reading book white sitting

今天在在读网络空间的兴衰的时候,里面的一句话引起我的注意

人们在阅读文字时,常常快速扫描文字,找到感兴趣的部分再按照顺序细致阅读,这也达到了随机访问的效果。而音频与视频不能快速扫描,只能依然按照时间顺序快进或快退,来搜寻想要的内容,有较强的线性。

OrangeCLK

而我们所熟悉的音乐播放器的概念,也不过是更加方便的切换帧

现代音频视频播放器提供了进度条操作的接口,可以在时间轴上选取播放时间,有了一定随机读取的功能。但大体上音频与视频仍然是线性媒体,它只有按照时间顺序播放时才能提供意义,计算机提供的操作接口只是让人可以选择播放起点。音频视频中各帧内容只有时间关系,没有其他联系。

上面这段描述,突然让我意识到了我自己阅读习惯的一部分 —— 关于买书。

我算是一个比较喜欢买书的人,每年基本上都会买一些实体书和电子书来看,电子书我有4部 ,实体书有近 200 本。

我买的电子书和实体书也会有明确的方向倾向:

  • 工具书、计算机相关的,大多买实体书 、 PDF
  • 社科类图书、传记类图书,大多买 Kindle 电子书 / 微信

工具书买实体,是因为我在看工具书的时候会需要从目录快速导航到某个具体的细节,然后在这个细节里进一步快速跳转。在读这些工具书的时候,我的目标就是 —— 快速读完,然后解决问题,合上书。

除了工具书之外,我还会把一些我在电子书当中看到觉得不错,打算长期持续性阅读的传记等,买成实体书以便随时翻阅。

而社科类、传记类的图书,由于其内容和时间序、顺序阅读强相关,没有那么强的随意跳跃的诉求,携带方便的电子书就成了最佳的选择。

当时不明白自己为什么这么样选择,现在看看,大概是因为信息本身的特质决定的。

运用深度优先和广度优先算法获取更多的信息

smartphone showing Google site

我平时会看很多的文章,这些文章成为我不断的创作的重要的灵感来源和信息收集的来源,因此,我对于信息的收集和整理也颇为关注,只为收获更多的信息。

在实际的阅读当中,我会采用深度与广度优先结合的方式,来遍历我所看的文章、图书,从而获得一个更大范围要阅读的内容。

主题 · 深度优先遍历

我的阅读往往是从某一个主题开始的,通过搜索引擎,找到搜索引擎当中排行靠前的文章,作为我的主题文章。

d2b5ca33bd970f64a6301fa75ae2eb22 4
搜索获得主题文章

在阅读主题文章时,我会进行广度优先遍历,将文章当中提到的关联文章、参考链接用新标签页面打开放在后台,等待稍后处理完当前页面再进行阅读。这个时候,我阅读的文章就会从原本的一篇文章,变为 1 + 3 篇文章;

d2b5ca33bd970f64a6301fa75ae2eb22 5

在阅读完主题文章后,再依次阅读其相关文章 A、B、C。并在 A、B、C 的基础上,进一步挖掘相关文章 D、E、 F、G、H。此时,我阅读的文章变为了 1+3+5。

d2b5ca33bd970f64a6301fa75ae2eb22 6

现在,我要读的文章就从一开始的一篇主题文章变为了共计 8 篇文章,获取了 8 倍的信息。如果此时我的问题已经得到了解决,那么我就可以对这些信息进行收拢和汇总,达成我的目标。如果此时问题没有得到解决,则可以继续进行广度优先遍历,进行进一步的挖掘。

此外,如果到了某一层发现不再有相关的文章可以查看,则可以退回到搜索引擎,从第二篇开始重新进行主题级别的深度优先遍历。

作者 · 广度优先遍历

当我完成了当前主题的研究时,此时我仍然保有 8 篇文章的链接。窗口依然没有关闭,此时我会进行作者级别的广度优先遍历。

我会从当前的文章当中跳转到博客的归档页面或首页,从首页开始逐篇阅读下去,直到读完某篇博客。

d2b5ca33bd970f64a6301fa75ae2eb22 7

基于之前开的 8 个不同的页面,可以进一步广度优先各博客主的文章,并在感兴趣的文章当中进行进一步的深度优先遍历,来查看更多的内容。

长此以往,你会发现,自己要看的文章越来越多。当然,你也可以收集到越来越多的信息。

使用 Sheetjs 将 JSON Array 转化为 Excel

white printing paper with numbers

使用 node-excel-stream 来按行处理 Excel 数据 中,我提到,如果你希望简单的完成 Excel 的读取和处理,那么 node-excel-stream 是个不错的选择。而反过来,如果你希望将 JSON Array 导出为 Excel,那么 Sheetjs 是个不错的选择。

注意

Sheetjs 和 exceljs 不同,区分了商业版和社区版。我们这里使用的是社区版 Sheetjs CE

用法

使用 Sheetjs 对数据进行导出时,你只需要调用 XLSX 方法当中的 json_to_sheet ,就可以将你的 JSON Array 变为一个 worksheet,接下来只需要将其放入一个新的 workbook 当中,并导出为文件,就可以完成 JS 数据导出为 Excel。

const XLSX = require("xlsx");

const data = [
  {
    ...
  },
  ...
]

const worksheet = XLSX.utils.json_to_sheet(data);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "sheetNameIsFirst");
XLSX.writeFile(workbook, "output.xlsx");
Code language: JavaScript (javascript)

使用 node-excel-stream 来按行处理 Excel 数据

white printing paper with numbers

数据分析是一个非常常见的需求,而在实际的落地场景当中, Python 是使用最多的。不过我因为写了很久的前端,其实对于Python已经生疏了。当我开始启动项目时,就会选择执行 npm init 来初始化一个项目。既然如此,就试着使用 Node.js 来做数据分析。

在 Node.js 当中操作 Excel ,最好的便是 Exceljs。不过 ExcelJs 封装了大量的函数,对于绝大多数的数据分析场景来说,可能并不适用(也不一定,只是我比较喜欢用代码来描述逻辑,Excel 更多是一个导入导出)。

当明确了我只是需要一个简单的导入导出后,那么 node-excel-stream 就进入了我的视野。

读取 Excel 内容

和 Exceljs 不同,node-excel-stream 的封装相对简单,就是一个 Reader 和 Writer ,提供的方法也十分简单:读取文件、定义格式,按行处理内容;

需要注意的是,node-excel-stream 只支持 xlsx ,而不支持 xls,所以如果你用的是旧版,则需要重新保存成 xlsx 来进行处理。

let dataStream = fs.createReadStream('data.xlsx');
let reader = new ExcelReader(dataStream, {
    sheets: [{
        name: 'Users',
        rows: {
            headerRow: 1,
            allowedHeaders: [{
                name: 'User Name',
                key: 'userName'
            }, {
                name: 'Value',
                key: 'value',
                type: Number
            }]
        }
    }]
})
console.log('starting parse');
reader.eachRow((rowData, rowNum, sheetSchema) => {
    console.log(rowData);
})
.then(() => {
    console.log('done parsing');
});
Code language: JavaScript (javascript)

写入 Excel 内容

写入时和读取时相比,稍微复杂一点,需要将所有的输入使用 Promise.all包裹起来

let writer = new ExcelWriter({
    sheets: [{
        name: 'Test Sheet',
        key: 'tests',
        headers: [{
            name: 'Test Name',
            key: 'name'
        }, {
            name: 'Test Coverage',
            key: 'testValue',
            default: 0
        }]
    }]
});
let dataPromises = inputs.map((input) => {
    // 'tests' is the key of the sheet. That is used
    // to add data to only the Test Sheet
    writer.addData('tests', input);
});
Promise.all(dataPromises)
.then(() => {
    return writer.save();
})
.then((stream) => {
    stream.pipe(fs.createWriteStream('data.xlsx'));
});
Code language: JavaScript (javascript)

总结

如果你需要将 Excel 导入到 Js 当中进行处理,那么 node-excel-stream 是一个不错的选择。

warehouse — 一个简单易用的 JSON 数据库

black and yellow printed paper

在 Hexo 的 Github 组织下,有一个不明显,但却很有用的仓库 —— warehouse。

warehouse 是一个 JSON 数据库,基于 JSON 实现了各种类似于 SQL 的查询,可以帮助我们基于一个 JSON 文件来进行查询。在 Hexo 的静态生成过程中,warehouse 帮了大忙。

用官方的话来说,warehouse 就是 A JSON database with Models, Schemas, and a flexible querying interface.

在实际使用上,warehouse 确实如他所说的那边方便(虽然某些方法没有,但依然不影响他的使用很方便)。

Example

比如,如下代码就定义了 一个 Post 模型和对应的表。并实现了在这个表中插入一个新的数据。

var Database = require('warehouse');
var db = new Database();

var Post = db.model('posts', {
  title: String,
  created: {type: Date, default: Date.now}
});

Post.insert({
  title: 'Hello world'
}).then(function(post){
  console.log(post);
});
Code language: JavaScript (javascript)

如果你需要将这些数据保存为一个单独的文件,只需要修改初始化的参数,并执行 save 方法,就可以将 JSON 导出到指定的文件中

var db = new Database({
  path: "./test.json", // 将数据存储在 test.json 当中
});
db.save();
Code language: JavaScript (javascript)

类似的,如果数据已经构建好了,也只需要执行 load 方法,就可以加载数据。

var db = new Database({
  path: "./test.json", // 将数据存储在 test.json 当中
});
db.load();
Code language: JavaScript (javascript)

场景

如果你希望在内存当中对于 JSON 有一个更好的操作方式,那么 warehouse 是个不错的选择,不需要另外单独安装数据库,就可以实现类似于数据库的查询方式,体验还是非常好的。

如果你想了解更多,可以查看

如何判断一个颜色是什么颜色?

red yellow and green paper

当你看到这个题目的时候,你可能会有点迷惑:“一个颜色是什么颜色”,这个问题好无厘头。但如果我换个用法 ,你可能就能明白 — 人类是如何辨别出一个颜色是红色而不是绿色?

回想小时候,大家应该都听说过 —— 三原色。不同的人可能记得不同,有的人记得是红绿蓝(色光三原色),也有人记得是红青黄(美术三原色)。结果不一样,但并不影响。两种三原色都告诉你了 —— 一个颜色是可以由另外三种颜色组合而成。

这意味着,每一个颜色都对应着三个坐标。他们是 RGB 也好,还是其他也好,都是通过三个颜色的色码来确认是哪个具体的颜色的。我们的显示器也是如此制造的。

但三原色有个问题 —— 变量太多。假设我们在每个维度分 3 个不同的结果,三原色可以拼出 27 种不同的组合。如果我们在每个维度分成 10 阶,这个结果就是 1000 个不同的维度。按照 RGB的 0 ~ 255 ,一共 256 阶,则一共可以形成 16,777,216 个组合。如果你想要构建出一组用于判断的规则,就十分的困难。

因此,换一个坐标系会是更好的办法 —— 试试 HSL 描述方法。

HSL 是将 RGB 三维坐标转换为色相、饱和度、亮度(英语:Hue, Saturation, Lightness)组成的新维度坐标。

d2b5ca33bd970f64a6301fa75ae2eb22 2

当我们变为新的坐标系后,我们定义颜色的坐标就从过去的三个维度,变为了只需要色相(Hue)这一个坐标就可以定位的坐标。毕竟,如果一个蓝色不饱和饱和,都不影响他是个蓝色;同样的,一个蓝色的亮度不高,但依然是蓝色。

通过从 RGB 坐标系转变为 HSL 坐标系,我们就将过去的 16,777,216 个组合简化为 360 阶。从过去的三维坐标系,变为了全新的一维坐标系。

d2b5ca33bd970f64a6301fa75ae2eb22 3

这样我们就可以十分简单的来细分我们的不同的颜色,更好的来编写规则。比如Hue 在 15 ~ 45 时为橙色;在45 ~ 75 时为黄色;在 75 ~105 时为绿色等等。

在我们写代码的时候也会更加简单,我们只需要计算出具体的 Hue 的值,就可以得出对应的颜色的名字。

RGB to HSL 算法

如下算法来自 Wikipedia

https://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

设 (rgb)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于rgb中的最大者。设min等于这些值中的最小者。要找到在HSL空间中的 (hsl)值,这里的h ∈ [0, 360)是角度的色相角,而sl ∈ [0,1]是饱和度和亮度,计算为:14aa645507f35455bbc990e04ecc0907128c509a

fffb33944b2529ac9398bfb365968795a03b3ddc{\frac {1}{2}}\end{cases}}”>

l={\begin{matrix}{\frac  {1}{2}}\end{matrix}}(max+min)

h的值通常规范化到位于0到360°之间。而h = 0用于max = min的(定义为灰色)时候而不是留下h未定义。

RGB to HSL Sample Code

function rgbToHsl(r, g, b) {
  r /= 255, g /= 255, b /= 255;

  var max = Math.max(r, g, b),
    min = Math.min(r, g, b);
  var h, s, l = (max + min) / 2;

  if (max == min) {
    h = s = 0; // achromatic
  } else {
    var d = max - min;
    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);

    switch (max) {
      case r:
        h = (g - b) / d + (g < b ? 6 : 0);
        break;
      case g:
        h = (b - r) / d + 2;
        break;
      case b:
        h = (r - g) / d + 4;
        break;
    }

    h /= 6;
  }

  return [h, s, l];
}
Code language: JavaScript (javascript)

延展阅读

https://www.december.com/html/spec/colorterms.html

2022 年 7 月月度总结

summary

Objective 1:持续获取现金流,并构建未来收益的现金牛

KR1:投资收益达到 20000 元

之前跌掉的浮盈又双叒叕涨回来了。还是挺开心的。

KR2 :单篇稿费突破 6000 元

没有变化。不过看到了一个新的观点:

先报价,提供符合对应价格的产出;不断循环,并提供价值。

下个月试试看。

KR3 :达成年度预算,支出不超预算

换了新预算模型之后,并调整了计算后,发现我的 7 月的基本开支大概是在 8000 左右,看起来还是比较可控。目前的住房成本还是比较高的。后续继续观察。如果控制的好的话,一年成本也就是 10 万以内。

d2b5ca33bd970f64a6301fa75ae2eb22 1

KR4 :构建软件类现金牛业务,预期产生收益 10000 元人民币m

无进展。

Objective 2:提升生活基础设施,构建未来生活好基础

KR1:前往 6 个城市旅行

疫情。。。不出门。

KR2:进行 20 次文娱活动

主要是在家看书,倒没怎么出门。

KR3:借助智能化设备,缩减在家务相关事务上耗费的时间

暂无进展

Objective 3 :开拓视野,打造多元行业人才

KR1:写 15 篇书评

本月两篇书评

KR2:输出关于加密货币的 Newsletter 12 封

暂无进展。但最近开始继续用 Heptabase,希望早日输出成功!

KR3 :完成计划中的三本图书的写作

暂无进展。

使用小程序的 Canvas 2D 提取特定点的颜色

6ee6df690137fd06bc6166adb63caca1

在小程序当中,我们可以通过在 Canvas 画布上绑定 Tap 事件,来获取到用户点击行为,当我们获取到点击行为对应的坐标时,就可以读取到对应位置的颜色。并根据我们的需求,将颜色转换成我们想要的 RBG 色值。

这就是我们常见的各种取色软件的最常见的实现方式。当然,落实到实际开发过程中,大家或多或少会有所不同(涉及到调色。我们拍照的颜色和我们所看到的颜色并不完全一样。不同的相机调色会有所不同。类似的,我们需要加入相应的逆向算法排除对应的相机自身调教的影响)。

在小程序的场景中具体实现方式可参考如下代码:

页面布局

<view>
  <view><button bindtap="chooseImage">1. 选择图片</button></view>
  <view><canvas id="myCanvas" bindtap="onCanvasTap" type="2d" style="background-color:gray;width: 100%;margin-top: 100rpx;"></canvas></view>
</view>
Code language: HTML, XML (xml)

对应的 JS

和在 在小程序中使用的 Canvas 2D API 绘制本地图片 一样,你需要提取到 Canvas 的 Ctx ,用于执行操作。当你通过 bindTap 拿到你的点击点相对于 Canvas 的 左上角的坐标后,就可以使用 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/getImageData">getImageData</a> 来提取具体范围的数据。因为我的目的是提取某个点的颜色,因此我的第三、第四参数都是 1 (取一个像素点的宽度和高度)。

提取出图片数据后,你可以在 data 当中提取一个 4 个元素的数组,按照顺序,分别是 RGBA 的四个值,你可以根据需要使用这个数据(比如放大展示在界面上)。

Page({
  data: {
    color: ''
  },
  onCanvasTap(e) {
    const query = wx.createSelectorQuery()
    query.select('#myCanvas')
      .fields({
        node: true,
        size: true
      })
      .exec((res) => {
        const canvas = res[0].node
        const ctx = canvas.getContext('2d')
        const data = ctx.getImageData(e.detail.x, e.detail.y, 1, 1).data;
        const [red,gree,blue,alpha] = data;
      })
  },
});
Code language: JavaScript (javascript)