开始

随着年龄的增长,似乎也到了要写日记的年纪了(正经人谁口口口)。况且今年算是一个特殊的年份,呐,就来回顾一下今年的种种罢。

健康

从健康来回顾是一个不错的开始。今年的生活节奏也有了很大的变化,虽然离年初的目标仍有一段距离,但是也值得记录一下。

起源

经过去年一年在奋斗逼之都的摧残之后,已经意识到了健康生活的重要性。在健康学习到150岁 - 人体系统调优不完全指南程序员延寿指南 | A programmer’s guide to live longer的契机下,决定好好调整今年的生活作息。

作息

最重要的当然是日常作息了,主要的优化方式就是从12点之后睡觉改为11点入睡,7点起床(当然也和工作时间调整有关)。

喝水

虽然看上去是一个不起眼的优化,但是回过头来看应该是本年度最有性价比的改动了。在下载了喝水app并严格执行每日喝水目标之后确实能感觉到身体的变化。

减肥&&锻炼

从奋斗逼之都被赶回来的时候已经接近90kg了,上称的时候确实有点不能接受。所以今年最大的目标就是减肥。然而作为一个没有毅力的人(不然也不会到达这个体重),自然是要选择easy path了。在经过仔细调研之后决定第一步就是先喝水,于是就有了用app强制喝水的故事。一开始确实非常的难受,需要一直跑厕所,但是还好那段时间在家里蹲所以也没有什么大碍。在大概经过1个月之后身体就已经可以适应正常的饮水量了。而喝水的另一个好处,作为民科的我的想法是:饭前喝水可以一定程度稀释胰岛素水平(加上占据胃容量),可以在更少饮食的情况下不那么饥饿。

减肥最重要的当然是饮食了,对此我的策略一开始是:早饭正常吃,中午一个板烧鸡腿堡,晚上一口饭+吃菜。由于前置了一个月的喝水计划,所以在执行到这里的时候并没有非常的折磨,当然晚上也是会饿的,所以也买了一堆牛肉干来尝试,最后的选择是下面这款:

由于提早了睡眠时间,所以晚上饥饿的程度也不会那么严重,总体来说减少摄入在早睡和多喝水的优化下比较轻松就达成了。而目前我的策略是所谓的8+16进食法:早饭不吃一杯牛奶,中午正常吃,晚饭不吃饭光吃菜。

锻炼的部分,一开始只是在家里做简单的深蹲。后面改为了骑车上班(15km)+动感单车的形式,夏秋两季的运动量是最多的。感觉最好的还是省了两个月的油钱,还是在油价的最高点(不是。


在运动之于最大的收获就是发现了屌丝神器迪卡侬,已经成为忠实用户了。

所以在达成了75kg目标的今天还是非常满意的(虽然年初的目标是70kg)。

游戏

今年在搬进新家之后买了太差了电视和ps5,终于可以好好的玩游戏了~ 而今年最多的游戏时光也是在ps5上面。但是我还是要说ps5会员你就是个寄吧。纯纯的垃圾(特别是大镖客出会免)

异度之刃3

在过年的时候作为出门做客消遣的游戏算是狠狠的玩了一阵,非常的沉迷非常的好玩,今年过年玩xb2。

个人评价:系统、地图非常不错,吊打国内开放世界手游。但是受限于ns的垃圾机能,人物大部分时间马赛克严重,非常影响游玩。剧本方面主角太多,非常菜市场,没有能够完美塑造全部的角色或者重点塑造一对男女主,少点味。

而且感觉xb2,3的系统都非常适合手游化甚至可以达到好玩的程度,不知道为什么日厂不做。

死亡搁浅

作为ps5会免的第一个体验的游戏,只能说画质非常的不错。但是放下之后就很难再拿起来玩了。

战神5

画质非常炫酷,作为ps5的扛鼎之作,虽然战斗系统方面还是4的那一套做了迭代。但是总体流程玩下来很爽快,不亏。好评。

对马岛之魂

ps5会免游戏,在多年不吃育碧罐头之后再来品味甚至别有一番风味。战斗之后的振刀收刀非常的帅气,很有剑戟片的感觉。风景也很不错。好评。

FF16

年度答辩之作,对rpg的最大侮辱,吉田还是滚回去做ff14吧。

美末1

在另一篇文章中已经品鉴过了,好评。

荒野大镖客

好玩,但是后期有点没耐心了。而且剧本走向悲剧,在不那么快乐的2023年玩起来有点压抑。

十三机兵防卫圈

自己买了盘刚要玩就进入会免。。二刷,希望哪天又失忆了可以再玩一遍。 好好评。

王国之泪

对旷野之息的迭代,感觉其实王泪才是老任一开始想要做到的样子。好玩,但是机能太垃圾了,玩到一半搁置。等ns2再玩。

阅读

Crafting Interpreters

写编译器和解释器的书,从0开始。非常适合新手,而且有免费的HTML版本,搭配双语翻译效果绝佳。今年最值得推荐的书。

可能性的艺术 比较政治学

适合作为政治学入门书籍观看,还不错(看的原因是据说被ban了,逆反)。

计算 吴瀚清

新书,第一部分感觉可以和《什么是数学》《数学 它的内容方法和意义》一起观看,属于数学简史类型的科普。

刘擎西方现代思想讲义

科普哲学思想的书,图一乐之外也能大致了解各个思想学派和发展路径。

工作、消费主义和新穷人

没什么印象,简单来说工作只是资本主义对人的一种规训,不努力工作,薅资本家羊毛才是正途。

置身之内

知道了地方和中央也不是铁板一块,地方只会在拿着上面的要求一顿排列组合之后选择电阻最低的路径(easy path)来实现上面的KPI和自己的目标。

天朝的崩溃

在绝对的科技优势面前任何的努力或者忠诚都是无用的,无论你是文官还是将军,在看到英军战斗的那一刻就能知道,时代已经变了而你无能为力。你能做的只有一路瞒到国务院或者议和止损保住自己的狗命。

购物

石头G10S

搬了新家之后购入了扫地机器人,总体来说非常不错,很省心。

PS5

值得,就是夏天过热自动关机有点绷不住。

群晖+Apple TV

看蓝光原盘的电影很爽。

Apple Watch SE

为了记录运动买的,总体不错,就是一天一充还是有点接受不了。

升降桌

买了电机和桌面自己组装的,现在已经习惯了站立工作。

工作

今年最值得说的可能就是工作吧,但是现在的我来说,觉得还是要将其放到更低的位置(生活更重要)。

虽然一想起来可能有很多话要讲,但是最后写出来的可能也就那样:

从去年10月被奋斗逼公司卸磨杀驴之后在杭州并找不到工作,然后灰溜溜回家过年。年前机缘巧合面了现在这家老家的公司,干到现在也快一年了。虽然薪资对半砍了,但是获得了8:30上班,5:30下班的清闲日子,也才有了健康生活还能锻炼的一年。

作为一个三年三家公司,四年四家的loser,今年也来到了工作的第四个年头。个人感觉自己还是挺幸运的,赶上了互联网的末班车蹭到了几年经验,现在也还没有失业在家。也有时间做自己喜欢的事。

起源

这个事故来源于某个PHPer转职Javaer时发生的灵异事件,在云原生应用脚手架中选择了应用架构为MVC架构之后生成的脚手架打包的jar包启动之后无法访问Controller中配置的路径。

现象

据某PHPer所说,在IDEA中直接启动项目没有问题但是打包成jar之后就访问不到controller中定义的请求路径了。

第一次排障

面对这个bug的第一直觉就是maven打包有问题,应该是代码没有打包进去。但是在解压jar包之后发现代码确实已经在lib文件夹里,而且解压之后也能找到对应的class文件。

这时候怀疑对象就转到了spring bean装配有问题上,于是便使用ApplicationContext的getBean方法尝试在spring启动完成之后获取basicController的bean,然后发现果然是bean并没有成功装载。

于是死马当活马医的给启动类加上了@ComponentScan注解尝试抢救一下,结果抢救失败仍然没有装载。

这时候已经是万策尽放弃治疗了,直接劝退了PHPer。

第二次排障

一天之后这个bug迎来了专家会诊,某Java领域大神准备对其进行一番操作,但是失败了。于是又将项目clone下来看了一看,因为病因是IDEA启动时可以正确加载而maven打包之后有问题,于是又将嫌疑人锁定到了maven上,但是根据本人浅薄的maven知识并没有发现配置有任何有问题的地方。

于是又开始死马当活马医,准备使用SPI机制给spring强制注入bean试试。在spring.factories文件中配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration 为controller之后发现IDEA正常启动。但是maven打包时springboot启动直接报错:找不到该class文件。

嗯,有错误是好事,说明并不是spring装配的时候有问题而是项目启动时根本没有这个class的文件。这时候随便找了一个自己项目里的SDK jar包解压看了一下目录,又看了一下多模块中web模块的jar包:BOOT-INF。凶手已经找到了。

破案

按照配置给web模块和service模块增加了<skip>true</skip>配置,跳过了springboot打包插件,项目正常启动并可以访问请求路径。

很明显,在创建模板的时候pom.xml直接被复制了三份放到了三个模块当中,导致了spring-boot-maven-plugin插件把三个子项目都打包成了可部署的jar包。

一开始解压jar包的时候并没有关注到这个细节导致多次抢救无效。

令人疑惑的是 https://github.com/alibaba/cloud-native-app-initializer/issues/65 官方仓库里竟然有这种issue,但是<skip>true</skip>在最外层完全是反作用导致打包失败,而内部web模块明明需要这个配置却没有填写。属实神秘。

前言

又又又到了self-hosted engineer最喜欢的建站时间,由于上次使用凉心云新用户薅的服务器的手机号废弃了,导致控制台无法登录,也不知道还剩多久时间到期。于是只能重新买了一台服务器再折腾一次。好在现代建站技术足够发达,迁移全部内容基本只是复制粘贴一下compose文件(没想到备案才是最麻烦的)。

原先还想给网站加一个雷池WAF,略微折腾了一下没搞定就放弃了。下次有时间再好好研究研究。

建站速通

docker

1
2
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

BBR算法

1
2
3
4
echo net.core.default_qdisc=fq >> /etc/sysctl.conf
echo net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.conf
sysctl -p
sysctl net.ipv4.tcp_available_congestion_control

portainer

1
2
docker network create traefik-public
docker volume create portainer_data

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3.3"

services:
portainer:
image: portainer/portainer-ce:latest
command: -H unix:///var/run/docker.sock
restart: always
ports:
- 9000:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.portainer.rule=Host(`portainer.oxcafebabe.cn`)"
- "traefik.http.routers.portainer.entrypoints=websecure"
- "traefik.http.services.portainer.loadbalancer.server.port=9000"
- "traefik.http.routers.portainer.service=portainer"
- "traefik.http.routers.portainer.tls.certresolver=leresolver"
volumes:
portainer_data:
external: true

networks:
traefik-public:
external: true

traefik

启动portainer后通过端口访问,然后在portainer里创建stack:

注意: acme.json文件需要手动创建并chmod 600

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
version: "3.3"

services:
traefik:
container_name: traefik
image: traefik:latest
command:
- --providers.docker
- --log.level=INFO
- --accesslog=true
- --api.dashboard=true
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.leresolver.acme.httpchallenge=true
- --certificatesresolvers.leresolver.acme.email=tangbin97@outlook.com
- --certificatesresolvers.leresolver.acme.storage=./acme.json
- --certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web
ports:
- 80:80
- 443:443
networks:
- traefik-public
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /root/acme/acme.json:/acme.json
labels:
- traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)
- traefik.http.routers.http-catchall.entrypoints=web
- traefik.http.routers.http-catchall.middlewares=redirect-to-https
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
- traefik.http.routers.dashboard.rule=Host(`traefik.oxcafebabe.cn`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
- traefik.http.routers.dashboard.service=api@internal
- traefik.http.routers.dashboard.entrypoints=websecure
- traefik.http.routers.dashboard.tls.certresolver=leresolver
environment:
- TZ=Asia/Shanghai

networks:
traefik-public:
external: true

vaultwarden

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: "3"

services:
bitwarden:
image: vaultwarden/server
container_name: bitwarden-server
volumes:
- bitwarden:/data
environment:
TZ: "Asia/Shanghai"
WEBSOCKET_ENABLE: "true"
SIGNUPS_ALLOWED: "false"
WEB_VAULT_ENABLE: "true"
DOMAIN: "https://bitwarden.oxcafebabe.cn"
ADMIN_TOKEN: "!!!!!!!!!!!!!!!"
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.bitwarden.rule=Host(`bitwarden.oxcafebabe.cn`)"
- "traefik.http.routers.bitwarden.entrypoints=websecure"
- "traefik.http.services.bitwarden.loadbalancer.server.port=80"
- "traefik.http.routers.bitwarden.service=bitwarden"
- "traefik.http.routers.bitwarden.tls.certresolver=leresolver"
- "traefik.http.routers.bitwarden-websocket.rule=Host(`bitwarden.oxcafebabe.cn`) && Path(`/notifications/hub`)"
- "traefik.http.routers.bitwarden-websocket.entrypoints=websecure"

volumes:
bitwarden:

networks:
traefik-public:
external: true

RSSHUB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: '3'

services:
rsshub:
image: diygod/rsshub
environment:
ACCESS_KEY: !!!!!!!!!
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: 'redis://redis:6379/'
PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000'
PROXY_URI: socks5h://172.17.0.1:20173
depends_on:
- redis
- browserless
networks:
- traefik-public

labels:
- "traefik.enable=true"
- "traefik.http.routers.rsshub.rule=Host(`rsshub.oxcafebabe.cn`)"
- "traefik.http.routers.rsshub.entrypoints=websecure"
- "traefik.http.services.rsshub.loadbalancer.server.port=1200"
- "traefik.http.routers.rsshub.service=rsshub"
- "traefik.http.routers.rsshub.tls.certresolver=leresolver"

browserless:
image: browserless/chrome
ulimits:
core:
hard: 0
soft: 0
redis:
image: redis:alpine
volumes:
- redis-data:/data

volumes:
redis-data:

networks:
traefik-public:
external: true

其余项目同理迁移,非常的迅速。

数据恢复

只有bitwarden和rss数据需要恢复,直接在网页上导入导出一次即可。

0%