Yearly Archives

25 Articles

Lua用setmetatable返回默认值为function时的暗坑

0   118665 转为繁体

想在api服务器里实现一个acl的功能,对某些请求(需要登录,需要检查appkey,需要限制频次等)做限制,对某些起始状态(比如登陆)或者终结状态(比如报错)的请求放行。

因为lua里木有switch case,因此通过一个acl_list的table去查找规则,因为需要限制的请求种类比较多,就把rule_check_token当成默认值了,一看是是这么写的:

然而却会在local token= xxxx那一行报stack overflow,想了半天也发现哪里有无限递归,因为query传进来的是http请求的query string解析出的键值对表。

把query打印出来一看,发现竟然是这个模块本身……

仔细看了文档才知道,原来__index后面的值是一个function时,lua会调用这个function去获得不存在的键,并且第一个参数是模块本身(即_M,一个table)。在这个例子里:

  1. 调用一个非默认规则的api
  2. lua调用了rule_check_token
  3. 参数query被传入了_M本身
  4. 运行到local token= xxxx这一行
  5. 这个table里(_M)又没有token这个键
  6. 回到2

所以就死循环了

 

所以要好好看文档

 

解决方法是可以套一个function

 

贴一个打印table的工具,方便调试:

可以打印出如下形式:

使用openresty请自行改写成local function和ngx.say的形式

mongo好大一个坑

2   74343 转为繁体

因为种种原因被逼着写mongo……

作为一个初学者,我发现了几个坑:

新的协议没文档

官网上只有Legacy Driver Implementation Documentation这个旧的协议文档,新的文档的链接是一个死循环,绕一圈可以回到原地(不信你试试)。可能有用的只有一个视频,还是2011年的,不想看了,哦草。这里还有一个2013年的,从stackoverflow看来的

当然官方给的各种语言的SDK里倒是一直在更新的。

但是给个文档会死啊!

虽然是在用lua写,所以本来也是作死。

但是给个文档会死啊!

因为lua-resty-mongol没有支持新协议,所以会有这么个问题

在update里使用$pull,lua-resty-mongol用getLastError取被修改的行数,永远是返回1(这特么谁设计的),没办法知道改成功了没有。只能update前后各find一次比较了哈哈哈哈哈哈。

设计太坑爹

除了之前的getLastError永远返回1以外,还有一个问题:

之前是2.4.x版本,升级到3.x之后,告诉我admin库需要升级,否则没法登陆,而且需要用2.6.x版本来升级

呵呵

还有一个问题:

现在我有这么个文档post,每个记录是这样的:

首先(只)取所有评论的话是没有问题的↓:

现在我想取出_id是5下的前15条评论

这么写↑,post_content也出来了,post_content好大的啊,不想取怎么办啊

这么写↑,_id没了,其他post_content还在

↑并没有什么卵用


↑这样_id有,其他键没了。

所以结果是_id必须留着……

没错我是强迫症,强迫症多着呢

 

从目前的我所遇到的情况来看,似乎mongodb能干的奇妙功能用SQL数据库一样能搞,无非要再配合别的靠谱的nosql数据库(比如redis这种)。至少写了代码还能预测能发生什么。像mongo这样写着写着给你个惊♂喜的实在受不了了。哦不过也有可能被虐着虐着就有感♂觉了呢(ง •̀_•́)ง

 

PS : 我是mongo初学者,欢迎大神来鞭挞我

 

Incapsula的IPV6垃圾垃圾真垃圾

0   9943 转为繁体

你说你A了一个(日本的)/32,一个(美国的)/44,一个(以色列的)/48,好像都是NTT的线路。点此处有真相

(bgp.he.net上查不到,说明并没有路由,也就是放置play。

用什么不好,偏偏要用以色列的那个,连自己特么官网都是这个IP段。

436919cbjw1es8jrr26zwj20am02m0t0

你知道教育网ping多少嘛?300多ms

所以并没什么egg用。

另外我发现incap的官网ipv4也用的香港那段,哈哈哈哈哈哈

迅雷快鸟(diǎo)路由器版

557   298017 转为繁体

可以在路由器或者同一网络下的任意设备上登陆并心跳,这样就不用开电脑也不用在手机里装奇怪的应用了。

对我有洁癖你来打我呀

436919cbgw1erq704m1h4g205k049nfa有问题请留言。如果你要报告一个问题,请同时注明:

  • 所使用的版本 (Python/Shell)
  • 运行的系统环境及版本 (操作系统,Python版本等)
  • 包含错误信息的日志
  • 产生错误的操作步骤
  • (可选) 运营商所在地,如:上海电信

Read More

再见多说

17   77425 转为繁体

迁移到disqus,旧评论已导入,等后台处理

默认头像->

你们说好不好呀

我肯定是兹瓷的咯

算了还是滚回去用多说好了,这导入太不靠谱