最近玩的东西和踩的坑
最近请了一星期的假,连着国庆就是半个月,决定好好放松一下。不过还是忍不住鼓捣小玩意,索性随便记一下。
1. Hugo 博客主题
帮女朋友搭博客,她在一个 Hugo 博客主题网站相中了 LogBook。可是一点下载才发现,是真tm的贵啊,79刀,最近人民币还不断贬值。
于是乎在 GitHub 翻了一下,找到了开源版本的 HTML 等静态文件。但是静态文件肯定不能直接用在 Hugo 上啊,白搭!
又在另一个仓库上找到了魔改后(但丑很多)的 LogBook 的 Hugo 主题。就尝试跑起来,没有任何文档,机缘巧合,被迫开始琢磨 Hugo 主题的结构。
后面发现,Hugo 主题本质上也只是一堆 Go template ,只是把静态文件的相应的地方全部挖空,然后根据 Markdown 文件的内容填充进去。
当然这个故事的结尾是,虽然弄懂了 Hugo 主题的基本原理,但我前端没怎么学,很难快速改成 Hugo 主题。不过我发现了 themefisher 的免费开源 Hugo 主题,女朋友从里面选了个 liva ,好像还更好看。
2. Hugo 的相对路径问题
反正这个很搞,涉及 Site BaseURL、第三方库的 base url 等。
以及最开始的时候,用的是名为 blog 的仓库,所以创建的博客的 base url 是 username.github.io/blog
,显然本地调试用 \
更舒服。所以这就又非常考验我对前端相对路径的把握能力了,蛋疼。
最后的解决方式是:直接通过 hugo
命令,然后从生成的 public
静态文件夹里去看最后的相对路径,然后再去改。以及利用一下 Hugo 的 .Site.BaseURL
一类的变量。
后面她找了一个在博客里内嵌 pdf 的工具,也是帮忙调好,解决了一堆奇奇怪怪的问题。
博客地址:https://violetjam.github.io/ ,超好看的!至于以后用其他服务器部署,换域名什么的再说吧。先白嫖 pages 着。
3. Docker run 命令问题
在给 ShenYu 的 helm chart 加 jvm 参数支持的时候,遇到了两个哭笑不得的问题,让我调了一个下午,真是耻辱。
我还提了个 issue :https://github.com/apache/shenyu/issues/4030
大概就是说,ShenYu 官方的 Dockerfile 里,执行了一个 entrypoint.sh 脚本,里面会根据容器是否设置了 ADMIN_JVM
环境变量来设置 JVM 参数。
我一开始是用 Helm 来部署 K8s 来测,发现环境变量并不能生效,每次都是空。
后来我就直接用 Docker run 官方的镜像来测试,发现环境变量也传不进去,还是空。
再后面我受不了了,又直接把官方脚本的核心部分抽出,自己根据 busybox 写了一个 Dockerfile ,测试 entrypoint.sh,发现环境变量也是空。
测了半天之后,我才发现问题所在。
我之前一直怀疑是 entrypoint.sh 的问题,比如 Dockerfile 中的 ENTRYPOINT
命令中引用环境变量有特殊的规则等等。
直到我想起上次的 gorm 查询,把 Limit
语句写在 Find
语句后面,导致 Limit
语句失效的问题,我才意识到,这次可能因为是 docker run
后面的环境变量的设置没生效。
我当时执行的命令是这样的:
docker build -t test_env .
docker run test_env --name=t1 -e ADMIN_JVM=fakeopts
当然 -e
不会生效啊,因为 -e
在 镜像名(test_env
) 后面,在镜像名后面的参数都不会生效,我哭死,真是傻到家了。
4. 又一个啼笑皆非的问题
解决了上面那个问题,证明 Dockerfile 里的 ENTRYPOINT
是没问题的,那么问题出在哪呢?
虽然我在测试的时候 docker run
里的参数没传对,但是 helm 运行的时候,是把 env
配置写在 yaml
里的,不可能有问题啊?
直到我在看了 Git 提交历史后,发现了盲点:官方最新的 Docker 镜像版本是 2.5.0 ,大概是两三星期前发布,而这个最新的 ENTRYPOINT
中执行的 entrypoint.sh
脚本,是在9天前新增的。
我哭死,看着最新的代码,运行旧的镜像,这哪能设置成功啊,谁又能想到这玩意是前几天的未发版的特性?
5. 一点小收获
这次在写一些小东西的时候,以及调试 ShenYu 的 helm 的时候,不得不稍微深入了一下 alpine 的镜。
以前只知道它很轻量,现在被迫需要在镜像中调试东西,alpine 自带的那些工具就完全不够了。
比如出现了 curl 请求 https 的时候出现证书问题,需要用 apk 安装 ca-certificates
。
比如测试 jvm 参数是否生效,需要用到 jps
,需要用 apk 安装 openjdk8
。(官网默认的镜像肯定是 jre,能运行就好,不需要jdk)
又比如趁着这次机会系统地过了一遍之前收藏的 Docker 教程。
6. 远程开发
前些天回实验室,师弟们的新电脑到了,多了几台主机,我就抱了台装了个 Ubuntu 20.04,太爽了!
这可是 16G 内存的服务器啊!然后 frp 什么的一把梭,又装了个 rdp ,用来预热一波以后把 Ubuntu 当作日常机,看看桌面软件生态是否合适。
后面开发 helm 相关的东西就舒服得多,速度是真的快,比垃圾的 2C4G 服务器快多了。随便造。
刚刚又在上面装了 VS Code 的 Remote SSH 和 JB 家的远程开发工具。
越来越觉得,平时随身携带的笔记本作为一个简单的UI、终端,或者说和服务器交互的入口,不需要很高的性能。其他东西都可以尽可能地放到自己的云服务器上、实验室的电脑上,开发不要太舒服!
7. 小游戏
前些天看 B 站被种草了一个游戏,One Dreamer 。
讲一个独立开发者的心酸故事,画面好看,配乐好听,54块,全英文。
游戏背景是一个VR虚拟世界,大部分东西都是代码化的,可以改里面的代码,来改变物体的行为。看起来是基于C#的。(在里面写代码,貌似比在现实中写代码还难哈哈哈)。不过里面的代码,面向对象的思想还不错。就是耦合比较多。
不过这都不是重点,重点是里面还有个像素小游戏,一个人吃豆子,然后三个守护走来走去,玩了好多次才通关。
然后就想着自己要把这个游戏复刻下来,找到了之前 Star 的一个 Go 的游戏开发库,ebiten ,看起来挺不错的,埋个坑。
8. 远程开发第二弹
后面又深入体验了一下 Goland (JB家族的 Go IDE)的远程开发功能,感觉不太行×
优点:
- 只要本地有个 Goland 客户端,然后能 SSH 连服务器,Goland 会自动在服务器安装相应的服务端并配置
- 本地确实内存消耗很低了,也可以直接跑远程的环境。大致上用起来和本地差不多
缺点:
- 不是用原来的 Goland 客户端,而是会新起一个 Client,而且貌似电脑中搜不到这个 Client软件,需要打开 Goland,点远程开发再进去
- 插件体验实在太差了,所有插件需要重新安装就不说了,甚至很多插件,死活装不上,或者装上了没有生效
- 只有当 Client 端正常关闭了,并且主动点一下 “Stop”,Server 端才会被正确关闭,否则 Server 端就会一直开着,吃内存太恐怖了。在装完插件后,点击"Restart",这时 Client 会重启,但上一个连接的Server不会自动关闭,会新建一个。
9. SSH Config
在尝试 VS Code Remote SSH 的时候,发现它新建了一个 SSH Config 文件。然后就发现了还能这么玩!
以前我都是用 Termius 无脑管理 SSH 连接,最喜欢的是跨操作系统的设备同步。
但是越来越觉得 Termius 的界面丑了,自己的 Mac 配了 Zsh 的主题,好看地不行,感觉用 Iterm2 通过 ssh 命令来连,会很好看。
但是每次手动输命令,太麻烦了,然后就发现 SSH Config 真好用!!!
只要在 config 里写好一个个 SSH 的配置,然后就可以通过 ssh + 配置名字 来连接了,而且还可以配置别名,比如:
Host myserver
HostName 10.1.1.1
User root
Port 22
IdentityFile ~/.ssh/id_rsa
就能 ssh myserver
来连接了。(这里的端口其实可以不填,默认 22)
以及还支持通配符,比如:
Host *
IdentityFile ~/.ssh/id_rsa
就可以让所有的 SSH 都用这个私钥免密登录了,同时如果有其他的连接需要用其他的私钥,也可以覆盖。
还支持在配置中配置跳板,这样就不需要手动 -J
了,比如:
Host newserver
HostName 10.2.2.2
User root
ProxyJump myserver
就可以直接 ssh newserver
来连接了。相当于 ssh newserver -J myserver
再搭配上 Fig,自动提示已有的 SSH 连接,简直绝配!