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
自动生成 Lua 热更新代码游戏服务器使用 Lua 的一个重要原因是 Lua 便于热更. 即使服务器正在运行, 只需让它执行一段代码, 即可重写其中的某些函数, 达到热更新的目的. 例如模块 app 有一个函数 foo 1234567local M = {}function M.foo(a, b) return a + bendreturn M 如果我们要将 foo 热更成将 a 和 b 相乘, 只 February 5, 2021 #lua
由斜杠划分的区域一月份 Leetcode 的每日一题几乎都是并查集. 不过个人认为与状态转移方程千变万化的动态规划相比, 并查集还是相对比较简单的. 这道题是我觉得最有趣的两道之一 (另一道是打砖块, 以后有时间的话也写一篇它的题解). 题目源自 Leetcode 959 题 在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共 January 27, 2021 #algorithms #leetcode
Go 设置 socket 端口复用我们知道, 一般来说, TCP/UDP 的端口只能绑定在一个套接字上. 当我们尝试监听一个已经被其他进程监听的端口时, bind 调用就会失败, errno 置为 98 EADDRINUSE. 也就是所谓的端口占用. 12345678910int fd1 = socket(AF_INET, SOCK_DGRAM, 0);int fd2 = socket(AF_INET, SOCK_DGRAM, 0 January 24, 2021 #linux #go #network
2020 Annual SummaryAt the beginning of 2020, no one anticipated that we would face an unprecedented pandemic that would last a year or more. 2020 is unusual, to me, pandemic, new job, working, challenges, learning, voca January 1, 2021 #essays #english