Archive for March, 2008

erlang的regexp模块

Monday, March 31st, 2008

regexp

翻译: gashero

目录

应用于字符串的正则表达式函数。

1   导出函数

1.1   match(String,RegExp) -> MatchRes

String=RegExp=string()
MatchRes={match,Start,Length} | nomatch | {error,errordesc()}
Start=Length=integer()

在字符串String中寻找正则表达式RegExp的第一个最长的匹配。搜索最长可能匹配,如果几个结果相同则返回第一个。返回如下:

  1. {match,Start,Length} :匹配成功,返回开始和长度。
  2. nomatch :无法匹配。
  3. {error,Error} :发生错误。

1.2   first_match(String,RegExp) -> MatchRes

String=RegExp=string()
MatchRes={match,Start,Length} | nomatch | {error,errordesc()}
Start=Length=integer()

寻找第一个匹配,通常比 match 更快,并确定匹配的存在与否。返回值同 match 。

1.3   matches(String,RegExp) -> MatchRes

String=RegExp=string()
MatchRes={match,MatchRes} | {error,errordesc()}
MatchRes=list()

返回所有的不重叠匹配结果,返回如下:

  1. {match,Matches} :如果正则表达式是正确的,哪么如果没有匹配则返回空的列表。每个元素都是形如 {Start,Length} 的元组。
  2. {error,Error} :正则表达式有错。

1.4   sub(String,RegExp,New) -> SubRes

String=RegExp=New=string()
SubRes={ok,NewString,RepCount} | {error,errordesc()}
RepCount=integer

将第一个匹配成功的子字符串替换成New。字符串New中的 & 符号代表被替换掉的字符串,而 & 则代表原来的 & 符号。返回结果如:

  1. {ok,NewString,RepCount} :如果正则表达式正确,则RepCount为替换执行的次数,为0或1。
  2. {error,Error} :正则表达式有误。

1.5   gsub(String,RegExp,New) -> SubRes

基本等同于 sub ,不同在于所有的不重叠会被替换,而不仅仅是替换一次。

1.6   split(String,RegExp) -> SplitRes

String=RegExp=string()
SubRes={ok,FieldList} | {error,errordesc()}
FieldList=[string()]

通过正则表达式将字符串切割成多个字段。如果分隔字符是空格 ” ” ,则分隔字符也隐含包括TAB字符。其他分隔字符没有此效应。返回值如下:

  1. {ok,FieldList} :字符串已经被切分成各个字段了。
  2. {error,Error} :正则表达式有误。

1.7   sh_to_awk(ShRegExp) -> AwkRegExp

ShRegExp=AwkRegExp=string()
SubRes={ok,NewString,RepCount} | {error,errordesc()}
RepCount=integer()

转换sh类型的正则表达式到awk类型的正则表达式。返回转换过的字符串。sh正则表达式是给shell用于匹配文件名用的,支持如下特殊字符:

    • :匹配任何数量任何字符
  1. ? :匹配单一任意字符
  2. […] :匹配范围内的字符,字符范围用符号 – 来分隔。如果第一个字符是 ! 则是相反的匹配。

尽管sh正则表达式并不强大,但在大多数时候却很好用。

1.8   parse(RegExp) -> ParseRes

RegExp=string()
ParseRes={ok,RE} | {error,errordesc()}

转换正则表达式字符串到可供其他正则表达式函数使用的内部格式。可以在调用其他函数时替换正则表达式的位置。这对于同一个正则表达式需要使用多次时非常有效。返回值:

  1. {ok,RE} :匹配成功则返回内部表示法。
  2. {error,Error} :正则表达式有误。

1.9   format_error(ErrorDescription) -> Chars

ErrorDescriptor=errordesc()
Chars=[char() | Chars]

在匹配失败时返回匹配错误的描述信息。

2   正则表达式

这里提到的正则表达式知识 egrep 和AWK语言中的子集。他们由如下字符组成:

c 非特殊意义的字母c
\c 匹配转码序列或字面上的c
. 匹配任意字符
^ 字符串开头
$ 字符串结尾
[abc…] 字符类,即指定字符组成的集合。字符范围是两个字符用 – 连接
[^abc…] 否定字符类,不匹配集合中的字符
r1 | r2 轮流,匹配r1或r2
r1r2 串联,匹配r1并且r2
r+ 匹配一个或更多的r
r* 匹配零个或多个的r
r? 匹配零个或一个的r
分组,匹配r

转码序列允许等同于Erlang字符串:

\b 退格
\f 换页(form feed)
\n 换行(line feed)
\r 回车
\t TAB
\e escape ESC
\v 纵向TAB
\s 空格
\d 删除
\ddd 八进制值ddd
\c 任何除了上面字符以外的,如\或”

可以让这些函数工作的更方便,比如在 io:get_line 中读取新行,当然字符 $ 也会匹配 “…n” 。如下例子时Erlang一些数据类型的正则表达式:

Atoms [a-z][0-9a-zA-Z_]*
Variables [A-Z_][0-9a-zA-Z_]*
Floats (\+|-)?[0-9]+\.[0-9]+((E|e)(\+|-)?[0-9]+)?

正则表达式是以Erlang字符串来编写的。这意味着字符 \ 或 ” 必须以转码方式来书写。例如浮点数的正则表达式就是: (\\+|-)?[0-9]+\\.[0-9]+((E|e)(\\+|-)?[0-9]+)?

正则表达式并不是一定要有转义序列字符的,他们可以自动生成。除了用在不同的地方,否则与普通的Erlang字符串是一样的。

3   作者

Robert Virding – support@erlang.ericsson.se

erlang的string模块

Monday, March 31st, 2008

string

翻译: gashero

目录

字符串处理函数库。

1   导出函数

1.1   len(String) -> Length

String=string()
Length

返回字符串的字符数。

1.2   equal(String1,String2) -> bool()

String1=String2=string()

测试两个字符串是否相等,如果相等返回 true ,不相等返回 false

1.3   concat(String1,String2) -> String3

String1=String2=String3=string()

连接两个字符串成为新的字符串,返回新的字符串。

1.4   chr(String,Character) -> Index

String=string()
Character=char()
Index=integer()

返回一个字符串中某个字符第一次出现的位置,如果不存在则返回0。

函数 rchr 拥有相同参数,但是从右侧开始计算。

1.5   str(String,SubString) -> Index

String=SubString=string()
Index=integer()

返回子串匹配位置,未匹配则返回0。例如:

> string:str(" Hello Hello World World ", "Hello World").
8

函数 rstr 拥有相同参数,但是从右侧开始计算。

1.6   span(String,Chars) -> Length

String=Chars=string()
Length=integer()

返回String匹配Chars中最多字符长度,从前开始。例如:

> string:span("\t    abcdefg"," \t").
5
> string:cspan("\t    abcdefg"," \t").
0

函数 cspan 则是取从前开始第一个匹配时前面不匹配的部分。后面的Chars可以包含多个字符用于匹配。

1.7   substr(String,Start[,Length]) -> SubString

String=SubString=string()
Start=Length=integer()

取得字符串的子字符串,可以指定开始处和长度,长度可省略。例如:

> string:substr("Hello World",4,5).
"lo Wo"

1.8   tokens(String,SeparatorList) -> Tokens

String=SeparatorList=string()
Tokens=[string()]

根据分隔符号列表中的字符将字符串切割成词法符号。例如:

> string:tokens("abc defxxghix jkl","x ").
["abc","def","ghi","jkl"]

1.9   chars(Character,Number[,Tail]) -> String

Character=char()
Number=integer()
String=string()

返回包含指定数目个字符的字符串,可选的指定随后跟着的字符串Tail。

1.10   copies(String,Number) -> Copies

String=Copies=string()
Number=integer()

返回包含指定数量份复制过的字符串。

1.11   words(String[,Character]) -> Count

String=string()
Character=char()
Count=integer()

返回字符串中的单词个数,分隔符可以在第二个可选参数指定。例如:

> string:words(" Hello old boy!",$o).
4

注意分隔字符必须以美元符号开头,后面指定,如上的 $o

1.12   sub_word(String,Number[,Character]) -> Word

String=Word=string()
Character=char()
Number=integer()

返回指定位置的单词,单词间的分隔符定义同上。注意这里的位置数字是以1开始的。例如:

> string:sub_word(" Hello old boy !",3,$o).
"ld b"

1.13   strip(String[,Direction[,Character]]) -> Stripped

String=Stripped=string()
Direction=left | right | both
Character=char()

返回去掉了两端空白的字符串,可以指定方向和空白字符。 strip/1 等同于 strip(String,both) 。例如:

> string:strip("...Hello.....",both,$.).
"Hello"

1.14   left(String,Number[,Character]) -> Left

String=Left=string()
Character=char
Number=integer()

返回从左起,调整过长度为指定数字的字符串,可以指定后面跟的填充字符,默认为空格。如果字符串太长也不会被截断。例如:

> string:left("Hello",10,$.).
"Hello....."

函数 right 拥有相同的参数,只不过会将字符串右对齐。

1.15   centre(String,Number[,Character]) -> Centered

String=Centered=string()
Character=char
Number=integer()

将字符串中间对齐扩充到指定长度,不足不用用空格或指定字符填充。

1.16   sub_string(String,Start[,Stop]) -> SubString

String=SubString=string()
Start=Stop=integer()

返回字符串的子字符串,可以指定开始位置和结束位置。例如:

> string:sub_string("Hello World",4,8).
"lo Wo"

注意不同于 substr 的指定开始和长度,这个函数是指定开始和结束。

1.17   to_float(String) -> {Float,Rest} | {error,Reason}

String=string()
Float=float()
Rest=string()
Reason=no_float | not_a_list

将一个开始于浮点数的字符串转换成浮点数,剩余无法识别的会返回。例如:

> {F1,Fs}=string:to_float("1.0-1.0e-1"),
> {F2,[]}=string:to_float(Fs),
> F1+F2.
0.900000
> string:to_float("3/2=1.5").
{error,no_float}
> string:to_float("-1.5eX").
{-1.50000,"eX"}

1.18   to_integer(String) -> {Int,Rest} | {error,Reason}

String=string()
Int=integer()
Rest=string()
Reason= no_integer | not_a_list

将参数中以整数开头的字符串转换成整数和剩余部分。例如:

> {I1,Is}=string:to_integer("33+22"),
> {I2,[]}=string:to_integer(Is),
> I1-I2.
11
> string:to_integer("0.5").
{0,".5"}
> string:to_integer("x=2").
{error,no_integer}

1.19   to_lower(String) -> Result

String=Result=string()
Char=CharResult=integer()

将字符或字符串转换成大写或小写的形式。其他形式:

to_lower(Char) -> CharResult
to_upper(String) -> Result
to_upper(Char) -> CharResult

2   注意

这里面有些函数看起来有点像,这是因为 string 包是由以前的两个包合并而成,以前的函数全部都保留下来了。

正则表达式函数放在了独立的模块 regexp 中了。旧的入口点为了向后兼容也保留了,不过在未来的发行版中会取消,所以建议用户使用新的模块。

string 中没有文档化的函数不要使用。

3   作者

Robert Virding – support@erlang.ericsson.se

Torbjorn Tornkvist – support@erlang.ericsson.se

从山上向下望望非主流

Sunday, March 30th, 2008

从山上向下望望非主流

这几天有个很搞笑的视频,一个非主流女孩把80后骂了一段,地址如下:

http://www.tudou.com/programs/view/mpXCp6iG35s/

看这个视频笑了半天,尽管我也是80后,是宅男,属于被骂的那一群。在主流社会还没骂完80后的时候,90后开始出来找骂了,唉,这个时代变化的实在太快了。

有如我以前的帖子《唯快不破》一样,比我更快的人才是值得敬畏的。这群孩子还小,难免有更快的。就像在我大学的时候开始渐渐发现唱歌和拍电影的人开始渐渐有同龄人时的那种压力一样,恐怕现在已经开始有比我小的人进入社会高层了。

先不谈那些走非主流路线的吧,主流路线即高中-大学的路线。现在的90后年纪最大的也才刚成年,极其早熟的也才刚刚上大学。他们真的还小,少年不知愁滋味。看那个女孩对80后的一阵阵数落,有如找到了我们这代人当年的样子,一样的不可一世。同理可知,上一代,甚至一代代的人其实都是这样的过程。再同理可知,我们这80后的孩子即2000后,也一样有办法把90后当成老土数落一顿。历史这样循环的发展真的很有趣。

其实每个十年,都有这个时代自己的烙印,这个年龄群也有特殊的经历和生活方式。谈谈80后吧,一个重要特点就是正好开始赶上高等教育扩招。我们成长的过程没有经历过饥荒和动乱,一直生活的和平的年代。成长历程中唯一算是一点磨难也就是中考高考了,受到的苦比70后要少很多。同时在和平年代长大的80后,愤青也开始减少。

虽然赶上了扩招,但是整个80后却几乎可以算是整个年龄段承受过最大的升学压力。虽然录取率有所提高,但是却让几乎所有人都向着同一个方向拼命。也许也就是这段经历,造就了一大批的宅男户女。

80后宅男,蓬松杂乱的头发,拖沓的衣服,从山林里走出来,向山下望望,一90后小女孩在骂街。哈哈哈,这本身就成了景色了。

说到这时,再看看,开始有一80后裹布女开始反击了。地址如下:

http://www.tudou.com/programs/view/M59aWFGsCxg/

本来泼妇骂街就是很好玩的事情,更何况对骂。不过总的来说这个反击太没意思了,丫的这女人翘着二郎腿,说话还挺傲气的。最烦就是这类女人了。被批评了就老老实实接受么,更何况“做人要低调”。

时间总是会流逝,80后即便是想继续非主流下去,也无奈进入了主流的行列。90后的非主流也维持不了几年,终归会有更变态,更非主流的2000后出来骂街。

80后,准备退出非主流的历史舞台吧。

民警叔叔的信箱

Wednesday, March 26th, 2008

民警叔叔的信箱

前几天上班时经过了南苏州路的良友饭店,初到上海时还曾经在那里住过六天。经过时发现墙上居然钉着一个信箱,上面具体记不清了,总之是给警察用的。于是浮想联翩。

上海是个有多年富裕历史的地方,也很容易找到一些繁荣的遗迹,比如巨老型号的bmw等等。而这个民警的信箱也很有趣。让我想起假如有人需要报警,那么可以这么写:

尊敬的民警同志:

你好,我这里附近正在发生一起刑事案件,犯罪嫌疑人即将逃走,望尽快到达处理此事。

此致
敬礼!

然后民警叔叔收到信以后,决定回信:

尊敬的市民同志:

你好。收到你的信以后,我们立即赶往出事现场,发现犯罪嫌疑人已经逃走半个多月。感谢你对上海市治安建设的关心。

此致
敬礼!

C.N.R.

Friday, March 21st, 2008

C.N.R.

City Night Racer-都市夜行者

2008年3月21日,我再次自己一个人骑车出去玩,晚20:40开始,一直到22:30回来。

一直很喜欢夜晚,因为夜晚时总是可以很集中精力,并且忘却很多烦心事。今天是从我住处的汉中路地铁站一直到上海财经大学。一路向北,沿恒丰路到达中山北路,然后沿中山北路一直到达上海财经大学。

一路晃晃悠悠,时快时慢的骑着,看看路边风景。上海有很多高架路,可以达到普通路面两倍以上的交通能力。顺着这些高架路,毫无尽头的走下去,感觉总是有些压抑的,就像在走隧道一样。还好,我可以不去看中山北路上面的高架路,只是看路边的各色建筑就可以了。

出发不久就到了虹口区,那里有如闸北一样的破旧,好多危房。除了可以体会一下这个世界我并不是最惨的以外,实在没什么观赏价值。共和新路与中山北路交叉口是个很大的路口,假如不带着地图恐怕会走丢的。唉,我语文依旧是很烂……

上海财经大学是这次的目的地。主要是2008年初时突然想到自己该进修一下了,而且见到同事里面有人在交大读软件工程在职硕士,也感觉自己不能闲下来。于是想想自己的情况。

2007年3月到上海时,住了几天宾馆,那是我并不漫长的生命中难得的闲下来的时间。于是整天看电视,那时如果我逼着眼睛一般会去中央音乐频道,听了不下五遍音乐剧《猫》。不过最让我有所启发的是那时开始看第一财经,我对金融的兴趣大概也就是从这个时候开始的。后来多亏了一起玩python的朋友linker,发给我小说《货币战争》的节选,我才真正的开始了解一点东西。

其实这个世界偶然的东西总是很多,并且这些偶然促成了一个人的改变。再后来就是gmail广告中看到的forex.com外汇期货,再后来就是纸黄金。forex.com的外汇期货算是逼着我仔细看了很多宏观经济的东西了。结合我的编程技术,提出了三角货币对算法和均线算法,虽然后来证实都是无效的,但是这点实践总是比空看书要好。

再后来,就是买纸黄金。然后还是那个无所不知的好友jorge,一起研究纸黄金。在第一次买入和卖出的交易中,小赚14%,不过这个过程用了两个月的时间。

网上看了太多的关于软件工程师30岁以后命运的文章了。尽管我很想做技术,不过貌似国内的环境不允许,早晚要选择转行。看了除了生物学,我还多了一种选择。

今年下半年,试着找空去上海财经申请读一个金融学的在职硕士。这个世界我不明白的东西太多了,不过我会尽力学。老老实实用两年读完这个学位,到时候公司也该上市了,随后就是我的一次飞跃。哈哈,计划总是很美好。

跑题远了,回到中山北路上。到了上海财经大学,真是让我见识了世界上居然还有比我那个大学还小的学校。无论从校园里哪个方向走,恐怕都不会有超过一千米就可以出学校了。呵呵,不过客观的讲,上海的学校都是很小的,但这并不影响在这样一个弹丸之地搞出一番学术成就。上海财经大学也就是靠这个弹丸之地做到国内财经类学校排名第一位的。呵呵,我喜欢。

校园里很幽静,很多树,路边也没有刺眼的路灯。图书馆里面坐的满满的。让我想起我颓废的大学生活,我整个大学阶段去图书馆平均一个月一次。其他时间都在实验室里面鬼混了。如果上天给我重来一次的机会,……,……,……,我估计还是那样的,哈哈哈。

每个人都有一份命运,也许我的命运就是不停的抗争,用很大的努力获得一点点的成绩。

真正的7231-4P加装USB功能

Tuesday, March 18th, 2008

真正的7231-4P加装USB功能

其实我还是比较菜的,标题忽悠人而已。同时恭喜你被忽悠了。

我的硬件:Belkin F5D7231-4P

因为nicky的缘故,我对tomato是比较有好感的,并且尽可能的选择tomato来做改装。

网上已有的经典《belkin7231-4p潜力挖掘教程1-挂U盘》,地址如下:

http://www.right.com.cn/forum/viewthread.php?tid=11637&highlight=

不过讲的是dd-wrt,内核版本是2.4.30,而即便是最新版的tomato-1.17,内核也只是2.4.20。所以并不适用。最后我选择了一个网友制作的firmware,基于tomato-1.17,加装了USB驱动和openvpn。介绍地址如下:

http://www.right.com.cn/forum/viewthread.php?tid=13909

安装过程比较白痴,就是在WEB界面选择新的firmware上传就是了。网上流传很多的tftp方式上传,我开关机多次也没有找到全部灯都亮起来的那一刻,所以并没有试验成功。不过说实在的,WEB界面上传更新firmware方式确实够白痴,我喜欢。

刷新完firmware以后,再次进入WEB管理界面,administration->Scripts,然后在那个很大的输入框里面输入如下内容:

insmod /lib/modules/2.4.20/kernel/fs/ext2/ext2.o
insmod /lib/modules/2.4.20/kernel/drivers/usb/usb-ohci.o
insmod /lib/modules/2.4.20/kernel/drivers/usb/storage/usb-storage.o
sleep 3
umount /jffs
umount /mnt
mount /dev/scsi/host0/bus0/target0/lun0/part1 /jffs
mount /dev/mtdblock/4 /mnt
mount -o bind /jffs/opt /opt

然后再次重启,你就可以用df -m命令看到/jffs目录已经挂载了你的USB存储设备了。

如果你一切进行的很顺利,这里在提醒一句,刷新firmware之前可以备份配置的,哈哈哈!

3月12日-3月13日的博客访问分析

Thursday, March 13th, 2008

3月12日-3月13日的博客访问分析

我一直是很关注我的博客被什么人访问的,所以安装了google分析的那个东西来看看。

这次分析的时间段是北京时间3月12日16:00-3月13日16:00的24小时。

此期间共163次pv,来自68个独立IP地址。

访问量排名第一位的是《zenoss快速指导》。zenoss作为sf.net上长期处于前十名的软件,是一个比较著名的监控系统,不过在我看来是个叫好不叫座的东西。按照我们头的说法就是:zenoss是程序员开发出来的,而nagios是运维工程师开发出来的,所以nagios长期占领开源监控系统的半壁江山而 zenoss一直发展的不好。这样也直接导致了一个后果就是zenoss的文档奇缺。我那段时间开发公司的QRMonitor监控系统,需要一个参考,也就顺便研究了一下zenoss,翻译了一个小手册。现在国内有关zenoss的手册级文档仅此一篇,所以各大搜索引擎给我带来了很多pv。不过我也只有这么一篇zenoss的文章,此页的访问流失率也非常高。

访问量排名第二位的是《Programming Erlang 第5章笔记 高级顺序编程》,这是《Programming Erlang》中比较基础的一章,也正符合了“越初级的东西读者越多”这一点。说实在的,现在Erlang的各方面的文档和教程都不好,推广也是非常困难的。国内难得的一点文档阅读数都很多。

访问量排名第三位的是《gashero的Pylons笔记》。说实在的我已经快一年不用这个东西了,当时用的时候也是很不喜欢,因为是工作关系,不敢怠慢,于是写了一大堆的笔记。现在就是这个样的一个结果,虽然我很不喜欢,不过如果有人愿意学也就算了。在这里再次强调一点就是,不建议学pylons。

我放弃“河边的小屋”已经快半年了,随后就是启用这个“惊帆之静默”的博客。还好半年的经营之下,访问量已经接近当时“河边的小屋”的一半了。这一点其实很不容易,毕竟河边的小屋在那时经常有csdn.net的关照,有很多推荐过来的用户的pv。

刚才回头又看看河边的小屋,pv已经接近13万了,在我停博以后又增加了一万多。csdn.net博客总排名已经跌落到400名左右了。在我停博之前,总排名是40-50名的样子,每天pv在350-400左右。呵呵,其实我对于这一点一直是很沾沾自喜的。我也用河边的小屋帮助我找到了现在的工作。csdn.net的博客虽然是偏向技术的,可是排名在最前面的那些全都是IT趋势类的博客,河边的小屋纯粹靠技术博客混到前50名已经很不容易,另外,就是我坚决不转载的传统。

河边的小屋已成历史,惊帆之静默还在成长,慢慢来吧。我的博客主要方向是python和erlang,不过看得出来,惊帆之静默在python方面已经远远算不上知名博客了,这也和python在最近这几年快速发展有关。erlang在国内还算得上一个新兴的技术,至少还可以混一点pv。

编程语言的哲学

Wednesday, March 12th, 2008

今天晚饭时,听到几个同事在谈用什么IDE,谈到了JBuilder、Eclipse、Netbean等等,提到了自动生成类模板,自动填充setter/getter等等。想想我自己,现在只用vim已经两年了。

我以前是用过一小段Java代码的,那时巨喜欢Eclipse,感觉那就是未来型的IDE,包含的功能太先进了。那个时候我也会用vim,不过除了写hello.java以外,真的没办法用。没法记忆那么多东西。

现在想来,也许我无法用vim写java代码的原因并不是vim的缺陷,毕竟有些语言是可以只用vim的,比如C、Python、Erlang。

如果一种编程语言所做的工作必须要依赖强大的IDE支持,是否从某种意义上暗示了编程语言设计的失败呢?

记不得哪本书上的牛人说过,人类可以理解的代码行数是很有限的,当然,人类可以记忆的东西也是很有限的。所以,我相信,一个糟糕的编程语言设计,加上强大的工具,其实带来的还是很低的工作效率。我在几年前放弃Delphi最直接的理由就是一个让我感到失望的编辑器,而我又没有其他选择。

最后,引用一句:世界上有三种程序员,一种用vi,一种用emacs,另一种用其他。

一个梦寐以求的开发平台

Tuesday, March 11th, 2008

berkin F5D7231-4P

我家里用的无线路由器。牛人nicky当初买这个东东时就已经深知其强大了,所以买了个足够强悍的平台,并且配备了32MB内存。我昨晚又把一个闲置的U盘给接上了,正在研究如何让它识别出来U盘。

一直以来都希望找一个足够小巧的开发平台,提及要很小,不需要显示器,有网络接口,最好是电池供电。前段时间的PSP已经可以让我小有兴奋了,只是IO不太完善,而这次的AP决定符合要求,更何况还有4个以太网接口。

这段时间要多研究一下了,现在只是知道了有DD-WRT,而家里的已经装上了Tomato-1.11。可以另外安装的软件 也很多,至少我需要的Python就是有的,还有很多python的扩展模块。只是想要研究一下的libpcap没在里面,不怕,只要有gcc一切都好说。