Ragel状态机生成器

Posted by: on Dec 4, 2008 | One Comment

Ragel可以把正则表达式翻译成有限状态机(FA)的各种语言表示,包括C、C++、Objective-C、D、Java和Ruby。Regular Expression和FA的用途很广,可以用于协议分析、数据解析、词法分析、用户数据校验等。在Ragel的帮助下,写一个atoi的函数非常容易,而且比标准库提供的atoi函数性能要高。

/*
 * Convert a string to an integer.
 */

#include 
#include 
#include 

%%{
	machine atoi;
	write data;
}%%

long long atoi( char *str )
{
	char *p = str, *pe = str + strlen( str );
	int cs;
	long long val = 0;
	bool neg = false;

	%%{
		action see_neg {
			neg = true;
		}

		action add_digit {
			val = val * 10 + (fc - '0');
		}

		main :=
			( '-'@see_neg | '+' )? ( digit @add_digit )+
			'n';

		# Initialize and execute.
		write init;
		write exec;
	}%%

	if ( neg )
		val = -1 * val;

	if ( cs < atoi_first_final )
		fprintf( stderr, "atoi: there was an errorn" );

	return val;
};

#define BUFSIZE 1024

int main()
{
	char buf[BUFSIZE];
	while ( fgets( buf, sizeof(buf), stdin ) != 0 ) {
		long long value = atoi( buf );
		printf( "%lldn", value );
	}
	return 0;
}

Geek的一天

Posted by: on Jun 8, 2008 | 3 Comments

回想一下自己的每个工作日,果然挺geek的。BTW,谁看到了我的blog的,有兴趣写写自己的每一个工作日怎么过的么?

7:00am   起床,洗漱,看一下中国当日的财经新闻
7:45am   上班
8:00am   到办公室
12:00pm 午餐
12:30pm 继续
4:00pm   下班,偶尔到超市买菜
5:00pm   看研究的题目,paper
6:00pm   晚餐,看当天的世界财经新闻
7:30pm   开始研究工作
10:30pm 中国股市开市
11:30pm 研究工作结束
12:30pm 中国股市上午收市,睡觉。

attend or not?

Posted by: on Apr 4, 2008 | One Comment

There is a very promising program. Being accepted into the program means money in the future. But the current situation is lack of money. To do, or not to do?

多伦多

Posted by: on Dec 30, 2007 | No Comments

两次无梦的睡眠以后,到了多伦多,飞机从香港到多伦多,航程15小时,晚点了8小时。多伦多天气很好,暴风雪过后是很漂亮的晴天,尽管天很黑——这是维度的威力。

因为航班晚点的原因,而且也要把所有的行李一同清关,所以行李不能直接转到下一班航班上。在check-in的柜台,办理check-in手续的姐姐很无奈的望着我,说:你要把超重的行李都转移到一个箱子,然后给手续费噢。我很无辜的说:我第一次来啊,行李很多,对不起哦,下次不会啦。于是argue成功。感谢这个check-in柜台的大姐姐。

办boarding pass是自助的,一开始不太习惯,后来还好,按了一会屏幕,还是一样嘛。

机场里到处是上网的地方,只是要钱。为了skype回家,所以给钱也没办法啦,充分利用吧。可惜这里没有赤立角机场那里的好,香港机场到处是电源插座,这里的座位旁边基本没有,有插座的地方全是很诡异的,例如厕所旁边……所以laptop不能充电了。

逐渐开始天亮了,马上要到远方的小岛去了。

出发,新起点

Posted by: on Dec 29, 2007 | 2 Comments

每年的12月29日,都有所不同。初中的12月29日,是在上网聊天打P中度过的;高中的12月29日,是在题目和书海中度过的;到了南京的12月29日,则是开始体会银色圣诞——之所以不是白色的原因,完全是因为南京的冬天温度不低,下雪经常只是下了几瓣雪花就停了。

当我还是一个初中小屁孩的时候,大家唯一能想到的好玩的事情是吃喝玩乐,我却喜欢坐在书堆里;到了所有人在准备高考的时候,我做了高考的逃兵,混比赛成绩求取保送;再长大一些以后,大学里,大伙都想混一个好成绩,我却想着公司,生意,恋爱。现在同龄人工作的工作,考研的考研,我又想,我应该有心思静下来想想学习的事情。这好像总是显得我很奇怪。

其实这挺彷徨的,一个人,没有陪同,也不知道在新的国度里能不能立住脚,找到一份好工作,做一个突出的学生。不过我知道一件事情,就是从此我需要独立,需要付出120%以上的努力,需要和其它肤色的人讲不同的语言。谁知道呢,能不能立脚,也是一种值得珍惜的经历,弥足珍贵。

我还挺幸运的,至少在出发之前,就找到了地方居住,不需要凄凄惨惨孤孤单单的找一个落脚的屋子。至少房间是光洁明亮的,而不是著名的留学生公寓——地下室。12月窗外的景色,自然就是白色的,不过尚且气候温和,而夏季天气更是宜人。

坐在机场里,有机会静默的想一些事情。机场里来来往往的人,匆匆的来,匆匆的去,匆匆的分别,匆匆的相聚;这一切的匆匆,构成了夜的背景。我心不知道堵住了什么,空空的,又好像满满的。

可能很多重新出发的人,也会跟我想的相似。此刻脚下是新的起点,要对自己说:站稳了,别趴下。

李开复先生应该一死以谢天下

Posted by: on Apr 10, 2007 | 5 Comments

话说 Google 做了一个谷歌拼音输入法,举世瞩目,including 本土的对岸的甚至国外的。然后事情来了,谷歌被揭发抄袭搜狗输入法。结果狐狸咬狗,然后又狗咬狐狸,一地鸡毛。

照我说,亲爱的 Schmidt 是请错人了。虽然李开复先生在微微软的活动能力还可以,但显然碰到狗狗就硬朗不起来了。结果谷歌是走了一个又走一个。“敬爱的李开复老师”,如果你有知,就知道道歉是没用的,赶快辞职下台吧。

[tags]Google, China, 拼音, 搜狗, plagiarism[/tags]

Linux 安全系列:用 grsecurity 保护 Linux

Posted by: on Sep 8, 2006 | 3 Comments

作为系统管理员,我们首先要担心的问题是一个系统的安全性和稳定性,其次才是它的效能和效率。

一个系统是否安全,一般来说取决于以下几点:

  • 系统对外接口的多寡,及其安全性
  • 系统内部向外的接触能力
  • 进入系统内部后,接触系统信息的可能性

对于必须开放访问的系统来说,成熟而可靠的系统保护措施是十分重要的。而对作为各种程序运行平台的操作系统而言,系统中的各种列表,例如目录、文件、进程等,都可以成为怀有恶意的用户甚至是骇客的窥探的窗口。例如一个已经侵入系统获得普通用户权限的骇客,可以通过观察系统中的各种服务器进程和相关的配置文件,探测系统的保护机制和各种漏洞。譬如一个普通用户,如果具有执行 Apache 的权限,那他就很有可能可以通过 Apache 的编译参数、版本查找服务器的漏洞。一个很重要的原则是:把服务器上的所有用户都看成是怀有恶意的使用者,所以系统必须限制普通使用者的权限。这是一个无关道德的问题,而是一个技术问题。

对于 Windows 来说,系统的权限控制可以通过 Active Directory 来实现。但这只是对文件访问的控制,而并没有涉及系统的进程、网络接口。当然,复杂的 AD 规则当然包括对网络服务的访问,可是这只是限制的系统的接口部分,并没有从根本上解决上述问题。Linux 本身也并没有复杂的系统安全机制,一如传统的 Unix 一样,Linux 是通过普通的文件权限来保护系统,而这并不足够。

为了解决上述问题,Linux 内核有几个相关的 patch,包括由 NSA 开发的 SELinux、Brad Spengler 开发的 GRSecurity 和 RSBAC Team 开发的 RSBAC。由于效能和简便性方面的原因,这里选择使用 GRSecurity。相关的比较可以看这里这里这里这里

GRSecurity (grsec) 内核的安装和配置

在 kernel 网站和 grsecurity 网站分别下载内核源代码和对应版本的 grsec patch。这里以目前的最新版,kernel 2.6.17.11 以及 grsec-2.1.9为例。

解开 linux-2.6.17.11.tar.bz2 压缩包之后,就可以进行 patch 了。以下是关键命令:

然后找到你的原来的内核配置文件,并配置之。

在 make oldconfig 的时候,请根据你的需要回答Y/N。后面将会继续 make menuconfig。

这里要选择 Security Level。可以根据你的需求选择 Low/Medium/High/Custom。不过一般来说,我在这里是选择 Medium 的。其它选项可以根据需求配置。下面是配置 Address Space Protection:

这里可以选择这样配置,但是 Disable privileged I/O 最好取消。因为很有可能某些服务器进程要用到 ioperm/iopl 这样的系统调用。然后是 RBAC 的配置:

这里可以把 Hide kernel processes 勾上,这样当开启 RBAC 时,内核进程都会被隐藏起来。Then, 文件系统保护:

这里可以全部勾上。Then, Kernel Auditing,也可以全部勾上。图片就不提供了。

下面是可执行文件保护:

如果系统是属于开放系统的话,可以把 Invert GID option 勾上,这样下面规定的 GID 就是 Trusted Users 的 ID,将不会收到 TPE 的限制。Network Protections,里面的内容也可以全部勾上。Sysctl support,sysctl 功能一定要打开,但是 Turn on by default 最好关闭,否则的话启动的时候设置的余地就不大了。

而至于 PaX 的设置,按照默认配置就可以了。

内核的编译和安装可以按照正常的步骤进行。不过值得一提的是,在 Ubuntu 6.06 LTS 中,需要更新 initrd 的时候,只需要使用 update-initramfs 命令就可以了。

重启后 grsec 的配置

比起 SELinux 来说,配置 grsec 并不困难。由于之前在配置内核时,已经打开了 sysctl 选项,所以我们接下来的配置只需要使用 sysctl 就可以了。我们可以打开相关需要的选项,下面是一个很简单的例子,可以写入 /etc/rc.local 中。

运行之后,就可以发现,世界一切都不同了:

这是 grsec 的效果之一,可以保护进程信息,用户只能查看到自己的进程,也不能用 netstat 查看网络连接情况。

RBAC 的配置和应用

RBAC (Role-based Access Control) 是 grsec 其中一项很强大的功能,它可以限制系统进程的各种访问权限,包括对文件、资源、网络以及系统调用、系统的capability的访问限制。例如,可以限制系统的 web 服务器 /usr/sbin/httpd,只允许它访问 /etc/httpd,/var/www,/var/log/httpd 以及 /var/run/httpd,/tmp 这几个目录,而其它目录,可以仅对它隐藏起来以限制它的访问。更可以限制这个进程,只允许其接受入站的信息,而不允许其 connect 到其它网络服务器。这种访问策略,更有利于建立安全的系统。

RBAC 功能由两部分来实现:内核的 grsec 接口 (/dev/grsec 设备) 和用户端的 gradm 程序界面。

gradm 程序源代码,可以在 grsecurity 网站下载。必须下载与 patch 对应版本的 gradm 程序。下载之后直接 make install 就可以安装了。

以下以 /usr/sbin/sshd 为例子说明 grsec 的策略设置:

subject /usr/sbin/sshd dp {
/ h
/bin/bash x
/dev h
/dev/log rw
/dev/random r
/dev/urandom r
/dev/null rw
/dev/ptmx rw
/dev/pts rw
/dev/tty rw
/dev/tty? rw
/etc r
/etc/grsec h
/home
/lib rx
/root
/proc r
/proc/kcore h
/proc/sys h
/usr/lib rx
/usr/share/zoneinfo r
/var/log
/var/mail
/var/log/lastlog rw
/var/log/wtmp w
/var/run/sshd
/var/run/utmp rw

-CAP_ALL
+CAP_CHOWN
+CAP_SETGID
+CAP_SETUID
+CAP_SYS_CHROOT
+CAP_SYS_RESOURCE
+CAP_SYS_TTY_CONFIG
}

在这里,/ 作为默认的路径,是被完全隐藏的。这就是说,ssh server 进程只能看到标记为 r 的文件和目录。下面 CAP_* 系列的设置,可以参看 /usr/include/linux/capability.h 中的说明。

参考:RBAC 配置说明,以及 gradm 的 policy 文件。

[tags]linux, grsecurity, security[/tags]

翻译:如何集中精力写作

Posted by: on Jul 7, 2006 | One Comment

原址:Bad Language: How to concentrate on writing
作者:Matthew Stibbe

当我要面对截止时间、一定要进行工作的时候,我会用一些方法来迫使自己集中精力。

  1. 关掉Email。我不会打开 Outlook (或者如果打开的话,我会关掉所有会告诉我有新邮件的提醒)。
  2. 隔离自己。戴上一个 Bose 的静音耳机,你会发现寂静是如此的珍贵。
  3. 贪婪与罪。我会提醒自己这份作品会为我赚了多少钱,如果我没有完成这份工作的话,我会感到如何羞愧。这有时候会有用。
  4. 停止 Blog 。时间紧迫的时候,像 blog 和吸尘这些会分散注意力的事情令人感到更逼迫。知道这一点会令你更容易抵抗注意力涣散。
  5. 早起。对于写作来说,早上6点是最有创作力的时间,而且不会有事情来分散你的注意力。比起工作得更晚,这会令你精神更愉悦。
  6. 给自己一点小奖励。我会对自己说:“Matthew,如果你能再写500词,你就能喝杯茶,吃点小饼干。”
  7. 把时间分段。在15、20、30、50分钟后设定闹钟,除了写作以外,不要做别的事情,直到写完为止。这看起来像是一个保持进度的好方法。
  8. 全屏工作。把 Word 调到全屏模式 (在视图菜单),摒除所有令你不能集中精神的事情。
  9. 打草稿。分成写作、修改几个步骤,把工作分成简单的部分来完成可以减轻压力。
  10. 转换环境。有的时候,如果我真的在挣扎着不知如何开始,会拿上笔记本(电脑)到咖啡厅去,随便潦一点东西出来。新的环境,是灵感的开始。

[tags]writing, work[/tags]

A reference rate for major choosing

Posted by: on Mar 11, 2006 | One Comment
You scored as Engineering. You should be an Engineering major!

Engineering
100%
Mathematics
92%
Anthropology
83%
Linguistics
75%
Theater
75%
Philosophy
75%
English
67%
Psychology
67%
Biology
58%
Journalism
58%
Art
58%
Chemistry
58%
Sociology
58%
Dance
42%

What is your Perfect Major? (PLEASE RATE ME!!<3)
created with QuizFarm.com

Useful Phrases

Posted by: on Jan 21, 2006 | No Comments
  1. 表示原因(because, since)
    attribute … to …
    ascribe … to …
    for the sake of sth
    result from
  2. 大量的、程度高 many, much
    significantly
    immensely
    magificently
    tremendously
    dramatically
    drastically
    considerablyj
    substantially
    noticeably
  3. 不可避免
    inevitably
    unavoidably
    absolutely
    definitely
    undoubtedly
    inextrically
  4. 表示否定(not)
    fail to
    no
    never
    nothing
    no one
    be far from
    little
    few
  5. 认为 think ->
    contend
    maintain
    claim
    state
    regard sth as
    view sth as
    deem sth as
  6. 忽略
    overlook
    ignore
    neglect
    disregard
    fail to take … into account
    be unaware of
    be unconcious of
  7. field (领域) ->
    domain
    realm
    sphere
    territory
  8. 建立(build)
    establish
  9. 引起、导致(cause)
    give rise to sth.
    bring about sth.
    trigger
    contribute to
    result in
  10. 影响(affect)
    influence
    impact upon
    exert an influence/impact upon
  11. 提供(provide, supply)
    provide sb. with sth.
    offer sb. sth.
    endow sb. with sth.
  12. 使某件事成立
    enable sb to do sth./enable sth.
  13. 抱怨、投诉:
    lodge a complaint
    express/exhibit/manifest a high level of disatisfaction/revulsion/replusion
  14. 更多的(more)
    additional
    excessive
  15. 过多(over)
    exceeding
  16. 需要:
    make a request for
    demand
    desire
  17. 有关系:
    be bound up with
    be subject to
    in connection with
    correlated to (correlate)
    in accord with
  18. 阻止(stop .. from)
    prevent … from
    preclude … from
    hamper sth
    make it difficult for sb to do sth
  19. 吸引兴趣(interest)
    appeal to
    arouse one’s interest
    attract/draw/capture one’s attention
    stimulate
  20. 程度小
    insignificant
    trivial
    petty
    fiddling
  21. 习惯(get used to)
    be accustom to sth.
    adapt oneself to sth
    condition himself to sth
  22. 分布
    scatter
    disperse
    distribute
  23. 增加困难(make sth difficult)
    compound the difficulty of
  24. 改变(change)
    alter
    adjust
    deviate from
  25. 不满、厌恶(dislike, hate)
    discontent
    revulsion
    repulsion
    complaint
    disatisfaction

Supported by Webinit Consulting