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
Beware of Hash Collisions in Lua TablesWe all know that a Lua table is a hash table, which uses a hash function to map a key into one of the table’s slots. However, the result of the hash function is not unique. There exist some keys that July 30, 2021 #lua #english
用树莓派搭建一个能在外网访问的 NAS我最近买了一个树莓派, 想用它搭建一个 NAS. 对此我有几点要求: 能在外网访问 启用 HTTPS 内外网使用相同的访问方式, 无缝切换 我准备使用 NextCloud, 因为它支持 WebDAV, 这样可以作为 Joplin 的同步服务器. 我之前在外网 VPS 上搭建过一个 NextCloud, 现在我准备把它迁移到我的树莓派上, 感觉数据还是放在自己身边更可靠些. 我购买的是树莓派 4 June 27, 2021 #practice
Jump Consistent Hash 算法这篇文章我们讨论 Jump Consistent Hash 算法, 一个极简且高效的一致性哈希算法. 哈希与一致性哈希 哈希函数, 或者说散列函数, 能将一个较大定义域中的元素映射到一个较小的有限值域中. 值域中的元素有时也称为桶 (bucket), 值域的大小亦称为桶的数量. MD5 就是一种常用的哈希函数, 它能将任意大小的数据 (较大的定义域) 映射成一个 16 字节的哈希值 (较小的有限值 June 13, 2021 #algorithms
ZooKeeper 入门教程ZooKeeper 是一个分布式服务中间件, 乍一看有点像一个 NoSQL 数据库系统. 不过它的主要功能不是存储数据, 而是提供一种共享数据和服务间通信的方式, 使用它我们能够更方便地开发分布式软件. 这篇文章介绍 ZooKeeper 的主要特性, 使用方式和应用场景. 主要特性 我们先来看一下 ZooKeeper 的主要特性, 以及它跟 NoSQL 数据库系统不同的地方. 数据存储 不同于 R May 2, 2021 #featured #tools
并不简单的二分查找二分查找是一个很经典的入门算法, 我们每个人都学过. 然而它往往没有我们没有想象的那么简单, 它有很多容易出错的细节: 用 < 还是 <= ? 是 right = mid 还是 right = mid - 1 ? 是用 mid = (right + left) / 2 还是 mid = left + (right - left) / 2 ? 如何使用二分查找找出左边界和右边界? 等等等 March 31, 2021 #algorithms
经典动态规划问题我最近温习了一下动态规划, 发现有些问题解法的代码十分相似, 但思路却大相径庭, 非常容易混淆. 这里总结一下. 这涉及到几个经典的动态规划问题: 0-1 背包问题, 完全背包问题和爬楼梯问题. 题目源自 LeetCode 416 题, 518 题, 377 题 和 70 题. 我们先来来看问题和它们的解法, 你会发现这些解法十分相似. 接着我们再来逐步分析其中的思路. 不同的问题, 相似的解法 February 20, 2021 #algorithms #leetcode