Lua入门学习
<aside class="aside clearfix">
<a class="tag label label-info" href="/tags/lua.html">lua</a>
</aside>
<section class="brief"><p>了解到<code>Lua</code>(一种轻量级、可嵌入式的脚本语言),其实是很早之前和一些做游戏的朋友聊天的时候知道的,他们在项目中广泛地使用到这个语言。于是自己上网也看了一些lua开发中的一些特定发现,Lua 被运用的领域远不止游戏。特别最近很火的Redis和<code>OpenResty</code>(一个基于Nginx ...
Lua数据结构 — TValue(一)
数据结构的设计,在一定程度上奠定了整个系统的设计,所以决定写一个对Lua主要数据结构的分析文章,本来打算写一篇就好了,但是每个数据类型其实都有点复杂,一篇的话篇幅太长,所以就拆开几篇来写了。
为什么是从TValue说起,TValue是实现Lua弱数据类型的主要数据结构,不但在脚本中的值使用了TValue,连Lua的实现中,很多数据结构也依赖于TValue,TValue一定程度上贯穿了整个Lua。先说一下Lua里面的数据类型:(lua.h :69)
从上面的定义中可以看到,Lua的值类型有9种,其中LUA_TNONE是用于判断这个变量是否等于为空使用的,这个是Lua内部使用的,后面再详细说明。现在来看Lua里面的TValue数据结构:(lobject.h 71-75)
在Lua里面,一个变量使用TValue这个类型来存储的,int tt就是上面宏的类型值(4个字节),而Value则是一个union(8个字节)。在这个union中,其实分工也十分明确:
在Value中,void* p、lua_Number n、int b都是不用回收的值类型,而GCObject* gc则都是需要回收的 ...
基于openResty+lua的权限校验
之前在这篇文章想进openResty的坑里说要做个和权限相关的大实例,这篇算给做的东西一个详细点的README,代码已经丢到github 之前是在Google随便搜了shiro和openResty的关键字,看到了这个,其实他的权限校验是在后台用go语言做的,nginx只是在前面做了个转发功能,这是我给作者提的issue,我是自己用lua做了逻辑
大体实现功能
请求过来时统一先处理,在access_by_lua阶段执行权限校验。每次先到redis取权限,取不到则连mysql取,再把结果填到redis里(模拟,设置了3秒过期),然后调本地服务看是否通过权限校验,通过之后再进行请求的路由分发,不通过直接返403给客户端
模块关于shiro 官网,java的一个权限框架。可以做粒度很细的权限,比方你要使用3号打印机,可以用这样的形式printer:query:3来表达这个资源,printer是model,query是action,就是传统的增删改查的动作,3是这个model的主键。在java里可以用这样的注解来做权限校验@RequiresPermissions(“printer ...
PIL.16Lua的编译、执行
尽管我们说Lua是一个解释型的语言,但Lua总是在运行代码前会编译成一种中间格式。(这并不重要,很多解释型也会这样做)编译阶段的存在对于解释型语言听起来有点不太对。然而,解释型语言的重要特性不是说他们不会被编译,而是说其轻易执行在空中生成的代码。我们可以说,一个dofile这样的函数存在给为了我们把Lua称为解释型语言的资格。我们会讨论Lua执行代码chunks的过程,编译意味着什么(做了什么),Lua怎么样运行编译了的代码,在这过程中怎么控制错误。
前面,我们把 dofile 介绍为一种Lua中执行代码的基本方式,但是 dofile 其实是一个辅助函数:loadfile 才做了真正的工作。
类似 dofile , loadfile 从一个文件加载 Lua chunk,但是不会运行这个 chunk。他只会编译这个 chunk,然后把编译后的 chunk 以一个函数返回。而且,loadfile 不会和 dofile 一样返回错误,其只会返回错误代码。我们可以如下定义 dofile:
function (filename) local f = assert(loadfile(filena ...
Lua数据结构 — 闭包(四)
文章目录
</div>
<p>前面几篇文章已经说明了Lua里面很常用的几个数据结构,这次要分享的也是常用的数据结构之一 – <strong>函数的结构</strong>。函数在Lua里也是一种变量,但是它却很特殊,能存储执行语句和被执行,本章主要描述Lua是怎么实现这种函数的。</p>
在脚本世界里,相信闭包这个词大家也不陌生,闭包是由函数与其相关引用环境组成的实体。可能有点抽象,下面详细说明:
一、 闭包的组成
闭包主要由以下2个元素组成:
函数原型:上图意在表明是一段可执行代码。在Lua中可以是lua_CFunction,也可以是lua自身的虚拟机指令。
上下文环境:在Lua里主要是Upvalues和env,下面会有说明Upvalues和env。 在Lua里,我们也从闭包开始,逐步看出整个结构模型,下面是Closure的数据结构:(lobject.h 291-312)
不难发现,Lua的闭包分成2类,一类是CClosure,即luaC函数的闭包。另一类是LCl ...
lua学习
一、注释单行注释:两个破折号多行注释:[[ … ]]
二、变量和流程控制所有的数字类型都是double
num=42
字符串是Immutable的,和python一样
s = 'walternate'
t = "double-quotes are also fine"
u = [[ Double brackets
start and end
multi-line strings.]]
lua有垃圾回收机制,t是undefined
t = nil
语句块用关键字do/end标示
while num < 50 do
num = num + 1
end
语句:
if num > 40 then
print('over 40')
elseif s ~= 'walternate' then – ~= 是不等号.
– 等号是== 对字符串也适用.
io.write('not over 40n') – 默认输出到stdout.
else
– 变量默认是全局的.
thisIsGlobal = ...
Lua 学习 chapter25
目录
自省机制
访问变量
钩子
沙盒
只有疯狂过,你才知道自己究竟能不能成功。
自省机制
通过debug.getinfo(foo),函数就会返回一个包含该函数有关的一些数据的表。
访问变量
通过debug.getlocal来检查任意活跃函数的局部变量。还可以通过函数getupvalue来访问一个呗lua函数所使用的的非局部变量。
我们还可以通过traceback函数来打印堆栈信息。
钩子
调试库中的钩子机制允许用户注册一个钩子函数,这个钩子函数会在程序运行中某个特定事件发生时被调用:
每当调用一个函数时产生的call事件
每当函数返回时产生的return事件
每当开始执行一行新代码产生的line事件
执行完指定数量的指令后产生的count事件
钩子函数的注册:通过debug.sethook:第一个参数是钩子函数,第二个参数是描述要监控事件掩码字符串,第三个参数是一个用于描述以何种频度获取count事件的可选参数。
要监控call、return、line事件,把这几个事件的首字母放入掩码字符串。要监控count事件,则需要在第三个参数中指定 ...
3 Model Evaluation
模型评估
经验误差与拟合问题
在分类问题中,将分类错误的样本占样本总数的比例称为错误率。如果在$m$个样本中有$a$个样本分类错误,则错误率为$E=frac{a}{m}$,与之相对的精度为$Accu=1-E$。或者,我们将学习算法的实际预测输出与样本的真实输出之间的差异称为误差。学习算法在训练集上的误差称为训练误差或经验误差,在新样本上的误差称为泛化误差。学习算法的训练过程就是努力使得经验误差最小化。但是,我们希望获得的是泛化误差小的学习算法。在一些情况下,我们能得到一个训练集上表现很好的学习算法,但是这种学习算法不一定好,甚至是糟糕的。因为这样的学习算法把训练样本学习得太好了,把训练样本的一些特点当成了样本的一般性质,这种学习算法泛化能力低下。这种现象被称为过拟合。与过拟合相对的是欠拟合。出现欠拟合意味着学习算法学习能力不足,没有发现样本的一般性质。欠拟合的解决方法很简单,只要加强学习算法的学习能力即可。但是,过拟合则十分困难,所以过拟合是机器学习中的重要问题。只要相信$P neq NP$,过拟合就是无法避免的,我们能做的就是减少过拟合所带来的影响。下图是过拟合和欠拟合的类比图 : ...
Lua语法邮箱sina
Lua是一个以性能著称的轻量级的脚本语言。可以跨平台运行解析,而不需要编译的过程。Lua是一个区分大小写的编程语言。
Lua语法学习
变量
1、标识符
Lua中使用标识符定义一个变量,标识符由字母,数字,下划线组成。最好不要使用下划线加大写字母的标识符,因为Lua的保留字也是这样。一般约定,以下划线开头连接一串大写字母的名字(如_VERSION)被保留用于Lua内部全局变量。
2、定义变量
Lua定义变量是没有类型的,根据存储什么数据来决定是什么类型。如num=10。
3、变量类型
(1) nil表示空数据,等同于null。
(2) boolean布尔类型,Lua把false和nil看作是“假”。数字0与空字符串“ ”为真。
(3) string字符串,用“”或‘’来表示,用2个方括号[[]]来表示“一块”字符串。
(4) number小数类型,表示双精度类型的实浮点数。
(5) table,其实是一个“关联数组”,数组的索引可以是数字或字符串。Lua中的数组索引是从1
开始的。
4、Lua变量
有三种类型:全局变量、局部变量、表中的域。
变 ...
LUA_API
编译使用 lua api 的 c 语言程序
gcc temp.c -o temp -llua -lm -ldl
生成动态链接库供 lua 程序调用
gcc temp.c -o temp.so -fPIV -shared
LUA_API
定义
/*
@@ LUA_API is a mark for all core API functions.
@@ LUALIB_API is a mark for all auxiliary library functions.
@@ LUAMOD_API is a mark for all standard library opening functions.
** CHANGE them if you need to define those functions in some special way.
** For instance, if you want to create one Windows DLL with the core and
** the libraries, you may want to use the ...