我的 Hackathon 心法

a person sitting at a desk using a laptop computer

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

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

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

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

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

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

如何在 M1 mac 上安装 MySQL2 Gem

red and silver beaded necklace

在 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 的构建过程中找不到。

d2b5ca33bd970f64a6301fa75ae2eb22 3

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

  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 的安装。

d2b5ca33bd970f64a6301fa75ae2eb22 4

一些适合送给小朋友的礼品

wrapped gift box

我的两个表姐都生了小朋友,大表姐生了一个女儿,二表姐生了一个女儿和一个儿子。作为舅舅,我希望每年都送他们一些礼品,一方面让他们记得我,另一方面,也算是帮助身在焦作的他们看到一些一线孩子看的书。(当然,这些书未来当我有了孩子,也会同样买给他,让他看)。

记录下来,是为了方便你在遇到类似的问题时,有的参考。

已经送过的礼品

图书

  • 新概念英语》:虽然目前教育提倡学中文,不断在降低英文的比重,但我自己作为一个英文的受益者,还是希望下一代能够学习英文、学好英文,去看看这广袤的世界。
  • DK博物大百科》:DK 大百科声名在外,希望博物大百科可以帮助他们理解这个世界的多样性。坦白来讲,我觉得 DK 系列都很值得作为礼物送给小朋友。
  • 小亮老师的博物课》:当时小亮老师比较火,加上博物课本身是我比较希望小朋友了解的,就直接买了一套。现在回过头想想,可能和 DK 博物大百科冲突了。
  • 图说天下·国家地理系列:走遍中国》:焦作是一个小地方,如果他们未来上大学也在省内上,可能终生走出河南的机会不多。但走遍中国系列的图书,可以让他们知道原来中国这么大, 他们知道世界之大,便有走遍世界的可能。
  • 大英儿童漫画百科全书》:这是我买的最早的礼物,当时没有买 DK大百科主要是怕他们看不懂。
  • DK 文明百科全书》:专注在历史领域的图书。DK 大百科是真的很适合当礼物送。。

玩具

  • 乐高

希望送的礼品

  • 性教育相关图书:我国的学校里目前性教育依然是禁忌,则通过家庭的方式来补充是必要的。我也希望选择一些性教育的图书,送给他们,帮助他们建立正确的性观念,保护好自己。
  • 财商相关图书:我从小就没有接受良好的财商教育,很多信息都是成年以后自己慢慢学习的,希望他们能够不走我的老路,在更早的时候,就能够接受到相关的信息。目前打算购买的图书包括:《小狗钱钱》、《富爸爸穷爸爸》。胭脂王推荐了《奇妙的盘算社团》,但我还需要自己先看一遍,再评估是否要送给外甥女和外甥。

2024.01.15补充

《奇妙的盘算社团》读完了,还不错。不过比较适合初中阶段的小朋友。他们已经建立了基础的人生观、价值观,这个时候看这本书比较好。

You Need or You Want?

red and white square illustration

由于常年有信息焦虑症,所以我订阅了大量的信息来源,各种 RSS、公众号。但真正我能看到的是有限的。

这个时候就有一个问题需要回答:

我关注的这些内容,到底是我需要?还是我想要

理想情况下应该是我只看我需要的,并在我需要的基础之上,有 10% 左右的超额内容,这样确保自己既没有被海量的消息打爆,同时也没有陷入在信息茧房里。

不消费无用信息便是一个尝试

100 多个频道,得干掉一些。

d2b5ca33bd970f64a6301fa75ae2eb22 1

纪念外婆

pumpkin squash decor

早上妈给我发了条消息,说外婆不在了。

d2b5ca33bd970f64a6301fa75ae2eb22 2

马上买火车票,安排好今天、明天、未来几天的事情,排好优先级,然后静待晚上的车回焦作。


我算是外婆最待见的孩子。由于三个舅舅和大姨生的都是女儿,也都是独生子女。我这个小女儿的儿子就成了外婆最喜欢的孩子。再加上小时候家里的条件不好,我常常在周末被送到外婆家度过。

有很多美好的记忆:

  • 外婆家的院子,放满水,让小学的我在里面玩水;
  • 外婆在院子里洗衣服,我在院子里玩;
  • 外婆在院子的房顶晒西瓜酱,我给外婆帮忙;
  • 每次去外婆家,外婆都要给我做好吃的;
  • 在我小时候的冬天,焦作下了雪,外公外婆带我去人民公园玩,还给我做了个简易的雪橇,让我滑着。
  • ….

还有很多我不记得,但外婆记得的片段:

  • 外婆问我,要不要改姓买(我外公姓买),我说不要,男孩子要跟爸爸的姓,女孩子才跟妈妈的姓。
  • 外婆问我,她和我奶奶都掉进河里了,我先救谁?我说我谁都不救,因为我不会游泳,我打 119。
  • ….

所有的一切美好的回忆,涌上心头。


两周前因为堂弟结婚,我回了趟河南。那时候外婆已经住院了,不过只是因为胃病,在医院已经住了有几天了。刚好我回来,还见了她两面。可惜没有拍照。

后面再回来,就是外婆因为吃了中药,上吐下泻,直接休克,被送进了 ICU,我也是连夜赶回来。

没想到再回来,就是参加她的葬礼了。


我以前有给外公外婆拍照的习惯,因为我不知道他们什么时候会离开我们。结果发现,似乎只有我有拍照的习惯。结果现在我可能成了拥有她照片最多的人。

如果你去看望老人,我也建议你也可以给老人们拍照。因为你不知道什么时候就再也和她们无法相见。或许这次见面,就是你们的最后一面。

未来我可能会选择买拥有更好相机的手机,不为别的,只为能够留下亲人、友人的美好的照片和回忆,这些照片,会成为伴随我们未来一生重要的 Moment。


想着以后我就没有外婆了,曾经那么爱你的老人也不在了。泪又留下来了。


一些人在火车站的情绪,没有主题,只是任由情绪肆意的挥洒。以自己的情绪,纪念外婆。

不消费无用的信息

red and white square illustration

今天注意到,我自己在消费 Youtube 上关于 Tesla Model 3 的视频信息。

但实际上,我不应该消费这个信息,因为我已经在今年买了自己的第一辆车,今年内大概率是不会需需要买车了。在买车应该是在 2-3 年后,有了自己的房子才会考虑买电动车。

此刻我对于 Tesla Model 3 的任何信息消费都是无意义的、超出我需要的,除了会增长我自己想要购买 Model 3 的欲望之外,不会有任何的变化。

但现实是我不可能在短时间再买车。

so, 答案就是,我不应该消费这些信息,直到我的又一次需要去购车时,再重新关注和了解这些信息。

嗯,应该取关一些公众号、Up 主,控制自己的信息摄入了。

我的投资理财书单

pile of assorted-title books

以下这些书单是我认为和投资理财相关,要看的书。部分书有书摘,你可以点击链接查看书摘。

入门

经济学

投资与生活

投资基础

股票 & 基金

其他

除了上述的图书以外,本站的读书笔记分类中还有一些投资相关的书摘,供你参考。

如何自定义 Docked?

red and silver beaded necklace

我在之前的文章 使用 Docked Rails CLI 简化 Rails 的开发 中介绍了 Ruby on Rails 的 Docked 程序,并提供了一个我自己的定制版本。

这里来和大家说一下怎么自定义 Docked 镜像,从而构建一个适合你自己的镜像。

Fork Docked 项目

At first ,你需要 Fork Rails 官方的项目

https://github.com/rails/docked

Fork 项目到你自己的名下后,你可以修改一下他的名字,改成适合你自己习惯的名字(比如我就改成 Runs 了,Docked 对我来说太容易打成 Docker 了)。

修改 Dockerfile

Docked 最核心的其实就是 Dockerfile ,你可以修改你 Fork 来的项目,并在 Dockerfile 当中添加必要的依赖,引入新的资料等。

比如,https://github.com/bestony/runs/commit/d930a5d6fc389cb6fa8e9f7c41947d01b000da95这个 Commit 就是为了在 Dockerfile 当中添加 PGSQL 的配置,以实现在使用 rails new 命令时,可以选用 PGSQL as DB Backend。

修改 Ruby 版本

可参考:https://github.com/bestony/runs/commit/31fabe5f914d931834b0e12797b14d76bf56d162

修改 Node 版本

可参考:https://github.com/bestony/runs/commit/5969cc4ee5c0bf8503ebdab5664f365b6719843e

修改编译脚本,上传镜像

修改完成 Dockerfile 后,接下来你需要修改 Docker镜像产物,以便于你自己在实际使用过程中,直接使用你自己的 Docker 镜像。

修改 https://github.com/bestony/runs/blob/160fe165db7abecc3229be417b15473dcd3aec9f/.github/workflows/docker-publish.yml#L41 的 tags 为你自己的,格式为 ghcr.io/{你的 ID}/{你的仓库名}

修改好之后,只需要提交 Commit ,等待 Github Action 的自动构建即可。

修改 Readme

镜像构建结束,你只需要修改 Readme 中的安装配置命令,这样在后续使用时就不用自己再修改了。重点修改的内容包括 ailas、镜像名以及底部的启动命令。

d2b5ca33bd970f64a6301fa75ae2eb22

总结

通过对 Docked 的简单修改,可以实现快速构建一个属于你自己的开发环境命令,帮你优化自己的工作流。

Gmail 的一个搜索小技巧

gmail

很久没有看 Gmail 了,堆积了一千多条消息。于是今天上午抽了半个小时,清理了一下邮箱。

RaiseByTurtles 中找到如何筛选出所有没有标签的邮件,我使用的是下面这个 Query

-has:userlabels -in:sent -in:chat -in:draft -in:inbox
Code language: CSS (css)

通过这个 Query ,我就知道我其实还可以使用 - 的语法来在 Gmail 中搜索邮件(过去我几乎只用 is:unread [query] 来搜索所有包含某个关键词的我未读的邮件)。

在清理过程中,我就可以不断的在其中去叠加一些关键词,来实现,干掉那些已经失效的邮件,比如,通过下方的 Query 就可以实现屏蔽掉所有没有标签且不属于 Substack 和 zhubai 的邮件,从而避免误伤到我订阅的 Newsletter。

-has:userlabels -in:sent -in:chat -in:draft -in:inbox -substack -zhubai
Code language: CSS (css)

使用 Docked Rails CLI 简化 Rails 的开发

a golden docker logo on a black background

在开发 RoR 的时候,经常需要配置本地的开发环境。但如果你需要在一些云端开发环境(比如 Github Codespaces)中配置你的开发环境时,就会变得比较麻烦。

但得益于 Docker,我们可以直接使用 Docker 镜像来完成我们的开发环境。

Ruby 官方提供了 Docked 来帮助我们完成这个环境的构建。

配置

假设你已经完成了 Docker 的安装,接下来你只需要做如下操作,来配置 Docked Rails Cli

docker volume create ruby-bundle-cache
alias docked='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli'
Code language: JavaScript (javascript)

为了方便你的使用,你还可以将上述的输入放在 .bash_rc.bash_profile 当中。

使用

接下来,你只需要使用 docked 你要执行的命令 来执行各种命令,比如官方给出的这样的 Sample。

docked rails new weblog
cd weblog
docked rails generate scaffold post title:string body:text
docked rails db:migrate
docked rails server
Code language: CSS (css)

updates in 2023.12.19

由于官方默认的 docked 没有 PGSQL 的支持,所以我自己 Fork 了一个版本,做了一些更新。

具体可以见 https://github.com/bestony/runs

什么样的照片有长期的留存价值?

woman taking photo of high-rise building beside road

这两天在梳理我的老照片,一边看一边删,也整理出了我眼中,有长期留存价值的照片。希望通过总结出规则,方便自己日常拍照、日常清理照片。

原则

  1. 有清晰人像的照片:我们的记忆是跟随人一起的,我们会记得某些人的某些时刻。因此值得长期留存的照片,一定是有清晰人像的照片。无论是正面出镜,还是背影出镜,能辨别出清晰人像的照片,才是有留存价值的。单纯的风景照片从长周期的记忆视角来看,不值一提。
  2. 有故事感的照片:虽然有清晰人像,但故事中有一定的冲突、故事感的照片,才值得我们留存。自拍符合清晰人像,但未必符合故事感。如果只是自己的脸,其实留存下来没有太大的意义(只能用来感慨自己的人生变化还是蛮大的,已经没有了当年的朝气)。

定期清理照片

除了定下规则,也需要定期清理照片,这样才能在需要的时候,快速找到自己的照片。照片多并不一定是好事,有价值的照片多才是好事。

手机相机还是得好

翻自己的老照片,明显感觉到,手机拍照记录生活还是更主流。相机虽然也有,但更多是「作品」,而不是「生活」,生活还是得手机。

我喜欢的歌手

selective focus silhouette photography of man playing red-lighted DJ terminal

最近突然想起来,应该把我喜欢的歌手 Share 给大家,互相交换一下自己喜欢的歌手、歌曲,让那些好听的歌曲广为流传。

周杰伦

不用多解释,我们那个年龄段的人都喜欢。

赵英俊

赵英俊的歌我一致都很喜欢,他的歌曲风格独特又深入人心。

我喜欢的歌包括:

  • 《送你一朵小红花》
  • 《世界上不存在的歌》
  • 《悟空传》
  • 《万万》
  • 《不许离开我》
  • 《唐人街》
  • …几乎他的所有歌我都很喜欢

他的歌很多时候唱出了小人物的无奈,像我这样的小人物,难免会有一些「他唱出了我的感觉」,所以很习惯。

再加上他的编曲也都不错,人也很有才,所以很喜欢听他的歌。

可惜天妒英才,英年早逝。

汪苏泷

汪苏泷的情歌很多,也很值得听。

海来阿木

海来阿木坦白来讲,之前我不是特别的熟悉,因为的确小众。不过听了以后,他的声音还挺有个性的,自带嘶哑的特效,唱起来情歌,自带的撕裂感。

我喜欢的歌包括:

  • 《不过人间》
  • 《你的万水千山》
  • 《别知己》
  • 《三生三幸》
  • 《阿果吉曲》
  • 《西楼儿女》

海来阿木算是宝藏歌手了,比较小众,但歌的确很好听。独特的声线值得一听。

李宗盛

我目前已经到了能听懂李宗盛的年纪了。所以,也推荐给大家。

此外,李宗盛之前和 New Balance 拍的一系列广告片也不错,感兴趣的可以找来看看。

为什么说投资是认知的变现?

ea3765a81c7a26a7864efdcf7c81ef7b

过去一直听孟岩讲「投资是认知的变现」,没什么感觉,最近投资拼多多属实让我自己感受到了「投资是认知的变现」这句话。

投资的核心动作是低买高卖

在股票市场中,所有的盈利来源都可以归结为「低买高卖」,你在低价时购买了股票、基金,并在高价时卖出基金,获得其中的差价。

一种策略是简单的「追涨杀跌」,如果发现一个股票/基金开始出现涨势,就开始买入,并在买入后不久,进行售出。这种行为并非完全不可行,在高频交易和量化交易的过程中,基本上便是基于这样的逻辑进行,并通过机器逻辑来提升交易的频度和粒度,获取高额收益。

另一种策略便是我们所说的「投资」,找到你觉得价值和价格不匹配的股票,以低于市价的标准买入,并以高于市价的标准卖出,获得其中的价差。绝大多数的投资便是如此。

如今有了各种股票基金 App,投资动作变得越来越简单,你不再需要前往股票交易所现场购买,远程在家中,甚至坐在马桶上,都可以完成一次交易,「认知」体现在何处?

认知便是你知道这支股票的价值是多少。当你知道一个股票的价值,你便敢于在市场情绪崩溃的时刻激情买入;当你知道一个股票的价值,你便敢于在市场热捧之时,激情抛售。

我的收益不过是运气

我买入拼多多时,正值中美关系冰冻,拼多多股票跌至 70 美元。所以我买入了 20 股,把当时海外的空闲现金全部投入。后续随着中美关系解冻、拼多多的海外版 Temu 业绩不错,拼多多股票一直涨,直到最近的 145 美元。

从 70 买入开始,一直到 110 美元开始,我开始纪律性的卖出,110 美元卖一部分;120 美元卖出一部分;130 美元卖出一部分;目前手头还剩不多,定下的售出价格是 150 美元。虽然尚未达到 150 美元,但已经收回本,剩下的部分其实都是赚的。

在此刻,我深刻的感知到「投资是认知的变现」。我不知道拼多多的价值是多少,所以我会在 110 卖出、120 卖出、130 卖出。如果我始终没卖,可能到了 150 美元卖出,不仅仅是收回本,而是翻倍的收益。

但另一个层面,上面的这些不过是马后炮,拼多多完全有可能从 110 美元跌回 70 美元,甚至跌回 40 美元,这一切都是有可能的。我的认知并不能告诉我拼多多的价值到底是多少,只不过是纪律性的交易让我可以赚钱,本质上是幸运,而不是能力。

一如当下纠结的我,到底该不该卖拼多多?现在是否是已经超过了拼多多的股票价值?我是否应该继续持有还是卖出?我不知道。或许止盈是一个好的选择,既然认知不到位,就应该接受自己认知不到位带来的结果。也像我年初 200+ 卖掉的 NVDA,我的认知没办法想象到 NVDA 可以卖到 400+ ,所以自然无法享受到其从 200+ 涨到 400 + 的收益。

投资不过是认知的变现。

从童年找答案

woman eating sandwich

熟悉我的人知道,我是一个胖子,不折不扣的胖子。身高 180 ,体重 110 Kg。我也试图减肥,但一直以来,并没有养成良好的饮食习惯,导致体重一直没有减下来。我也在想,到底是什么让我始终瘦不下来?

答案当然是:迈不开腿、管不住嘴。可真的这么简单嘛?

为什么迈不开腿?

因为内心有恐惧:

  1. 恐惧自己的体能不足,所以到健身房去根本做不了几个动作。
  2. 工具自己的能力不足,到健身房会被嘲笑。

但这些真的是问题么?或许是的,毕竟我还算的上是一个骄傲的人。但同时,这些想法也限制了我的发展和身体健康。

也许是因为在我看来,总有比健身更重要的事情,身体可以往后放一放。但,真的还能往后放一放么?

为什么管不住嘴?

相比于迈不开腿, 管不住嘴显然是让我持续胖下去更加重要的原因。但,为什么?为什么管不住嘴?为什么习惯性的吃多?

当我无意识的时候,我自然会继续吃多。但真的去思考为什么吃多的时候,我赫然发现,这问题原来是从童年带回来的回忆。

打小吃的就多

从小时后开始,我吃的就比较多。所以一直以来,给家里人养成的印象也是我比较能吃。从而形成恶性循环。

家里人觉得我能多吃 — 给我安排更多吃的 — 激励家里人给我安排更多吃的 — 进一步多吃。

这种恶性循环使得我被要求吃的更多,而我为了让家里人更开心,所以也在不断的吃的更,久而久之,固化了我吃的多的风格。

但,这解释不了如今我已经离开了家乡,已经开始自己做饭吃饭,为什么还是吃这么多?

内心深处对于物资匮乏的恐惧

我家里并不算富裕,甚至从小我的外食之类的都是很少的。大部分时候我都是在家吃的,对于外面的好吃的其实并没有太多的机会去吃。

这样使我养成了一个坏习惯 — 每当有的机会去吃的时候,就会多吃。因为不知道自己什么时候还能再吃到。这个坏习惯也加重了家里人对于我「吃的多」的刻板印象。

而且,这件事也影响我在其他方面的习惯。举个例子来说,如果我住高档酒店,没有用完的洗漱用品一定会带走。一方面是我觉得不带走浪费。另一方面,的确这些高档酒店的洗漱用品我拿回家依然可以用。

虽然我的收入可能完全可以支付的起一块肥皂的钱,但习惯趋势我还是会把酒店的香皂带回家日常使用。我真的缺这块肥皂钱么?显然不是的。

想要改变,需要从心改变

我其实在朋友的减肥的服务中学了不少,包括理论也都看了,也都学了,但还是减不下来。真的是服务不行么?不是的。

从技能上,我已经掌握了先吃青菜蛋白质,再吃碳水;控制自己摄入食物的比重和顺序。但,习惯性的多吃,让我即使是已经在先吃碳水的情况下,依然大量的摄入了食物。

想要改变这些问题,需要解决我自己的心病、心理问题,最终才能得到解脱。

FastAPI 在使用 pytest 加载不同的配置文件,以实现测试环境单独运行某些配置项目

person holding sticky note

引言

Fast API 作为一个新兴的 Python Web 框架,不少的开发者都在使用 FastAPI 来开发应用。我最近也在试着使用它。

在开发应用时,我习惯使用 TDD 的方式进行开发,特别是开发飞书机器人时,由于飞书给我提供的请求是可预测的,特别适合以 TDD 的方式来定义行为并实现。

同时,我在使用其他语言开发的时候,也会用到使用 .env.env.testing 这样的配置文件来在不同的环境下加载不同的配置文件,达到在不同环境使用不同的变量来完成任务。

内容大纲

  1. 实现读取 .env 文件
  2. 实现在测试环境读取 .env.testing 文件

模块详细内容

实现读取 .env 文件

想要实现在 FastAPI 中读取 .env 文件,首先,你需要引入 pydantic_settings 包,来完成基本的配置文件的读取。

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    app_name: str = "Awesome API"

settings = Settings()
print(settings.app_name)

接下来你可以为这个 Settings 类新增 Config 配置,以实现读取本地的 .env 文件

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    app_name: str = "Awesome API"

    class Config:
        env_file = ".env"

settings = Settings()
print(settings.app_name)

通过上述代码,你的配置项目就会自动读取 .env 文件来加载环境变量,从而实现更加简单的环境变量管理。

实现在测试环境读取 .env.testing 文件

在测试时,为了避免使用线上的数据,你可以在测试时加载不同的环境变量文件。

如果你只有一个测试环境,可以有一个非常简单的方式来实现:在配置 env file 时,传入一个元组,会自动加载多个文件。

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    app_name: str = "Awesome API"

    class Config:
        env_file = (".env",".env.testing")

settings = Settings()
print(settings.app_name)

需要注意,这里实现的实际上是使用 pydantic-settings 自己的加载顺序来实现。默认情况下,靠后的文件优先级会更高(覆盖了前面的内容)。这样的好处是如果你有些配置测试环生产是一样的,可以在 .env.testing 中加入不同的部分,相同的部分直接复用生产环境的配置项目即可。

但由于使用的是顺序加载多个问题,如果你发现表现和你配置的不一致时,就要看看是不是有优先级更高的环境变量文件覆盖了默认的 .env 文件。

结论

借助 pydantic-settings 的一些配置,你可以快速实现 .env.env.testing 的加载,相比与判断环境变量,这样会比较简单,且可以实现在 .env.testing 中只维护变量,和线上保持一致的部分可以直接继承。


附加部分

JSON to Pydantic

black flat screen computer monitor

使用 FastAPI 后,你需要写完整的请求体和返回体,以便于生成 API 文档,对于完全从 0 开始构建的项目来说,是不难的,但如果你需要做的是一个项目的迁移,那么写这些类型定义可能需要耗费你大量的时间。

不过,JSON to Pydantic 可以帮助你解决这些问题:

d2b5ca33bd970f64a6301fa75ae2eb22 6

这个网站支持使用一个 JSON 作为 Input,并生成对应的 Pydantic 的代码,对于一些老旧项目迁移的工作来说,可以说是节省了大量的时间。

大力出奇迹,但不是 All in

Go All In signage in middle of camera and banknotes

不少人对于大力出奇迹有一个错误的认知 —— 认为大力出奇迹便是 ALL In。但其实并不是,大力出奇迹更像共产主义的一个特色 —— 集中力量办大事

实际上,我并不鼓励任何形式的 ALL IN,如果你开始思考要不要 ALL IN 的时候,说明你的路子大概率已经走错了。正确的事情需要投入去做,但不需要 ALL In 的去做。

ALL In 是指你将所有事情都押宝在一件事上,这意味着你不成功便成仁。但当你走到这一步的时候,可能你已经没得选了,大概率面临的是失败,不然为何成功成了千古佳话。

大力出奇迹则是对看重的事情大力投入,而不是停留在推演、思考,主动投入资源去推进一件事的落成,才能帮助你把想要达成的目标给达成。

这两者是不同的,可别乱用。

小公司大多死在优先级不清晰

d2b5ca33bd970f64a6301fa75ae2eb22

引言

最近在和朋友在做一些项目的时候,很深刻的感受到了创业公司的一些问题。而其中让我印象最为深刻的是 —— 优先级分不清。

这也引发了我的思考,大公司为什么能成为大公司?小公司为什么总是小公司?是不是有什么是小公司一直没做好的?

思考后我的答案是:小公司往往死于优先级不清晰

作为一个小公司来说,资源不多是正常的,但不是致命的,有多少钱就办多少事就好。但如果你没有钱,却选择做一个不适合自己的事情,或不把有限的资源投放在最重要的事情上,可能最终一定会面临一事无成,最终无法达成自己的预期。

背景信息

我们当时的目标是开发一个项目。一个项目中存在主流程和辅流程。我的观点是优先关注项目的主流程,而不是辅流程。而朋友则会关注一些偏表面的体验、颜色、或一些直线流程的产品功能。这里我们存在了优先级的冲突。当然,最终还是按照我的优先级来做事。

我的观点

在绝大多数的时候,大公司是那个资源更加充沛的角色,这使得大公司可以拥有更多的资源、更多的试错可能机会。对于大公司来说,一个方向的试错,并不会导致大公司彻底死亡。同时,大公司的各种流程的积累,可以帮助大公司尽可能的做出最正确的决策(虽然这个「最」其实是在企业内的最,未必是产品的最)。

但对于小公司来说,由于资源的有限,可能一次失败面临的就是全盘皆输。因此,对于小公司来说,优先级的决策就变得弥足珍贵。对于小公司来说,如果领导者是一个聪明、经验丰富的人,还可以很好的评估项目和工作的优先级,带领大家穿越周期,最终取得预期的结果。但如果领导者不够聪明,或者精力不在做决策上,则大概率走向不好的结果。

分析和评论

不过,这个事情上来讲,也有一点悖论。对于小公司来说,决策会更加重要,但对于小公司来说,招募到一个可用之材也是更困难的事情 —— 因为人才会选择去一些胜率更高的大公司从业,获取更加明确的收益。小公司得到的人才可能往往不是那么的优秀,使的小公司的决策行为更加雪上加霜。

对于小公司来说,需要用更高的赔率去招募合适的人才,才能招到真正优秀的人来一起做事。

结论

大公司因为有标准的流程,即使决策者水平不高,依然可以借助流程提升决策的水平。但对于小公司来说,如果决策者水平不高,大概率会死在路上。好的决策,影响一切企业。


作为一个个人,如果你刚刚走进社会,有机会进入到大公司去感受到大公司的决策流程,那对于你整个从业经验来说都是会有很大帮助的。但如果你没有办法进入到大公司,那么一定要仔细遴选小公司,特别是与小公司的领导者沟通,了解小公司的人领导者是什么样的人,确认小公司的领导者是否是你认可的人。避免浪费自己的时间。

创业公司/小公司可能是每个人必经的道路。但是,我希望你能在这个路上少踩一些坑,走的更稳。