Lua学习
简介
Lua是脚本型语言
动态编译
动态执行
每次修改不需要重新编译链接执行
运行时编译而并非运行前编译
是C语言编写的
速度比C语言快
特性Lua的Hello World1print("Hello world")
Lua行末不要分号
Lua的括号12345do …… …… ……end
Lua语言几乎用不到大括号,取而代之的是do…end
Lua的注释123456789// 双斜杠不是注释了哦--[[这是一个多行注释哦]]/* 这不是多行注释了哦*/
小心不要变成纯文本了
12345--如果上面的多行注释没有写 双横线的话,就变成的纯文本赋值语句哦a = [[<html><head></head><body></body></html>]]-- 这个时候的 a 就是一个纯文本
数据类型
Lua是动态类型,不需要定义就可以直接使用
12a = "I'm a"print("a is "..a)
Lua的数据类型是动态可变的
Lua ...
luasocket getaddrinfo nil 问题
使用 luarocks 安装 luasocket,在调用 bind 时,报:
socket.lua:29: attempt to call field ‘getaddrinfo’ (a nil value)
继续执行以下 lua 代码片段:
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
>
> do
>> local socket = require("socket")
>> for k,v in pairs(socket.dns) do
>> print(k,v)
>> end
>> end
gethostname function: 0xc774f0
toip function: 0xc77ea0
tohostname function: 0xc77f00
>
>
发现确实没有加载进来,而 getaddrinfo 是一个标准的 posix 系统调用,所以基本可以确定是安装的问题了。。
于是从 gi ...
Lua程序设计(6)
Lua中的数据结构:数组、链表、队列等
数组:在Lua语言中使用整数来索引表就可以实现数组,因此数组的大小不用非得是固定的,而是可以按需增长的。
在Lua语言中一般以1作为数组的起始索引。
矩阵及多维数组:使用一个不规则数组:即数组的数组,一个所有元素均是另一个表的表。
这种矩阵在创建时必须显式的创建每一行,一方面更加具体,另一方面增加了更多的灵活性。
将两个索引合并为一个:我们通过将第一个索引乘以一个合适的常量再加上第二个索引来实现这种效果,在这种方式下,我们可以使用以下的代码来创建一个全0元素的N*M矩阵:
1234567local mt = {}for i = 1,N do local aux = (i - 1) * M for j = 1,M do mt[aux + j] = 0 endend
链表:我们可以把每个节点用一个表来表示,链接则为一个包含指向其他表的引用的简单表字段:
根结点:list = nil
在表头插入一个值为v的元素:
1list = {next = list,value = v}
遍历链表:
12345local l = listwhile l do v ...
lua
lua-resty-lrucache深入解析lua-resty-lrucache是openresty里常用的缓存,是一个worker级别的缓存,也是一个最近最少使用的缓存,下面我们来具体分析它的实现过程。
使用示例123456789101112131415161718192021local _M = {}local lrucache = require "resty.lrucache.pureffi"local c, err = lrucache.new(200) if not c then error("failed to create the cache: " .. (err or "unknown"))endfunction _M.go() c:set("dog", 32) c:set("cat", 56) ngx.say("dog: ", c:get("dog")) ngx.say("cat: ", c:get(" ...
安卓上为什么不能运行64位LuaJIT字节码
<h3 id="安卓上为什么不能运行64位LuaJIT字节码"><a href="#安卓上为什么不能运行64位LuaJIT字节码" class="headerlink" title="安卓上为什么不能运行64位LuaJIT字节码"></a>安卓上为什么不能运行64位LuaJIT字节码</h3><p>今天在测试安卓下是否可以运行64位的LuaJIT字节码时出现了一个报错。错误说加载了错误格式的字节码,而32位的字节码可以正常运行。这就很纳闷了,为啥64位的安卓应用依然只能读取32位的字节码呢?</p>
仔细查阅了一下以后发现,苹果在15年强制新提交的应用必须支持64位之后,Unity紧赶慢赶的在4.6.2以上的版本增加了对IOS64位的支持,但是Unity官方对于64位安卓应用的构建遥遥无期,一方面64位Android可以良好的兼容32位应用,再一个谷歌也没有强行的去推进这件事情,所以目前绝大多数的安卓应用还是32位的。
那么 ...
Lua 初步学习
1 所谓的“交互式编程” Lua提供了交互式编程模式,我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用
2 所谓的“脚本式编程” 我们将代码写入.lua文件,然后执行,就是脚本式编程。 eg: WangBingdeMacBook-Pro:~ wangbing$ cd /Users/wangbing/Desktop/luaDemo WangBingdeMacBook-Pro:luaDemo wangbing$ ls helloWord.lua WangBingdeMacBook-Pro:luaDemo wangbing$ lua helloWord.lua Hello World! WangBingdeMacBook-Pro:luaDemo wangbing$
3 如何进行代码注释 单行注释:– 兑行注释:–[=[注释内容]=]
4 标志符 1)Lua标志符用来定义一个变量,标志符是以A到Z或者a到z或者下划线_开头加上0个或者多个字母、下划线、数字等 2)但是最好不用 ...
nginx lua waf
ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙###用途:
防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
防止svn/备份之类文件泄漏
防止ApacheBench之类压力测试工具的攻击
屏蔽常见的扫描黑客工具,扫描器
屏蔽异常的网络请求
屏蔽图片附件类目录php执行权限
防止webshell上传
###推荐安装:
推荐使用lujit2.1做lua支持
ngx_lua如果是0.9.2以上版本,建议正则过滤函数改为ngx.re.find,匹配效率会提高三倍左右。
###使用说明:
nginx安装路径假设为:/usr/local/nginx/conf/
把ngx_lua_waf下载到conf目录下,解压命名为waf
在nginx.conf的http段添加
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/ ...
lua面向对象学习
元表和元方法 在Lua中,每个值都有一个元表,table和userdata类型的每个变量都可以有各自独立的元表, 其他类型的值则共享其类型所属的单一元表。
基本的metatable
创建新的table时不会创建元表
getmetatable(table) 获取table或者userdata类型变量的元表
setmetatable(t,ot) 设置table或者userdata类型变量的元表
123456local t = {1,1}print getmetatable(t) -- nillocal t1 = {}setmetatable(t,t1)assert(getmetatable(t) == t1)
Lua代码中,只能设置table的元表,若要设置其他类型的值的元表,必须通过C代码来完成。
标准的字符串程序库为所有的字符串都设置了一个元表,其他类型在默认情况下没有元表。
table中可以重新定义的元方法:
1234567891011121314151617__add(a,b) --加法__sub(a,b) --减法__mul(a,b) --乘法__d ...
StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改
通过keys进行模糊查询后的批量操作
对Hash集合下的key进行模糊查询后的批量操作
对Set集合下的值进行模糊查询后的批量操作
注意
通过keys进行模糊查询后的批量操作
var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379,allowAdmin = true");
redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
//Redis的keys模糊查询:
" local ks = redis.call('KEYS', @keypattern) " + //local ks为定义一个局部变量,其中用于存储获取到的keys
" for i=1,#ks,5000 do " + //#ks为ks集合的个数, 语句的意思: for(int i = 1; i <= ks.Count; i+=5000)
...
lua学习笔记(三)
Lua函数函数定义123456[local] function (argument1,argument2) -- do something [return result] -- 可以返回多个值,每个值以逗号隔开end-- 函数名表示该函数的引用,与C/C++的函数指针类似
可变参数12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152-- 与C语言类似,在函数参数列表中使用三点...表示函数有可变的参数function add(...) local s=0 for i,v in ipairs{...} do -- 注意这里是{},{...}表示一个由所有变长参数构成的table(这里实质是一个数组) s=s+v end return sendprint(add(3,4,5,6,7)) -- 输出:25-- 可变参数也可以赋值给一个变量function average(...) result=0 ...