都 2022 年了,还需要独立站么?

blue and white light digital wallpaper

于2014 年不同,如今移动互联网盛行,对于很多企业、个人来说,独立站点已经不再是一个必选项了。

但在我看来,这是一个如何看待独立站和微信公众号/知乎账号的问题。

作为我个人,我常年维持的包括 Twitter、抖音、微信公众号、微信视频号、知乎账号。但同时,个人博客,也就是你现在看到的这篇文章所在的地方,也是我长期维护的主要阵地。

在我看来,独立站代表了自主可控。作为技术人,我们可能对于国内搞的信创嗤之以鼻,但我们必须要明白,我们嗤之以鼻的是将开源技术改改就叫自主研发的行为嗤之以鼻,而不是对于自主可控诉求的嗤之以鼻。

如果你只使用 Twitter、微信公众号等平台,那么你面临的问题可能是 —— 一不小心突破了平台的界限,就会直接将你的账号封禁,让你的账号无法访问,你的所有创作历史付之一炬。即使你的内容可能并不会被政府认为有风险,但平台出于自身保护的诉求,也可能预先将你的账号进行了封禁。作为创作者,这样的风险是极大的,你可能辛辛苦苦积攒的数年的工作,一夜之间化为乌有。

但如果你拥有一个自己的独立站点,那么当某个平台出现问题后,你依然可以基于自己的独立站点来进行维护和发布,你依然拥有自己这个独立站的可控。在这种情况下,独立站才是你自己的最核心的阵地,其他平台不过是你的一个运营渠道。渠道是可以随意更换的,而独立站才是你的立身之本。

当然,选择独立站也需要注意,什么样的更可靠,比如 ICANN 直接管辖的通用顶级域(gTLD)就比交给各国家管理的域名(ccTLD)更可控(国家域名有可能出于国家利益封禁,而由 ICANN 直接管辖的通用顶级域则不会)。比如一个简单的例子 —— 阿桑奇的维基解密即使让众多国家都颜面扫地,但依然存活于世,便是 ICANN 的中立属性带来的。只要维基解密能找到支持自己的服务器,就可以继续托管。

你当然可以选择不要自主可控,但你要明白是你自己把生杀大权交给了平台。

短跑还是长跑,你想清楚了么?

editing video screengrab

昨天,我写了《年轻人别太抗拒加班》一文,阐述了我对于加班的态度。

另外一个方向,我认为值得参考的思路是关于长跑和短跑的对比。

长跑和短跑的一个很大的不同是短跑更关注的是加速度和爆发力,你需要获得一个更快的加速度,并在很短的时间达到目标。而长跑太长,我们很难通过一次爆发来达成目标,则需要更换策略,采用的是跑的更久的路线来操作。

如果这件事放在加班上,则是需要思考你自己在一线城市的生命周期。

不得不说,我国的一线城市的落户并不容易,四大一线城市北上广深,只有广深略好,北京和上海的落户都是极为困难的。而想要长期在一个城市生活、养育下一代,户口是不可或缺的产品。在这种情况下,我们必须思考我们的策略:我在一线到底是长跑还是短跑?

对于绝大多数的年轻人来说,一线的生活都是短跑:在一线城市打拼,赚到一定的启动资金后,回到准一线,甚至是二线城市,找到一份不那么累的工作,安静祥和的生活下去。

而对于一部分优秀的年轻人来说,一线生活是长跑:可以解决一线城市的户口甚至是房子的问题,并在一线城市长久的生活下去。

对于短跑的人来说,你需要的便是在前期大量的积累自己的经验,让自己快速的崛起,并快速的回笼资金,积攒自己的资本。那么在不影响健康的情况下,加班就成为一个合理且高效的策略。

对于长跑的人来说,你需要的是在一线更加长久的待下去,让自己更好的融入城市的生活和节奏当中是更加重要的,加班是其次,下班去构建自己的生活圈和朋友圈会更加重要。

年轻人别太抗拒加班

editing video screengrab

这篇文章大概率会被读者说「爹味重」,不过,我还是想聊聊这个话题。

我堂弟看到我每天坐在电脑前,略显焦虑,总觉得我这样不够好,也担心他自己走入行业后,是这个样子的。

从我自己而言,我自己其实并不是特别担心加班这件事:

  • 一方面是对我来说,加班本身不是坏事,加无意义的班才是。如果我坐在电脑前始终在忙活着,那我觉得这是一个很好的状态。但如果坐在电脑前就是刷刷 Twitter,看看视频,那可能是没啥意义。
  • 另一方面,从我的视角来看,年轻人依然需要珍惜加班的时间。就如同马云老师说的「996 是福报」,你需要通过努力工作来让自己获得新的技能和技术,并通过这些技术获得回报。

但是,我也同样抗拒加班:抗拒那些明明没有事情干但又要坐在公司里不能走的加班。

如果加班是为了学习技能,提升自己的效率,掌握更多的能力,这是一个好事;如果加班只是为了满足所谓老板的管理欲,那我建议你早日跑路,这样的公司今天能让你留下来加班只是为了满足老板的管理心,那么明天就能让你上交聊天记录来满足他的管理欲。

加有用的班。

不过说起来,如果真的是有用的班,大家估计也都愿意,自己就留下来加班了。

macOS 如何跳过默认密码规则,设定短密码

fc09d8197fd6e42ee25a92c7ce900edb

macOS 为了确保安全,为系统设定了一个相对复杂的规则,因此,在使用的时候,你需要设定一个符合一般密码规则的密码。如果你试图输入一个短密码,会提示如下错误:

passwd: Credentials could not be verified, username or password is invalid.  Credentials could not be verified, username or password is invalid.
Code language: HTTP (http)

不过,家用电脑很多时候是没有这个必要性的,对于我这种居家使用,希望有密码,但又没必要特别长的密码的人来说,就可以考虑设定一个更短的密码。一方面,有短密码可以避免猫没事来踩我键盘,另一方面,短密码也不至于特别长,一觉醒来不用输入一个特别长的密码。

macOS 是如何设定你的密码规则的?

macOS 当中是有一个 Account Policy 的,系统设定了一个默认的 Policy 来限制你的密码必须符合某些特定的规则。

因此,如果你希望突破默认的 Account Policy ,则有两种方式:

  1. 替换现有规则:使用一个更加宽松的 Account Policy 来替代更加严格的 Policy ,则让自己不至于设置一个非常复杂的规则。同时也不会特别复杂。
  2. 干掉所有规则:如果你嫌弃规则的限制,也可以直接干掉所有的规则,这样就可以随心所欲设定规则。

替换现有规则

如果你需要替换现有的规则,则你需要先创建一个规则的文件,你可以只需执行如下命令来将当前的默认规则导出:

pwpolicy getaccountpolicies | awk 'NR>1' > ~/Desktop/file.plist
Code language: JavaScript (javascript)

导出成功后,可以打开编辑器,找到其中的 policyAttributePassword 字段,将其值进行修改

 policyAttributePassword matches '^$|.{1,}+'
Code language: JavaScript (javascript)

上面这个规则是使用正则表达式编写的,能通过任何字符串。

清除所有规则

如果你觉得设定规则还是麻烦, 那不妨直接干掉所有的规则好了。执行如下密码,即可干掉所有的规则。

pwpolicy -clearaccountpolicies

上述命令可以帮你干掉所有的账户规则,现在你可以对你的账户做任何事情了。

设置密码

设置完成账户规则后,你就可以执行 passwd 命令,来设定你的账户的密码,设置一个更短且好用的密码。

d2b5ca33bd970f64a6301fa75ae2eb22

需要注意的是,你修改的密码是不包含 KeyChain 的,如果你需要修改 KeyChain 的密码,则需要执行 security set-keychain-password 来修改 Keychain 的密码,你可以根据自己的需要修改 KeyChain 的密码。

9vzyn

延展阅读

本文参考了如下链接

https://apple.stackexchange.com/questions/337468/how-to-set-a-short-user-password-in-macos-mojave-and-later-10-14

https://apple.stackexchange.com/questions/293820/modify-pwpolicy-in-sierra

为什么我选择「独立开发者」作为长期路线

person standing near the stairs

我一直以来,对于自己的长期路线看待的都非常的明确 —— 我不愿走技术专家的路线,而是更倾向于走业务负责人的路线。

其背后是一套我自己看待世界的标准和逻辑:

  • 纯粹的技术专家的路线是一条死路。原因是技术专家本身没有问题,作为个人,成为技术专家也是一个可预期的路线和成长路径。但技术专家的反面是「文无第一,武无第二」。任何领域,技术专家永远都只能留下一个人,第二名就不再受市场的关注和欢迎。这使得大家不得不的内卷,让自己成为第一,把其他人踩在脚下。但风水轮流转,没有一个人能够在第一的位置上一直坐下去,因此就要不停的学习、不停的工作来保证自己的地位。终生不得休息。
  • 业务负责人的路线相对更难,但也更加多样化。业务是复杂的,人群、场景、手段、工具等的不同,都会造就出一个新的业务形态出来,而这些业务形态当中,除了部分存在赢家通吃的情况,绝大多数的市场往往都能容纳第二名、第三名的存在(一般来说,具有网络效应的产品只能容得下头部,容不下第二家)。这使得大家可以不用互相内卷,而是各做各的,服务好自己的客户,获得不错的收益。

综合上述的两条,我最终选择了业务负责人的路线,长期走下去。

如今的一个落脚点,便是独立开发者的实践。就像我一直和所有人说的 —— 独立开发者,不过是创业公司的 MVP

重置 MoneyWiz 数据

我的 MoneyWiz 已经使用了 4 年了,从 2018 年 6 月开始至今,记录了大量的消费数据、收入数据。

d2b5ca33bd970f64a6301fa75ae2eb22 31

四年下来,我在 MoneyWiz 上记录了超过 6000 笔数据,这些数据记录了我过去四年的消费习惯、生活习惯、历史轨迹。

但另一方面,过去四年我的记录也极为不合理,比如过去的 4 年里只使用了 17 次退款(很显然退款次数不止 17 次)、大量的调整余额的行为(平均下来每 3 天就会调整一次余额)。这些都是一些不正常的数据,凸显出我在过去的四年里的大量不合理的记账行为。

也正是因为我的记录的不合理,过去我的数据并不能很好的支撑我针对自己的数据分析。因此,我希望在 4 年之际,重头开始,用一个更加正确、更加合理的方式来重新开始记账,并正确的使用 MoneyWiz ,来辅助我的生活。

如何处理历史数据?

历史数据虽然存在错漏,但毕竟也代表了我过去几年的消费习惯,不能完全舍弃。但另一方面,我也希望这些数据不要影响我的新的记账。因此,我将其从 MoneyWiz 当中导出来,并备份至 Google Drive。这样如何日后我需要重新对我的历史数据,依然可以基于我的导出数据进行分析。

injuo
备份数据

为什么不考虑 BeanCount?

其实我也有考虑 BeanCount,奈何看起来确实不是那么方便,且我认为很重要的「预算」和「预测」的功能都没有,这对于我来说,我认为是没有必要切换到 BeanCount 的。

不仅如此,我如果使用 BeanCount,还需要自行配置服务器,对于当下的我来说,我认为优先级不高,继续使用一个相对更加开放的记账软件(比如Moneywiz),可以导出所有数据,具备日后迁移到 BeanCount 的可能即可。

总结

在过去的四年里,我很感激 MoneyWiz 和自己过去耗费的心力,成功的让自己养成了记账的习惯。但另一方面,在接下来的时间里,希望我可以更好的完成记账,而不是像过去那样,给自己留下不可分析的脏数据。

为什么 2022 年了,依然让堂弟入 IT 的坑

CAPTCHA

在之前的文章里,提到过,堂弟最近在跟我学习编程。不过没有提到为什么我做出这样的判断,这篇文章就来聊一聊为什么要做这样决策。

任何决策都有其背后的上下文,基于这个上下文才能理解这个决策的原因。

我的堂弟来自村里,从小便是帮大伯种地做生意和喂羊,没少做农活。大伯家中虽然不能说是清贫,但也确实算不得富有。堂弟还有一个姐姐,目前在北京上班。

可以看出,堂弟的基础并不好,家中并不能给他提供太多的帮助,对于堂弟来说,如果不能留在外面,很有可能就要回到河南,做个小生意,或者找一个公司工作,拿着河南的平均工资。

在这种情况下,我判断堂弟的核心诉求应该是 致富,首先要解决致富的问题,从村里走出来,而不是随时有可能生意黄了,不得不回村里。

基于上述的判断,我给到堂弟的建议是从事互联网/IT的研发工作,而具体方向的划分,则是前端工程师

关于选择 IT 主要考量的因素主要有以下几个:

  1. 我可以给他一些指导。相比于让他自己完全从 0 开始进入 IT 这个行业,显然我的帮助可以让他稍微少走一些弯路。
  2. 即使 IT/互联网增长放缓,依然是一个高薪行业。即使目前 IT/互联网增长放缓,但也仅仅是相比于互联网本身。相比于更多的传统行业,IT 依然拥有相对可观的薪水收入和可预期的行业持续生命周期。对于从农村出来的堂弟来说,是一个不错的选择。
  3. IT/互联网的学历歧视较轻。不少的行业是存在学历的歧视的,如果员工没有相应的学历或是不是从特定的学校/专业毕业,就会存在歧视的情况。互联网因为本身没什么门槛,所以相应的歧视也比较少,更多是你是否有足够的能力来做这件事。如果有能力做,就不太会被歧视。而本科的文凭已经达到了行业的硬门槛水平线,堂弟需要的是锻炼自己的能力,让自己的能力达到可以求职的水平。

总体来说,我算是帮堂弟做了一个人生决定,从我上述的判断来看,没有什么大问题,但长期来看,还是要看他能否在这个行业当中坚持,并找到属于自己的路,并持续的走下去。

关于正念,我知道的

meditation

由于长期的焦虑和压力,我始终在寻求一些能够让自己摆脱压力或解决压力的方式和方法。正念冥想在最近几年,被宣传的「神乎其神」,那些练习了正念冥想的人宣称正念可以「10分钟冥想就可以达到休息一整晚的效果」,对于自认为压力比较大的我来说,自然是十分具有吸引力,因此,我也开始了漫长的正念练习。

我的正念练习其实开始的并不算顺利,冥想源自佛教,但又不同于佛教的冥想,因此,并不能单纯的理解为佛教的冥想,现代说的「正念冥想」是去除了宗教概念之后的产物。

正念意味着心在当下,活在此刻,心神不乱。它意味着在自然的觉醒状态下安顿心灵,不带任何偏见或评判。

《十分钟冥想》

从正念的介绍当中,其实大致可以知道正念能干嘛:让我们被扰乱的心神重归平静,用一种自然平静的心态来看待我们所处的状态。换句话说,正念并不能做到药到病除,更多只是能够帮助你回归平静,并用平静的心态来处理问题。因此,正念冥想并不适用于所有人,从我的视角来看,更适合那些情绪波动极大,容易出现易怒、无法集中注意力等问题的人。

当你摆正了对于正念冥想的认知,控制好自己的预期后,正念冥想就真正适合你了。


说完了正念冥想的基本认知,接下来说说在我自己学习冥想过程中,我认为对我有帮助的东西:

  • 《HeadSpace 正念冥想指南》:这是一个来自 Netflix 的纪录片 / 教程,由 HeadSpace 的创始人 Andy Puddicombe 所制作的课程,介绍了一些比较简单的冥想入门的方式。
  • 《十分钟冥想》:这本书也是由 Andy Puddicombe 所撰写的,相比于纪录片,提供了更加丰富的信息和上下文,对于理解正念的价值,会更有帮助。

如果你也打算学习正念,那么这两个资源应该会对你有比较大的帮助。


除了这些视频/书以外,现在看到最多的应该就是各种冥想的 App 了,他们大多提供了一些冥想的音频,可以帮助你快速进入都某些状态当中。对于初学者来说,借助于这些 App 和提供的引导,可以快速先体验到冥想的状态。但也需要注意到是,在真正意义上你需要冥想的场景中,你是无法依靠这些 App 的。这些 App 是好的教具,但不能太过依赖,不然就本末倒置了。

你需要在使用这些 App 的时候,尝试习得自主正念冥想的技能,这样才能在你真正需要正念冥想的时候,快速进入到状态。

公司不是让你来学习的,但你可以在公司学到东西

man wearing white and black plaid button-up sports shirt pointing the silver MacBook

最近堂弟毕业,我让他来和我一起住,顺便学习编程,希望借此机会,进入到互联网/软件行业,借助 IT 技术的力量脱贫。

在指导他的时候,我突然意识到了职场的另一层价值 —— 让你学东西。

我们常说,公司是要盈利的,所以公司不是让你来学习的,公司是让你来干活的。所以,我们更加关注自己在进入公司前的水平。但如果你能够用好公司的资源,确实也可以在公司当中学到东西。

1. 企业为你提供经验

企业通过剥削你,获得利益。但与此同时,你也因为被剥削,而获得了经验,这些经验可以帮助你积累经验、建立壁垒。从而成为一个更加强大的自己,让你能够更好的处理工作,以及跳槽到下一家公司。

2. 企业为你提供老师

在任何一家公司,作为一个新人,你都有值得学习的人。无论是你的直接管理者,还是你的导师,抑或是公司的 CEO。

作为一个新人,你可以放心大胆的去向这些前辈提出你的问题。从我以往的经验当中来看,绝大多数的人都有「好为人师」的「毛病」,所以,当你拿出问题去问他们的时候,他们都愿意给出一些思考的方向,甚至是直接告诉你答案。

当然, 你也会遇到一些人秉承着「教会徒弟,饿死师傅」的理念,不愿意教你,这也是正常的。遇到这样的人,你不要再找他来提问就好了,选择其他人来提问,学习。

总结

资产阶级和工人解决的剥削问题常被提上台面。不过作为打工人,我们既要看到剥削的坏处,也要意识到背后的好处,坦然的接受剥削的坏处,然后巧妙的利用剥削带来的好处,才是一个优秀的打工人。

职场小建议:事事需要 Double Check

woman signing on white printer paper beside woman about to touch the documents

独立开发者孵化器日常工作有感

在职场当中,一个常见的问题就是 —— 我以为我做到了,但其实我没做到。

比如非常常见的:

  • 我以为我和同事说了,但同事说没说;
  • 我以为我把信息同步到位了,但其实没有同步到位。

而一个非常简单的方式可以解决掉这个问题便是 —— Double Check

比如,你和同事说完之后,可以让她用她的理解复述一遍同样的问题。她说的时候便是你进行 Double Check 的时候,你可以很快发现你们对于同样的问题是否有相同的认知,哪些点上你们以为一致了,但其实没有一致。

在协作场景下,上下文的同步无比重要,因此,积极去做上下文的同步,才能做好你的工作。逐渐从职场菜鸟一步步往上走。

读书读的是个细嚼慢咽,但也是狼吞虎咽

pile of assorted-title books

我最近在读互联网圈爆火的《纳瓦尔宝典》,这本书不厚,但我读的非常慢,和我预想的完全不同。这本薄薄的书,却花费了我不少的时间,我读这本书读了快半个月,也不过读了 30%(大约 70 页),实在算不得快。

d2b5ca33bd970f64a6301fa75ae2eb22 30

又会想起我之前读的《你是你吃出来的》,一两天就翻完了。

这样截然相反的结果让我思考,这是为什么?为什么我读纳瓦尔宝典这么慢?

仔细对比二者的不同,我得到了答案:

  • 对于《你是你吃出来的》,我在读之前,就知道这是一本不错的书,且我读它就是希望获得一些过去我没有的信息的,所以这本书对我来说就是完全输入。我直接阅读即可。
  • 对于《纳瓦尔宝典》,我在读之前同样知道这是一本不错的书,且他和我所在几乎是相同的行业。我虽然是希望获得一些过去我没有的信息的,但因为这里面有太多相似和过去共同的部分,所以我在阅读的过程中,时常会将其中的信息拿去放在我自己的经历当中去做对比。这种拿信息和我自己的对比,让我话费了不少的时间,基本上是读一页就要想一会儿。

哪一种好呢?我觉得都挺好,

  • 前者是让我获取新的信息,我从小白开始快速了解到一些信息,指导我的生活;
  • 后者是让我验证我的判断,我从新的信息里和过去的判断进行对比,增强了自己对于判断的认知,直接指导我的生活。

二者都挺好。

为你的 WordPress 站点配置 Telegram Instant View

telegram

Telegram 内置了一个非常好用的阅读功能 —— Instant View。Instant View 可以实现在 Telegram 内部重新对网站内容进行排版,从而为读者提供更好的阅读体验。

作为一个网站主,如果你希望对你的网站提供相应的支持,则可以自行在 Instant View 的网站添加你自己的网站进行适配。

为 WordPress 添加 Instant View 适配

访问 Instant View 官网,并使用你自己的 Telegram 账号登录

d2b5ca33bd970f64a6301fa75ae2eb22 8
Instant View 官网

登录成功后,点击右侧的 My Templates,进入到 Templates 管理页面。

d2b5ca33bd970f64a6301fa75ae2eb22 9

并在 Templates 管理页面中间的输入框中输入你网站任一文章的地址,并回车,你会自动进入到规则的适配页面。

d2b5ca33bd970f64a6301fa75ae2eb22 10
规则适配页面

随后,在页面中输入你的站点的规则,这里我们可以使用其他开发者写好的规则。将规则粘贴在页面中

# Use Instant View version 2.0
~version: "2.0"

# Use this template only blog article pages
?exists: /html/head/meta[@property="article:published_time"]

# Get article text in <article> 
body:     //article

# Get title from <h1>

title:    $body//h1[1]
subtitle: $title/next-sibling::h2
author_url: //span[has-class("author")]//@href

# Get article cover image
cover: //img[has-class("wp-post-image")]

# Convert all iframe elements to inline element
@inline: $body//iframe[starts-with(@src, "/media/")]

# Remote header and footer
@remove: //article/header
@remove: //article/footer

# Replace p to figure
@replace_tag(<figure>): $body//p[.//img]

# Youtube Embedded Fix
@replace_tag(<figure>): $body//p[.//iframe]
Code language: PHP (php)

粘贴并保存后,会自动在最右侧页面生成预览的效果。

d2b5ca33bd970f64a6301fa75ae2eb22 11
加入规则适配后的效果

当你的规则适配效果无误后,接下来只需要点击右上叫的 Mark as Checked ,来标记该页面已经检查完车。

d2b5ca33bd970f64a6301fa75ae2eb22 12
标记为检查成功

测试完成第一个后, 接下来你只需要在你的博客当中挑选出 10 篇文章,进行文章的验证即可。

d2b5ca33bd970f64a6301fa75ae2eb22 4
验证至少 10 个页面才行

根据 Telegram Instant View 的规则,你需要验证满 10 篇文章,才能提交你的模板给官方人员审核。

d2b5ca33bd970f64a6301fa75ae2eb22 5

提交后,你会见到这样的提示,接下来只需要等待你的模板通过测试即可。

d2b5ca33bd970f64a6301fa75ae2eb22 6
提交成功

预览效果

在审核期间,你可以在编辑器页面右上角点击「View in Telegram」来查看预览的效果。包括你也可以复制里面的 rhash 的值,使用这个值来生成 Instant View 的链接分享给别人。不过,最方便的当然还是等官方审核通过以后再用。

d2b5ca33bd970f64a6301fa75ae2eb22 13
预览效果。

总结

Telegram Instant View 的开发不困难,掌握了一定的 HTML 、XPath 的基础,就可以开发完成,简单的几步,就可以让你的网站在 Telegram 当中拥有一个不错的预览效果,这个时间值得去花。

为你的服务器配上自定义的登录界面

text

我自己在服务器上使用的是 Ubuntu 20.04,每次在登录时,Ubuntu 都会展示一系列的信息,冗余且在多个服务器上看不出差异,并不能非常友好的提醒我这个是哪个服务器。

d2b5ca33bd970f64a6301fa75ae2eb22 25

于是,我决定对其进行自定义,改成我自己喜欢的样子。

d2b5ca33bd970f64a6301fa75ae2eb22 29

1. 分析现有的 Message 格式

想要修改,就一下先分析一下组成结构。我截图所示的输出可以分为三个部分:header、motd 和 last login message

而我主要不满的是 header 和 motd 的部分,对于 last login message,我虽然觉得有些多余,但在很多场景下,确实可以用于提醒。所以我就不隐藏了。不过,如果你希望隐藏 last login 的话,可以在当前用户的根目录下创建一个 .hushlogin 文件来关闭 last login message

touch ~/.hushlogin

2. 修改 motd 和 header

修改 motd

motd 的全称是 Message of Today,他的内容被存放在 /etc/motd 当中,想要修改 Motd 的文字,只需要直接修改 /etc/motd 文件的内容即可。不过需要注意的是,motd 文件不支持做格式化,只支持展示默认的文本。因此,你可以通过在其中加入空行来引起注意。

l9p67

修改 header

Header 部分存放在 /etc/update-motd.d/ 目录中,你可以通过修改这个文件夹下的文件来实现不同样式的 motd 风格。其中文件名格式为 优先级-文件名的方式进行组织,你可以根据自己的需要,创建适当优先级的文件。

2czq5

比如,00-header 文件的源码如下

#!/bin/sh
#
#    00-header - create the header of the MOTD
#    Copyright (C) 2009-2010 Canonical Ltd.
#
#    Authors: Dustin Kirkland <kirkland@canonical.com>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program; if not, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

[ -r /etc/lsb-release ] && . /etc/lsb-release

if [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then
	# Fall back to using the very slow lsb_release utility
	DISTRIB_DESCRIPTION=$(lsb_release -s -d)
fi

printf "Welcome to %s (%s %s %s)\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"
Code language: PHP (php)

其中有价值的代码主要就是最后几行的输出。

类似的, 10-help-text 的代码则输出了文字。

#!/bin/sh
#
#    10-help-text - print the help text associated with the distro
#    Copyright (C) 2009-2010 Canonical Ltd.
#
#    Authors: Dustin Kirkland <kirkland@canonical.com>,
#             Brian Murray <brian@canonical.com>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program; if not, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

printf "\n"
printf " * Documentation:  https://help.ubuntu.com\n"
printf " * Management:     https://landscape.canonical.com\n"
printf " * Support:        https://ubuntu.com/advantage\n"
Code language: PHP (php)

而我们自己如果想要控制,可以自己写一个文件,比如叫 01-custom ,在其中加入如下代码(这段代码可以生成一段黑底红字的输出,用于提醒我自己这是生产环境服务器),并执行 chmod +x /etc/update-motd.d/01-custom 来设置可执行权限。

#!/bin/bash
printf "\u1b[31mwelcome to ixiqin.com production server\n"
Code language: JavaScript (javascript)

这里需要注意的是,/etc/update-motd.d 目录下的文件本质上是一个可执行文件,你可以使用 bash / dash 等任何 Shell 来实现,也可以考虑使用 Node.js、Python 之类的脚本来实现。这样就不用像我一样,使用 Termial Color Code 来实现颜色的变化。

执行完成后的结果如下

6wek6

根据需要自定义

当你找到了具体的文件的位置和配置的方式,就可以根据自己的需要来调整 /etc/motd/etc/update-motd.d 当中文件的内容,来达到你想要的效果了。

d2b5ca33bd970f64a6301fa75ae2eb22 28

这样,就完成了对于 Shell 的登录界面的改造工作了。

Switch 游戏: 雪人兄弟 Special (SNOW BROS. NICK & TOM SPECIAL) 游玩体验

a86f98132e422cac2ec9c1a99f4849a6

最近王大夫帮我把 Switch 的充电问题给解决了,我又可以开始玩 Switch 了。

第一波开始玩的,是雪人兄弟。我上一次玩这个游戏还是在小学的时候,在同小区的小朋友家插卡带玩的。现在 Switch 上也有了,刚好这两天低价促销,就买了下来。

关于游戏

雪人兄弟的 Switch 版本分为多个版本。其中的 Arcade 重置版模式,则和我们小时候在卡带上玩的版本一样,一关关的向上突破。

此外, Switch 版也支持多个手柄一起玩(意味着你可以和朋友一起玩)。

a86f98132e422cac2ec9c1a99f4849a6

在整体的游玩体验上来讲,是非常不错的,可以让你回顾一下小时候玩雪人兄弟的感觉。和小时后的雪人兄弟一毛一样。

此外,如果你希望在界面上再回顾一下小时候的感觉,还可以切换画面模式为 Green(绿屏)或 Black & White(黑白屏模式),并开启扫描线,来回溯小时候的那种 CRT 大块头电视的效果。

2c01e02a0f48131dcc3a07a997ba2457

关于游戏的背景故事

小时候玩雪人兄弟的时候并没有关注雪人兄弟背后的那些故事。这次在 Switch 上就顺便看了一下雪人兄弟的背景故事。

第一感受

我在看完过场动画以后,第一感觉是故事内核和马里奥一毛一样。 X 国家被 Y 国家攻占,Y 还抓走了 X 的公主,X 国家的人奋发图强决定救回公主。

然后又想了一想,觉得和马里奥还是有点区别的 —— 马里奥是爱情,雪人兄弟是亲情。。。因为雪人兄弟被抓走的是雪人兄弟的姐妹,而不是爱人。

图片版

e6c9d24ely1h35y3ocu3tj20zk0k0ta0
e6c9d24ely1h35y3z1nwmj20zk0k0dh8
e6c9d24ely1h35y3ysc69j20zk0k0q4e
e6c9d24ely1h35y3yjwm3j20zk0k03zv
e6c9d24ely1h35y3yadzoj20zk0k0t9s
e6c9d24ely1h35y3y4masj20zk0k075m

文字版

在遠方,有個寧靜祥和的冰雪樂園。 然而在某一天,卻遭到了Hotteda王國的Artich王的襲擊。 雖然冰雪樂園的孿生王子尼克和湯姆試圖阻止,但卻被Artich王下詛咒,變成了雪人。

而孿生公主Puripuri和Puchipuchi也被綁架,成為了人質。 再這麼下去…冰雪樂園就要完全融化,消失殆盡了。 為了拯救冰雪樂園,恢復原有的寧靜祥和,尼克和湯姆王子踏上了漫長的遠征路途。

「我一定會救出公主們,並且破除詛咒!」

「出發! 雪人兄弟們!!」

macOS 如何从 Nintendo Switch 中复制截图

black android smartphone displaying man in white shirt

最近沉迷 Switch ,无法自拔。在游玩过程中,截图了不少游戏中的画面,想要将其分享给大家,自然需要能够将截图图片复制出来。而 Switch 使用的是 Micro SD 卡,想要复制图片需要单独准备一个读卡器,显然不如直接将 Switch 作为读卡器,借助 Switch 上的 Type C 接口,来完成图片的复制。

原理

在 Switch 当中,实现了一个名为媒体传输协议(MTP)的通信协议,只需要你在 macOS 当中安装支持该协议的软件,并将电脑与 Switch 相连,就可以实现将 Switch 作为读卡器读取其中的截图文件。

步骤

1. 安装 Android File Transfer

一个比较常用 & 简单的支持 MTP 协议的软件是来自 Google 官方为 Android 提供的 Android File Transfer

下载该软件并进行安装,安装完成后,打开软件,等待 Switch 链接。

2. 在 Switch 上进入复制模式

配置完 Android File Transfer,接下来拿出一根 Type C 数据线,将其插入 Switch 底部的充电口。

并开机,在 Switch 当中找到 「设置」—「数据管理」—「管理截图与视频」

32c760cc37a480d78ebf4ace7864eeb7
993be4edefb1eb546b6d7f10ebb243ea

在截图与视频管理中,找到「通过 USB 连接复制到电脑中」,点击这个选项。

df858b0ca21be4b0f6636302e53a23c6

随即 Switch 会进入到配对模式,看到如下界面,则说明已经配对成功。

0ce6f28e154fa96363dffcb9eb7f234f

对应的, Android File Transfer 也读取到了 SD 卡当中的截图文件。

其中:「其他」文件夹是你在系统界面截图得到的图片;而以游戏名命名的文件夹,则是各自游戏当中的截图。

d2b5ca33bd970f64a6301fa75ae2eb22 24

接下来你就可以在其中找到你想要的截图,通过拖拽,将其拖到你本地的文件夹中进行查看了。

当你拷贝完成后,点击 Switch 上的「解除连接」,就可以安全退出 Android File Transfer,拔下数据线,继续开心的玩游戏了。

总结

我一开始以为 Switch 底层是 Android 改造的,后经推特上推友提醒,Switch 底层是任天堂自己开发的操作系统,只是兼容了 MTP 协议,所以特地在文章前加入了 MTP 协议的说明。

希望这个文章,可以帮到还在用 Switch 玩游戏的你。

在 Next.js 中直接引入 SVG

computer screen displaying website home page

随着 SVG 的兴起,过去使用雪碧图、IconFont 作为界面中图标用法已经过时。大家会更倾向于加载更加简单、空间占用更小、编写更容易的 SVG 作为图标的解决方案。

而 Next.js 同样对于 SVG 提供了支持。

最简单的加载方式 —— URL 加载

如果不希望对应用程序做任何的改进,一个最简单的方式是直接使用路径进行加载。只需要使用一个 img 标签,并设定 src 为 svg 文件的路径就可以了。

<img src="/logo.svg" alt="Logo SVG" />
Code language: HTML, XML (xml)

不过,使用 URL 来加载的问题是,当你的文件夹路径和结构比较复杂的时候,你需要使用一个较长的路径来加载 SVG,比较麻烦。

当然, 你也可以简单的优化这个方案 —— 比如自行封装一个 svg component,支持传入文件名 & alt 文字和其他参数。这样在调用的时候只需要输入文件名即可。

最舒服的加载方式 —— 编程加载

在 Next.js 当中,如果你希望更加舒服的引入 SVG,那比较好的方案是使用 import 标签来进行引入。不过,由于 SVG 本身并不是一个标准的 React 组件,你需要在 Next.js 上安装插件来支持对 SVG 的解析。

加入对 SVG 的解析需要安装 @svgr/webpack 插件。执行如下命令安装插件。

# yarn
yarn add @svgr/webpack
# npm
npm install --save @svgr/webpack
Code language: PHP (php)

安装完成后,修改 next.config.js添加相关的解析规则。

module.exports = {
  webpack(config) {
    config.module.rules.push({
      test: /\.svg$/,
      use: ["@svgr/webpack"]
    }); // 针对 SVG 的处理规则

    return config;
  }
};
Code language: JavaScript (javascript)

修改后保存,便可以直接使用 import 语法来处理

import Logo from "../assets/logo.svg";


// usage
<Logo />
Code language: JavaScript (javascript)

这样,你就可以直接将 SVG 作为一个 Component 引入,并使用你熟悉的 React Componet Props 来修改这个 Component 的各项属性。

总结

在这篇文章中,分享了两种在 Next.js 的方法,你可以根据自己的实际情况来决定选择具体使用什么样的方式来引入 SVG。

使用 Proxy.py 自建 HTTP Proxy

black smartphone

如果你需要对一个集群进行开发,且开发过程中需要访问内网,一个比较常见的方式是建立虚拟专有网。但倘如你不愿建立虚拟专有网,那么一个比较简单的方式是建立一层 HTTP Proxy 来访问内网当中的数据,你只需要在某一个节点上设定 HTTP Proxy,并在你自己的电脑上配置 HTTP Proxy ,就可以完成使用对应的节点来访问具体的网页,解决 HTTP 访问的问题。

原理

HTTP Proxy Servr 的原理并不复杂,就是一个标准的正向代理。你只要能搭建这样的一个服务即可。

e6c9d24ely1h341f4087mj21t90g2755

实际操作逻辑

以下文章以 Debian GNU/Linux 10 为例

1. 在你的节点上安装 Python3 & pip 3

Python3 是运行 Proxy.py 的运行环境,而 pip3 则是安装 Proxy.py 的工具。执行如下命令来安装。

apt install python3 python3-pip

2. 安装 Proxy.py

这里我们不使用 Virtual Env 来安装,主要是方便后续加入 Systemd 来进行控制。如果你习惯使用 Supervisord 来控制的话,就可以使用 Virtual Env 来安装 Proxy.py。执行如下命令

pip3 install proxy.py
Code language: CSS (css)

3. 启动 Proxy 进行测试

在你的节点上执行如下命令来启动一个测试服务器。

proxy --hostname 0.0.0.0 
Code language: CSS (css)

如果你需要监听某一个特定的 IP, 则将 0.0.0.0 修改为你具体的 IP。

配置后,你可以看到如下的输出,则说明已经成功启动了 Proxy 服务器。

启动完成后,你就可以在本地测试访问如下命令来进行测试。

curl -x [服务器IP]:8899  http://httpbin.org/get
Code language: JavaScript (javascript)

当你看到如下输出时,确认返回值当中的 origin 是否是你的节点 IP,如果是你的节点 IP 则说明你的 HTTP Proxy 已经配置成功了。后续你就可以通过这个 HTTP Proxy 来进行访问了。

e6c9d24ely1h341n60ii2j21b40cuta8

测试完成后,你可以执行 Ctrl + C 来关闭当前的 Proxy Server。

4. 配置 Basic Auth Authentication

上面配置好了 HTTP Proxy Server,但一个问题是这个 Server 没有安全验证,随时会被别人所利用。所以我们需要配置一些基本的安全配置,来解决这个问题。

在你的 Proxy.py 当中加入 –basic-auth 选项,则可以实现加入基本的鉴权。其中,用户密码用英文冒号隔开。比如我需要创建一个用户名是 admin ,密码也是 admin 的proxy ,就可以执行如下命令。

proxy --hostname 0.0.0.0 --basic-auth admin:admin
Code language: CSS (css)

5. 配置开机自启动

现在 Auth 也有了,但是我们不能总是开着 Terminal 来运行我们的服务,所以一个好的办法是为其加入 Systemd ,这样我们就可以使用系统自带的能力来完成 Proxy 的自启动了。

执行 systemctl edit --force --full proxy.service 来创建一个新的 Systemd 服务,并在其中加入如下代码并保存。

[Unit]
Description=Proxy Service
Wants=network.target
After=network.target

[Service]
ExecStartPre=/bin/sleep 10
ExecStart=proxy --hostname 0.0.0.0 --basic-auth admin:admin
Restart=always

[Install]
WantedBy=multi-user.target
Code language: JavaScript (javascript)

保存完成后,执行 systemctl enable proxy.service 配置该服务器的开机自启动 & systemctl start proxy.service ,即可实现 Proxy 服务的开机自启动,并在当前启动该服务。

总结

有了 HTTP Proxy ,你能以一个更加简单的方式来访问内网当中的服务器。你只需要控制 Proxy 节点的可访问权限,就能很好的处理内网数据的安全问题。

2022 年 5 月月度总结

summary

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

KR1:投资收益达到 20000 元

本月得益于 A 股回暖,所购买的基金开始出现浮盈;当前浮盈 5851.67;

分析原因,主要是在之前 A 股跌破 3000 点的时候进行了买入,处在一个低点买入,赚钱的概率就会得到提升。

KR2 :单篇稿费突破 6000 元

本月无新进展。

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

目前的预算执行的比较差,准备接下来采用现金消费的方式,避免信用卡的消费

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

本月开始继续构建 PodHosting,目前进展缓慢。But,至少是开始了。。。

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

幸福生活很重要,生活也不能忘记。毕竟,赚钱是为了生活。

KR1:前往 6 个城市旅行

五月份没有外出旅行,不过进山露营了,也算为一次旅行。

今年太难了,一直规划旅行,不过各地的疫情搞的哪里都没去成。。。

KR2:进行 20 次文娱活动

本月没有进行什么文娱活动

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

本月新购入了「电动拖把」,让拖地这件事变得更省心、省力。自己体验以后发现电动拖把的体验还是一般。长期来看,还是要迭代到扫地机器人才能更加省力省心。

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

KR1:写 15 篇书评

继续鸽书评。不过本月读了几本书。应该写几篇书评的。就安排在六月吧。

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

0 进展。

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

0 进展。