搭建ngx_lua_waf
Created at 2019-05-26
<span id="post-title-updated">Updated at 2019-08-15</span>
<span id="post-title-categories">Category
<a href="/categories/搭建服务/">搭建服务</a>
</span>
<span id="post-title-tags">
Tag
<a href="/tags/搭建ngx-lua-waf/">搭建ngx_lua_waf</a>
</span>
</p>
<hr/>
搭建ngx_lua_waf工作环境:centos7 ...
ulua学习笔记1
本文为bbbbbbion(可以叫我六饼)原创总结,如有疏漏请各位拍砖留言。转载请尊重原作者成果,保留出处。这一系列用于记录笔者学习ulua热更新的过程。首先来看Windows下lua环境的搭建。
环境:lua for windows (lfW)主页:http://luaforwindows.luaforge.net/
lua for windows是一整套Lua的开发环境,主要包括:
Lua Interpreter(Lua解释器)
Lua Reference Manual(Lua参考手册)
Quick Lua Tour(Lua快速入门)
Examples(Lua范例)
Librarier with documentation(一些Lua库和文档)
SciTE(一款多用途编辑器,已经对Lua做了特殊的设置)
上述提到的主页上可以下载lfW(需要翻~墙),最新版本为:5.1.4-46。一路默认安装,最后一步会询问是否使用SciTE默认的“黑色”风格,一般建议勾选。
使用SciTE:打开SciTE,新建文件,输入print(“hello world”),然后保存 ...
Redis实现限流器Lua脚本
算法原理系统以恒定的速率产生令牌,然后把令牌放到令牌桶中,令牌桶有一个容量,当令牌桶满了的时候,再向其中放入的令牌会被丢弃;当想要处理一个请求的时候,需要从令牌桶中取出一个令牌,如果此时令牌桶中没有令牌,则拒绝该请求。
数据结构采用Hash结构存储,字段定义如下:
名称
含义
capacity
令牌桶容量
remain
剩余令牌数
period
时间窗口大小(秒)
quota
时间窗口内的限额
timestamp
生成令牌的时间戳(秒)
脚本代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546redis.replicate_commands()local key = KEYS[1] -- 令牌桶标识local capacity = tonumber(ARGV[1]) -- 最大容量local quota = tonumber(ARGV[2]) -- 时间窗口内的限额local period = tonumber(ARGV[3]) -- ...
Unity中的Lua
文章目錄
</div>
<p>结合以前的初步学习了解,这一次要对Lua进行进一步的深入学习。</p>
首先我们要知道Lua是脚本语言,是有自己的虚拟机,是解析执行而非像C#,C++,Java这些编译执行。同时Lua是弱类型语言。
这里不更多的讲解Lua虚拟机相关概念,详情参考http://blog.sina.com.cn/s/blog_8c7d49f20102uzsx.html这里只要知道Lua的虚拟机(程序模拟线程,堆栈等)是运行在程序里而非物理CPU上,因此只要虚拟机把Lua脚本解析成对应平台的机器码就能支持跨平台(好比Java的JVM)。
Lua Study以前的部分学习参考:Scripting System & Lua StudyLua — some important concept and knowledgeLua - C API Lua - C call Lua & Lua call CLua - Object Oriented ProgrammingLua - UserdataLua - Managi ...
Lua垃圾回收
撰写于 2018-05-25
<span id="post-title-updated">修改于 2018-05-25</span>
<span id="post-title-categories">分类
<a href="/categories/高级Lua/">高级Lua</a>
</span>
<span id="post-title-tags">
标签
<a href="/tags/Lua/">Lua</a>
</span>
</p>
<p>本来不想写这篇的,往浅了说,没啥意思,就是api的使用方法,往深了说,就是lua自动GC的原理,涉及到底层源码的解读,暂时没精力看。那就折 ...
17.Lazy evaluation
从效率的角度而言,最好的计算就是不计算。如果必须执行计算,我们可以拖到非计算不可的时候再计算。这种操作广泛适用于各个领域。
引用计数123class { ... };String s1 = "Hello";String s2 = s1;
一般来说,s2被s1初始化后,s1与s2都有了自己的值,为了完成这个拷贝初始化,我们需要使用new来分配内存,需要调用strcpy函数拷贝数据等等,付出了极大的成本。但实际上此时的s2根本不需要执行拷贝操作,因为s2没被有被使用。
从lazy evaluation的角度而言,我们根本无需拷贝,只需要让s1与s2共享一个值即可。通过做一些记录以便了解哪些对象在共享哪些值,就省略了new与copy的开销。当且仅当某个string被修改时,我们才需要执行真正的拷贝操作。例如当s2需要被修改,此时我们应该赶紧拷贝s1赋予s2,然后修改s2。
引用计数的具体实现机制见More Effective C++ 29,其核心原理就是lazy evaluation:除非你确实需要,否则不去为任何东西制作拷贝,能共享就共享。
区分读写 仍以上文带有引 ...
lua栈
既然Lua虚拟机模拟的是CPU的运作,那么Lua栈模拟的就是内存的角色.在Lua内部,参数的传递是通过Lua栈,同时Lua与C等外部进行交互的时候也是使用的栈.,先关注的是Lua栈的分配,管理和相关的数据结构.
lua虚拟机在初始化创建lua_State结构体时,会走到stack_init函数中,这个函数主要就是对Lua栈和CallInfo数组的初始化:
static void stack_init (lua_State *L1, lua_State *L) {
/* initialize CallInfo array */
L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo);
L1->ci = L1->base_ci;
L1->size_ci = BASIC_CI_SIZE;
L1->end_ci = L1->base_ci + L1->size_ci - 1;
/* initialize stack array */
L1->stack ...
2.5 lua 变量
全局变量创建一个全局变量全局变量不需要声明,给一个变量赋值即创建了一个全局变量,访问一个没有初始化的变量(默认是全局变量,即,lua的变量默认是全局变量,特别注意)也不会出错,会返回nil。123print(var_a) var_a = 10print(var_a) -- 10
在命令模式中执行如下:1234Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio print(var_a)nil
删除一个全局变量删除一个变量很简单,直接将改变量赋值为nil;如下面的例子:b是全局变量,当赋值为nil之后,再调用print就会返回nil。12345Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio b = 1; print("b=" .. b); b = nil; print(b);b=1nil
总之,可以这么理解:当一个变量被赋值为nil,这个变量就变得像从来没出现过一样,换句话说,只有当一个变量的值不是nil这个变量才是存在的。
局部变量使用local 关键字来声明一个局 ...
深度理解Lua中的table
Lua的table是个很有意思的东西。有些内容平时写代码的时候很少接触到,但是了解一下还是很有意思的。
这篇blog参考MetatableEvents,一个一个边写测试边细说。
__newindex
原文翻译:
__newindex用于分配属性,当调用 myTable[key]=value时,如果元表中有__newindex并且指向一个function,就会调用这个function,传入的参数为table, key 和 value
用 rawset(myTable, key, value)可以跳过这个元方法直接给myTable的key属性赋值为value。
如果__newindex指向的方法中,没有调用rawset方法,传入的键值对(key/value)就不会添加到myTable中。
测试代码:
local meta = {
__newindex = function(t, key, value)
print("call __newindex",t, key, value)
end
}
local test ...
Lua入门教程:垃圾回收
Lua 使用的是自动内存管理,所以我们不需要自己手动取删除创建后的对象,Lua 通过垃圾回收(garbage collection)的方式自动删除成为来及的对象,从而将程序员从内存管理的负担中解放出来。
虽然在理想的环境中,垃圾回收对我们来说是不可见的,但其却不是万能的,比如某些关键的性能点,我们可能需要停止垃圾回收,或者让它只在特定的时间点运行,这就需要额外的垃圾回收方式来辅助。
Lua 采用了弱引用表(weak table)、析构器(finalizer)和函数 collectgarbage 的机制来作为辅助垃圾回收。
弱引用表所谓弱引用(weak reference)是一种不在垃圾回收考虑范围内的对象引用。弱引用表允许收集 Lua 中还可以被程序访问的对象,它告知 Lua 语言一个引用不应该阻止对一个对象的回收机制。
一个典型的内存泄漏的场景是如果我们在数组中存储一些活跃的对象,我们只需要把对象插入到数组中去即可,一旦对象成为了数组中一部分,在数组销毁之前,该对象是永远无法回收的,虽然数组中的对象可能没有任何其他地方引用它,但其仍然被数组引用,除非我们告诉 Lua 数组中的引用不应 ...