在LuaJIT中通过FFI直接调用newlisp

2012年5月17日 没有评论

1. 首先,当然是编译newlisp,并拷贝到/usr/lib/libnewlisp.so
2. 编译luajit,启动之

上代码

--载入ffi
ffi = require("ffi")
--载入newlisp
newlisp = ffi.load("newlisp")
--定义newlisp的公开API
ffi.cdef[[
char * newlispEvalStr(char * cmd);
]]
 
--接下来,就是调用过程了
newlisp_str = "()"
tmp = ffi.new("char[2]") -- 因为newlispEvalStr的参数是char*,而newlisp_str是string,需要转一下
ffi.copy(tmp, newlisp_str)
 
--执行
newlisp.newlispEvalStr(tmp)
 
 
---------------------------------------------
--------------封装一下,做个库------------------
---------------------------------------------
 
function newlisp(newlisp_str)
    local ffi = require("ffi")
    local newlisp = ffi.load("newlisp")
    ffi.cdef[[
       char * newlispEvalStr(char * cmd);
    ]]
    local tmp = ffi.new("char[" .. #newlisp_str .. "]")
    ffi.copy(tmp, newlisp_str)
    newlisp.newlispEvalStr(tmp)
end

TODO: 改为lua-newlisp形式的调用

Related Posts:

  • No Related Posts
分类: lisp 标签: ,

将诺顿Ghost(诺顿克隆精灵)正版化了

2012年5月12日 没有评论

不打算说其他的,就贴一下邮件内容吧:

感谢您光临诺顿网络商店。
以下是您所购买产品的下载信息。
请务必妥善保管本邮件。

[订单内容]
───────────────────────────────────
[订单号码]       NSCN0000017XXXX
[定购日期]       2012-05-12 22:09:28
───────────────────────────────────
[订购的商品1]      诺顿克隆精灵15.0 一用戶 下载版
[类别]            
[数量]             1 个
[产品密钥]   09-A052-0969-XXXXXX
───────────────────────────────────

Related Posts:

  • No Related Posts
分类: 其他 标签:

增强型Proxy_Pass – 替换nginx内置的proxy_pass

2012年5月9日 没有评论

项目地址: https://github.com/wendal/lua-resty-http

这个项目是https://github.com/liseen/lua-resty-http的fork版本, 暂未被合并.

nginx内置的proxy_pass有几个问题:
1. 无法方便的调整后端host
2. 总是等待后端host把响应写完了,才开始向客户端写数据
3. proxy_next_upstream不灵活

演示,实时proxy_pass,每读取1k就往浏览器写1k数据:

local url = 'http://'
if ngx.var.http_host then
   url = url .. ngx.var.http_host 
end
url = url .. ngx.var.request_uri  -- 拼接完整的URL
if ngx.var.args then
   url = url .. '?' .. ngx.var.args
end
local ok, code, headers, status, body  = hc:proxy_pass {
    url = url,
    fetch_size = 1024, -- 分段大小
    max_body_size = 100*1024*1024 ,  --响应体的最大大小.
    headers = ngx.req.get_headers(), -- 传递客户端的参数,可以根据需要进行修改哦.
    method = ngx.var.request_method, -- 真实还原客户端的请求方法,当然,你可以改!!
}
if not ok and not ngx.headers_sent then
    ngx.exit(502) -- 出错了哦? 这里只是简单遵循了nginx在后端报错时的响应,你完全可以实现自己的逻辑,进行错误处理
else
    ngx.eof()
end

核心扩展点,这是http.lua中的代码,我在这里附上中文注释:

-- proxy_pass方法支持3种回调哦
-- 提醒一句,回调里面,你可以调用任意ngx_lua的代码哦,就是说,你连ngx.exit(404)之类的中断请求的操作,也是完全可以的
function proxy_pass(self, reqt)
    local nreqt = {}
    for i,v in pairs(reqt) do nreqt[i] = v end
 
    -- 响应回调,可以替代proxy_next_stream的功能哦,例如替换响应码,或者进行转向其他请求
    if not nreqt.code_callback then 
        nreqt.code_callback = function(code, ...)
            ngx.status = code
        end
    end
 
    -- header回调,可增减resp的header
    if not nreqt.header_callback then
        nreqt.header_callback = function (headers, ...)
            for i, v in pairs(headers) do
                ngx.header[i] = v
            end
        end
    end
 
    -- body回调,注意chunked的情况哦
    if not nreqt.body_callback then
        nreqt.body_callback = function (data, chunked_header, ...)
            ngx.print(data)
            if chunked_header then
                ngx.print('\r\n')
            end
        end
    end
    return request(self, nreqt)
end

安装:
先编译openresty
将lib/resty/url.lua和lib/resty/http.lua拷贝进openresty的lualib中

注意: 回调的API尚未锁定, 将来可能根据需要添加更多参数

Related Posts:

  • No Related Posts
分类: Nginx 标签: , , , ,

bfr-非阻塞的管道缓存器,解决Linux管道缓冲区过小的问题!!

2012年5月7日 没有评论

官网地址: http://glines.org/software/bfr

Google上,”Linux Pipe Buffer size”,”Linux管道缓冲区是否可调整”"增大pipe缓冲区大小”之类的查询,能出30万条记录…
Linux上的管道, 要不就是4k,要不就是64k, 很多时候根本不够用 — 我遇到需求的比较夸张,每秒传输200mb的数据通过一个管道,悲催…, 问题如果从几秒钟的跨度看, 输入输出是均衡的,但细看一下, 一秒之内的输入输出非常不均衡, 导致输入输出都耗费大量时间在阻塞式读写中

前一段时间,已经打算自己写一个类似的缓冲器, 桥接管道两段,做个大缓存,可惜,由于C水平有限,且找到替代方案,就不了了之

终于,问题还是回来了, 而且,很巧的,我找到了bfr,一个古老的管道缓冲器(2004年之后就没有更新了…),So, 为其建立一个github的库 https://github.com/wendal/bfr

使用说明,简单翻译:

bfr v1.6 (c) 1999-2003 Mark Glines <mark@glines.org>
Usage follows:
 
bfr [-v|--verbose] [-t0|--threshold=0] [-T0|--timeout=0]
        [-b100|--bufsize=100] [-p<arg>|--progress=<arg>] [-m0|--minimum=0]
        [-T90|--throttle=90] [-C0|--speedcap=0] [<input file or -> ...]
 
short --long       default desc
----------------------------------------------------------------------------
-h    --help       -       display this (hopefully) helpful message.(帮助信息)
-v    --verbose            enable verbosity (use twice for pedantic verbosity) (详尽信息,除非你遇到bug!!)
-p    --progress   k1k     Enables "progress mode" (see manpage) (进度显示, 强烈建议无视这个选项)
-m    --minimum    600k    set the amount of buffer to reach before output
                           begins (to ensure a full stream even at start).(低于多少缓冲,就先不输出)
-i    --initial    minimum Special case of --minimum to preload at the start
                           of operation.  If unset, --mimumum value is used.(真正输出前,先接收多少数据)
-t    --timeout    0       time, in seconds, to wait before aborting if both
                           input and output are locked.  0 = wait forever.(输入输出被阻塞的超时设置,基本上是用不上的)
-T    --throttle   90      after filling the buffer, the percentage to let the
                           amount of onhand data to go down to before accepting
                           more input. (缓冲区接近满的时候,停止接收数据,直至缓冲区的占有率下降)
-C    --speedcap   0       If set to a non-zero value, bfr will allow only
                           this many bytes to be output per second. (限制流出的速率,基本上没用)
 
-b    --buffersize 1M      full size of memory buffer.(总的缓冲区大小,非常重要!!)
 
-f    --fork               forks off the read half, to work around buggy
                           kernels which block even in nonblocking mode, such
                           as when reading from a cdrom or nfs volume hangs
 
-o    --output     -       selects the output device(输出到哪里,默认是stdout)

关于编译,虽然它提供了configure等标准的构建脚本,但实际上,仅bfr.c和bfr.h是必须的, 简单修改bfr.h,定义VERSION,移除config.h,即可直接编译bfr!!

Related Posts:

  • No Related Posts
分类: VPS/Linux 标签: , , , ,

成功编译OpenJDK 7u2 ! 哦也!

2012年5月6日 没有评论

这个周末,连续编译了好几款开源程序:
ffmpeg+x264 很传统的编译,./configure和make
mongo+v8 使用scons进行编译,改为V8引擎的mongo,性能是否会大幅提速呢? 打算出个报告哦!
5.5 使用cmake

最后一个重头戏,本打算编译Chrome的,但发现其源码实在太大了,改为编译向往已久的OpenJDK 7u2

编译环境,Ubuntu 12.04 x64桌面版, root用户下操作

准备工作

View Code SHELL
apt-get build-dep openjdk-6
apt-get install openjdk-6-jdk
apt-get install libasound-dev build-essential

下载OpenJDK 7 update 2 的源码

View Code SHELL
cd /opt
wget http://www.java.net/download/openjdk/jdk7u2/promoted/b13/openjdk-7u2-fcs-src-b13-17_nov_2011.zip
unzip openjdk-7u2-fcs-src-b13-17_nov_2011.zip
cd /opt/openjdk

开始编译,会经历多个错误zzZZ

View Code SHELL
export ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk-amd64
export LANG=c
jdk/make/jdk_generic_profile.sh
make sanity
 
#确认无错误后,执行
make ALLOW_DOWNLOADS=true
 
#然后,就等吧,必然出错,需要编辑一个文件
vim hotspot/make/linux/makefiles/gcc.make
#将其中的 WARNINGS_ARE_ERRORS = -Werror 注释掉
 
#OK,再启动make
make ALLOW_DOWNLOADS=true
 
#然后,就到sound出错了
cd jdk/make/javax/sound/jsoundalsa
vim Makefile
#找到CPPFLAGS ,在其结尾,添加 -lasound
#如果再次make还是失败在这里,那么 ,先还原上一个修改, 并拷贝出错的最后一条gcc命令,添加-lasound后执行,应该无错误地pass
 
#再次make
make ALLOW_DOWNLOADS=true
 
#OK,你会遇到最后的错误, corba的什么什么类找不到?!
cp -r /opt/openjdk/build/linux-amd64/corba/classes/* /opt/openjdk/build/linux-amd64/classes/
 
#好了,你最后一次跑make了,这次应该能够成功了!!
make ALLOW_DOWNLOADS=true
 
 
#漫长编译后,你终于能看到编译成功的提示:
########################################################################
##### Leaving jdk for target(s) sanity all docs images             #####
########################################################################
##### Build time 00:04:19 jdk for target(s) sanity all docs images #####
########################################################################
 
-- Build times ----------
Target all_product_build
Start 2012-05-06 23:07:41
End   2012-05-06 23:12:30
00:00:04 corba
00:00:14 hotspot
00:00:02 jaxp
00:00:06 jaxws
00:04:19 jdk
00:00:04 langtools
00:04:49 TOTAL
-------------------------
make[1]: Leaving directory `/opt/openjdk'

大功告成,来玩玩吧!

View Code SHELL
#现在,跑一下你的OpenJDK 7u2吧!!
/opt/openjdk/build/linux-amd64/bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-root_2012_05_06_19_19-b00)
OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode)
 
编译一个HelloWorld试试:
/opt/openjdk/build/linux-amd64/bin/javac /tmp/Hi.java
#################################
root@ubuntu:/opt/openjdk/build/linux-amd64# /opt/openjdk/build/linux-amd64/bin/java -cp /tmp Hi
Hi, this is my openJDK!
root@ubuntu:/opt/openjdk/build/linux-amd64# 
#################################

Related Posts:

  • No Related Posts
分类: Java 标签: , , , , , , ,