使用 gperftools 分析程序性能gperftools 是谷歌推出的一套非常强大的性能分析工具集. 它主要有这三个功能: 分析 CPU 性能, 能够统计出一段时间内各个函数的执行时间, 帮助我们找出耗时的代码; 分析内存占用情况, 能够统计出某一时刻各个函数分配的内存大小, 帮助我们找出内存占用高的代码, 也能帮助我们定位内存泄露; 自动检查内存泄露. gperftools 还包含一个高性能内存分配器 tcmalloc, 我们 April 10, 2022 #tools #c/c++
Jekyll Email ProtectionA few months ago, I migrated my blog from Cloudflare to my cloud server. Since then, I’ve received more spam than before. I found the reason is that Cloudflare has a feature that protects email from c March 3, 2022 #english #practice
[翻译] x86 汇编的基础介绍原文 A fundamental introduction to x86 assembly programming 0. 介绍 x86 指令集架构是近 20 年来我们家庭电脑和服务器所使用的 CPU 的核心. 能够阅读和编写低级汇编语言是一项很强大的技能, 这能够让你写出更高效的代码, 使用 C 语言中无法使用的机器特性, 以及对编译过的代码进行逆向工程. 不过起步可能是一项令人生畏的任务. January 18, 2022 #featured #translations #assembly
2021 Annual SummaryI didn’t really do so many things in 2021 compared to last year, but at least I kept some good habits like learning English and doing LeetCode. The most important thing this year was I joined a big co January 1, 2022 #essays #english
深入理解 KMP 算法字符串匹配是非常常用的算法. 它要做的是, 对于模式串 t, 找到它在目标串 s 中第一个出现的位置. 例如 t = "abcab", s = "ababcabd", 算法就应该返回 2. 说起字符串匹配, 不得不提到 KMP 算法. KMP 是一个很厉害的算法, 它非常巧妙, 能在线性时间复杂度内完成字符串匹配. 本文我们来了解它. 本文会用到 Python 的切片语法表示子串. 如果你不熟悉 December 25, 2021 #algorithms
做了一次服务迁移之前我用树莓派挂载移动硬盘, 在上面部署 NextCloud, 然后使用 Cloudflare Tunnel 做内网穿透, 当作 NAS 使用. 但是 Cloudflare 在国内的访问速度实在太慢. 更糟糕的是, 最近一段时间, 我域名的 Cloudflare 节点突然在国内无法访问, 导致包括这个博客在内的所有服务都无法正常使用. 于是我在前段时间在腾讯云买了一台香港的廉价 VPS, 做了一次 December 12, 2021 #practice
Switch 语句的语义switch 语句一般用于多重分支选择. 不过 switch 的语义与 if ... else if 完全不同, 它更像是 goto 语句. switch 只接一个语句块, 语句块中可以包含一些 case 跳转标签, switch 先对表达式求值, 然后跳转至对应的标签. break 可以跳出 switch 语句. 12345678switch (state) { case 1: November 14, 2021 #c/c++
DWords2: 全新版本的弹幕背单词我觉得通过弹幕背单词是个好主意, 不过一年多前我用 Python 写的那个软件有点太简陋了, 局限性比较强, 而且放到现在还有各种兼容性问题. 因此这次我重写了 DWords, 全新版本使用 Electron 开发, 界面 (相对一代的烂界面) 要好看得多, 且新增了一些功能. 新版本使用 WebDAV 同步, 用坚果云就可以很好地同步了, 比一代的邮件同步强很多. 项目主页 | 下载地址 主 September 21, 2021 #tools
基于 TCP 的应用层协议设计一直以来, 包括我在内的很多人都认为, 基于 TCP 的应用层协议很简单, 只需要加个包头就行了. 因为 TCP 是可靠的协议, 能保证数据有序无误地送达对端; 只是它面向流, 不保留消息边界, 因此我们只需要定义协议包头, 能区分各个数据报即可. 然而这个看法是错误的: 传输层协议所做的工作是有限的, 应用层协议的工作远不止封装一个包头. 我们来看个例子. TCP 连接并不是那么可靠 我们用 C September 5, 2021 #experience #network
在自己的博客上启用 Tab 键搜索Chrome 浏览器有一个功能, 在地址栏输入域名后按下 Tab 键, 就可进入搜索状态. 这让我们很方便地搜索一个网站的内容. 这个功能称作 Tab to Search. 当然不是每个网站都支持, 毕竟不同网站的搜索接口都不一样. 不过, 这个功能并不是 Chrome 专门为一些知名网站做的适配, 而是通过一个开放性标准 OpenSearch description format 实现的. August 13, 2021 #practice