引言 在十月中旬,我们参加了由 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_...
简介 TickStats 是孵化自 @idoknow 的一个开源(即将)项目,当前主要由我全程参与设计和功能开发。它旨在提供一个轻量化、易用的指标收集与指标可视化的一体化解决方案。相比于 prometheus、grafana 这些服务,TickStats 更加轻量化,能够做到开箱即用,适用于中小型项目等场景。 Demo: https://tickstats.soulter.top Soulter’s TickStats Stat: https://tickstats.soulter.top/app/66049a53 缘起 可观测性对于开发者来说非常重要。开发者需要知道项目的运行状态、性能指标、用户使用数据等信息,以便及时发现问题并进行优化。一般来说,首选的解决方案是使用 prometheus 作为指标收集工具,grafana 作为指标可视化工具。但是,这两个工具的配置和使用都比较复杂,对于一些小型项目来说,可能会显得有些“大材小用”,并且这些服务的运行也会产生服务器开销。 此外,我们注意到很多的项目都开发了自己的指标收集系统,这些系统的功能都是类似的,但是都是独立开发的,没有...
9 月 29 日早上,一条短信发来: 「XX大学通过推免系统给您发送了待录取通知」 点下“接受”按钮,全国无数的保研人给这 5 个月的保研准备画上了圆满的句号。 回首这五个月,我过的其实并不是那么顺利。 心路历程 从今年 4 月开始,我就开始在各大心仪高校官网上翻阅,期望寻找到一个感兴趣方向的导师。很多老师都很友善,及时给了回信,留了微信。特别是复旦大学的老师的回信中写道我的能力很出色,心里暗自窃喜。 然而,我的“BG”(背景)当时是有很大缺陷的——虽然排名靠前(前5%),但是没有通过六级。 很快,就到了夏令营,投了十几所心仪的高校,也仅仅只有寥寥一两所入营。最后由于各种原因,入营机会也被我放弃了。记得之前看到的知乎一篇经验贴中博主被高校十几杀之后还笑了出来,没想到反应过来时自己已是画中人。 这期间我还在中国科学院自动化研究所实习,老师们都很好,给我安慰。 痛定思痛,哪里不行补哪里。我开始认真准备接下来的六级、雅思。由于放暑假,我成了空旷且凉爽的逸夫楼的常客。每天除了实习和维护项目就是学雅思。说实话,雅思没有想象中那么难。 也许是受他人影响,记得很清楚,在 8 月 22 日,...
背景 最近换上了 ArchLinux,体验了众多美观的 TUI 应用。其中我认为最酷炫的当属 ncmpcpp 这个音乐播放器了。 日常办公时把它放在屏幕角落,就会感觉工作环境变得更有趣了。这也让我对它的实现产生了巨大的好奇心,于是我决定探索一下它是如何实现的。 本文将深入底层,从音频编码开始讲起,探究 wav 格式的音频文件是如何被解析的,然后再讲解如何通过傅立叶变换将音频信号转换为频谱图,最后再着手实现。 音频编码 声波 中学物理教过我们,声音是一种机械波,由物体振动产生,通过介质传播。当波通过介质传递到耳朵时,耳膜会随之振动,我们才能听到声音。 声波会引起麦克风(注:这里以动圈式麦克风为例)传感器中的振膜振动,振膜与被磁铁包围着住的线圈相连,根据法拉第定律和楞次定律,振膜振动会使磁场中线圈移动而产生感应电流。此时,只需要监测线圈两极的电压即可得到声音的波形图。机械振动就被转换为了电压信号。 我们现在得到的是连续的模拟信号,还需要将其转换成计算机可识别的离散的数字信号。 这时候,我们需要对信号进行模数转换(ADC)。AD 芯片每隔一段时间(几微秒)对波形图打点采样,得...
起源于在 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...
最近和 @Rockchin 合资购买了一个位于日本东京的 4C8G 的高性能 VPS,用于部署一些服务。在这里记录一下自己搭建邮件服务器的过程。 0x01. SMTP、IMAP、POP3 协议 SMTP(Simple Mail Transfer Protocol)是用于发送邮件的位于应用层的协议,使用 TCP 协议作为传输层协议,端口号为 25。SMTP 协议规定了很多命令,它告诉客户端或服务器要采取什么操作及如何处理任何伴随的数据。比如 HELO:客户端向服务器标识自己 MAIL FROM:指定邮件的发件人 RCPT TO:指定邮件的收件人 DATA:发送邮件内容 QUIT:结束会话 客户端与服务器建立 TCP 连接后,客户端会首先发送一条 HELO 命令,然后服务器会返回一条 250 OK 命令,表示连接成功。可以使用 telnet 命令测试 SMTP 服务器是否正常工作: 1telnet smtp.idoknow.top 25 连接成功后,输入 HELO 命令。 1234567Trying 45.137.180.174...Connected to smtp.idok...