防止 MicroServer Gen 10 Plus 的风扇突然狂飙
今年元旦我把之前用的 Gen 8 换成了 Gen 10 Plus。后来想着现在性能上去了,可以把 NAS 的功能也合并进来,于是就把给 NAS 用的两块机械硬盘迁进了 Gen 10 Plus 里。但就在这之后,我发现它的风扇时不时就会突然狂转一分多钟,然后再降回平时的转速。而且这个问题不分白天黑夜,甚至有一次大半夜把我吵醒,不胜其烦。终于在上周,我找到了问题的根源,并彻底解决了。
今年元旦我把之前用的 Gen 8 换成了 Gen 10 Plus。后来想着现在性能上去了,可以把 NAS 的功能也合并进来,于是就把给 NAS 用的两块机械硬盘迁进了 Gen 10 Plus 里。但就在这之后,我发现它的风扇时不时就会突然狂转一分多钟,然后再降回平时的转速。而且这个问题不分白天黑夜,甚至有一次大半夜把我吵醒,不胜其烦。终于在上周,我找到了问题的根源,并彻底解决了。
公司有的项目里面还是采用把 API key 明文写在 application.properties
或者某个单独的 properties
文件来管理,这既不安全也不符合公司的规定。所以我通过利用观察者模式和 Spring 的事件机制,将其改为加密存储于配置中心,并且实现了在配置中心更新后,服务中生效的配置也可以立即更新。
看到一篇深入讲解 Redis 中 Pub/Sub 的文章 Redis Pub/Sub In-Depth,所以打算将它翻译出来,顺便深化自己的理解。
熟悉 Spring AOP 的都知道,如果同一个类中的两个方法在内部互相调用,那么此时 AOP 是不会生效的,因为 Spring AOP 是通过代理类来实现的,而类内部的方法调用并不会走到代理对象。那么,有没有办法让内部调用的时候也让 AOP 生效呢?万能的 ChatGPT 告诉我,方法是有的,还有好几种。
前两天看到个问题,说在 Java 中,为什么不推荐在代码中直接写字符串值?我一开始能想到的就是代码的可维护性和可读性,但是总觉得这个问题没这么简单,肯定还有 JVM 虚拟机里面的优化。那既然现在大语言模型这么发达,我觉得可以让它给我讲讲。
我们都知道,Docker 和容器化技术让运维有了质的飞跃,从此我们不必再担心软件运行所需的繁杂环境,只需要拉取镜像并运行就可以一步到位部署好软件的运行环境。但是在开发过程中,我们仍然需要在本机安装各种依赖,一不小心又会把本机的环境搞乱掉,更不提不同版本的语言之间可能存在的冲突。因此,就出现了 Dev Container,顾名思义就是在容器环境中开发,这样我们在开发时也可以享受到统一且隔离的开发环境。
正好我最近也在开始接触 Dev Container 并使用它给一个开源项目成功提交了代码,正好趁热打铁,把写博客的 Hexo 环境从本机挪到 Dev Container 中。
刚刚看到我虚拟机里面的 Ubuntu 报硬盘空间不足,看了下发现是在安装那会,自动分区就只用了一半的空间,遂着手扩容。在这里记录下操作过程备忘。
刚刚登录到我的服务器之后,看到 motd 提示有一个僵尸进程。本来处理僵尸进程很简单,杀掉它的父进程就行了。但是紧接着我发现这个进程是属于一个 Docker 容器的,因为我想要更优雅地处理掉它,就顺藤摸瓜找到了对应的容器并将其重启了。这里就记录下我的排查过程以供参考。
最近在试着用 TypeScript 写点东西,在用 catch (error) {}
代码块处理异常的时候,看到了一个很难理解的错误 TS18046: error is of type unknown
。网上一顿冲浪之后,看到了 Kent C. Dodds 的一篇博客 Get a catch block error message with TypeScript。我跟着文章的内容成功解决了这个问题,并且解答了我的疑惑,所以想要翻译出来帮助到更多的人。
以下内容除特别注明外,皆翻译自原文。我亦不对内容做任何的担保,并不对任何可能产生的后果(包括但不限于文件丢失或功能异常)负责。
前些天在 Atlassian 的文档中看到一篇关于管理点文件(即.bashrc
之类以点开头的文件)的文章《Dotfiles: Best way to store in a bare git repository》,感觉很有参考价值,遂决定翻译出来,希望能帮到更多的人。
以下内容除特别注明外,皆翻译自原文。我亦不对内容做任何的担保,并不对任何可能产生的后果(包括但不限于文件丢失)负责。