闲置书籍出售

都是一些自己买来已经阅读过的书籍,放着也是占地方,不如转手给需要的人。

厦门市内自取,其他地方不包邮。

Read More …

Cocos2d-x 绑定脚本究竟选择 Lua 还是 JS ?

Cocos2d-x 绑定脚本究竟选择 Lua 还是 JS ?

这个问题感觉是有点可笑的存在,很大的程度上和 web 的大规模使用有关,当然直接关联的还是 HTML5 风暴。当你身边不从事 IT 的人都开始说 HTML5 的时候,你知道这个技术概念的副作用要来了。

好吧,闲话不说,我们说正题。

当下,在 Cocos2d-x 中,绑定脚本究竟选择 Lua 还是 JS ?

首先我们要明白,对比绑定脚本与对比语言本身是有巨大的差别的。简单的说作为绑定脚本的语言只是作为计算机语言本身的一小部分。

当我们通常在说起一种编程语言时,我们往往会隐含着很多有关那种语言的相关的东西。比如语言的演变历史,语言产生所要直面的问题,语言的生态环境,等等。

具体的说在 cc2dx 中,绑定脚本的作用就是调用框架本身的 cpp 的接口,这些接口以 cc2dx 框架本身的风格展现,所以,绑定脚本语言本身的特性被抹去了大半,而且因为 cc2dx 使用环境所限,绑定脚本也很难,依靠自己语言的各种生态环境中的资源,比如 Lua 没法直接用 luarock ,Lua 的 C 语言库也很难整合到项目中, JS 在这方面的处境就更尴尬了,因为 JS 设计之初就是为了让它运行在浏览器之中处理各种 web 问题, JS 的代码资源虽多,但是能直接向 cc2dx 提供帮助的却很少。

当然,还有一个问题我们需要明确,就是作为计算机语言本身, Lua 要比 JS 优秀,当然,我们对比两个事物的好坏的时候,需要有一个参照系,在这个语境下就是从作为计算机语言对于程序员的心智负担来讲的。

Lua 的设计从简,但是并不粗糙。 JS 设计确有很多让人用普通思维模式难以接受的地方。对于 JS 的语言设计问题的吐槽太多了,这里不赘述。单单是 this 作用域问题就让人如鲠在喉。

所以总结一下:

1. 对于绑定脚本而言,脚本语言本身的特性事实上已经被宿主框架限制,这个角度看,两种脚本语言没什么差别。

2. 在语言最基本的语法和一些实现特性上, Lua 比 JS 更加规范和更小的对于程序员的心智负担。

综上所述,当前, Lua 更适合作为 cc2dx 的绑定脚本语言。

放下

一直都觉得,所谓放下释怀都是很滑稽的说法,好像你可以有选择不放下不释怀似的。

开搞

一直都没有离开移动互联网,但是也一直没有参与具体的一线客户端开发。现在倒好,一下子 iOS 、 Android 同时开搞,惭愧以前看东西太过浅薄,书到用时方恨少。

不过也好,可以尝试一下极限学习的过程,也就是在未来的3个月要把 iOS 、 Android 开发都摸熟,能搞出东西,能把脑海中勾勒出来的东西做成具体的产品。

有段子讲:什么是人才?人才就是给你一个任务搞定了,再给你一个任务又搞定了。有时总抱怨时事不济,现在有了机会就是要去做个人才。

是为记。

使用 OpenResty 架设 Websocket Echo Server

喜大普奔! 春哥维护的 OpenResty 项目今天发布了 1.4.2.9 版本,最大的改进就是集成了 LuaRestyWebSocketLibrary ,这让开发 Websocket 服务器变得非常简单,这里我记录一下做一个简单的 echo server 。

我使用的系统是 ubuntu 13.04 64位,使用的 websocket 客户端是由 Python 编写的 websocket-client ( https://github.com/liris/websocket-client )。

首先下载 OpenResty 源代码、编译:

wget http://openresty.org/download/ngx_openresty-1.4.2.9.tar.gz

tar zxvf ngx_openresty-1.4.2.9.tar.gz

cd ngx_openresty-1.4.2.9

./configure --with-luajit

注意, OpenResty 依赖 perl 5.6.1+, libreadline, libpcre, libssl ,因为我已经安装过了,所这里没有安装步骤。如果没有安装可以执行 sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make 进行安装。

$ make
$ sudo make install

这样 OpenResty 就被安装到默认的 /usr/local/openresty 目录中了,我们验证一下。

$ cd /usr/local/openresty/nginx/sbin
$ ./nginx -V
nginx version: ngx_openresty/1.4.2.9
built by gcc 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/openresty/nginx --add-module=../ngx_devel_kit-0.2.19 --add-module=../echo-nginx-module-0.48 --add-module=../xss-nginx-module-0.03rc9 --add-module=../ngx_coolkit-0.2rc1 --add-module=../set-misc-nginx-module-0.22 --add-module=../form-input-nginx-module-0.07 --add-module=../encrypted-session-nginx-module-0.03 --add-module=../srcache-nginx-module-0.22 --add-module=../ngx_lua-0.9.0 --add-module=../headers-more-nginx-module-0.22 --add-module=../array-var-nginx-module-0.03rc1 --add-module=../memc-nginx-module-0.13 --add-module=../redis2-nginx-module-0.10 --add-module=../redis-nginx-module-0.3.6 --add-module=../auth-request-nginx-module-0.2 --add-module=../rds-json-nginx-module-0.12rc10 --add-module=../rds-csv-nginx-module-0.05rc2 --with-ld-opt=-Wl,-rpath,/usr/local/openresty/luajit/lib --with-http_ssl_module

然后我们编写一个需要使用的 nginx 配置文件:

#file: ~/Works/OpenResty/echo/nginx.conf

worker_processes  1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;

        location /s {
            content_by_lua '
            
            local server = require "resty.websocket.server"
            
            local wb, err = server:new{
              timeout = 5000,
              max_payload_len = 65535
            }
    
            if not wb then
              ngx.log(ngx.ERR, "failed to new websocket: ", err)
              return ngx.exit(444)
            end

            while true do
              local data, typ, err = wb:recv_frame()
              
              if wb.fatal then
                ngx.log(ngx.ERR, "failed to receive frame: ", err)
                return ngx.exit(444)
              end
              
              if typ == "close" then break
  
              elseif typ == "text" then
                local bytes, err = wb:send_text(data)
                if not bytes then
                  ngx.log(ngx.ERR, "failed to send text: ", err)
                  return ngx.exit(444)
                end
              end
              
            end
            wb:send_close()
    
            ';
        }
    }
}

然后启动加载写好的配置启动 OpenResty :

$ sudo /usr/local/openresty/nginx/sbin/nginx  -c ~/Works/OpenResty/echo/nginx.conf

然后我们用 Python 写个 client 测试一下:

#file: test_echo.py

from websocket import create_connection
ws = create_connection("ws://localhost/s")

print "Sending 'test echo'..."
ws.send("test echo")
print "Sent"
print "Reeiving..."
result =  ws.recv()
print "Received '%s'" % result
ws.close()

执行脚本

$ python test_echo.py
Sending 'test echo'...
Sent
Reeiving...
Received 'test echo'

测试成功!

这样,一个高性能的 websocket echo server 就搭建好了。