如何实现每天5点起床

原文:How To Wake Up at 5 A.M. Every Day

文章的中心思想和zen habits的比较像,通过重复动作,形成习惯,从而“催眠”自己实现早起的目标。

目标

首先需要知道自己为什么要早起,很多人只是跟风。因为如果只是为了身体健康,其实更重要的在于规律睡眠,是否早起并不是核心,因此容易动力不足。文中作者早起的主要动力是,获得早晨这段安静的工作时间投身自己的事业

算清楚得与失

早起的好处主要是获得一段没人打扰的时光,因为如果你起的比别人早,别人通常都在睡觉。而且,大部分人在早上的时间更容易找到工作状态,并且更有创造力。

早起同样有坏处,主要在于一天的时间会减少。早起所获得的安静时间,并不是凭空产生的,而是把晚上的时间挪了过去。并且,早起很容易延长睡眠时间,因为没有“上班时间”这样紧迫的界限,更容易赖床。而晚上,通常是与朋友的社交时间。

每个人因为早起而将会失去的东西不太一样,需要先算清楚。然后对比好处与坏处,首先说服自己。

关注睡眠时间

早睡,并不是强行起床。需要注意保持充足的睡眠时间,在晚上早点入睡。并且,在刚开始的阶段,可以比以往睡得更长一点,给你的身体留足精力准备适应新的习惯。

别一口气定下太多目标

先专注早起一个目标即可,特别是在一开始的时候,早起之后所做的事情不要有限制,甚至可以是一些娱乐活动,这样有助于自己先形成早起的习惯,之后再考虑工作的事情。比如,可以早起看剧或者打游戏,这样会容易很多

选好早晨的习惯动作(核心)

如果早晨醒来后固定要做一些事情,比如刷牙洗脸,泡茶,做早饭,看报纸等,久而久之形成习惯后,会“催眠”自己,使大脑只关注于接下来要做的事情,从而减少一些早起的排斥,这样会让早起更为简单。这个阅读zen habits的文章会有比较深刻的体会,别对自己的大脑过于自信,通过一些动作来欺骗大脑是很有用的。

不带手机睡觉

尽量让你的睡眠环境很无聊,没有手机,也没有其他的干扰。可以把手机放在其他房间。


改变当代世界的三大力量

原文:https://www.collaborativefund.com/blog/three-big-things-the-most-important-forces-shaping-the-world/

译文:https://lonecapital.com/opinion/3650/

二战是非常重要的历史事件,很多事情都可以追溯到二战。而未来,有三个事情将和二战一样影响深远:

1. 老龄化——人口结构变化重塑当代经济体系

低生育率、人口老龄化带来劳动力短缺,将会严重影响经济增长。同时,出生率下降的结果是,人口增长的一大来源成为移民,由此也将带来移民问题。

2. 贫富差距——近40年来财富分配不平等的问题达到了破裂的边缘

川普,桑德斯,英国退欧都反映了底层的呼喊:“停一停,我们得换个玩法了。你喜不喜欢都没办法,因为现在该听我的了。”

3. 信息爆炸——便捷的信息获取渠道瓦解了曾经的屏障

互联网使人们之间的距离越来越短,本来虽然意见不和但没有机会相遇的人们,被互联网推向彼此,产生了很多的价值观冲突。才华更容易被发觉,无论你是谁,只要有好的点子人们都愿意洗耳恭听(创投、网红)。虚假信息和垃圾广告也越来越多。

世界是由尾部事件驱动的,少数事件带来深刻影响着大量的结果。对投资而言,一小部分仓位的成败很可能决定了一生的收益。

历史也是如此。二战、一战以及大萧条影响了整个20世纪的重大事件。在19世纪是工业化和内战。

人口构成、不平等和信息获取会极大的改变接下来几十年的走向。虽然我们无从得知历史究竟如何发展,但是当它们确实发生的时候我们会了解其中的原因。


NodeJS在web server中直接返回buffer(express, koa, nest.js等)

如下场景,需要直接返回base64decode后的数据,而不是调用toString,通常,这样返回是不行的:

1
2
3
4
app.get('/', function (req, res) {
const buffer = Buffer.from('p8AuXbAKFihL9N1H4aYi7w==', 'base64');
res.send(buffer);
});

这样直接返回一个buffer的结果是,会被序列化为数组或者其他同类对象,有点类似被调用了toString方法

如果想要直接返回buffer内容,需要构建stream

1
2
3
4
5
6
7
8
import stream from 'stream';

app.get('/', function (req, res) {
const buffer = Buffer.from('p8AuXbAKFihL9N1H4aYi7w==', 'base64');
const bufferStream = new stream.PassThrough();
bufferStream.end(buffer);
bufferStream.pipe(res);
});

如果是在NestJS中:

1
2
3
4
5
6
7
@Get()
async vodDecrypt(@Res() res: any) {
const buffer = Buffer.from('p8AuXbAKFihL9N1H4aYi7w==', 'base64');
const bufferStream = new stream.PassThrough();
bufferStream.end(buffer);
bufferStream.pipe(res);
}

微信小程序清空按钮Button样式

小程序中一些功能必须要用自带的button组件才能完成,比如获取授权、分享等,已经不支持用js触发了。清空button样式除了设置本身的css外,还应注意设置after,以下设置可以几乎清空一个button的样式:

1
2
3
4
5
6
7
8
9
10
button {
margin: 0;
padding: 0;
border: 0;
background-color: #fff;
color: #000;
}
button::after {
border: 0;
}

“退休前”旅游的感受

Reflections on Pre-Tirement 这篇文章讲述了作者脱产进行为期10周的旅游的体验和反思,这是一种目前欧洲流行的“退休前”状态(pre-tirement,可以理解为半退休,介于正式退休和全职工作之间的半工作半退休状态)的尝试。大概可以理解为,已经赚够了钱,可以开始边体验生活边工作了,生活不只是工作。

以下是原文,在这里有一篇中文翻译:程序员休假十周的感受【译】

阅读更多
GitHub Actions 执行自定义SSH命令

观察发现Actions的机器,连接国内服务器比CircleCI的网络要更稳定,更适合做部署在国内的流水线。

总共分两步,第一步是用rsa密钥实现自动登陆远程ssh服务器,第二步才是执行命令。

1. 配置rsa密钥自动登陆

首先是生成ssh使用的对称rsa密钥,并把公钥保存在远程服务器的authorized_keys文件中,这里就不详细描述了。其中,私钥需要进入Github对应的Repo,点击Settings,Secrets,新增一个名为SSH_PRIVATE_KEY的键用来保存rsa私钥。

然后引入别人做好的actions脚本webfactory/ssh-agent@v0.1.1,读取私钥。

还有一步是配置known-hosts,否则会出现一个是否yes的提示卡住。记得替换下面的域名为自己的

1
2
3
4
5
- uses: webfactory/ssh-agent@v0.1.1
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Setup knownhosts
run: ssh-keyscan sijie.wang >> ~/.ssh/known_hosts

2. 登陆并执行命令

引号内的内容替换为自己的命令

1
2
- name: Run SSH Command
run: ssh root@sijie.wang "echo 'Hello Github Actions' > actions.log"

在kubernetes的ingress中配置let's encrypt自动https

平时在普通的机器上,用cert-manager配置let’s encrypt自动开启https非常方便。而在kubernetes中,如果使用ingress做反向代理路由,那么也可以安装对应版本的cert-manager自动开启https, 自动续证书。

1. 安装helm和tiller

helm的安装这里不详细讲,现在一般云服务商(比如阿里云)的kubernetes中都会安装好helm和tiller,只需要在客户端安装helm即可,mac下可以直接用homebrew

1
brew install kubernetes-helm

2. 安装cert-manager

直接贴上来自官方的安装命令即可。大致为新建一个cert-manager的namespace,然后用helm安装相应版本的cert-manager。为了获取更新的版本,执行前可以参考一下官方:https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Install the CustomResourceDefinition resources separately
kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.11/deploy/manifests/00-crds.yaml

# Create the namespace for cert-manager
kubectl create namespace cert-manager

# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io

# Update your local Helm chart repository cache
helm repo update

# Install the cert-manager Helm chart
helm install \
--name cert-manager \
--namespace cert-manager \
--version v0.11.0 \
jetstack/cert-manager

检查是否安装成功

1
kubectl get pods --namespace cert-manager

成功的话类似:

1
2
3
4
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6866597-zw7kh 1/1 Running 0 2m
cert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2m
cert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m

3. 配置issuer

注意下面的邮箱需要改成你自己的

创建一个production-issuer.yaml文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: user@example.com
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
1
2
$ kubectl create --edit -f production-issuer.yaml
issuer.cert-manager.io "letsencrypt-prod" created

配置完再查看一眼

1
kubectl describe issuer letsencrypt-prod

4. 开始添加域名使用

首先用常规的方法配置ingress,并等待其分配好IP等信息。然后编辑yaml, 添加issuer,在annotations中加入两行:

1
2
3
4
5
6
7
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kuard
annotations:
kubernetes.io/ingress.class: "nginx" # letsencrypt
cert-manager.io/issuer: "letsencrypt-prod" # letsencrypt

有些云服务商需要手动添加tls证书

1
2
3
4
5
6
spec:
...
tls:
- hosts:
- www.example.com
secretName: example-com-tls

加完之后,耐心等待,cert-manager会自动申请证书,期间可以看到有临时的ingress出现,这就是在验证域名。等待最多10分钟即可配置完成。

如果需要强制https跳转,则再添加一个annotations

1
nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'

jupyterhub设置cors允许跨域

使用jupyterhub作为后端kernal的时候,前端需要通过ws连接到jupyter notebook(由jupyter hub产生)。这时候在默认情况下会产生跨域的情况,需要进行一些配置。

阅读更多
nodejs在kubernetes中的时区设置

kubernetes的pod中默认的时区是0时区,如果要修改时区,一般是通过mount的方式,将/etc/localtime映射为/usr/share/zoneinfo/Asia/Shanghai

但是这种方式下,系统时区是改了,比如在bash中输出date已经是正确的,但是NodeJS应用中可能依然是0时区。这时候需要再加一个环境变量TZ即可。

1
2
3
4
containers:
- env:
- name: TZ
value: Asia/Shanghai

彻底删除macOS中的VSCode

需求源于交还公司电脑,除了在Applications(应用程序)中把VSCode拖到废纸篓,还需要手动删除个人信息。

总共有两个地方

1
2
rm -rf $HOME/Library/Application\ Support/Code
rm -rf $HOME/.vscode