913 词
起源自 AstrBot 项目群里有人问为什么 AstrBot 又又又又项目检查更新失败: 当时由于正在忙其他事,就随便回了一个“因为直接请求 GitHub” 因此可能有时会有这个问题。 过了一会,突然想到我已经将检查更新的业务切到自己的服务上了:api.soulter.top。于是自己打开看了看: 不对劲。然后赶紧登服务器查看情况。由于在老家,网络巨差,4G 网络的带宽大概在 100Kbps - 1.3Mbps 条跳跃,并且丢包率严重,因此 ssh 到我洛杉矶的服务器的体验简直就是和地球人操作火星上的火星车一样的痛苦。 甚至无法测速。 艰难地用 tmux 切换到 API 服务,发现已经卡死无响应,于是马上 kill 掉这个服务重启,然后正常了。 开 top 看了看进程情况,发现 postgres 占用的 CPU 时间异常的高。由于机器上只有 tickstats 在用 timescaleDB(基于 pg 的一个时序数据库),因此马上查看 tickstats Docker 容器的 logs,发现最近的 POST 请求全部报 400。 结合 PG 的异常占用,我又马上切到了 t...
6.4k 词
一些碎碎念 我维护 AstrBot 这个项目到现在已经有两年多的时间了。从 2022 年 12 月底 ChatGPT 问世以来,这个项目便在不断更迭,途中也收获了不少的用户和他们的支持。这是我目前为止花费时间和精力最多的一个项目,包括设计整个架构项目、维护项目等等。然而,我却没有将这些思考过程以文章的形式写下来。 在这个项目正式被遗忘在时间的洪流之前,我觉得非常有必要写几篇文章来好好梳理一下它,来让更多人知道它背后的故事(聊聊它是怎么从一个几十行的代码膨胀到现在将近一万六千行代码的x)。毕竟真正去看源代码、看 commit log 的人应该没有多少吧。 @z2z63 的一句话很好:“源代码是设计的编译产物,通过读源代码去理解设计就好比反汇编”。接触了这么多语言和项目,我越来越体会到架构设计的重要性。好的架构设计将导致一致的系统实现,更好的可维护性和可扩展性。而坏的设计会导致不良的代码,系统实现没有弹性,不能适应变化,模块间匹配得不好,重复的代码和工作在不同模块中随处可见。这招致在它上面叠加更多坏的设计(实际上就是它在迫使你这样做)。并且当想对代码进行单元测试的时候,发现由于高耦...
6.4k 词
洋洋洒洒又一篇,忙忙碌碌又一年。 狐狸与刺猬 我把这一节放在开头,因为它代表了我 2024 年最为深刻的收获之一。 我很早就发现自己是一个对很多不同领域都同时感兴趣的人了,甚至这种兴趣有时显得“过于广泛”。就拿计算机来说,我能同时对数据库、生成式人工智能、软件工程、游戏开发、虚拟现实、增强现实、混合现实、硬件、无线电感兴趣。而除此之外,天文学、物理学、音乐、经济学、哲学、国际关系、绘画、视频后期、摄影等各式各样的学科也在我的兴趣范围内。如此众多的兴趣,却常常让我不得不压抑自己对于探索新领域的渴望,因为社会似乎普遍把“成功”与“专注”或“深耕”挂钩,他们认为,只有深耕某一领域,才能有所成就。高中时笔记本页脚看到的那句 “门门精通,样样稀松” 的名言,时不时也会像警钟一样警醒着我:一旦你选择了多个方向,便难免成为“泛而不精”的代名词,甚至被贴上“失败者”的标签。 我曾有一段时间看见那些看似专注于计算机领域,实际上却也在跨界涉猎多个不相干的领域的人,让我感到自己并非孤单。但遗憾的是,从更广阔的环境来看,这样的人还是少。 今年为准备保研而找导师的时候,这个问题更是赤裸裸地显露了出来...
29k 词
引言 在十月中旬,我们参加了由 OceanBase 举办的为期半个多月的数据库内核实现赛,我们花了大量的时间实现赛题要求——日均 8 小时。不得不说,这是一个非常能让人 “上瘾” 的比赛 orz。有时候,在熟悉代码、debug 的时候,不知不觉 2 个小时就过去了。在和队友(@Nelson, @z2z63)的努力下,我们最终在 2024.11.09 初赛拿了满分,位列全国第 19/1212 名,北京市第 2 名,全校第 1 名。 这篇文章是我在比赛中的开发记录,由于是边思考边写出来的,未经过后期处理,可能有一些地方表述不清晰。迫于时间和个人对 C++ 的掌握程度有限,有些实现方法会比较抽象,请见谅。 队友的请参阅: Nelson:OceanBase 2024 z2z63:OceanBase 数据库大赛初赛结束之后 数据库的基本思想 一个数据库可以是这样: 12345678my_db = open("mydb.txt", "a", encoding="utf-8")def insert(query): data_...
1.4k 词
简介 TickStats 是孵化自 @idoknow 的一个开源(即将)项目,当前主要由我全程参与设计和功能开发。它旨在提供一个轻量化、易用的指标收集与指标可视化的一体化解决方案。相比于 prometheus、grafana 这些服务,TickStats 更加轻量化,能够做到开箱即用,适用于中小型项目等场景。 Demo: https://tickstats.soulter.top Soulter’s TickStats Stat: https://tickstats.soulter.top/app/66049a53 缘起 可观测性对于开发者来说非常重要。开发者需要知道项目的运行状态、性能指标、用户使用数据等信息,以便及时发现问题并进行优化。一般来说,首选的解决方案是使用 prometheus 作为指标收集工具,grafana 作为指标可视化工具。但是,这两个工具的配置和使用都比较复杂,对于一些小型项目来说,可能会显得有些“大材小用”,并且这些服务的运行也会产生服务器开销。 此外,我们注意到很多的项目都开发了自己的指标收集系统,这些系统的功能都是类似的,但是都是独立开发的,没有...
3.1k 词
9 月 29 日早上,一条短信发来: 「XX大学通过推免系统给您发送了待录取通知」 点下“接受”按钮,全国无数的保研人给这 5 个月的保研准备画上了圆满的句号。 回首这五个月,我过的其实并不是那么顺利。 心路历程 从今年 4 月开始,我就开始在各大心仪高校官网上翻阅,期望寻找到一个感兴趣方向的导师。很多老师都很友善,及时给了回信,留了微信。特别是复旦大学的老师的回信中写道我的能力很出色,心里暗自窃喜。 然而,我的“BG”(背景)当时是有很大缺陷的——虽然排名靠前(前5%),但是没有通过六级。 很快,就到了夏令营,投了十几所心仪的高校,也仅仅只有寥寥一两所入营。最后由于各种原因,入营机会也被我放弃了。记得之前看到的知乎一篇经验贴中博主被高校十几杀之后还笑了出来,没想到反应过来时自己已是画中人。 这期间我还在中国科学院自动化研究所实习,老师们都很好,给我安慰。 痛定思痛,哪里不行补哪里。我开始认真准备接下来的六级、雅思。由于放暑假,我成了空旷且凉爽的逸夫楼的常客。每天除了实习和维护项目就是学雅思。说实话,雅思没有想象中那么难。 也许是受他人影响,记得很清楚,在 8 月 22 日,...
16k 词
背景 最近换上了 ArchLinux,体验了众多美观的 TUI 应用。其中我认为最酷炫的当属 ncmpcpp 这个音乐播放器了。 日常办公时把它放在屏幕角落,就会感觉工作环境变得更有趣了。这也让我对它的实现产生了巨大的好奇心,于是我决定探索一下它是如何实现的。 本文将深入底层,从音频编码开始讲起,探究 wav 格式的音频文件是如何被解析的,然后再讲解如何通过傅立叶变换将音频信号转换为频谱图,最后再着手实现。 音频编码 声波 中学物理教过我们,声音是一种机械波,由物体振动产生,通过介质传播。当波通过介质传递到耳朵时,耳膜会随之振动,我们才能听到声音。 声波会引起麦克风(注:这里以动圈式麦克风为例)传感器中的振膜振动,振膜与被磁铁包围着住的线圈相连,根据法拉第定律和楞次定律,振膜振动会使磁场中线圈移动而产生感应电流。此时,只需要监测线圈两极的电压即可得到声音的波形图。机械振动就被转换为了电压信号。 我们现在得到的是连续的模拟信号,还需要将其转换成计算机可识别的离散的数字信号。 这时候,我们需要对信号进行模数转换(ADC)。AD 芯片每隔一段时间(几微秒)对波形图打点采样,得...
5k 词
起源于在 Bilibili 上看到的一个关于 Hyprland 使用的视频,作为 Windows、MacOS、Gnome 桌面用惯了的人,在看到视频中展示的新奇的 “平铺式” 桌面交互体验、大量的动画效果时,我对它产生了浓厚的兴趣,于是打算动手装一个 Hyprland 桌面。 Hyprland 官方声明其对 ArchLinux、NixOS 的支持最好。久仰 ArchLinux 大名,我对它的部署充满了好奇心(雾),所以又先安装了 ArchLinux。 0x01. 在 Linux 下制作 PE 引导盘 使用 Ubuntu 系发行版的用户请自行在前面加 sudo。 插入 U 盘。 1fdisk -l 查看 U 盘对应的设备名称: 1234567Disk /dev/sdd:57.3 GiB,61530439680 字节,120176640 个扇区Disk model: SanDisk 3.2Gen1单元:扇区 / 1 * 512 = 512 字节扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节磁盘标签类型:dos...