2008年11月20日
#
今天维护服务器。一查看/var/log/auth.log,哦!天南地北的朋友都想登录到我们的破服务器。虽然都未成功,但动物凶猛啊。现实残酷,黑客无情,安全第一。还是安装个rootkit检查工具为妙:
#aptitude install chkrootkit rkhunter
#chkrootkit
.....
#rkhunter -c -sk
.....
还好。
2008年5月28日
#
最近一直在试用Jazz。IBM宣传Jazz是下一代的软件交付平台,IBM开发者网站上一大堆的文档,看来IBM对这个软件还是非常重视的。试用体会:
- IBM或者说Rational对软件工程的研究是非常深入的,IBM Rational系列软件可以充分体现IBM对软件过程的理解。Jazz中集成了各种软件开发过程(时下流行的Srcum也在其中)。Jazz充分认识到了敏捷的重要性,所以敏捷的思想贯穿整个软件。
- 虽然IBM提供的比较丰富的文档,学习曲线还是有些陡峭。特别对于没有使用过Rational软件的开发人员。推荐初学者先看看这个文档
- Jazz的版本控制源于CC不是很喜欢,如果可以用SVN代替就好了。
- Jazz的客户端是开源的,但服务端只有90天试用。具体的价格也要6月份才出来。
2008年5月19日
#
还是记录在这吧。
现在在Debian下安装tex很方便了。如果一些宏包没有下载下来可以安装在系统上。步骤:
- 在/usr/share/texmf/tex/latex下建一个目录mkdir xxpackage
- 把宏包解压在这里
- texhash
2008年4月19日
#
又是Python。呵呵。谁叫人家帅呢
Quixote的部署
在Quixote官方白皮书中已经详细描述了Quixote的工作模式。Quixote可以使用Python自代的http_server(主要用于开发调试)和与Apache(或lighttpd)配合使用。
Quixote与Apache配合使用方式如下:
- 使用CGI,文档中称为egular CGI。被认为效率最低的一种方式,因为每一个请求都会创建一个新的进程。
- 使用fastCGI,CGI可以运行fastCGI一定是可以应用的。这也是豆瓣采用的方式。在Quixote作者的一个PPT中,他认为fastCGI是buggy的。哦:(也不至于啊。我们正在寻找使用fastCGI的部署经验。
- 使用mod_python,将python代码嵌入到Apache中。
- 使用SCGI,这是作者推荐的。使用Apache SCGI module scgi_mod将遵循SCGI协议Apache将请求发送到相应的Socket如localhost:3001。而这个Socket由本地运行的一个 Python程序打开。这个Python程序将处理请求,并返回结果。
SCGI的配置
Quixote的网站上对SCGI的描述:SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计更容易实现。
配置SCGI过程如下:
- 安装各个模块不在话下,debian让程序员有了懒惰的美德:
#aptitude install libapache2-mod-scgi python-scgi python-quixote
- Apache的配置,添加配置到apache.conf。(有些教程中加入了SetHandler scgi-handler ,但这个加上就很本不会和3000通信。可能是版本的问题。最好不用。)
<Location "/qx">
SCGIServer localost:3000
SCGIHandler On
</Location>
配置完成。SCGI的好处在于,修改了Python程序,不用重启Apache,只要重启SCGI就可以了。
第一个Quixote程序
一切就绪,我们来一次Quixote的完整之旅。
- scgi程序要求有一个服务打开3000端口。启动scgi的程序如下:
1
2 #!/usr/bin/python
3 # -*- coding: utf-8 -*-
4
5 from scgi.quixote_handler import QuixoteHandler, main
6 from quixote import enable_ptl
7 from quixote.publish import Publisher
8 enable_ptl() #启动PTL
9
10 def create_publisher():
11 from ourroot import RootDirectory
12 return Publisher(RootDirectory(), display_exceptions='plain')
13
14 if __name__ == '__main__':
15 from quixote.server import scgi_server
16 scgi_server.run(create_publisher, port=3000, script_name="/qx")
17
- 程序结构是比较简单的,使用的是scgi_server的run方法。要注意的是run方法中的script_name和前面apache 的配置Location是一样的。程序的关键是导入了ourroot这样一个ptl 。下面是我们的第一个ptl程序。
1
2 # -*- coding: utf-8 -*-
3 """这个是我们第一个例子的根目录
4 """
5 from quixote.directory import Directory
6
7 class RootDirectory(Directory):
8 _q_exports = [""]
9 def _q_index [html] (self):
10 print "debug message from the index page"
11 """
12 <html>
13 <head>
14 <meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
15 <title>第一个例子</title>
16 </head>
17 <body>
18 <h1>第一个例子有中文!</h1>
19 </body>
20 </html>
21 """
22
- 现在在浏览器中输入http://localhost/qx就可以看到结果了。
- 除了运行上面的python脚本,也可以采用这样的方式运行scgi:
python /var/lib/python-support/python2.5/quixote/server/scgi_server.py \
--factory=FirstApp.create_publisher \
--script-name=/qx --port=3000
Quixote 中文化的要点
Quixote的中文设置好像很麻烦。其实随着python、Quixote版本的推进,现在这个问题已经很简单了。字符集使用的是utf-8。使用gb2312可能也是可以的。
- 所有源代码使用utf-8在程序的开始加上# -*- coding: utf-8 -*-
- ptl的html模板加上content="text/html charset=UTF-8"
- 关键:在quixote的安装路径下有__init__.py,将其中的DEFAULT_CHARSET = 'iso-8859-1'改成 'utf-8'
- 也可以不修改__init__.py,使用Publisher的时候把Publisher扩展一下:
1 class UTF8Publisher(Publisher):
2 quixote.DEFAULT_CHARSET = "utf-8"
2008年4月18日
#
很久没有更新了。
敏捷时代似乎已经到了,将更多的时间花在了Python和Ruby上。C++好些地方使不上劲呢:(。
前段时间研究了一下boost.python,还真不错,就是文档太少啊。有时间将其整理一下。
pongba的这个
论坛还真不错。天天在上面泡着。
2007年10月18日
#
大型的数据库厂商在数据可用性上下足了功夫一会儿负责均衡,一会儿分布式数据库,不时还发明一些术语吓唬用户。而开源社区总是让人感到创意十足。夹在数据库和用户端之间的中间层产品大家一定见得多了,今年6月发布的MySQL Proxy名字看上去一般般,但其功能确很Cool。
MySQL Proxy 可以作负载均衡,可以艰苦,分析,客户端和服务器之间的通讯。最Cool的是可以使用嵌入到系统中的Lua。呵呵,现在不来点脚本语言好像就不入流呢。最近InfoQ上一篇文章《用MySQL Proxy实现读写分离》可能是时下现实的一种应用。原理很简单看看图就一目了然:
2007年10月9日
#
毕业论文已经使用Latex排好。学校要求使用Word,并提供了严格的模板。这个模板还真不错,但我哪有MS Office呢?04年以来只使用Linux,没用MS Office好多年,一直用Open Office对付这,这次肯定不行了。无奈只有找台机器装Windows,Office,满世界的找注册码什么的。
我用Linux并不是想显得很厉害,也不是Linux桌面很好,甚至觉得要普及Linux桌面路还很长。用Linux70%是工作原因,30%是因为不太想用盗版。我觉得我们搞软件的还对使用盗版情有独钟,软件产业的确很危险。
经常听大家比较中印软件产业,我对此兴趣不大,也不太了结印度的情况。我只认识一个印度人,给我上过软件测试课。有一次提到国内网站上到处都是Crack,我看见他的表情里只有轻蔑。
2007年9月10日
#
突然想起郑逸梅老先生。他讲的艺坛逸事离我们可能远了,但《幽梦新影》读来还是很有味道的。Google;抄录之:
------------------
壮士跨马,逸士骑驴。
读《离骚经》宜于茶余,诵《剑侠传》宜于酒后。
坐花茵,枕琴囊,嗽清泉,啖松实,仙乎仙乎!
愁无可遣,遣之于诗,遣之于酒 。恨无可语,语之于月,语之于蛩。
文人如范仲淹,始足以讲武;武将如岳鹏举,始足以谈文。
胸中一团浩荡之气,不能发之于文,亦当挥之以剑。
喜读书之者不得书读,喜饮酒者不得酒饮,喜游山水者不得山水游,最为恨事。
野客狎鸥,逸士放鹤。
天下不平之气,托之于雷;人有不平之事,托之于剑。
一琴一剑,抒我怨愤,一灯一影,伴我凄清。
铅刀虽钝,然鲜挫折。
大英雄不怕死,亦不轻生;大丈夫不随世浮沉,亦不矫情立异。
贫时不忘富,自无谄容;富时不忘贫,自无骄态。
一喜一怒,最是见人之真。
马嘶西风,剑鸣鞘匣,雄心一起,便绕走通宵,不能成寐。
世有大年,岂必常服补剂;天生名将,不关多读兵书。
濯垢易,涤耻难。
世间最丑之事,莫若攀龙附凤。
英雄好杀,不杀人之所不忍杀者,好杀人之所不敢杀者;文人好骂,不骂人之所不忍骂者,好骂人之所不敢骂者。
人不可不有月下谈禅之逸致,亦不可不有花前说剑之豪情。
天下惟善读书者,不负花月,不脱酒盏,不离山水,不绝美人。
南人失之柔,不可不睹黄河之奔腾;北人失之亢,不可不见吴山之秀美。
美人之胜于花者,解语也;花之胜于美人者,生香也,二者不可得兼,舍生香而解语者也。
梅令人高,兰令人幽,菊令人野,莲令人淡,春海棠令人艳,牡丹令人豪,蕉与竹令人韵,秋海棠令人媚,松令人逸,桐令人清。柳令人感。
所谓美人者,以花为貌,以鸟为声,以月为神,以柳为态,以玉为骨,以冰雪为肤,以秋水为姿,以诗词为心,吾无间然矣。
能闲世人之所忙者,方能忙世人之所闲。
上元须酌豪友;端午须酌丽友;七夕须酌韵友;中秋须酌淡友;重九须酌逸友。
对渊博友,如读异书;对风雅友,如读名人诗文;对谨饬友,如读圣贤经传;对滑稽友,如阅传奇小说。
一介之士,必有密友,密友不必定是刎颈之交。大率虽千百里之遥,皆可相信,而不为浮言所动;闻之有谤者,即多方为辨析而后;事之宜行宜止者,代为筹划决断;或事当利害关头,有所需而后济者,即不必与闻,亦不虑其负我与否,竟为力承其事,此皆所谓密友也。
发前人未发之论,方是奇书,言妻子难言之情,乃为密友。
少年读书,如隙中窥月;中年读书,如庭中望月;老年读书,如台上玩月,皆以阅历之浅深耳。
能识无字之书,方可出惊人妙句,能会难通之解,方可参最上禅机。
古今至文,皆血泪所成。
《水浒传》是一部怒书,《西厢记》是一部悟书,《金瓶梅》是一部哀书。
文章是案上之山水,山水是地上之文章。
读书最乐,若读史书,则喜少怒多,究之,怒处亦乐处也。
读经宜冬,其神专也;读史宜夏,其时久也;读诸子宜秋,其致别也;读诸集宜春,其机畅也。
文人读武事,大都纸上谈兵;武将论文章,半属道听途说。
善读书者,无之而非书也;山水亦书也,棋酒亦书也,花月亦书也。善游山水者,无之而非山水;书史亦山水也,诗酒亦山水也,花月亦山水也。
“情”之一字,所以维持世界;“才”之一字,所以粉饰乾坤。
人须求可入诗,物须求可入画。
当为花中之萱草,毋为鸟中之杜鹃。
胸藏丘壑,城市不异山林,兴寄烟霞,净浮有如莲鸟。
清宵独坐,邀月言愁;良夜孤眠,呼蛩语恨。
居城市中,当以画幅为册水,以盆景为苑圃,以书籍当朋友。
方外不必戒酒 ,但须戒俗;红裙不必通文,但须有趣。
胸中小不平,可以酒消之;世间大不平,非剑不能消也。
鹤令人逸,马令人俊,兰令人幽,松令人古。
美味以大嚼尽之,奇境以精游了之,深情以浅语传之,良辰以酒食度之,富贵以骄奢处之,俱失造化本怀。
有山林隐远之乐而不知享者,渔樵也,农圃也,缁轻也;有园亭姬妾之乐而不能享不善享者,富翁也,大僚也。
----------------------
所谓“录”也就是Ctrl-c和Ctrl-v而已,记得读大学时可是工工整整抄写到本子上的。从第一次在486上看到电子书惊叹的表情到现在CtrlCV无奈的感觉。也就十多年吧,弹指一挥间也说不上,世界就变化得如此之快。故人以乘黄鹤去,老先生绝想不到他的句子会在互联网上粘来粘去。大家也就读读,那闲云野鹤般的姿态最多也就是心中的神往吧。
有些句子读来是有快感的“世间最丑之事,莫若攀龙附凤。”! 看看周遭憋足而丑陋的众生像,只能“胸中一团浩荡之气,不能发之于文,亦当挥之以剑。”?呵,这是游戏规则。这样的事恐怕只有“托之于雷”了。单单看中了这一条,可能太愤青了,所以我还是更喜欢“冷眼以观世界,虚心以读书”。
2007年7月28日
#
- 来自网络,收集备用:
- Integer: 有符号32位整数
- Integer32:与Integer相同。
- UInteger32:无符号32位整数
- Octet String:任意二进制或文本数据,通常长度限制在255个字符内。
- Object Identifier:An OID.
- Bit String:表示取名的位的枚举。这是一个无符号的数据类型。
- IpAddress:IP地址。
- Counter32:表示一个非负的整数,递增到最大值,然后恢复并从0开始递增。
- Counter64:与Counter32相同,最大值为64位的最大值-1。
- Gauge32:表示无符号整数,可增加或减少,但是不超过最大值。
- TimeTicks:表示代表数据的一个无符号整数,2^32取模(4294967296),两个值之间为百分之一秒。
- Opaque:提供向下兼容,不再使用的数据类型
- NsapAddress:表示一个用变长八进制字符窗表示的OSI地址。
2007年7月24日
#
C++通过范型编程倒是映入了大量函数编程的思想和手法,但终究强类型的语言,有时代码就不是那么优雅了.
一般情况下函数指针和函数对象(functor)是可以互换的,如std::for_each的第三个参数,但标准库中有4个函数配接器(not1,not2,bind1st,bind2nd)是不能接受函数指针,必须使用std::ptr_fun将函数指针封装成函数对象.还有一种情况是函数指针指向的函数的参数类型与函数模板需要的不匹配,如果要通过for_each调用每个Iterator的解引用(dereference)的对象的某个成员函数.直接使用诸如ClassA::*member_func的成员函数指针显然是想当然的做法,调用的语法都不一致,结果是一大堆编译错误信息.没有关系可以使用std::mem_fun和std::mem_fun_ref.如for_each(classAVector.begin(),classAVector.end(),mem_fun_ref(ClassA::*member_func)).标准库中的这一套函数适配器(functor adapters)使用起来要充分考虑使用的场合.不同的情况使用不同配接器.特别是您要区分for_each的容器是Container<T>还是Container<T*>,前者使用std::mem_fun_ref,后者使用std::mem_fun.这一段的详细讨论可一参照Effective STL的第40条和第41条.(个人感觉这几个配接器的名字真有的...fun).
如果您实在是有点受不了或者你不能确定容器中究竟放的是什么而且你愿意使用一下准标准库,就可以考虑boost库的mem_fn.boost::mem_fn也不是很特别的boost成员.使用boost::mem_fn好处:不用关心容器中是T还是T*甚至是boost::share_ptr<T>,另外买一赠一fn比fun更好听一点.下面抄录boost的帮助代码就很说明问题了.
struct X
{
void f();
};
void g(std::vector<X> & v)
{
std::for_each(v.begin(), v.end(), boost::mem_fn(&X::f));
};
void h(std::vector<X *> const & v)
{
std::for_each(v.begin(), v.end(), boost::mem_fn(&X::f));
};
void k(std::vector<boost::shared_ptr<X> > const & v)
{
std::for_each(v.begin(), v.end(), boost::mem_fn(&X::f));
};