Offline Evaluation in Recommendation System调研
推荐系统中的评测大致分为三类:离线评测、在线评测、用户调研。在线评测通常将流量随机分配到不同策略下下比较不同策略的优劣(又称A/B test或bucket test),操作简单,效果准确直观,但代价昂贵,可能伤害部分用户的体验;离线评测使用模拟器模拟线上环境获取结果,对线上几乎没有影响,因此一些重要系统通常要先通过离线评测确保算法效果再上线进行对比,但由于离线评测经常引入model bias及partial label(新算法产生的结果在线上真实环境下未被展示)等问题,使得线下评估结果与线上不一致;用户调研代价昂贵切过于主观,个人认为比较适用于产品调研,不适用于算法效果评估。这其中离线评测一直是推荐系统较为关注的话题,如何保持离线评测与在线评测结果的一致性在众多推荐系统中都是亟待解决的问题。
A Comparison of Offline Evaluations, Online Evaluations, and User Studies in the Context of Research-Paper Recommender Systems在论文推荐数据集上对比了user study、 ...
cocos2dx lua 安全之加密与解密实现
非常多使用cocos2dx+lua做游戏的同学。都会想到一个问题,我的游戏一旦公布,如何才干保证的我脚本代码不被破解。不泄露代码。尽管这和开源、共享的原则不合。可是代码也是coder的劳动成果,理应得到保护。
特别是商业游戏更是如此,不希望被别人破解掉源代码而且进行改动。
今天的话题就是怎样实现lua脚本文件的加密和解密。
我在网络上查过,都没有成熟的解决方式。然后我经过考虑之后,总结出两种解决方式,供大家參考。
1、轻量级的解决方式。APK打包之前,用工具把全部的lua文件加密,详细是将lua文件读到内存,然后使用zip等压缩加密库进行压缩加密,然后将压缩加密之后的数据保存为和源文件同名的文件。
打包之后执行lua文件的时候。则先读出lua数据。然后进行解密。将解密后的流数据传给lua虚拟机。
2、重量级的解决方式,此方案是上一种方案的扩展。也是商用游戏的方案,实现一个游戏文件包,打包前将资源和脚本都使用工具打包到一个文件。能够在打包的时候加密压缩,也能够不加密压缩。
然后在执行的时候直接从包内读出对应文件的数据。然后解密解压缩。然后提供给游戏引擎使用。这也是端游普遍使用的 ...
lua中的C
了解lua的内部实现结构有助于更清楚的各个函数是怎么要操作内容及内容的,就从最开始的lua解释器开始进行查看。
Lua提供了一系列API来让宿主程序和Lua进行通信。所有的API函数和相关的类型和常量都在lua.h内声明。
虽然我们使用了函数这个术语,但是API中的某些特性可能是以宏的形式提供的。
和大多数C库一样,Lua API函数不会检查他们参数的有效性和完整性。这可以通过在编译Lua的时候加上LUA_USE_APICHECK来定义。
Lua库是完全可重入的:其没有全局变量。它把所有的信息保存在一个动态数据结构中,我们称之为Lua state。
每个Lua state有一个或多个线程,每个对应每行的执行。lua_State类型(不要管名字)指向了这个线程。(可以认为这个线程也引用了与此线程相关的Lua state)。
一个指向线程的指针必须作为传递给函数的第一个参数,lua_newstate()是个例外,这个函数创建一个lua state并返回指针到主线程。
栈Lua使用一个virtual stack(虚拟栈)来与C进行值传递。栈中的每个元素代表了一个Lua值(nil, numbe ...
缓存数据库Redis结合Lua脚本解析
redis作为一款优秀的缓存数据库,已成为许多的公司项目开发的必备底层数据库之一了,在我们使用redis时,除了平常对五种基础数据结构进行单一操作,有时会需要依赖redis来处理一段相对复杂的逻辑,而这段逻辑可能需要通过redis client发送多条redis命令来达到我们的目的,然而这种处理方式,不仅效率低,而且无法保证事务的原子性;redis从2.6.0版本开始提供了一种新的解决方案,内置lua解释器,通过 redis Eval 命令来执行lua脚本,达到执行自定义逻辑的redis命令的目的。
解析Eval 命令的基本语法如下:1redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
如果我们想在lua脚本中调用redis的命令该如何操作?可以在脚本中使用redis.call()或redis.pcall()直接调用,两者用法类似,只是在遇到错误时,返回错误的提示方式不同。例如:1eval "return redis.call('set',KEYS[1],'ba ...
LUA面向对象编程技巧
LUA中的对象我们知道,对象由属性和方法组成。LUA中最基本的结构是table,So 必须用table描述对象的属性。lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。至于继承,可以通过metetable模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。
MetatableLua中的metatable 类似于C++中的虚函数,当索引table中的项不存在时,会进一步索引metetable(如果设置了的话)是否存在该项。这跟虚函数概念
不是很吻合么?
示例class12user_t = {}user_t.__index = user_t
以上代码声明class user_t。为了方便,user_t声明为全局的table。__index 是跟设置metatable有关,详细信息参见lua manual http://www.lua.org/manual/5.1/
实际上__index 应该赋值为function,这里是一个语法糖,等价于
1user_t.__index = function(key) return user ...
lua 原生api解读
简介
LuaAPI
1.创建新表
2.取表中元素
3.表中的元素赋值
4.取表元素
4.表元素赋值
5.对table的一些操作[不引发原方法]
6.复制栈上元素并压入栈
参考资料
简介
研究lua也有一段时间了,对lua也算是小有了解,对于lua的api可能和其他脚本语言不是
很相同,使用lua来编写,lua原生api都采用C语言开发的,理解这些api含义对于理解lua
语言设计的本身又起着至关重要的作用,故此在这里记录下,lua-api具体含义。
LuaAPI
1.创建新表
void lua_createtable(lua_State *L, int narr, int nrec)
创建一个新表,并将它放在栈顶,narr和nrec分别制定该table的array和hash部分的预分配
元素的数量。
无返回值
栈高度+1,栈顶元素是新的table。
#define lua_newtable(L) lua_createtable(L, 0, 0)
创建表的另一个ap ...
lua函数定义
FuncStateproto结构数组保存函数原型信息;prev保存父函数体指针;actvar保存定义的局部变量;upvalues保存upvalue
Lua源码中,专门有一个结构体FuncState用来保存函数相关的信息.其实,即使没有创建任何函数,对于Lua而言也有一个最外层的FuncState数据.这个结构体的定义:
typedef struct FuncState {
Proto *f; /* current function header */
Table *h; /* table to find (and reuse) elements in */
struct FuncState *prev; /* enclosing function */
struct LexState *ls; /* lexical state */
struct lua_State *L; /* copy of the Lua state */
struct BlockCnt *bl; /* chain of current blocks */
in ...
Lua 源码学习——数据结构
数据结构简介
字符串
数据结构简介
Lua 中支持的数据结构包括:
宏
类型
对应数据结构
LUA_TNONE
LUA_TNIL
nil
LUA_TBOOLEAN
boolean
int
LUA_TLIGHTUSERDATA
pointer
void *
LUA_TNUMBER
number
lua_Number
LUA_TSTRING
string
TString
LUA_TTABLE
table
Table
LUA_TFUNCTION
function
...
lua数据结构table的键值存取过程源码分析
一、相关数据结构定义1、Table结构定义1234567891011typedef struct { CommonHeader; lu_byte flags; lu_byte lsizenode; /* log2 of size of `node' array */ struct *metatable; TValue *array; /* array part */ Node *node; /* hash part */ Node *lastfree; /* any free position is before this position */ GCObject *gclist; int sizearray; /* size of `array' array */} Table;
可以看出array和node作为存储数据的两种结构,当table以整型作为key时,会用array来存储,其他数据类型key会用node来存储。sizearray作为数组的长度,2的lsizenode次方作为哈希表的长度。
2、TValue结构定义 ...