使用lua
lua-cmsgpack是一个开源的MessagePack实现方式、纯C的库,没有任何其它依赖,编译后可以直接被lua调用,目前主要支持Lua 5.1/5.2/5.3 版本。1、什么是MessagePack?
官方的解释是:
12It's like JSON.but fast and small.
跟JSON及其类似,但是比JSON更快并且占用空间更小,举个官方给出的例子,直接截官方图:
翻译官方的解释:MessagePack是一种高效的二进制序列化格式, 它允许在多种语言(如JSON)之间交换数据,但它越来越小, 小整数被编码为单个字节,典型的短字符串除了字符串本身之外还需要一个额外的字节。
目前市面上流行的开发语言MessagePack几乎支持,官方的地址为:http://msgpack.org/Lua MessagePack也提供了一套开源库,地址在:https://github.com/fperrad/lua-MessagePack/。
但是,作者使用的是lua-cmsgpack,至于哪个比较优异,作者还没有去比较,主要是先发现了lua-cmsgpack,后面看了下R ...
lua基础
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">赵子清技术文章</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<li><a href="../../index.html">Docs</a> »</li>
<li><a href="../index.html">开发语言</a> »</li>
<li>lua基础</li>
<li ...
Car Evaluation Analysis
汽车数据R语言机器学习分析
title: “Car Evaluation Analysis”
author: “Suraj Vidyadaran”
date: “Sunday, February 21, 2016”
output: md_document
对汽车数据使用17种分类算法进行数据分析,对代码进行实践应用和内容翻译
Load the data 读取数据
Exploratory Data Analysis 探索数据
Classification Analysis 分类
Linear Classification 线性分类
1 Logistic Regression 逻辑回归
2 Linear Discriminant Analysis 线性判别
Non-Linear Classification 非线性分类
3 Mixture Discriminant Analysis 混合判别
4 Quadratic Discriminant Analysis 二次判别
5 Regularized Discriminant Analysis 正则约束判别
6 Neural ...
使用lua脚本和jedis实现redis的hmsetnx命令,操作hash表时不覆盖原有数据
redis中set系列命令(包括set,hset等等),基本上都包括两个版本,纯粹的set和setnx, setnx即set not exist, 也就是只有Key不存在时才会执行set, 而不会覆盖原有的值。
但是hmset这个命令,包括redis本身,jedis都没有提供nx版本的支持。当然,hset这个命令是有对应的hsetnx版本的,hmset意思就是multi hset,一次可以操作多个key, 从而减小网络开销。
所以,为了在使用hmset时也能降低网络的消耗,用lua写了一个脚本,实现hmsetnx的效果,即:向Hash表中set键值对时,只有键不存在时才会写入,不会覆盖原有值。
12345678910local keyfor i,j in ipairs(ARGV)do if i%2 == 0 then redis.call('hsetnx', KEYS[1], key,j) else key = j endendreturn 1
脚本的原理还是比较简单,脚本中使用的参数和hmset完全一致。依次读入参数列表,迭代器i是奇数时给key赋值,偶数时执行一 ...
Linux 下 lua 开发环境安装及安装 luafilesystem
火云邪神语录:天下武功,无坚不破,唯快不破!Nginx 的看家本领就是速度,Lua 的拿手好戏亦是速度,这两者的结合在速度上无疑有基因上的优势。
最近一直再折腾这个,干脆就稍微整理下。以防后面继续跳坑!
安装:
1.先安装 lua 的相关依赖安装 C 开发环境由于 gcc 包需要依赖 binutils 和 cpp 包,另外 make 包也是在编译中常用的,所以一共需要 9 个包来完成安装,因此我们只需要执行 9 条指令即可:
12345678910gcc:命令未找到(解决方法)yum install cppyum install binutilsyum install glibcyum install glibc-kernheadersyum install glibc-commonyum install glibc-develyum install gccyum install makeyum install readline-devel
2.安装 lua5.1.5下载地址:http://www.lua.org/ftp/
123456789101112131415161718192 ...
lua基本语法
关键字1234and break do else elseifend false for function ifin local nil not orrepeat return then true until while
运算
数字运算
12支持+,-,*,/,…… 比如2^2 结果为4,2^4结果为16连接两个字符串,用".."运算符
赋值运算
1234a,b,c,d=1,2,3,4 --多变量一起赋值a,b=b,a --交换变量功能在默认情况下,变量是全局的。如果需要使用局部变量,使用关键字loacallocal a,b,c =1,2,3 --a,b,c都是局部变量
逻辑运算
123456789and,or,not在lua 中,只有false和nil被计算为false,其他数据都被计算为true,0也是trueand和or 的运算结果不是true和false,而是和它的两个操作数相关a and b :如果a为false,则返回a,否则返回ba or b :如果a为true,则返回a,否则返回b模拟c语言中的语句:x=a?b:c,在lua中,可以写成:x=a ...
Ngx_lua_waf搭建步骤
Ngx_lua_waf是一个web防火墙,主要通过lua实现,安装简单,性能优异,由国人loveshell开发。
ngx_lua_waf是我刚入职趣游时候开发的一个基于ngx_lua的web应用防火墙。
代码很简单,开发初衷主要是使用简单,高性能和轻量级。
现在开源出来,遵从MIT许可协议。其中包含我们的过滤规则。如果大家有什么建议和想法,欢迎和我一起完善。
主页上介绍的安装流程不是很详细,我这里详细记录了一下。
安装openresty平台OpenResty 是一个基于 NGINX 和 LuaJIT 的 Web 平台,相当于集成了lua的Nginx,比自己编译安装Nginx+Lua要方便很多。步骤如下:
su# 预装环境yum install readline-devel pcre-devel openssl-devel gcc# 下载安装包wget https://openresty.org/download/openresty-1.9.7.4.tar.gztar zxvf openresty-1.9.7.4.tar.gzcd openresty-1.9.7.4.tar.gz./ ...
通过lua栈了解lua与c的交互
其中分析、执行部分都是c语言实现的。
lua与c的关系lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈也都是存在c语言中的一个叫lua_State的结构体中的。举个例子,来看下lua中的加指令 OP_ADD a b c 是如何实现的:lua在运行时,会在c语言中的一个叫luaV_excute的函数中不断执行翻译后的lua指令,OP_ADD就是其中的一条指令(luaV_excute函数太长了,所以只在这里截取OP_ADD的部分,有兴趣可以直接去看lua的源码)1234case OP_ADD: { arith_op(luai_numadd, TM_ADD); continue; }
相关的一些宏定义:1234567891011121314151617181920212223242526#define arith_op(op,tm) { //获取b,c的值 TValue *rb = RKB(i); TValue *rc = RKC(i ...
Lua的元表
在 Lua 5.1 语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,例如我们可以重载 “__add” 元方法 (metamethod),来计算两个 Lua 数组的并集;或者重载 “__index” 方法,来定义我们自己的 Hash 函数。Lua 提供了两个十分重要的用来处理元表的方法,如下:
setmetatable(table, metatable):此方法用于为一个表设置元表。
getmetatable(table):此方法用于获取表的元表对象。
设置元表的方法很简单,如下:
123local mytable = {}local mymetatable = {}setmetatable(mytable, mymetatable)
上面的代码可以简写成如下的一行代码:
1local mytable = setmetatable({}, {})
修改表的操作符行为通过重载 “__add” 元方法来计算集合的并集实例:
12345678910111213141516171819202122local set1 = {10, 20, 30} lo ...
Lua语言
1. 数据类型
数据类型
描述
nil
只有值为 nil 属于该类,表示一个无效值(在条件表达式中相当于 false)
boolean
false or true
number
双精度类型的实浮点数
string
双引号或单引号表示
function
由 C 或 Lua 编写的函数
userdata
表示任意存储在变量中的 C 数据结构
thread
表示执行的独立线路,用于执行协同程序
table
Lua 中的表其实是一个”关联数据”, 数组的索引可以是数字或字符串
nil
boolena
number
string ...