Home

为什么说 Lua 5.3 中没有全局变量了

过去笔者一直使用 Lua 5.1, 对 Lua 5.3 中的 _ENV 一知半解. 最近新项目中使用了 Lua 5.3, 于是特意研究了下. 这篇文章总结下 Lua 5.3 中的环境和全局变量, _ENV 的含义以及与之相关的用法. Lua 变量的类型 Lua 中的变量可分为局部变量, 上值(upvalue)和全局变量. 经常使用 Lua 的同学应该都很熟悉, 举个例子: local up = "str" local function foo(a) local b = a print(up, b) end 对于 function foo 来说, a 和 b 是局部变量, up 是上值, print 则是全局变量. 局部变量和上值 一个变量是什么变量在编译时...

Read more

序列化 Lua 对象

在项目中由于种种需求经常需要将对象序列化成一个字符串. 由于 Lua 唯一的复合结构是 table, 所以实现起来还是比较简单的. 之前我们的做法是用 Lua 写一个递归函数遍历 table 的键值然后转换成字符串并拼接起来. 然而 Lua 在字符串拼接的过程中会不断地构造字符串对象, 因此这样的实现方式性能较差, 并且会浪费内存, 特别是数据比较大的时候. 一种优化方式是将键值转换的小字符串存到一个 table 里, 最后使用 table.concat 拼接. 不过我想跟进一步, 使用 C 实现它. C 实现的序列化函数与 Lua 实现的类似, 都是遍历 table, 遇到简单类型就直接转换成字符串, 遇到 table 就递归. 这里我们就可以把键值转换的小字符串存到一个缓冲区里,...

Read more

矩阵的 n 次方和斐波那契数列通项式

斐波那契数列大家应该非常熟悉, 这是一个典型的递归定义的数列. 那么这样一个递归定义的数列的通项式是怎样的, 它又是如何推导出来的呢? 这里我们从寻找矩阵的 n 次方说起. 矩阵的 n 次方 首先只有方阵才有与自己相乘, 所以我们实际讨论的是方阵的 n 次方. 为了高效地求得一个 $m\times m$ 的矩阵 $A$ 的 n 次方 $A^n$, 我们的做法是找到一个矩阵 $P$ 和一个对角矩阵 $B$, 使得 $B=P^{-1}AP$. 这个过程称为矩阵的对角化(Diagonalize). 因为有 $B=P^{-1}AP$, 必然有 $A=PBP^{-1}$. 所以 因为 $B$ 是对角矩阵, 所以我们就可以很快地求出 $A^n$ 了. 为了对角化矩阵, 我们需要找到所有...

Read more

分布式哈希表 (DHT) 和 P2P 技术

1. 引言 相信没有人没使用过 P2P 技术. BT 种子和磁力链接就是最常见的 P2P 技术, 使用 P2P 技术, 文件不再需要集中存储在一台服务器上, 而是分散再各个用户的节点上, 每个人都是服务的提供者, 也是服务的使用者. 这样的系统具有高可用性, 不会由于一两台机的宕机而导致整个服务不可用. 那么这样一个系统是怎样实现的, 如何做到去中心化(decentralization)和自我组织(self-organization)的呢? 这篇文章我们来讨论一下这个问题. 这篇文章先会介绍 P2P 网络的整体思路, 并引出 P2P 网络的主角 - 分布式哈希表(Distributed Hash Table, DHT); 接着会介绍两种分布式哈希表算法. 这些会让你对 P2P 技术有...

Read more

Promise 和 Deferred

1. 引言 这篇文章笔者想讨论一下 JavaScript 中的 Promise 和 Python Twisted 中的 Deferred(jQuery 中也有 Deferred, 它们的思路是一致的). 它们很有趣, 也有点复杂. 在协程被广泛应用之前, 它们在网络编程中起到了重要的作用. 在此之前, 我们先来看看一些基本概念. 2. 从请求说起 请求和响应 我们在进行网络编程的时候, 总是会用到请求(request)和响应(response). 比如进程 A 需要传递一些数据给进程 B, 我们就可以说进程 A 给进程 B 发送了一个请求. 有的时候一个请求发送出去之后就不用关心后续了; 但是更多的时候, 我们关心目标进程对数据的处理结果, 并且希望对结果进行进一步的处理. 这个...

Read more

三个思路相通的最大面积问题

笔者在 LeetCode 上看到了三个非常有意思的最大面积问题, 这里来分享一下. 1. 接雨水 题目源自Leetcode: 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 思路一 如何去解这个问题呢? 我们注意到, 一个柱子上之所以能储水, 是因为它的两边有别的柱子挡着. 那么一个柱子上最多能储多少水呢? ...

Read more

通过弹幕背单词

众所周知, 对于程序员来说, 最重要的语言不是 C, 不是 C++, 不是 Java, 而是英语. 十分不幸的是, 鄙人极其不擅长英语, 尤其是背单词: 背完即忘. 我需要的是高频重复. 所以我决定采取点措施, 然后就做了这个: DWords. 它可以单词变成屏幕上的弹幕, 用起来就像这样: 这样在工作写代码的时候就会时不时地飘过来一个弹幕, 不断地强化重复记忆. 我认为这个工具非常适合程序员. 除此之外, 它还支持在多个客户端之间同步单词. 为了做到这一点, 我让用户设置一个电子邮箱, 然后通过发送和接受电子邮件来同步数据. 这么做的原因是我不想维护服务器, 也没有必要, 这只是一个小工具. 使用电子邮件的一个好处是可以通过手机添加单词了 – 所有的智能手机都有邮件客户端, ...

Read more

2019 Annual Summary

On September 15, 2017, the first day I joined the company, I told myself that I joined a good company which has a good treatment but I was not feeling happy at all. I had plenty of worry and confusion at that moment because I didn't know my direction. All I can do is working hard and learning as much as possible. At the beginning of 2019, I to...

Read more