月度归档:2022年03月

使用 Stylish 巧妙破解基于 CSS 的复制限制

使用 Stylish 巧妙破解基于 CSS 的复制限制

本文内容仅用于学习和技术研究。请不要用此作恶。

白宦成

在一些网站上,出于版权或增长的诉求,一些网站会在站点内部加入防止复制内容的限制。作为一个内容创作者,我是支持(因为版权原因而不得不选择)这样的行为的。但另一方面,我自己也需要进行一定的笔记,对于长段的内容,显然,直接复制原作者的内容更适合我。因此,我也不得不研究一下,如何破解这种样式的限制。

为什么 CSS 能禁止复制?

CSS 当中提供了一个属性 user-select 可以用于设定文字是否可以被选中,对于非技术人员来说,无法被选中,自然无法使用 Ctrl + C 来复制内容。在这种情况下,对于非技术人员,就可以实现很好的防复制了。

不过,CSS 防复制不算多见,我见的最多的还是以 Javascript 的方式来禁用复制和 Devtools 的。

这个属性的值有以下五种,其中 none 是用于防止复制的,设定为 None 后,即使你的内容是文本内容,也无法被选中,就无法直接使用 Ctrl + C 来完成复制了。而 text 则是可以选择文本,其他的几个属性,你可以在 MDN 的语法说明中找到。

user-select: none;
user-select: auto;
user-select: text;
user-select: contain;
user-select: all;

使用 Stylish 来破解 CSS 的限制

类似油猴脚本可以在目标网页上加载 Javascript 文件,Stylish 可以在目标网页上加载 CSS ,并按照 CSS 的计算权重,让我们的代码可以得到执行。基于这个能力,我们可以覆盖原本网页上样式,来实现将 user-select 的值修改为我们需要的值。

1. 安装 Stylish

前往 Google Chrome Extension Store 安装 Stylish

2. 找到不能复制的文字对应的样式类

在浏览器中打开开发者工具,定位到你需要复制的文本元素,在右侧的调试工具中切换到「计算样式」,就可以在其中找到 user-select属性,并可以看到对应的样式类选择器,复制选择器。

3. 在 Stylish 中新建一个样式文件,并在其中添加对应样式类的代码

因为我们只需要修改复制,所以只需要将对应的属性的值做一个简单的修改即可。

4.设置生效网站

为了减少这段代码影响到的页面,你可以在下方的应用对象这里设定具体生效的网站,从而降低对于其他站点的影响。

总结

本次针对 CSS 禁止复制的研究帮助我节省了大量的研究的时间,有效的提升了我进行研究的效率,真的不错!

看纸质书/电纸书,而不是社会化读书

看纸质书/电纸书,而不是社会化读书

首先,在文章的开始,我先要强调,我并不是绝对不使用社会化读书软件(如:微信读书),但我使用微信读书有自己的方式

接下来是具体的观点内容

我们在读书的时候,应该尽可能的选择纸质书/ Kindle

在各种购买推荐的时候,你都会发现,所有针对 Kindle 的推荐都会提到 「无打扰」,这同样是我推荐你看纸质书/Kindle的原因。

作为手机不离身的一代人,我们现在已经习惯了「被打扰」,但不意味着这是对的,不断的被打扰,让我们无法集中精力去做应该做的事情。当我们不断被打断,我们就更应该去寻找稀缺的集中。

而在这件事上,无论是纸质书还是 Kindle ,都可以实现类似的效果。你可以沏一杯茶(或者是煮一壶咖啡),将手机关静音,放在另外的房间里,拿着一本书,或者是你的 Kindle ,在桌前仔细的阅读。

你可能会担心自己看不到消息。但这世界上有多少事情是「你一个小时不看手机」就会产生问题的。

借助一个和通讯设备分类的工具,我们可以很好的实现想要的「宁静」、「专注」的效果。

但这些,社会化读书软件是无法实现的。

社会化读书软件本来就是帮助人们建立起更全面的连接

几乎所有的企业都希望开发出一款拥有「网络效应」的应用。

网络外部性(network externality),又称网络效应(network effect)或需求方规模经济(demand-side economies of scale),指在经济学或商业中,消费者选用某项商品或服务,其所获得的效用与“使用该商品或服务的其他用户人数”具有相关性时,此商品或服务即被称为具有网络外部性。 最常见的例子是电话或社交网络服务:采用某一种社交媒体的用户人数越多,每一位用户获得越高的使用价值。

对于企业来说,网络效应是一个很好的工具,可以帮助留下用户,但对于用户来说,一方面它的工具性随着网络效应而获得提升,但另一方面,我们也会因为网络效应而被限制在应用当中。

微信读书等一系列社会化软件会通过产品功能的设计,让你不断的被触发,不断接入其中,让你读书也不会那么的纯粹和集中。评论、弹幕,都不断的把你从阅读中拉扯出来,进入到一个社会化的环境当中。

包括从某种角度来看,我在 B 站/ Youtube 上看视频的时候,也很少会开启弹幕(除非我看的内容本来就是很无厘头的内容),我会希望能够静下心来安安静静的欣赏一个作品,而不是不断被拖走,不断的被打断。

社会化读书的用法

我在前面提到过,我其实并不是完全不使用微信读书。我自己使用微信读书的场景是这样的:

  1. 读小说:Kindle 上的小说大多是已经完本的。如果希望看一些更加接近当下的网络作家的小说,那么微信读书是一个很好的选择。而微信读书有阅读赠送书币的设定,你可以通过读小说来获取书币。再通过书币购买新的小说章节。
  2. 读公众号:微信读书可以阅读微信公众号,这一点相比于微信公众号自带的阅读机制,会更好,你可以像图书一样翻阅一公众号,并在其上做标记、批注,对于如果你要深度研究某个特定的公众号,是非常有帮助的(比如很有个人特色的大 V、投资人等)。
  3. 发现新书:我现在发现新书的方式基本上是去线下的书店看有没有什么有意思的新书、去 Amazon 看看最近的优惠是什么书以及去微信读书当中看看朋友的书架里都是什么书(不过我自己的书架其实是隐藏的,因为我不希望让别人发现我在微信读书看的都是小说)。
梦想的房子(5):弱电箱、书房弱电环境

梦想的房子(5):弱电箱、书房弱电环境

作为一个计算机相关行业的从业者,我自然少不了在家中配置一些电子设备。而且我也会花费大量的时间用来在家庭中编程、生活,因此,一个好的家庭网络环境是必要的。

弱电箱

从我当前的租房的状态来看,我可能会在弱电箱中需要以下一些东西:

  1. 光猫:这是当下必备的了,毕竟已经光纤入户,那我们就必须要有相应的光猫来完成光信号的解析。所以这个是不可或缺的。
  2. 交换机:我的家中可能会有大量的设备,因此,交换机对于我来说是必要的。实际上,简单一算可能就会发现我需要的设备需要不止一根网线 mac Mini + PC、NAS、单独接入无线路由器、可能还需要给电视预留网线的接口,再考虑到后续可能会有儿童房、卧室电视之类的,这样就至少需要六口交换机了,需要提前预留(但不一定会用到)
  3. 插座:光猫和交换机需要相应的电力供应,因此,弱电箱中至少要有 5 个左右的插头,以确保不同的设备有充足的电力供应
  4. 风扇:确保弱电箱内部的热量可以散发出去(如果是一个比较大的弱电箱的话,就可以免于买风扇,考其自然散热)。

通过这样的方式,就可以将网络信号从外部问题转化为稳定的内部问题。接下来要处理的就是如何将信号传递到不同的位置。

对于电视,可以直接通过墙内的线路进行信号的传递,直接购买千兆的超6类线来进行线路的部署即可。

此外,还涉及到家中会用到的无线网络。无线网络需要通过网线从交换机侧接入,并辅以 AP 来完成家庭内部的网络覆盖。

对于需要用到网线的书房,需要通过单独的网线,从弱电箱将信号牵引至书房,从而可以在书房内获得信号。出于使用场景的问题,书房内需要单独设定路由器来进行信号的分流。

书房

书房中我的电子设备较多,因此也需要有更多的网络接口来使用。从弱电箱进入到书房后,需要有一个单独的路由器来进行网络承载,这样也可以在书房内构建一个小型局域网,方便在局域网内进行高速的传输。

在路由器方面,我希望是至少支持 1 – 2 个光纤入口的路由器,这样可以让我的 NAS 和 PC 能够以光纤的方式进行接入。另一方面,还要考虑到 NAS 能够被其他设备所访问和其他的电脑(比如 mac 笔记本)的接入,因此,书房应该也有一个单独的空间用于放置路由器和 NAS。

总体来看,我需要一个能够满足如下需求的书房弱点环境:

  1. 路由器:用来建设书房的局域网;
  2. NAS:我的是 QNAP 的 TS231P2,挺好。
  3. 插座:至少需要 2- 3 口的插座,来完成电路的接入。

梦想的房子(4):玄关篇

梦想的房子(4):玄关篇

租房多年,也对于玄关有了一些简单的理解。因此,也就有了自己的需求。

尺寸

够用就行,没啥特别的追求。

功能设施

鞋柜

我们每个人都会有不止一双鞋子。女性更是有不同功能的鞋子,因此,玄关的鞋柜至关重要。在我看来,两个人的话,最少需要 10 ~ 15 双鞋子的存储空间,才能确保地上没有多余的鞋子。

收纳柜

玄关区域除了鞋子以外,其实还有更多的东西,比如钥匙、门卡、口罩、洗手凝胶、一次性拖鞋、耳机等物品。

有了一个单独的收纳柜,可以将这些东西存储在收纳柜中,并在使用时随时拿出来。

在收纳柜上可以有一个区域/小篮子,来放日常出门的钥匙。

下沉式玄关

下沉式玄关和非下沉式玄关的一个很大的区别是它人为的区分出了一个区域,从而可以更好的实现外鞋不进屋。

不过,下沉式玄关挺依赖房子本身的属性的,也不一定能搞定。

可视门禁控制器

现在的新房基本都有这个,不过放在哪也是个讲究。我觉得放在门口比较合适。放在厨房/客厅其实感觉不太实用。

总结

玄关区域不大,但细节不少。特别是在疫情当下,玄关作为家的入口,还是很值得关注一下的。

梦想的房子(3):厨房篇

梦想的房子(3):厨房篇

我其实算是一个比较喜欢做饭的人,虽然做的不算太好吃,但始终坚持在做(又菜又爱玩)。厨房在我的生活中也是一个重要的角色。因此,厨房的好坏,是很影响生活的。

尺寸

厨房对我来说,尺寸不需要特别大, 能够将功能设施安排好,还有一定的空间可以正常做饭,不至于特别窄即可。

功能设施

双开门冰箱

我需要一个足够大的冰箱,或者一个冰箱 + 一个冰柜。我平时蛮喜欢囤一些吃的,一个小冰箱往往就会导致做饭时空间捉襟见肘,看到好吃的也需要思考一下自己的冰箱是否放得下。一个更大的冰箱会成为一个更好的选择。

洗碗机

如果说,做饭最痛苦的是什么,那莫过于洗碗了。租房受限于空间等各项原因,所以没办法用洗碗机。自己买房之后,我希望可以借助洗碗机来降低我做饭的摩擦力,来做饭。

日式三眼灶

自打我点了「焯水」这个技能后,一些比较难熟的菜,我会比较喜欢先焯水再炒。而两眼灶会导致你必须因为焯水而占用了一个位置。多出来的一个灶口可以用来焯水(是否有必要?可能还要看,但可能一个更好的排布设计可以解决这个问题)。

热水洗菜池

热水洗菜也是另外一个做饭的巨大阻力,热水洗菜可以降低做饭的阻力,不多解释。应该能理解,特别是冬天。

可以拔下来的水龙头

方便各种层次和角度的清洗。

厨房架

我会希望在厨房放置烤箱 & 空气炸锅 & 微波炉,因此,最好有一个架子可以容纳这些电子设备(还需要考虑一下电力排布的问题)。

  • 烤箱:可以用来烤口蘑、青菜、肉之类。
  • 微波炉:用来加热饭菜。

收纳柜

我会在厨房放置很多东西,比如多囤的调料、应急储备的方便面、干货、大米、鸡蛋、青菜。因此,一个大的收纳柜可以帮助我更好的收纳这些东西,从而解决厨房的收纳和管理的问题。

当然,这个柜子还需要有一定的碗筷的收纳整理能力。

总结

厨房算是装修过程中一个比较复杂的东西了,因为其设计的大功率电器较多,很容易引发火灾。所以,提前记录下自己的需求,以备日后不时之需。

梦想的房子(2):卫生间篇

梦想的房子(2):卫生间篇

关于卫生间,我其实一直很喜欢日式卫生间的风格,小巧但功能又足够丰富。但是对于我来说,我并不觉得一定要把卫生间做的那么小,如果有充足的空间,可以适当的调整一下,从而获得更好的生活体验。

尺寸

对于卫生间而言,我其实可以接受空间小一点,但我还是希望可以有干湿分离的。这样可以避免卫生间总是潮潮的。

功能设施

浴缸

每日的工作结束后,泡个浴缸是非常舒服的事情。相比于国内的浴缸,日式浴缸会更小一点,但同时也让泡澡这件事变得更加轻量。不需要背负那么重的负担。如果可以的话,我还蛮希望有一个日式的小浴缸,从而让每天都可以更加惬意。

热风/浴霸/自循环温控系统

租房的一个痛点就是大部分房子的卫生间并没有浴霸和热风,这就导致你洗完澡之后,会非常的冷,擦完身子出来瑟瑟发抖。洗澡过程中也必须开着热水,这样才不至于觉得冷。

因此,热风和浴霸对我来说是必要的。这能让你在洗澡中可以获得温暖。洗完澡擦身的时候也不至于感到冷。

淋浴头

淋浴总体来说,我觉得一些星级酒店的淋浴是非常不错的,原因主要如下:

  1. 水压足够大:这可能需要在自己家中安装一个增压泵来实现。
  2. 水温足够热:这可能需要在家中配置一整套零冷水的解决方案来实现。
  3. 多样的冲水方式:你可以选择顶冲,也可以选择侧冲。这样对于我这样的个子相对高一些的人来说,可以用顶冲来洗头,非常舒服。

因此,我希望自己以后装修房子的时候,也可以购买并配置这样的方案。

自动马桶

虽然我其实觉得蹲便可能更适合我们每一个人。但确实要考虑到家中的其他成员的诉求,自动马桶还是必要的。

洗衣机 & 烘干机

晾衣服真的是一个痛苦的事情,如果在洗衣机上提供了烘干的功能或有相应的烘干机,会让晾衣服这件事变得更加简单。同时,也可以让我们更好的利用阳台。

泡着茶,喝着咖啡在阳台上看书难道不舒服么?

总结

卫生间看似不起眼,但说实话,卫生间还挺影响生活质量的。你的一天从卫生间开始,你的一天也从卫生间结束。一个好的卫生间,值得你拥有。

梦想的房子(1):书房篇

梦想的房子(1):书房篇

在毕业的头两年里,我住在一个月只需要 1800 的单间里,艰难求活。而随着女朋友的到来,我的生活开始无休止的膨胀:居住环境的空间诉求变大;共同生活的生物变多;更多的在家工作的时间,让我开始更加希望自己有一个书房。

于是,在最近的两次租房的过程中,我都选择了两居室,并将其中的次卧改为书房,以满足自己的需求。

很快,我也会迎来又一次的搬家,于是,记录下自己的所求,以更好的在下一次搬家时,寻找到适合自己的房子。

尺寸

因为我除了编程相关的工作以外,还会拍一些视频,因此对于房间的纵深会有一定的要求,需要能够确保我不需要离镜头太近,免得视频里都是我的大头。

功能设施

水吧

我经常在深夜写代码、写文章,因此,茶叶、咖啡是我不可或缺的伙伴。现在我的水吧是在卧室,这意味着如果我需要喝茶、咖啡,就必须到卧室去接,在卧室煮咖啡,这样会非常影响同住人的生活体验。

因此,如果可以在书房当中有一个独立的水吧,对我来说,会是非常方便的。

  • 全自动咖啡机:咖啡因重度患者,不能没有咖啡。
  • 饮水机:多喝热水、多喝水、多喝冰水。我的饮水机同时提供了冰水(冰水开关关掉后就是常温)和热水两种版本,因此,我可以在夏天喝到冰水而在冬天喝到热水。
  • 制冰机:我是一个喜欢喝冰水的人(可能是因为胖),因此,在我看来制冰机也是不可或缺的。

此外,到了新的房子的话,我希望我可以不再使用4.5L的桶装水,而是改用 10 ~ 20 L 的饮用水。虽然可能水质没差,但我不再需要频繁的购买桶装水了,也不需要单独留存一个空间用来放水。

书架

人不能无书。从 1800 的单间,还是如今 5000 块的两居室,我始终都带着书。区别不过是书多书少。如今我家中依然放着百来本书。对于我来说,书是进步的阶梯,也是我精神的食粮。每当我迷惘之时,我就开始读书,从书中寻找答案。即使是如今的电子书时代,我也依然不放弃看实体书。

当然,这些书也是有选择的,对于那些不好的,或者是我觉得没有留实体书必要性的,我一般都会选择在朋友圈中将其送出去。留下来的,就是那些精挑细选,重要的图书。

办公桌

办公桌是一天工作的重点,因此,办公桌必不可少。而从我以往的办公桌的大小来看,我需要的应该是 140CM * 70CM 以上大小的桌子,这样才能放下我的两个显示器、鼠标、Mac mini,以及一些零散的水杯之类的小东西。

储物柜

经过以往几次搬家的经验,我发现我自己的东西还是比较多的,我需要一个足够大的储物空间,来存放我自己的杂物,包括:

  • 各家合作方赠送的礼品
  • 相机、镜头、三脚架、录音笔、无线麦克风之类的东西
  • 线材
  • 败家电子设备不常用的电子设备

单人床

对于我来说,最高效的状态是全力工作,然后累了就休息(睡觉),睡半个小时就能满血复活,然后再继续工作。这样的状态会能让我更好的工作。因此,一个 70 CM 宽的单人床,可以让我拥有更好的中场休息。

为什么不是去卧室?卧室太舒服了,可能会一觉睡好几个小时。稍微的不舒服的感觉,会让我更容易醒来。

总结

为什么要总结自己想要的房子?我们终归会踏上拥有自己的房子的路,无论是在一线城市,还是三四线小城市,总是会有的。那我们如何才能拥有一个称心如意的房子?很显然,从我们之前的生活经验中,总结出适合自己房子和布局。

我有一段时间很喜欢住 Airbnb 就是这个原因,我希望可以通过住在别人家里,感受到好的环境是什么样的。然后逐步找到适合自己的环境。接下来的几天,我将继续总结我梦想的房子。

如何处理 Gutenberg 开发过程中的 Minified React error?

如何处理 Gutenberg 开发过程中的 Minified React error?

在开发 Gutenberg 插件时,经常会出现下面这样的提示:

Uncaught Error: Minified React error #231; visit https://reactjs.org/docs/error-decoder.html?invariant=231&args[]=onClick&args[]=object for the full message or use the non-minified dev environment for full errors and additional helpful warnings.

上述提示表示当前的编辑器中出现了一个错误,但由于 React 的 Minified 设置,这些错误没有办法被打印出来。

在这种情况下, React 接管了默认的报错,让应用不至于崩溃,但另一方面,也让我们失去了处理这些问题的可能。因此,在本地的开发环境,最好还是将这个功能给关掉。

如何关闭默认的错误处理?

wp-config.php 文件中添加如下代码即可。

define('SCRIPT_DEBUG', true);
薅微信公众号的羊毛

薅微信公众号的羊毛

我最近开始日更博客,开始逐渐捡起我的写作的习惯,并尝试以此维持生计。

不过,我自己写文章有个坏毛病,比较意识流,这使得我的文章当中会出现很多的错别字。由于心流作用的存在,写作时我自己无法发现这些问题。

所以,我会在写完文章后,将其复制到微信公众号后台,并使用微信公众号后台自带的语法检查工具,来完成中文的基本信息的检查,降低我的错误率。

当然,除了微信公众号,你还可以有很多选择,比如 飞书文档、石墨文档等。

只是我为了让自己能够用的更爽,自己做了个插件 —— https://wordpress.org/plugins/wpstoreapp-spellcheck/

使用 Laravel Envoy 进行项目部署

使用 Laravel Envoy 进行项目部署

在大型企业当中,往往会有各种各样的 CI & CD 工作流来完成项目的部署,而对于我自己的项目而言,我也希望能够有这样顺畅的交付体验,因此,我也为自己的业务加上了类似的方案,以实现顺滑的开发体验。

不过,我没有做的那么重,没有上 Ansible,也没有封装 Docker,就是标准的 LNMP 环境。只不过,我在标准的环境上加入了 Laravel Envoy — 一个快速部署工具

什么是 Laravel Envoy

Envoy 是 Laravel 团队开发的一个在远程服务器上执行某些命令的工具,因为他同样使用 Blade 语法,因此在 Laravel 项目中接入非常方便。

如何使用 Laravel Envoy

1. 安装 Laravel Envoy

Envoy 有多种使用方式,一种是跟随项目的使用方式,即使用 composer require laravel/envoy --dev 来安装,并使用 php vendor/bin/envoy 的方式来运作,这样的好处是你无需污染顶级目录,只在项目层面使用 Envoy 来进行部署。

不过我因为有很多项目,所以我会更加倾向于直接在全局安装 envoy,执行 composer global requre laravel/envoy 实现在全局安装 Enovy。全局安装完成后,当你需要执行命令,只需要执行 envoy run deploy,就能执行当前目录下所定义的命令。

除了全局安装,你也可以考虑使用 Bash alias 来实现类似的效果,将 envoy alias 给 php vendor/bin/envoy 就可以实现即使没有全局安装,也可以实现不需要手动输入前缀的特性。

2. 初始化配置文件

当你需要配置时,你要做的很简单,只需要执行 envoy init 服务器地址/昵称就可以获得一个 Envoy.blade.php 文件,你可以通过修改这个文件的内容,来实现定义不同的工作。同样的,你可以将这个文件纳入到版本控制系统当中,从而实现部署脚本的跟踪和定义,对于后续的持续维护比较有帮助。

因为 Envoy.blade.php 也是采用了 Blade 的后缀,所以也同样适用了 Blade 引擎,你可以通过一个语意更加友好的方式来定义你的脚本。

@servers(['web' => '127.0.0.1'])

@task('deploy')
    cd /path/to/site
    git pull origin master
@endtask

比如,上面的脚本就是一个最基础的脚本,首先定义了这个脚本的命令会在名为 web 的服务器上执行,而这个服务器的地址是 127.0.0.1;并定义了一个任务 deploy。

3. 执行部署命令

当你完成代码的编写,并提交了 Git 之后。执行命令 envoy run deploy ,就会自动的在 web 这个服务器上执行在 deploy 当中执行的命令。

deploy 的命令只要是正常的 bash 命令即可。

高级用法

1. 引入其他任务

因为 Envoy 使用 Blade 语法来编写,你也可以使用 Blade 语法中的命令来引入其他文件的中的任务。因此,你可以将自己常用的命令定义出来,并将其通过 Packagist 发布出去,并在实际应用过程中,引入对应的文件来使用。

@import('vendor/package/Envoy.blade.php')

2. 处理多个服务器

Envoy 支持定义多个服务器以及并行执行,对于架构相对复杂的业务,你可以定义不同的 servers ,并在对应的 task 当中来设定需要在哪些 Server 上执行。定义任务时,如果你传入了 parallel 参数,则可以控制命令同时在多个服务器上并行(该属性为 false 时则是串行(

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])
 
@task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true])
    cd /home/user/example.com
    git pull origin {{ $branch }}
    php artisan migrate --force
@endtask

3. 定义变量或引入其他功能函数

你可以在 Envoy.blade.php 中加入 @setup 来完成变量的定义,并在后续的代码中使用。

@setup
    $now = new DateTime;
@endsetup

也可以直接使用 @include 来引入文件

@include('vendor/autoload.php')
 
@task('restart-queues')
    # ...
@endtask

4. 使用命令行参数

在启动时,如果你使用诸如 --param=value这样的参数来调用,则可以在你的代码中直接读取对应的变量,从而实现执行时带入不同的参数。

更多用法

Envoy 当中还有更多的用法,这里不再一一列举,如果你感兴趣,可以直接参考其官方文档,了解如何使用 Envoy 达成你的部署目标。

总结

在你不是很着急使用 Ansible 或 更重的部署工具的时候, Envoy 是一个不错的选择。特别是你使用 Laravel 进行开发时,Envoy 就是一个有效的工具。

什么样的业务用什么样的架构

什么样的业务用什么样的架构

多年来,我一直是 PHP 的拥趸,不论中间我写过多少编程语言,但我始终觉得,PHP 能从 2000 年活到现在,是有其意义和价值的。

而到了现在,我终于可以回答这个价值和意义到底是什么 —— 什么样的业务,使用什么样的架构

作为技术创业者,我们最常遇见的问题,便是过度设计技术方案:我的项目是不是应该做个数据库主从备份?我的项目是不是应该做 Kuberentes 集群来处理弹性?

但实际上,对于绝大多数的业务而言,这些问题都是根本不重要的 —— 如果没有 Kubernetes,我们能否保证我们的业务的稳定性?如果没有主动备份,我们能否保障我们的业务可以平稳运转?

技术在绝大多数的业务中,都是一个成本中心,是一个保障业务正常运转的基石。他应该被重视,但不应该被过度重视。一个创业公司可能会因为业务不够稳定而失去用户,但绝不会因为业务非常稳定而留住用户。用户在乎的是你为用户解决了什么样的问题,而不是用了什么样的架构。

过度(提前)优化是万恶之源。