跳到主要内容

Spring 时间格式格式化问题

· 阅读需 1 分钟

问题: 在接口响应的实体类的字段上加 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 发现这个注解没有生效.

@DateTimeFormat 使用的场景是: 用于 Spring MVC 的数据绑定和格式化.

  • @RequestParam 的字段上
  • @PathVariable 的字段上
  • @ModelAttribute 的实体类字段上

原因: @DateTimeForma 不生效的原因是 @DateTimeForma 不支持 @RequestBody 的反序列化.

解决方案: 改用 @JsonFormat 注解

@JsonFormat 是 Jackson 提供的注解, 用于 JSON 序列化和反序列化.

  • @RequestBody
  • @ResponseBody / @RestController
  • 需要序列化或反序列化实体类的字段上
  • Feign Client 调用
  • Redis 序列化
  • MQ 消息
  • Websocket 消息

html 页面乱码问题

· 阅读需 1 分钟

问题:在 Docusaurus 在 static 文件夹下添加一个自己写的 html 文件,在浏览器访问会出现乱码

解决方法

添加 <meta charset="UTF-8" />

<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>

AI 对就业的影响

· 阅读需 2 分钟
  • 短期: 其影响范围仍集中于初级信息相关行业.
    • 例如程序员, IT 高速发展的时候, 创造了很多程序员, 只从事简单脑力劳动的部分程序员,在短期内会受到 AI 的冲击.所有,不要追求浅层的技巧,要追寻其中的(核心原理)
  • 长期: 最终或许仅剩下最高级别的工作岗位由人类承担.

AI 替代的过程是逐步的.

  1. 若想让计算机实现特定编程需求,使用者自身必须具备编程能力.(不然一旦出现漏洞,很难排查问题)
  2. 当前计算机需解决的问题复杂程度与技术工具的提升速率同步推进,但问题复杂程度的提升速度,实际上远超技术本身的提升速度

一般具体技能的生命周期仅为 5~6 年.

广博且多元的知识储备.

需要掌握的知识真的变多了.

写作能力还是很重要的(逻辑清晰表达的能力,以及运行统计视角分析和解读数据的能力.).

有观点,并从事实去论证这个观点.

中国产业工人不到 2 亿人, 让 2 亿人放开量生产,两倍的地球人都消费不完.

有了 AI 之后,学习知识的门槛在变低.

未来更需要驾驭 AI 的人.

未来的活会越来越难. 以前十个人干的话现在一个人就能干. 但现在一个人干的活,未来需要十个人干(因为功能/需求复杂了).

未来,创新类工作会增加. 因为人们的精神消费需求会越来越多.

如何优雅地写作

· 阅读需 1 分钟

写作需要阅读, 研究, 思考和修订.

  1. 准备阶段
    • 多读书
      • 读各种各样的书
      • 保持稳定的阅读习惯
      • 做好摘抄和储备
    • 寻找创作地
    • 选择写作方式
    • 头脑风暴
      • 是你要表达的东西吗?
      • 主要观点是什么?
      • 会产生歧义吗?
      • 读者会对它感兴趣吗?
    • 研究
      • 确保你写的东西真实可靠.
      • 尽信书不如无书.
  2. 写草稿
    • 第一稿: 写一个想法清单
      • 可以是任何东西
    • 设定时间,自由写作
      • 类似于番茄钟, 到点为止.
    • 第二稿: 对草稿进行编辑
      • 逻辑
      • 错别字和语法
      • 前后保持一致性
      • 简化表达
    • 校对
    • 第三稿: 润色
  3. 发表文章
    • 平台
    • 排版
      • 行间距,字间距,对齐方式,图片插入等
    • 对某一领域的文章汇集成专栏

你或许该多发点内容

· 阅读需 2 分钟

https://www.aadillpickle.com/blog/post-more

Z 世代(Gen Z: 指 1997-2012 出生的一群人)是被记录和观察得最彻底的一代。你的人生就是场真人秀,永远有观众在盯着看。

想要做出好东西,你必须先跨过尴尬这道坎。

若在真空中创作,你将无从进步。私下里,我做的每件作品都是杰作。只要我不示于人前,就无人能否定这一点。反之亦然。有时我会觉得自己做的东西一文不值,因为距离太近,所有瑕疵都清晰可见;但旁观者保持适当距离审视,反而可能比我自己更懂其价值。无论你对自己作品的评判标准严苛还是宽松,你永远是自己作品最糟糕的裁判。

你发内容的唯一标准,就是觉得至少会有一个人喜欢。

反复发布垃圾意味着你永远不会进步,但从不发布任何东西也一样。

要让内容真正见效,通常需要三次曝光。

广告三次曝光原则

  1. What's this? 这是什么?

  • 建立认知, 吸引注意力.

  1. What's is saying? 说了什么?

  • 用户再次看到广告, 会思考这个广告说了什么.

  1. I need it? 我是否需要

  • 第三次看到广告时,用户基本了解产品. 此时会与自己的需求进行匹配.

一个被百万人浏览的网络梗,对世界的影响几乎为零。而你倾注心血的东西,哪怕只有一百个人看到,却可能真正触动某个人,甚至改变他的人生。或者改变你的人生。或者,改变你们俩的人生。

应该发布更多的内容. 这个内容应该对于至少一个人是有价值的/需要的. 不要发布垃圾.

发布的内容应该需要至少三次曝光. 因此, 需要修改你所发布的内容.

云服务器快照与镜像的区别

· 阅读需 1 分钟

快照类比为一张照片.

镜像类比为一个胶卷, 可以生成多个照片.

快照主要用于保护现有服务器的数据, 便于回滚. 镜像主要用于复制环境或批量部署多台相同配置的服务器.

基于Docker和Nginx搭建HTTPS Git服务器

· 阅读需 3 分钟

使用到的工具:

  1. Docker Compose
  2. Nginx
  3. Git
  4. fcgiwrap

Docker Compose 配置

services:
nginx:
restart: always
container_name: nginx
user: root
image: nginx
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- 80:80
- 443:443
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/mine.types:/etc/nginx/mine.types
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/etc/nginx/html
- ./nginx/screen:/etc/nginx/screen
- ./nginx/logs:/etc/nginx/logs
# 重要:
- /run/fcgiwrap.socket:/var/run/fcgiwrap.socket
# 这里不需要映射进去,因为 fcgiwrap 是运行在宿主机里面的
# - "/usr/lib/git-core/:/usr/libexec/git-core/:ro"
environment:
- NGINX_PORT=80
- TZ=Asia/Shanghai
privileged: true

Nginx 配置

# 443 端口
server {
listen 443 ssl;
server_name git.wangzhy.com;
ssl_certificate /etc/nginx/ssl/wangzhy.com_ecc/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/wangzhy.com_ecc/wangzhy.com.key;

# 设置 SSL 会话缓存。存储 SSL 会话参数,以便在同一客户端的后续连接中重用,从而减少 SSL 握手的开销
# shared:SSL:1m 表示创建一个名为 "SSL" 的共享内存区,大小为 1MB。这个内存区可以被所有工作进程(worker process)共享,用于存储 SSL 会话参数。
ssl_session_cache shared:chat_ssl_cache:10m;
ssl_session_timeout 1h;

#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_ciphers EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES256:!aNULL:!MD5:!RC4; # 高效率加密套件
ssl_prefer_server_ciphers on;

# 强制 HSTS (提高安全性)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

charset utf-8;
default_type text/plain;

include /etc/nginx/ip-conf/whitelist.conf;
deny all;

root /etc/nginx/html;

# 通过 https 请求 git
location ~ (/.*)$ {
# 使用 Basic 认证
# auth_basic "Restricted";
# auth_basic_user_file /etc/nginx/passwd;

# FastCGI 参数
include fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
# 因为 fastcgi 是通过 docker 将宿主机的程序映射过来的,fastcgi 实际是运行在宿主机的,所以在这里要是有宿主机的地址。
fastcgi_param SCRIPT_FILENAME "/usr/lib/git-core/git-http-backend";
fastcgi_param GIT_HTTP_EXPORT_ALL "";
# git 库在服务器上的根目录
fastcgi_param GIT_PROJECT_ROOT /wangzhy/gitrepo;
fastcgi_param PATH_INFO $1;
# 将认证用户信息传递给 fastcgi 程序
# fastcgi_param REMOTE_USER $remote_user;
# 将允许客户端 post 的最大值调整为 100 兆
}

error_page 400 402 403 404 500 502 503 504 /50x.html;
location = /50x.html {
}
}

Git 配置

允许远程访问 git 仓库:

git config --system http.receivepack true
git config --system http.uploadpack true

fcgiwrap 配置

安装

apt update && apt install fcgiwrap

启动

systemctl start fcgiwrap
systemctl enable fcgiwrap

问题处理

权限问题

  1. error: remote unpack failed: unable to create temporary object directory

检查下面文件、文件夹的权限

  • /run/fcgiwrap.socket
  • /usr/lib/git-core/git-http-backend
  • ps aux | grep fcgiwrap
  • Docker Compose Nginx 的主线线的用户
  • xxx.git 文件夹的权限,一般要求是 chmod -R 755 xxx.git
  1. fatal: unable to access 'https://xxxx/.git/': The requested URL returned error: 403

检查 xxx.git/config 文件,查看是否配置了 http.receivepack true

修改运行 fcgiwrap 的用户

系统默认是 www-data,如果需要修改成其他用户,比如 nginx,可以使用下面命令:

systemctl edit --full fcgiwrap.service

AI 问题汇总

· 阅读需 1 分钟

记录询问 AI 的问题与答案

Docker

1. docker compose pull && docker compose down && docker compose up -d 命令优化

重新创建并重启服务

# 最简洁的方式 - 重新创建并启动服务
docker compose up -d --pull always --force-recreate

拉取镜像并重启有变化的服务

docker compose up -d --pull always

场景安全的滚动更新

docker compose pull && docker compose up -d --no-deps --force-recreate

Docker Image

· 阅读需 1 分钟

watchtower

自动检测并更新 docker image

version: "3"
services:
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 3600 # 每小时检查一次更新

nvm

· 阅读需 1 分钟

nvm 设置默认 node 版本

nvm alias default 18

.npmrc 文件的作用

配置说明文档: https://docs.npmjs.com/cli/v9/using-npm/config

npm 命令的预设配置文件,在执行 npm 命令时,会加载并根据这些配置来执行命令。

audit=false
loglevel=error
registry=http://mirrors.tencent.com/npm/
engine-strict=true