AdairXie Blog

坚持做对的事情,并把事情做对

理解 timeout,这一篇就够了

对 TCP 协议栈的理解总是需要慢慢积累

PS. 最近比较忙,原先的 Lua 排序算法系列暂时搁置一段时间,以后还是会接着更新的。要是我精力足够,将来可能还会出 Lua 搜索算法系列,尽请期待。 嗯,好吧,有些标题党了。不过这个问题我在 google 了大量中文的资料后,都没能解释清楚我的疑惑。索性深入研究了几天,自己来总结下学习成果。 如果你的 Nginx 服务器流量足够大,足够繁忙。可能你会在 Nginx 的 error...

Lua 排序算法 - 插入排序

Insertion Sort

设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。 算法步骤 从第一个元素开始,该元素可以认为已经被排...

Lua 排序算法 - 选择排序

Selection Sort

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被...

Lua 排序算法 - 归并排序

Merge Sort

归并排序(Merge Sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并操作(Merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。归并排序有多路归并排序、两路归并排序, 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨...

Lua 排序算法 - 快速排序

Quick Sort

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。 算法步骤 从数列中挑出一个元素,称为 “基准”(pivot) 重新排序数列,所有元素比基准值小的摆放在基准前面,所有...

Lua 排序算法 - 冒泡排序

Bubble Sort

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 算法步骤 有一个长度为n的序列,一共需要n次外循环 在一次外循环里,...

Lua 的标准输出与缓存

最近我遇到了个奇怪的问题,我的一个 Lua 脚本需要通过 shell 的重定向将输出追加到一个日志文件中。但是那个 Lua 脚本的输出在日志文件里看来却不是实时的,输出的文本直到脚本结束时才能看到。 在 shell 下运行这个程序,是可以看到实时输出的: -- buffer_test.lua local socket = require "socket" local const = 1...

cjson 的抢占问题

默认的 cjson 其实是 “共享” 的

我说的 cjson 抢占 问题可不是 lua 的 非抢占 式协程,更准确的理解应该是:由于 lua 的协程切换,可能会导致 cjson 上下文不一致的情况。例如: -- json.lua local json = require("cjson") local _M = {} function _M.encode(data, empty_table_as_object) if j...

使用 newproxy 生成 userdata

原生的 Lua 也是可以生成 userdata 的

在 Lua 中,userdata 一般是在 C 里创建的数据结构,只能通过 C API 来操作。理论上 Lua 是不支持的,但是作者增加了一个隐藏的特性 newproxy 用于创建一个空的 userdata,参数可以选择是否带 metatable。主要是用来测试 GC,实现析构函数用的。 newproxy is an unsupported and undocumented func...

__len 其实很鸡肋

5.1 的 table 是不支持 __len 的

我们知道在 Lua 中取 table 的长度,可以使用 # 。但是这里有个前提,就是 table 必须是一个序列。如果一个 table 有「空洞」,那么用 # 取到的结果将没有明确含义!!! 但是根据 Lua 官方文档的说法,这个行为是可以通过 __len 元方法来改变的: A program can modify the behavior of the length operat...