标签归档:随笔

CapRover 如何停止服务,并进行硬盘扩容/维护

在一开始使用 CapRover 时,我使用的是一个 10 GB 的数据盘,但在部署了诸多应用后,10GB 的数据盘已经无法满足我的需求,于是我就对其进行了扩容,扩容至 20GB。在完成扩容 & 重启后,仍需要执行 Linux 的扩容命令 resize2fs 来扩容硬盘。

但由于 CapRover 中运行的服务跑在这个数据盘上,并没有办法直接在这个数据盘上进行扩容(进程会持续读取文件),因此,需要先将 CapRover 上的服务暂停,暂停后进行扩容,并重新启动服务。

CapRover 底层是使用 Docker Swarm + Nginx 来进行的,因此,我们只需要使用 Docker Swarm 的命令,来停止服务运行即可。

1. 获取服务名称

首先,你需要先获取到当前所有在跑的服务,以便于稍后去暂停。执行 docker service ls 来获取到具体的服务名称。

2. 拼接所需的命令

在 Docker Swarm 当中,并没有直接的 Start or Stop 概念,而是通过将 Replica 设置为 0 来实现关闭的能力。这个命令可以通过 docker service scale 服务名=服务数 来实现。因此,你需要将对应的服务设置为 0 来解决这个问题。你可以先行把开启和停止的命令拼接好,从而实现快速的启动和关闭,尽可能的减少宕机时间。

如果是有多个服务,可以直接拼接在后面,从而实现一次关闭 / 开启多个服务。

# docker service scale service_name=1 service_name_2=0
# 停止命令
docker service scale srv-captain--blog-ixiqin-com=0 srv-captain--mysql-8-production-db=0 srv-captain--pgsql-16-production=0 srv-captain--redis-server-production=0
# 启动命令
docker service scale srv-captain--blog-ixiqin-com=1 srv-captain--mysql-8-production-db=1 srv-captain--pgsql-16-production=1 srv-captain--redis-server-production=1
Code language: Bash (bash)

3. 执行命令,扩容硬盘

你可以先执行停止命令,然后执行扩容命令。完成扩容后,重新启动,即可完成整体的扩容。

blue red and green letters illustration

Thinking in Component Tree

在开发前端应用的时候,我比较推荐在真正开始写代码之前试着画一画组件树 / 状态树。

在很多时候,可能你的设计师已经帮你做好了组件树,但在某些场景下,你的设计时并不会帮你拆解组件树,或者是你是直接和产品经理对接,他不会帮你拆解组件树。

这个时候,相比于写代码,我更推荐你先拆解组件树,在完成组件树之后,再开始你的 Coding。

Figma / Sketch 之类的软件提供的分组能力、图层的能力,可以帮助你将组件合理的拆解、分组、归类。当你完成树的建设之后,可以试试看将不同的模块拆解,每个模块是否可以独立正常的运转。如果不可以,则说明你的状态拆解的可能是有问题的。

当你完成拆解之后,只需要按照你拆解出来的树组织你的 Component 即可。

woman in brown knit sweater holding brown ceramic cup

写作和整理,使我疗愈。

作为一个非典型 i 人,我因为电池容量极大,导致尝尝被人认为是一个 e 人。但坦白来讲,我真的是一个 i 人。因为我知道,自己其实能表现的很 e,不过是因为我的电量足够大给大家的错觉。一旦我在社交中消耗了自己的能量,便需要通过写作和整理,来疗愈自己,给自己充充电。

写作可以让我梳理脑海中纷乱的思维,强迫自己按照结构化的思维来思考问题,并尝试梳理脑海中的问题。我长期自己积累的 memos,则可以确保我总是有的写、有想写的内容。

整理则可以让我放空大脑,专心思考眼前的事物应该分到哪个类目,并将其放置到合适的位置。

你的自我疗愈手段是什么呢?

white wall switch

警惕我们的傲慢

在入住杭州「菲住不渴」酒店时,其全屋智能让我感受颇深,整体体验也不错。但在入住的过程中,我也发现这个酒店中的一些不适的点位。而这些不适的点位,正是我们没有考虑到用户的需求,以我们自己的傲慢,来让用户「学习使用」。

一个典型的例子是,菲住不渴酒店的卫生间大灯是没有开关的,当你早上起床时,你想要上厕所,你需要喊「天猫精灵,打开卫生间灯」。当我做这个动作的时候,我感受到了设计师深深的优越感以及我对于这个设计的不适。

我是一个人入住的酒店,这个状态可能还是可以接受的。但假如这个是一对夫妻、一组同事来入住。早起开灯去卫生间的代价是让另外一个人苏醒,这个设计有点愚蠢。设计师很相信天猫精灵的能力,但没有考虑到这个可能并不是一个适合的场景。

我们在设计产品功能的时候,应该充分的考虑用户的使用场景,以及需要给用户提供必要的降级方案(比如这个 Case 中,卫生间提供一个开关即可),不要让我们的优越感支配我们,设计出强迫用户的选择。

「杭州菲住布渴酒店」简评

最近去杭州住了一下阿里的「菲住不渴酒店」,感受一下阿里巴巴对于未来酒店的定义。其中有好有坏。这里简单描述一下我自己的个人体验。

整体设计

菲住不渴酒店的整体设计风格是比较简约且具备「未来感」,如果用一个更具象的描述的话,就是整个酒店充斥着弧角和多彩灯光,使得整个酒店从设计上给人以「未来感」、「科幻电影」感。

图片来自 www.booking.com

整体的设计偏简约,猛地一看,和过去我们熟悉的各种酒店是完全不同的,的确从设计上来看更加的「未来」。

房间内部设计

房间内部的设计延续了酒店整体的设计风格,以白色、弧线为主。清冷的性格对于喜欢雍容华贵的带娃家庭,可能不是一个好的选择,但对于出差、热爱科技感的年轻人来说,还是一个可以体验的选项。

图片来自 Booking.com
自己拍的,和其他楼房过近,晚上睡觉可要拉好窗帘。
图片来自 Booking

房间设施

菲住不渴酒店的一大特色是其智能化,所以其屋内放置了大量的智能化设备(虽然并不一定能每个都串起来),让没有使用过智能家居的人来说,可以快速感受到各种智能设备带来的好处。

首先,第一个会让你感到 Aha 的,是房间的人脸识别门锁,这个门锁是我整个入住过程中,体验最深刻的。你不再需要担心出门是不是没有带门卡,只要走到房间门口,人脸识别,就能进入房间。对于容易丢三落四的人来说,真的是福音。

房间内有一个天猫精灵,你可以睡觉的时候让它帮你关闭整个房间的所有灯光,就不用自己起床来关灯了(这一点很好,当然你也可以自己在家整一套智能家居)。

此外,床头给你准备了无线充电,你可以把手机放在上面充电,数据线可以安心的放在行李箱当中,来使用。

餐食

菲住不渴的酒店参数是朝着五星级酒店的方向去对标(但显然没有那么好啦),比起我们常住的全季、亚朵,是要好上不少的。

早餐当中有面包、咖啡、水果、凉菜、热菜、面档(云吞)、缙云烧饼、寿司、蒸档。对于住的人来说,虽不能比拟五星级酒店,但也绝对算得上是不错的一餐了。

照片来自 Booking
我自己拍的刚好另一个视角的照片

地理位置

菲住不渴酒店的位置在阿里巴巴西溪园区,所以对于要到阿里巴巴办事的人来说,住这家酒店会非常方便。但如果你是来旅游的,那这个酒店就不是太推荐了,主要还是离市区太远了,中间隔着一个西溪湿地,并不是一个适合旅游者入住的酒店。

总结

整体来说,我认为菲住不渴的住宿体验是可以接受的。虽然号称智能未来酒店,但在如今各家都有了送外卖机器人;各家也都会在自己的房间配置一些基本的智能家居设备的时候,菲住不渴酒店就没有那么显眼。

但另一个层面,这家酒店创办于 2018 年,如果用 2018 年的视角来看,那菲住不渴的确可以称得上是「未来酒店」。

但如今的我们再去,就当成一个普通酒店入住就好啦。

bunch of potatoes

你是「小土豆」么?

最近这几天,大量的南方游客涌入哈尔滨,在哈尔滨吃喝玩乐。在这个过程中,当地人对于南方游客的爱称引起了我的注意 —— 「小土豆」。

当然,我并不打算指责当地人或游客,各自有各自的想法和诉求。当地人希望用爱称来虚拟化所有的游客,以拉近距离。而游客则希望找到自己的认同感,从而快速定位自己和他人的区别。

我更关注的是 —— 昵称爱称这件事本身。

假设两个人毫无关系,完全平等,我们一般都是直接喊名字,甚至是直接「美女你好」、「帅哥你好」。但当其中一方对另一方有明显的诉求时,昵称就会开始弱化自己,抬高他人。就像技术圈喊「大神」一方面是认可大神的能力,另一方面则是希望大神给自己提供一定的帮助。

当我们被某些昵称 / 称呼感受到不满 / 舒服时,我们需要想想,这个称呼/这个描述的背后,是他对于我们什么样的预期?

woman in brown knit sweater holding brown ceramic cup

警惕我们自己的无意识行为

在生活中,我们会做非常多的无意识行为,而我们的无意识行为将会让我们损失很多的时间、可能性和机会。

举个例子来说,在高铁上,你可能会持续的刷抖音。即使目前火车已经在隧道里了,但你还是会去试图向下刷抖音,来获取最新的视频。即使你知道,此刻没有网络,必然不可能刷出新的。但无意识的下拉刷新的行为,会让你不断的做一个很傻的事情。

同样的事情也会发生在比如我会用起点看小说,由于我只看固定的几个作者,他们也固定在下午五点左右更新,因此,一个最佳策略就是我在下午 6 点左右去看,大概率作者已经更新, 我可以以最快的速度完成看更新,换换脑子,然后继续 Coding。但实际上我依然会在早上 / 中午去刷新看看是否有更新的内容。

如果你仔细分析自己的时间可能会发现你大量的时间都在做这些无意识的行为。而通过尽可能的让自己有意识,可以让你更好的掌控自己的生活和时间。这也包括,我自己也一直在练习冥想,从我的视角来看,冥想所提供的价值便是「让你有意识」以及「让你更容易有意识」。如果你觉得自己的日常当中有太多的无意识行为,不妨试试做一个最最简单的呼吸冥想,感受自己思绪的纷乱。

red and white square illustration

如何批量取消你的 B 站关注和 Youtube 关注

在 You Need or You Want? 当中,我提到,我在清理我的关注,取消那些我很久不看的频道,简单分享一下如何做这个动作。

Youtube 关注

YouTube 可以访问 Channels 页面,然后手动取消关注( Youtube 的取关还有个二次确认,所以没办法像 B 站那样一条命令取消关注当前页面的 所有 Up 主)

B 站关注

B 站的取消关注动作相对简单很多。由于 B 站提供了按「最常观看」的排序的方式,所以我们只需要选择使用这个排序,并切换到列表最后一页,批量取关即可。

批量取关你可以使用下面这个命令,来取关整个页面上的所有 UP 主。

$(".be-dropdown-item:contains('取消关注')").click()
Code language: JavaScript (javascript)

具体的步骤如下:

一、在个人主页打开关注管理页面,并切换至全部关注的「最常访问」排序列表。

二、使用 F12 或使用选项打开开发者工具,并切换到 Console 页面(中文是控制台)

三、粘贴上面的代码,就可以取消关注当前页面的所有 UP 主了。

需要注意的是,每次执行会取关当前页面的,你需要切换一下底部的翻页器,切换到其他页再执行上面的命令。

此外,你还需要关注执行频率,如果执行频率太高,可能会弹出一个报错。这个时候只需要刷新一下即可。

a person sitting at a desk using a laptop computer

我的 Hackathon 心法

我是一个很喜欢 Hackathon 的人,除了会积极参与一些其他团队组织的 Hackathon,有些时候也会自己给自己模拟一个 Hackathon 来玩。

如果仔细问问我为什么这么喜欢 Hackathon,大概是你必须在一个有限时间内去完成一个你自己设定的目标。这个目标具有一定的挑战性,同时又逼迫你思考到底什么是重要的。我的几个出名的项目 —— Logoly、NESHouse、ChatGPT-Feishu 都是在 Hackathon 的阶段完成的。

对于我来说,一个 Hackathon 我一定会做的:

  1. 选择一个我不那么熟悉的技术栈:太熟悉的内容没必要在 Hackathon 的过程中去实现,放在真正的生产环节去迭代就好。
  2. 选择一个我不熟悉的目标:如果技术栈选择了一个熟悉的方向,则在目标上会选择一个全新的方向,这样有可能在 Hackathon 环节去做一个自己从未做过的事情,扩展自己的能力圈。
  3. 逼迫自己思考什么是重要的:Hackathon 因为时间和资源是有限的,因此一定要逼着自己反复的思考到底什么是最重要的?以及我如何在有限的时间内,达成这个最重要的内容的产出的目的。

通过这样的方式,我几乎每一次的 Hackathon 都会有全新的收获,无论是新的技能,还是新的产品,一定会有相关的产出,而这些就是我参加 Hackathon 的最核心的收获。

此外获得到的东西,都不过是 Bonus,有了最好,没有也完全可以接受。

red and silver beaded necklace

如何在 M1 mac 上安装 MySQL2 Gem

在 M1 的 mac 上安装 mysql2 这个 gem 的时候,经常会遇到如下的报错:

1 warning generated.
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: warning: -multiply_defined is obsolete
ld: warning: ignoring duplicate libraries: '-lruby.3.2'
<strong>ld: library 'zstd' not found
</strong>clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1
Code language: PHP (php)

根据提示,我们可以看到是 zstd 这个依赖找不到导致的编译失败。这是因为 mysql2 是一个 Native Gem,依赖了大量的系统组件,如果我们没有对应的系统组件,就无法找到。

但实际上在我的系统中已经安装了 zstd,只是在 mysql2 的构建过程中找不到。

要解决这个问题有几个思路:

  1. 在构建时能找到 zstd ;
  2. 在构建时指定 zstd 的位置。

这里我选择第二种方式:

gem install mysql2 -- --with-mysql-config=$(brew --prefix mysql)/bin/mysql_config --with-ldflags="-L$(brew --prefix zstd)/lib -L$(brew --prefix openssl)/lib" --with-cppflags=-I$(brew --prefix openssl)/include
Code language: JavaScript (javascript)

通过 -- -with-mysql-config 的方式,可以在安装时指定构建的参数,从而实现让 gem 构建时使用我们设置的路径,从而完成 gem 的安装。