2009年6月9日星期二

evince中文乱码

直接修改/etc/fonts/conf.d/49-sansserif.conf,将其倒数第四行修改为一个中文字体

2009年6月7日星期日

白领陨落,黑领崛起

只有繁荣,没有民生。这一奇异的景象前所未有。真是所谓红肿之处,艳若桃花,溃烂之时,美如乳酪。社会中的每一个阶层都知道处于死局,可谁都无法解开这一死局。于是大多数人在糜烂中逃避,少数人加紧抢夺。后面这少数人就是黑领。

    这两年总有人在说什么“崛起”。到底是谁在崛起?是黑领。


    我在《邓玉娇杀官激起暴虐为什么?》一文中说过:“当权力集团争先恐后地占有社会资源的时候,说明他们已经彻底抛弃面具,权力已经彻底失控。权力集团的成员都知道,这样的疯狂对于统治者与被统治者双方都是不利的,但是,抢得慢的人只能是抢夺战中的落后者,并不能改变抢夺的大趋势,于是,大家都去抢,我死后哪管洪水滔天,巨额存款转到国外,子子孙孙花不完。


    “所有的人都看到了这种局面,但是,所有的人都没有办法于是,那些买不起房、看不起病、上不起学的人,只好借邓玉娇来发泄自己的愤懑。”


     


中国的黑领是世界上最无耻的群体


 才仅仅10年之前,白领还是一个全社会人人称羡的身份。万科地产甚至将其出版的系列图书命名为《白领》。白领是指那种在高级写字楼里上班的专业技术人员,特点是高学历、高收入。特别是写字楼里外资企业,更是白领群体云集的根据地。

  白领意味着体面的工作、优雅的修养、丰富的精神体验。从某种意义上讲,白领简直成为时尚的代名词。


  白领必定毕业于名牌大学,甚至是硕士、博士或海归,每天朝九晚五打卡,坐在格子间的电脑旁,MSN,麦当劳,卡布奇诺,丁克,地铁,打的,坐经济舱,住星级宾馆,泡吧,煲电话,听蓝调,加班,圣诞节,斯诺克,暂住证,红酒,抽555,住租来或按揭的公寓,买简约的宜家家具,收藏CD,谈论《老友记》,向往 xz,留恋于丽江,铁杆驴友,不看中文报纸不看中国电影,看《国家地理》《名牌》《读书》杂志,看卡夫卡看张爱玲看伊朗电影,洁癖,乡愁,健身,瑜伽,养吉娃娃,香水衣服鞋子泡吧旅游鲜花买书买CD看电影,月光一族。


  白领的产生是中国市场经济发展初级阶段末期的典型现象,证明了“知识改变命运 ”。白领大多只出现在一线城市。面对WTO的前夜,这些有文化有知识的年轻人开始尝试一种西方发达国家中产阶级的雅皮士生活。绅士与淑女,是充满这些新思想的青年人的人生目标。《了不起的盖茨比》和《傲慢与偏见》是他们的必读书。爱情、教养、文化、艺术、体验、精神贵族深深地吸引着他们。


  10
过去,物是人非。回头看看,当年怀着白领梦“范进中举”,当许多大学生兴冲冲踏出大学这个高级职业培训监狱大门的时候,却必须接受与黧黑的农民父亲同场竞
聘的残酷现实。曾经的白领已经老去,在一场百年不遇的经济危机面前,破产的破产,失业的失业,离婚的离婚。当孕育白领的贸易、广告、房地产、
IT和制造业风吹雨打流水落花,脆弱的白领蓦然发现,曾经雪白挺括的领口,已经被冰冷的汗水洇得皱皱巴巴一片姜黄。春天来的时候,老去的白领继续徘徊于物价和房价飞涨的城市。伫立在林立的写字楼脚下,他今天会收到一个面试通知么……白领的传说就这样陨落了


  与此同时,一个充满神秘色彩的社会群体已经夺
去了全中国所有的光芒,他们开着“自己的”大排量名牌汽车,出入高档酒楼,高级夜总会,乘坐头等舱或软卧,住星级宾馆,拥有黄金位置的几处豪宅,购全套红
木家具,在位置最好、景观最佳,装修最豪华、质量最安全的办公楼上班,独立办公室,不打卡,饭局,会面,喝茅台五粮液,品天价普洱,抽极品中华,精装《毛
评二十四史》,
VIP,炒股投资保险理财,收藏古玩字画珠宝黄金,高级会所,劳力士,路易威登,奢侈品,国际顶级品牌服饰,高尔夫,公派出国,移民,护照,拉斯维加斯,美容减肥按摩,组织体检,疗养,免费医疗,贵族学校,MBO,脱产学习,党校,佣人,情人,养藏獒,带薪假……


  他们就是在全中国一线二线三线城市遍地开花,全面崛起的新兴黑领阶层。相对于干干净净清清白白的白领,他们的衣服是黑色的,汽车是黑色的,脸色是黑色的。他们的收入是隐蔽的,生活是隐蔽的,工作是隐蔽的……所谓隐蔽,就是像站在黑夜里的黑衣人,你知道他在,他也知道他在,但你不知道他什么样,在做什么。他们就是就职于政府和官有垄断企业的那个庞大群体


  10年间,官有建筑已经屡屡刷新了所有中国城市的高度。在气度辉煌富丽堂皇的官方办公楼面前,商业写字楼登时被压出逼仄吝啬的寒酸来。从容积率、配套、装修等各方面,拔地而起的“大裤衩”成为城市黑领新贵们的“鸟巢”。白领和他的OFFICE一起,被黑领的裤衩遮住了所有的阳光。



  10年间,通过高税收、高房价和垄断政治权力
官方组织一步步通过各种手段将社会财富向自己手中集中。不仅以重税和重复收费罚款的方式,从横向上苛刻聚敛社会财富,而且以资源浪费和环境污染等方式,从
纵向上大肆透支谋夺子孙后代赖以生存的根基。官有经济在垄断的无竞争市场所向披靡,源源不断的暴利如滚滚长江。水气电油电信金融烟草卫生教育海关公路等行
业自不用说,即使出版、邮政、新华书店、市政、环卫、公交、盐业、矿业、铁路、民航、文化、体育、新闻、旅游、土地等这些领域,因为禁止自由竞争,其利润
之丰厚仍足以使任何外企眼红得流鼻血。在当下中国随便哪一个城市,一个大腹便便的税务监管员都可以开着路虎
SUV上班,他的办公室面积有多大、装修得有多豪华不必说,只消告诉你一句,他可以在单位里健身桑拿游泳……


  一个刚刚工作两年的警察就已经买车买房——没要父母的钱也没按揭……一个国家电网公司的抄表员基本月薪达到8000元……简单推算一下,全国有1000多个省级,20000个厅级,好几万到十来万个县级,这还不包括北京的中央部门和军队警察系统。较发达地区普通黑领年收入1020万元极普遍,年终发个十万元奖金不是什么稀奇事,而这也不仅仅是税务部门才有这个财力。


  这是“合法”的收入,这一部分财产是不怕公示
的。去年就有新闻称,南方某地所有的黑领都有两部车,而且很正常。人类都知道,对黑领来说,收入绝对不止薪水这一块,医疗交通吃喝拉撒贪污受贿等等,所有
的地方都享受纳税人无偿供养,每月的车贴甚至比农民工辛苦一个月的薪水还要多,他们也可以在超市买个床单裤衩都开发票报销,或者把免费领来的大量昂贵药品
卖钱。甚至嫖娼也要发票。可以说,所谓黑领,就是除了没给其配备法律意义上的配偶外,其它都是享受无偿供给的。


  黑领阶层之所以生活水平急剧提高,是因为其垄断了包括政治、法律、经济、信息在内的一切社会资源,他们消耗了至少一半以上的中国国民收入。他们的崛起,构成了中国新二元社会的显赫一极。这个群体虽然相对数量少,但是绝对数量庞大。粗略估计一下,这种以寄生垄断为业的黑领在全国约有 2000万以上


  比起10年前苍白的小资白领来,只有这些享受和垄断了政治权利的人才真正的实现了几代中国人的梦想,他们绝对已经达到甚至超过欧美发达国家生活的水准。当然,另外一极的其他“普通老百姓”则是标准的第三世界贫穷国家的国民。来自官方背景的黑领对来自民间草根的白领的颠覆,体现了政治权力向自由经济领域的渗透和僭越,以政治权力篡夺经济权力
这种食利自肥的经济身份使官方的超脱精神和公益基础遭到侵犯,合法性受到玷污,政治的伦理尊严荡然无存。官方由民众的仆从变成“民主”——民众的主子,由
公共利益的正义仲裁者演化为自身利益集团的代言人,从国家和社会的守夜人退化为自私卑鄙的盗窃者。这是一种极其危险的倾向。


  白领阶层可以说是开放的,或者说穷人的孩子可以通过读书实现白领梦
正因为如此,白领在大学扩招后人力资源充沛的中国急剧贬值。相对而言,黑领阶层则完全是封闭的,正因为封闭,才会奇货可居炙手可热。公共机构实际上已经成
为官僚权力集团把持的私家后院,普通人家的孩子要想进入这个群体,理论上说不是不可能,只能说——很渺茫。不错,公务员是公开招聘的,垄断官方企业的职位
也是面向社会招聘的,只要你拥护那个党,你就可以报名考试。


  但地球人都知道这里面的规矩——潜规则,考不考得上并不取决于考试分数。黑领的特殊之处是已经走向组织化和正在走向世袭化,前者巩固,后者继承。在白领黯然陨落之后,黑领的低调崛起在全社会引发了一轮又一轮的考公务员热。同时,黑领也成为所有商家追逐的目标,他们比白领具有更真实更强悍的消费力。他们走到哪里,哪里就物价飞涨;他们对地产的投资,使农民失去了土地,使白领丧失了家园。当白领遇见黑领,立马被压出西装下面的“小”来。


  今天,一个供职于夹缝状态私企的所谓白领,以他微薄的收入仅够维持温饱而已,消费对他来说已经是一个太过夸张和绝望的词语。不久前官商云集(没有几个身家低于千万)的两会上,一个黑领代表或是同情或是鄙夷地建议小白领们应该去卖肉——不是出卖自己的肉体,是卖猪肉。在这场席卷地球的金融风暴中,无数外企破产倒闭、业绩滑坡,覆巢之下,纷纷裁员降薪,白领们仓皇失业。与此相反,中国官有组织却财大气粗逆市飘红,令世界500 强为之羡慕,黑领们仍然可以毫无罪恶感地集体加薪


  近水楼台先得月,砸向黑领掌心的4万亿投资计划如同一针鸡血,使无数红了眼的黑领们激动得加额称庆——还是中国好、组织好啊。说实话,贫困潦倒的白领们从这4万亿民脂民膏中想捡点残羹剩饭也是痴心妄想。所以说,“孔乙己”这样卑微的白领如何能与“假洋鬼子”这样傲慢的黑领同日而语?如果说白领曾经掀起一股托福热、小资热的话,黑领的江湖则使传统国学和势利文化大热易中天的阴谋学、王立群阎崇年的帝王学、于丹的犬儒学和马未都的收藏学等等,无不映照了黑领这个社会核心消费阶层的形成


  黑领的兴起说明,20年前的那场轰轰烈烈的反腐败反官倒运动之后,新兴知识群体在与权力群体博弈中已经完全丧失了主动权。权力经济终于在近10年从量变到质变,完成了对知识经济和自由经济的彻底颠覆。权力组织在文革后重新收复了对共和国的垄断话语权。近年来热映银屏的《激情燃烧的岁月》、《军歌嘹亮》、《金婚》和《天下兄弟》等剧,集中反映了文革时期第一代黑领的优裕生活。权力特权下的文革被营造被演绎得无比温馨富足和谐,根本看不到知识阶层生不如死和农民阶层食不果腹的悲惨灾难。


  这种以主旋律色彩出现的怀旧情绪充满复辟邪恶和美化罪恶的企图。曾经的党校高材生、当代厚黑学大师冯仑老板毫不客气地把白领鄙视为“房奴”,一个“奴”字撕下了一群人看似体面的假领。诚然,白领没有任何社会权利,没有罢工权,没有选举权,没有话语权;他们没有权势,没有资本,没有门第。相反,黑领则是这个国家的上帝选民。


  他们的房子票子车子等等除过老婆之外,都一概享受无偿配给,几乎不用跟“普通老百姓”们争来抢去的所谓市场发生任何关系。白领是如此脆弱而不堪一击,一套小小栖身的房子就可以将其压垮;而黑领是如此坚不可催固若金汤,一场导致无数孩子死亡的“三鹿”惨案,也未见一人因职务犯罪被追究法律责任,仅仅纪律处分了事。因为对立法权和司法权的把持,黑领群体成为名义上和实质上的共和国公民,他们普遍享受到一个共和国公民所应当享受的一切政治权利。


  从基本人权、财产权、公民权、选举权和一切社
会福利,他们都应有尽有的得到了充分保护和满足。与之相反,日渐普遍和经济失宠的白领群体则无法享受到基本人权保证,更遑论公民权和社会福利。他们被官方
称之为与“公民”相对立的“普通老百姓”或者“群众”。相对于“共和国公民”而言,“普通老百姓”在政治层面和法律意义上,仅相当于“人畜”、“奴隶”或
者“机器人”。他们经常被官方作为十几亿的巨额国家财产来看待,说好听点叫作“劳动力资源”。其对外的称呼为“人民”,多用在“伤害中国人民感情”的时
候。白领的陨落代表着知识精英的穷途末路和理性精神的落败,黑领的兴盛代表着权力意识形态的扩张,和反知识重权力的血统论和阴谋论王者归来。


  “知识贬值”必然带来“读书无用论”的盛行,
中国社会从此向封建资本主义进一步靠拢。社会文化日渐沙化和盐碱化,重归流氓文化和宫廷权谋黑幕政治的覆辙。黑领对白领的阻击和绞杀使构成未来社会主流的
新兴中产阶级胎死腹中,建立宪政公民社会的启蒙运动被迫土崩瓦解。这种财阀与权贵的合力扼杀使一个民族的创新能力和创造力严重退化直至丧失。社会结构和信
息结构进一步被凝固被肢解,青年一代被年迈保守的既得利益者压制封堵在社会最底层。


  健康的社会流动和财富循环陷于停滞,推动社会
进步的活力和源泉被窒息被堵死。胜者为王的狼图腾文化、不择手段的官场权谋文化、暴殄天物的面子文化和崇高伟大的满清皇帝戏之所以大行其道,正映射着白领
规则的陨落与黑领规矩的升起,中国社会由知识和文明的艰难复苏,无可挽回地退回到野蛮与无知的权力通吃、弱肉强食中去。


  人往高处走,水往低处流。在全社会的羡慕、嫉妒和仇视之中,黑领阶层一方面继续低调的巩固其社会地位(政治地位和经济地位),另一方面在完成原始积累后,他们开始悄然向新大陆挺进——携款外逃,或者投资移民,实现自己正式加入世界发达国家高级人类的梦想,同时也使自己的后代永远彻底的摆脱水深火热的中国。摘自胡记茶行《对现状的分析——挤不进去,你永远是穷人》:据官方统计, 2004年中国农民人均年收入2936元,按年人均纯收入低于668元的标准,中国农村绝对贫困人口为2610万人。如果按照世界上公认的人均11美元以下就属贫困的标准,我国目前还有2.1亿贫困人口。“八五”期间,公车车辆消费占到全部国家财政支出的38%,整个国家总计支出37960亿中的 37.58%用于供养行政公务人员;公款吃喝公费出国年花费每年达9000 亿元以上。


  中国社会阶层分类:第一个阶层(也是处于最顶端的王者阶层)
由几百个家族组成,他们拥有骇人听闻的财富,是这个国家的掌控者。在他们之下是第二个阶层——地方性的豪族,数量也许是几万家,这些人控制着地方的权力,
自然也拥有无与伦比的财产。第三个阶层是由公务员,事业单位人员、国企管理人员、垄断国企人员和私营企业主等这些人中的佼佼者以及顶级白领阶层等这些群体
中的人员组成。第四个阶层是生活比较安逸的一般民众,他们经济上还算比较宽裕,但是社会地位不高,对社会没有什么影响力。第五个阶层是由城市平民和农村中
生活比较好的农民组成。第六个阶层是贫困群体,也就是四亿没有购买能力的民众。第七个阶层是一亿没有财富的赤贫阶层,第八个阶层就是最后那一亿灾难性赤贫
的阶层。


2009年6月6日星期六

fedora10安装nginx并配置php

安装nginx
yum install nginx

安装php5
yum install lighttpd-fastcgi php-cli php-mysql php-gd php-imap php-ldap
php-odbc php-pear php-xml php-xmlrpc php-eaccelerator php-magickwand
php-magpierss php-mapserver php-mbstring php-mcrypt php-mhash php-mssql
php-shout php-snmp php-soap php-tidy

vi /etc/php.ini
添加
cgi.fix_pathinfo = 1
至文件末尾

vi /etc/rc.local
添加
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi -P /var/run/fastcgi-php.pid
至文件末尾
(这是配置FastCGI加入到默认启动)

配置nginx(以下都是修改 不是添加)
vi /etc/nginx/nginx.conf
(可选)
worker_processes 5;
keepalive_timeout 2;

(必选)
server {
listen 80;
server_name _;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}

error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1.sixxs.org;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}

重启nginx即可。
感觉apache对php的内置支持的确更好用一点

2009年6月3日星期三

CVS 简单教程

日期:2003-04-19   作者:何伟平  

版权声明:本文档遵循 FDL 版权发布,有关 FDL 的详细信息,请参考:

http://www.fsf.org.sixxs.org/copyleft/fdl.html



何伟平



CVS 是 Concurrent Version
System(并行版本系统)的缩写,用于版本管理.如果大家曾经参与过多人协作开发的项目,大家肯定有这样的痛苦经历:由于多个人同时修改同一个文件,
自己辛辛苦苦修改的程序被别人彻底删除了.另外,如果你的软件/程序已经发布了三个版本,而这时候用户需要你修改第二个版本的东西,也许你会因为只保留了
最新版本而痛哭流涕.还有就是你对程序做了一些修改,但是修改很少,你只想给远方的同事发一个两个版本之间的差别文件,这样可以免于邮箱不够大,网速太慢
之类的问题.为了解决类似这样的问题,以及诸如生成补丁文件,历史版本修改等,一帮黑客(褒义)在原先 Unix 体系里很成熟的 SCCS 和
RCS 的基础上,开发了 CVS.(SCCS:Source Code Control System,RCS:Revision Control
System)



CVS
的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序.由仓库管理员统一管理这些源程序.这样,就好象只有一个人在
修改文件一样.避免了冲突.每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地.用户做的任何修改首先都是在本地进行,然后用 cvs
命令进行提交,由 cvs 仓库管理员统一修改.这样就可以做到跟踪文件变化,冲突控制等等.



由于 CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两部分.不过大多数 CVS 软件都把它们合二为一了.

  



结合文档和一些网上资源,我写一点非常简单的“速成”的教材.希望对大家有用.

下面是我的步骤和做法:



前提要求:



root 权限;

CVS软件,请找到相关的rpm,tgz,deb 等包装上,或者到  

http://www.cvshome.org.sixxs.org/CVS/Dev/code

下载原程序编译安装,这里我不准备介绍它的安装,请参考CVS自身的文档安装.我使用Slackware的tgz包,安装的命令是

#installpkg cvs*.tgz

其他包请参考对应包管理工具的命令.

一定的系统资源,要有一定内存(32M就能工作得很好),要一定的磁盘空间,看你的项目的大小和多少而定.

架设CVS服务器:

建立 CVSROOT
目录,因为这里涉及到用户对CVSROOT里的文件读写的权限问题,所以比较简单的方法是建立一个组,然后再建立一个属于该组的帐户,而且以后有读写权限
的用户都要属于该组.假设我们建一个组叫cvs,用户名是cvsroot.建组和用户的命令如下

 



#groupadd cvs

#adduser cvsroot

 



生成的用户家目录在/home/cvsroot(根据自己的系统调整)

 



用 cvsroot 用户登陆,修改 /home/cvsroot (CVSROOT)的权限,赋与同组人有读写的权限:

 



$chmod 771 . (或者770应该也可以)

注意:这一部分工作是按照文档说明做的,是否一定需要这样没有试验,我会在做试验后在以后版本的教程说得仔细一点.如果您有这方面的经验请提供给我,谢谢.





建立CVS仓库,(仍然是 cvsroot 用户),用下面命令:

 



$cvs    -d /home/cvsroot init

 



以root身份登陆,修改 /etc/inetd.conf(使用 xinetd 的系统没有此文件)和 /etc/services,

如果用的是 inetd 的系统,在 /etc/inetd.conf 里加入:

cvsserver    stream    tcp    nowait    root    /usr/bin/cvs    cvs -f  --allow-root=/home/cvsroot pserver



说明:上面的行是单独一整行,/usr/bin/cvs 应该是你的cvs版本的命令路径,请根据自己的系统调整./home/cvsroot 是你建立的CVSROOT的路径,也请根据上面建立目录的部分的内容做调整.



如果是使用 xinetd 的系统,需要在 /etc/xinetd.d/ 目录下创建文件 cvspserver(此名字可以自己定义),内容如下:





# default: on

# description: The cvs server sessions;



service cvsserver

{

socket_type = stream

wait = no

user = root

server = /usr/bin/cvs

server_args = -f --allow-root=/cvsroot pserver

log_on_failure += USERID

only_from = 192.168.0.0/24

}





其中only_from是用来限制访问的,可以根据实际情况不要或者修改。修改该文件权限:





# chmod 644 cvspserver





在/etc/services里加入:





cvsserver    2401/tcp



说明:cvsserver 是任意的名称,但是不能和已有的服务重名,也要和上面修改 /etc/inetd.conf 那行的第一项一致.这里我用的是 CVS 的口令认证方式,CVS 还有其他认证方式,我没有做试验,如果您有经验,请补充,谢谢.





添加可以使用 CVS 服务的用户到 cvs 组:

以 root 身份修改 /etc/group,把需要使用 CVS 的用户名加到 cvs 组里,比如我想让用户 laser 和gumpwu 能够使用 CVS 服务,那么修改以后的 /etc/group 应该有下面这样一行:

cvs:x:105:laser,gumpwu





在你的系统上GID可能不是105,没有关系.主要是要把laser和gumpwu用逗号分隔开写在最后一个冒号后面.当然,象RedHat等分发版有类似linuxconf这样的工具的话,用工具做这件事会更简单些.



重起inetd使修改生效:

 



#killall -HUP inetd

如果使用的是 xinetd 的系统:





# /etc/rc.d/init.d/xined restart



这样服务器就设置完成了.我们接着搞客户端.



设置客户端



如果是 Linux(或者其他 *nix),客户端和服务器端的软件是一样的,如果是Win,MAC等平台,请到



http://www.loria.fr.sixxs.org/cgi-bin/molli/wilma.cgi/rel



找相应的客户端软件,这里我先说一下在 Linux(*nix)里怎么做:



设置环境变量CVSROOT:

 



$export CVSROOT=:pserver:laser@the_server_name:/home/cvsroot

注意:这里的pserver是访问方式,我在上面设置的是口令认证,所以这里是pserver,如果你的CVS服务器设置成别的访问模式,那么需要相应修
改.laser是可以使用
CVS服务器的用户名,这里可以根据你的设置修改,我在这个版本设置的是直接使用系统用户的口令文件,也就是说laser必须是CVS服务器上的合法用
户,这里当然有安全问题,CVS可以设置成为拥有自己的用户,我将在以后的版本里面增加这些内容,或者您也可以提供一些补充,或者直接读CVS的文
档.the_server_name是CVS服务器的名称或者IP地址,根据你的情况填写,/home/cvsroot是你的CVS服务器的
CVSROOT目录,根据你的CVS服务器设置做修改或者询问管理员.你可以把这行放到你的shell的profile里
(.bash_profile,.profile等)这样就不用每次敲一长串命令了.





登陆CVS服务器:

 



$ cvs login,这时候 cvs 会问你口令,请把你在 CVS 服务器上的口令敲进去,这里是 laser 在 CVS服务器上的系统用户的口令:

Passwd:xxxxxxxx



成功登陆后将在你的家目录建立一个 .cvspass 文件,以后就不用输入口令了.



好,客户端设置完成,简单吧.

管理 cvs 服务器



服务器可以用了,现在大家最关心的就是如何管理服务器,比如,我想让一些人有读和/或写 CVS 仓库的权限,但是不想给它系统权限怎么办呢?





不难,在 cvs 管理员用户(在我这里是 cvsroot 用户)的家目录里有一个 CVSROOT
目录,这个目录里有三个配置文件,passwd, readers, writers,我们可以通过设置这三个文件来配置 CVS
服务器,下面分别介绍这几个文件的作用:



passwd:cvs 用户的用户列表文件,它的格式很象 shadow 文件:



{cvs 用户名}:[加密的口令]:[等效系统用户名]



如果你希望一个用户只是 cvs 用户,而不是系统用户,那么你就要设置这个文件,刚刚安装完之后这个文件可能不存在,你需要以 cvs
管理员用户手工创建,当然要按照上面格式,第二个字段是该用户的加密口令,就是用 crypt (3)
加密的,你可以自己写一个程序来做加密,也可以用我介绍的偷懒的方法:先创建一个系统用户,名字和 cvs 用户一样,口令就是准备给它的 cvs
用户口令,创建完之后从 /etc/shadow
把该用户第二个字段拷贝过来,然后再把这个用户删除.这个方法对付数量少的用户比较方便,人一多就不合适了,而且还有冲突条件(race
condition)的安全隐患,还要 root 权限,实在不怎么样.不过权益之计而已.写一个小程序并不难,可以到 linuxforum
的编程版搜索一下,有个朋友已经写了一个贴在上面了.



第三个字段就是等效系统用户名,实际上就是赋与一个 cvs 用户一个等效的系统用户的权限,看下面的例子你就明白它的功能了.



readers:有 cvs 读权限的用户列表文件.就是一个一维列表.在这个文件中的用户对 cvs只有读权限.



writers:有 cvs 写权限的用户的列表文件.和 readers 一样,是一个一维列表.在这个文件中的用户对 cvs 有写权限.



上面三个文件在缺省安装的时候可能都不存在,需要我们自己创建,好吧,现在还是让我们用一个例子来教学吧.假设我们有下面几个用户需要使用 cvs:



laser, gumpwu, henry, betty, anonymous.



其中 laser 和 gumpwu 是系统用户,而 henry, betty, anonymous 我们都不想给系统用户权限,并且 betty
和 anonymous 都是只读用户,而且 anonymous 更是连口令都没有.那么好,我们先做一些准备工作,先创建一个 cvspub
用户,这个用户的责任是代表所有非系统用户的 cvs 用户读写 cvs 仓库.



#adduser  

...



然后编辑 /etc/group,令 cvspub 用户在 cvs 组里,同时把其它有系统用户权限的用户加到 cvs 组里.(见上文)



然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件,加入下面几行:



laser:$xxefajfka;faffa33:cvspub

gumpwu:$ajfaal;323r0ofeeanv:cvspub

henry:$fajkdpaieje:cvspub

betty:fjkal;ffjieinfn/:cvspub

anonymous::cvspub



注意:上面的第二个字段(分隔符为 :)是密文口令,你要用程序或者用我的土办法生成.



编辑 readers 文件,加入下面几行:



anonymous

betty



编辑 writer 文件,加入下面几行:



laser

gumpwu

henry



这样就 ok 了,你再用几个用户分别登陆测试,就会发现一切都 ok 了.这里面的原理和说明我想就不多说了,其实很简单,和系统管理用户的概念是一样的.

  



现在服务器和客户端都设置好了,那么怎么用呢,我在这里写一个最简单的(估计也是最常用的)命令介绍:



首先,建立一个新的CVS项目,一般我们都已经有一些项目文件了,这样我们可以用下面步骤生成一个新的CVS项目:



进入到你的已有项目的目录,比如叫 cvstest:

$cd  cvstest

运行命令:

$cvs import -m "this is a cvstest project" cvstest     v_0_0_1     start

说明:import 是cvs的命令之一,表示向cvs仓库输入项目文件.

              -m参数后面的字串是描述文本,随便写些有意义的东西,如果不加 -m 参

数,那么cvs会自动运行一个编辑器(一般是vi,但是可以通过修改环境变量

EDITOR来改成你喜欢用的编辑器.)让你输入信息,

             cvstest 是项目名称(实际上是仓库名,在CVS服务器上会存储在以这个名字

命名的仓库里.)

             v_0_0_1是这个分支的总标记.没啥用(或曰不常用.)

             start 是每次 import 标识文件的输入层次的标记,没啥用.

这样我们就建立了一个CVS仓库了,然后,我们可以把这个测试项目的文件删除.试验一下如何从仓库获取文件.这里我假设上面的所有客户端工作你都已经做过了.

运行下面的命令:

   $cvs checkout cvstest

从仓库中检索出cvstest项目的源文件.

如果你已经做过一次checkout了,那么不需要重新checkout,只需要进入cvstest项目的目录,更新一把就行了:

$cd cvstest

$cvs update

一下即可.又或者你不想直接更新,只是想看看有没有更新的东西,那么:

$cvs status

这时后会打印出一长串状态报告(你可能需要用类似less这样的命令分页显示,或者定向到一个输出文件里慢慢看.),对项目中的每个文件有一份状态报告,类似这样:

===================================================================

File: foo.c             Status: Up-to-date

   Working revision:    1.1.1.1 'Some Date'

   Repository revision: 1.2     /home/cvsroot/cvstest/foo.c,v

   Sticky Tag:          (none)

   Sticky Date:         (none)

   Sticky Options:      (none)



这里最重要的就是 Status 栏,这里总共可能有四种状态:

Up-to-date:表明你要到的文件是最新的.

Locally Modified:表明你曾经修改过该文件,但还没有提交,你的版本比仓库里的新.

Needing Patch:表明有个哥们已经修改过该文件并且已经提交了!你的版本比仓库里的旧.

Needs Merge:表明你曾经修改过该文件,但是偏偏有个不识相的也修改了这个文件,而且还提交给仓库了!



如果你只是想保持软件的同步的话(象我),那么上面的东西就足够用了.可是如果多人协作开发项目的话,可就不是了这么简单了.当你参加项目,维护文件时,就需要更多命令,比如说你我都是某 nasdaq 项目的开发人员:



1,你对某个文件做了修改,比如说改了ceo.c,加了一行程序:printf("where can I find VC to cheat!");

改完之后你要把修改提交给仓库,用命令:

$cvs commit -m "add a complain" ceo.c

或者就是:

$cvs commit -m "worry about money"

让cvs帮你检查哪个文件需要提交.



2,当我开始干活的时候,可能我先:

$cvs status

一把,这时候我会看到:



==================================================================

File: ceo.c             Status: Needing Patch



   Working revision:    1.1.1.1 'Some Date'

   Repository revision: 1.2     /home/cvsroot/nastaq/ceo.c,v

   Sticky Tag:          (none)

   Sticky Date:         (none)

   Sticky Options:      (none)



于是我知道有人改了ceo.c,于是我就:

$cvs update ceo.c

或者干脆:

$cvs update

把ceo.c这个文件更新为最新版本,然后再干活.然后提交.



如果这天你修改了coo.c,加了一行 puts("how about another kind of bragging?");

并且提交了,但是这时候我已经 $cvs status 过了,就是说我不知道你的修改.

而我加了一行printf("You must shamelessly and seems knowingness to act as a coo");

并且傻乎乎地提交:

$cvs commit coo.c

这时候,CVS会告诉我

cvs commit: Examing .

cvs server: Up-to-date check failed for 'coo.c'

cvs [server aborted]: correct above error first!



于是我知道有个狗屎在我修改文件的当口做了提交,于是我

$cvs update

这时cvs会报告:

RCS file: /home/cvsroot/nasdaq/coo.c,v

retrieving revision 1.1.1.1

retrieving revision 1.2

Merging differences between 1.1.1.1 and 1.2 into coo.c

rcsmerge: warning: conflicts during merge

cvs update: conflicts found in coo.c

C coo.c

告诉你coo.c有版本冲突,于是我编辑coo.c,这时一般文件里看起来象这样:

  ...

printf("You must shamelessly and seems knowingness to act as a coo");

<<<<<<< foo.c

=======

...

  puts("how about another kind of bragging?");

>;>;>;>;>;>;>; 1.2

...



于是我把上面改成:

printf("You must shamelessly and seems knowingness to act as a coo");

puts("how about another kind of bragging?");

然后

$cvs commit -m "merged" coo.c

于是下回你再更新的时候就有新的补钉要打...如此往复,直到完成所有修改.

不过这里有一些要注意的地方就是删除程序,如果你删掉一行对你可能没有用的程序

puts("to be honest"); 而我不想删除(因为我有用),而我不知情地直接:

$cvs update

了,那么我的这行程序也完蛋了,所以这里我们要注意所有开发人员的协调,千万不要乱删东西,大不了用

#if    0

#endif

宏定义对括起来.实在要删东西,那最好先标记一个版本:

$cvs tag v_0_0_1



然后你可以发布并删除你自己的工作目录里这个版本的文件(注意:不是删除仓库里的.):



$cvs release -d nasdaq



然后你再生成一个新分支:



$cvs rtag -b -r v_0_0_1 v_0_0_1_1 nasdaq



然后再建立v_0_0_1_1的分支



$cvs checkout -r v_0_0_1_1 nasdaq



编辑并修改这个分支的文件,这样的做法比较好.



不过要注意的是,新标记和新分支的建立最好由项目的管理人员负责,否则每个人都做一个分支,那么仓库就太乱了.因此,比较的开发人员之间的直接沟通是不能
忽略的.一般来说,在互联网上的标准模式是有一个管理员(可能自己并不写程序),有一个邮递列表,大家都在邮递列表上交流看法和做各种决议.当形成决议之
后,管理员做一个新版本的标记.以此循环.

  



还有一些命令,比如要增加一个文件 garbage_china_concept_stocks_list:



$cvs add garbage_china_concept_stocks_list



然后还要:



$cvs commit  garbage_china_concert_stocks_list



看起来有点象数据库里的事务?的确是这样.CVS维护着一个本地的参考文件(在CVS/Entries里),这样提交的时候就可以一次地把所有改变放到服务器端,这样也更安全.同样,如果想删除文件 bankrupted_web_site:



$rm bankrupted_web_site

$cvs remove bankrupted_web_site

$cvs commit bankrupted_web_site



3,一些小技巧:

$Header$ 标记:把这个标记放在文件的任何地方都会被 cvs 替换成最后修改的 cvs 用户名,该文件当前版本号,最后修改时间,该文件的 cvs 仓库路径,看起来象下面这个样子:



// $Header: /home/cvsroot/simhost/simhost.cpp,v 1.2 2001/04/20 08:26:10 jqliu Exp $



一般我们把它放在开头,这样对程序员修改文件非常便利,很多时候你只要看一眼开头就知道文件是否最新.



$Id$标记:把这个标记放在文件的任何地方都会被 cvs 替换成最后修改的 cvs 用户名,该文件当前版本号,最后修改时间,该文件的 cvs 仓库路径,看起来象下面这个样子:



$Id: simhost.cpp,v 1.3 2001/04/24 02:27:36 simhost Exp $



好了,上面所有的东西,估计就是我们用cvs时80%情况下用的命令和内容,包括文件的更新,提交,冲突的解决,分支的派生,增删文件等.实际上cvs的
功能之强大,远远超出我在这里描述的内容,我这个"速成"也就管不了太多了,希望随着时间的推移,我们能够更加有效地使用CVS.也希望大家能够不断补充
这篇文章,最后能够成为手册,而不仅仅是速成.当然,还要更多地参考别的文档.



参考资料:

http://www.loria.fr.sixxs.org/cgi-bin/molli/wilma.cgi/doc.865331095.html

http://www.loria.fr.sixxs.org/~molli/cvs/doc/cvs_toc.html

2009年5月14日星期四

编程珠玑番外篇-D. 高级语言怎么来的-1

转自4G space,原文请看这里

终于放暑假了, 有心情来八卦了. 我主要想八卦一下高级语言的设计思想和各种范式的来龙去脉, 也就是回答这个问题: 编程语言为什么会发生成现在这个样子哩? 这里面的奥妙又在哪里哩? 我尝试着把这个系列的八卦写下去, 包括虚拟机的设计, 线程的设计, 栈和寄存器两大流派的来龙去脉等等, 也算是完成年初给大家许下的诺言.

高级编程语言的创始纪上写道:”初, 世间无语言, 仅电路与连线. 及大牛出, 天地开, 始有FORTRAN, LISP. ALGOL 随之, 乃有万种语.” 我们都知道, LISP 是基于递归函数的, FORTRAN 是做科学计算的. 现在的C 等等, 都比较像 FORTRAN 不像 LISP. 可是很少有人知道, 最初, FORTRAN 是不支持函数递归调用的, 而LISP是一生下来就支持的, 所有高级语言里面的递归调用, 都是逐渐从 LISP 那里学来的. 这段尘封的历史非常有趣, 值得八卦一番.

一般人学编程, 除了写 Hello World 之外, 人生写的第二个程序, 不是阶乘就是菲波拉契数列, 要不就是汉洛塔. 而这几个程序, 基本上都是因为函数的递归调用才显得简单漂亮. 没有递归的日子里, 人民非常想念您. 可是, 第一版的 FORTRAN 就居然居然不支持递归. 细心的读者要问了, 不支持递归的语言能图灵完全么? 当然可以, 图灵机就是没递归的典型的例子. 但是没递归调用的程序会很难写, 尤其像汉诺塔这种. 那么, FORTRAN 他怎么就悍然不支持递归呢, 让我们回到 1960 年.

话说当年, IBM 是计算机行业的领军者. 那时候的计算机, 都是比柜子还大的大家伙, 至于计算能力嘛, 却比你的手机还弱. 那时候计算机所做的最多的事情, 不是发邮件打游戏, 而是作计算. 作计算嘛, 自然需要一种和数学语言比较接近的编程语言. 于是, 1960年, IBM 就捣鼓出了 FORTRAN, 用行话说, 就是公式翻译系统. 这个公式翻译系统, 就成了世界上第一个编程语言. 这个编程语言能做数学计算, 能作条件判断, 能 GOTO. 用现在的眼光看, 这个语言能构模拟图灵机上的一切操作, 所以是图灵完全的. 学过数值计算的同学都知道, 科学计算无非就是一大堆数学计算按照步骤进行而已. 所以, 一些控制判断语句, 数学公式加上一个数组, 基本上就能完成所有的科学计算了. IBM 觉得这个语言够用了, 就发布了 FORTRAN 语言规范, 并且在自家的大型机上实现了这个语言. 

在实现这个语言的时候, IBM 的工程师要写一个 FORTRAN 编译器 (请注意那时候的大型机没有操作系统). 那时候的编译器都是用机器语言或者很低级的汇编语言写成的, 所以编译器要越简单越好. 这些工程师觉得, 弄一个让用户运行时动态开辟内存的机制太麻烦了, 所以干脆, 强迫用户在写程序的时候, 就要定好数组的大小, 变量的类型和数目. 这个要求并不过分, 因为在科学计算中, 数组的维度, 用到的变量等, 在计算之前, 就是可以知道大小的. 用现在的话说, 就是不能动态开辟内存空间, 也就相当于没有 malloc 的 C, 或者没有 new 的 C++. 这样的好处是, 一个程序要多少内存, 编译的时候就知道的一清二楚了. 这个主意看上去很聪明, 不过 IBM 的工程师比你想得更加聪明, 他们想, 既然一个程序或者子程序要多少内存在编译的时候都知道了, 我们干脆就静态的把每个子程序在内存中的位置, 子程序中参数, 返回值和局部变量放的位置, 大小都定好, 不久更加整齐高效么. 是的, 我们都知道, 在没有操作系统管理的情况下, 程序的内存策略越简单越好, 如果内存放的整整齐齐的, 计算机的管理员就能够很好的管理机器的内存, 这样也是一件非常好的事情. (再次强调, 当年还没有操作系统呢, 操作系统要等到 1964年发布的 IBM 360 才有, 具体开发一个操作系统之难度可参考< 人月神话>).

可是, 聪明的读者一下子就看出来了, 这样静态的搞内存分配, 就递不成归不了了. 为啥呢. 试想, 我有个 Fib 函数, 用来计算第 N 个菲波拉契数. 这个函数输入一个整数, 返回一个整数, FORTRAN 编译器帮我把这个函数给静态分配了. 好, 我运行 Fib(5) 起来, FORTRAN 帮我把 5 存在某个专门给输入参数的位置. 我在 Fib(5) 里面递归的调用了Fib(4), FORTRAN 一看, 哈, 不还是 Fib 么, 参数是 4, 我存. 这一存, 新的参数4, 就把原来的 5 给覆盖掉了, 新的返回值, 也把原来的返回值给覆盖掉了. 大事不好了, 这么一搞, 新的调用的状态居然覆盖了老的调用, 这下, 就没法返回原来的 Fib(5) 了, 这样一搞, 怎么递归啊?

IBM 这些写编译器的老前辈们, 不是不知道这个问题, 而是压根就鄙视提出这个问题的人: 你丫科学计算递归什么呀, 通通给我展开成循环, 展不开是你数学没学好, 想用递归, 你就不要用 FORTRAN 了. 那时候 IBM 乃是老大, 只有他们家才生产大型机, 老大发话, 下面的消费者只能听他的.

既然软件不支持, 硬件也就可以偷工减料嘛, 所以, 硬件上, 就压根没有任何栈支持. 我们都知道, 计算机发展史上, 软件和硬件是相互作用的. 我们现在也很难猜测, 是IBM 的软件工程师因为 IBM 的硬件工程师没有在硬件上设计出堆栈所以没有能在 FORTRAN 里面设计出递归调用呢, 还是 IBM 的硬件工程师觉得既然软件没要求, 我就不设计了呢? 不管怎么样, 我们看到的是, 1960 年前, 所有的机器的硬件都没有直接支持栈的机制. 熟悉CPU的都知道, 现代 CPU 里面, 都有两个至关重要的地址寄存器, 一个叫做 PC, 用来标记下一条要执行的指令的位置, 还有一个就是栈顶指针 SP. 如果没有后者, 程序之间的调用就会非常麻烦, 因为需要程序员手工维护一个栈, 才能保证程序之间调用最后还能正确的返回. 而当年, 因为 FORTRAN 压根就不支持递归, 所以支持 FORTRAN 的硬件, 就省去了栈指针了. 如果一个程序员想要递归调用, 唯一的实现方法, 就是让程序员借用一个通用寄存器作为栈指针, 自己硬写一个栈, 而且不能用 FORTRAN.

因为 FORTRAN 不支持递归调用, 按照自然规律, 自然会有支持递归的语言在同时代出现. 于是, 很快的, LISP 和 ALGOL 这两个新语言就出道了. 我们只说 LISP. 它的创始人 John McCarchy 是 MIT 教授, 也是人工智能之父, 是学院派人物. 他喜欢丘齐的那一套 Lambda 演算, 而非图灵的机械构造. 所以, LISP 从一开始, 就支持递归的调用, 因为递归就是 lambda 演算的灵魂. 但是有两大问题摆在 McCarchy 面前. 一是他的 LISP 理论模型找不到一个可以跑的机器, 二是他的 LISP 模型中有一个叫做 eval 的指令, 可以把一个字符串当成指令在运行时求值, 而这个, 当时还没有人解决过. 按照 Paul Graham 大叔在他的 Hackers and Painters 里面的说法, McCarchy 甚至压根就不想实现这个 eval 指令, 因为当 IBM 的一个叫 Steve Russell的工程师宣称要实现 eval 的时候, McCarthy 还连连摇手说理论是理论, 实际是实际, 我不指望这个能被实现. 可是, Russell 居然就把这两个问题一并给解决了(这哥们也是电子游戏创始人, 史上第一个电子游戏就是他写的, 叫 Space War). 他的方法, 说来也简单, 就是写了一个解释器, 让 LISP 在这个解释器里面跑. 这个创举, 让传统上编译-> 运行 的高级语言流程, 变成了 编写-> 解释执行的流程, 也就是著名的 REPL 流程. 他做的事情, 相当于在IBM 的机器上用机器码写了一个通用图灵机, 用来解释所有的 LISP 指令. 这个创举, 就让 LISP 从理论走到了实践.

因为有了运行时的概念, LISP 想怎么递归, 就可以怎么递归, 只要运行时支持一个软件实现的栈就可以了. 上面我也说了, 也就是写解释器的人麻烦一点而已, 写LISP程序的人完全就可以不管下层怎么管理栈的了. 同时, 有了解释器, 也解放了原来动态分配空间的麻烦, 因为现在所有的空间分配都可以由解释器管理了, 所以, 运行时环境允许你动态的分配空间. 对空间分配的动态支持, 随之就带来了一项新技术: 垃圾收集器. 这个技术出现在 LISP 里面不是偶然的, 是解释器的自然要求和归宿. 在 FORTRAN 上本来被绕过的问题, 就在 LISP 里面用全新的方法被解决了. LISP 的划时代意义和解释器技术, 使得伴随的很多技术, 比如抽象语法树, 动态数据结构, 垃圾收集, 字节码等等, 都很早的出现在了 LISP 中, 加上 LISP 本身规则很少, 使用起来非常灵活, 所以, 每当有一项新技术出现, 特别是和解释器和运行时相关的一项新技术出现, 我们就会听到有人说, “这玩意儿 LISP 里早就有了”, 这话, 是有一定道理的.

除了上面的软件模拟之外, MIT 还有一派在作硬件模拟, 这一派, 以后发展成了灿烂一时的 LISP machine, 为日后所有虚拟机理论铺开了一条新路. 这一派在70, 80年代迅速崛起, 然后随着 PC 的兴起又迅速的陨落, 让人唏嘘不已.

最后附送一个八卦: 1960 年的时候, 高级语言编程领域也发生了一件大事, 即 ALGOL 60 的提出. ALGOL 是划时代的标准, 我们今天用的 C/Java 全是 ALGOL 家族的. ALGOL 注意到了 FORTRAN 的不支持递归的问题, 于是从一开始, 就订立标准支持递归. 但是, 处理递归需要很小心的安排每个函数每次调用的地址和所谓的活动窗口(Active Frame), 而并不是每个编译器都是牛人写的, 所以在处理递归这样一个新事物上, 难免会出点小问题和小 BUG. 这时候, 搞笑的高爷爷(Knuth) 出场了, 他提出了一个测试, 叫做 “是男人就得负67″. (The man or boy test). 恕我功底不深, 不能给各位读者把这个男人测试的关窍讲清楚, 但是, 我知道, 这个测试, 乃是看 ALGOL 60 编译器有没有正确的实现递归和外部引用的. 照高爷爷的说法, 真的男人要能得到正确答案, 不是男人的就得不到正确答案. 当然, 高爷爷当时自己也没有男人编译器, 所以自己猜了一个 -121, 后来, 真的男人编译器出来了, 正确答案是 -67. 可见, 高爷爷的人脑编译器, 也不是男人编译器…

各位欲知详情的, 猛点这个.

PHP的字符集问题

第一种方法

< html>
< title >页面标题< /title >
< meta equiv="Content-Type" content="text/html; charset=gb2312" >

......
这种方法在FF上还是有问题,在IE上是可以的。

第二种方法
< ?php
header("Content-Type:text/html;charset=GB2312");
? >
这种方法在FF上也正常显示,在IE上是可以的。

现在的问题是,如果我页面是UTF-8的编码,而且PHP是默认用UTF-8,但是我的数据源使用GB2312的时候,页面无论如何都会出现乱码。这个问题应该怎么解决,方法还没查到。

2009年5月12日星期二

配置EMACS的PHP模式

http://sourceforge.net/projects/php-mode/

下载php-mode.el

http://www.emacswiki.org/cgi-bin/wiki/HtmlModeDeluxe

有在同文件里混合代码的处理说明需要mmm支持

在.emacs中加入

;;---------- php
(add-to-list 'load-path (expand-file-name "/usr/local/share/emacs/22.2/site-lisp"))
(require 'php-mode)

;;---------- mmm-mode
(add-to-list 'load-path (expand-file-name "/usr/local/share/emacs/22.2/site-lisp/mmm-mode"))

(add-hook 'php-mode-user-hook 'turn-on-font-lock)

(require 'mmm-mode)
(setq mmm-global-mode 'maybe)
(mmm-add-mode-ext-class nil "\\.php3?\\'" 'html-php)
(mmm-add-classes
'((html-php
:submode php-mode
:front "<\\?\\(php\\)?" :back "\\?>")))
(set-face-background
'mmm-default-submode-face "Blank")
(autoload 'php-mode "php-mode" "PHP editing mode" t)
(add-to-list 'auto-mode-alist '("\\.php3?\\'" . html-mode))
至于怎么在linux平台下的emacs中调试和运行php,有待继续研究。

emacs wiki里给的那个配置文件是有问题的,今天查了一天才搞定。

2009年4月28日星期二

纪念Sun的历史时刻

这里转过来的,个人还是挺喜欢SUN的。我也用过很多SUN的软件,比如JAVA,OpenOffice,OpenSolaris,VirtualBox...对于SUN被ORACLE收购的结局,还是感觉有点不爽,转篇文章纪念一下SUN这个伟大的技术公司。

Sun公司作为世界上顶天立地级的技术巨头之一,已经成立了将近三十年,随着不久前甲骨文(Oracle)的对其的收购,Sun很可能会逐渐淡出人们的视野,让我们从这一组图片来见证Sun成立以来起伏跌宕的历史时刻。

梦想的实现(1982)

  Sun,原是斯坦福大学 网络部(Stanford University Network)的缩写,源自斯坦福大学电子工程和计算机科学系的博士生Andy Bechtolsheim(下图右二)的设想,和他一起创业的还有MBA以及电子工程师Vinod Khosla(左一)、后来加入的Scott Mcnealy(右一),而Sun Microsystems作为一个公司,则是由开发过UnixBSD的Bill Joy(左二)在1982年一月以第一任CEO的身份成立。

这不是披萨盒(1982)

  第一代Sun工作站产品极具魅力,它基于摩托罗拉68000CPU,有着1MB的内存和百万像素级的显示器。

云计算(1984)

  “云计算”的概念并不是源由 Scott McNealy,而是由Sun的第五位雇员John Gage在1984年提出的。Gage是加州大学伯克利分校的一位数学讲师,但是对计算机拥有浓厚兴趣,后来成为Sun的公众形象。他预言了“云计算”的 出现,后来Sun的事业腾飞时,“云计算”一直是Sun的工作理念和方向之一。

SPARC——RISC架构商用成功的标志(1989)

   RISC(精简指令集计算)架构源自伯克利分校80年代的研究,Sparc最终成为商用工作站CPU的标志。Sun对Sparc的第一个设计应用在 1986年发布,但到1989年才出现Sparc CPU的工作站。Sparc是一个开源的设计,其他公司基于Sparc开发出了其他产品,如富士通和LSI

Solaris的光芒(1991)

  Sun对 Solaris的描述是:“工业界第一套完善封装的分布式计算环境”,作为一个和AT&T的合作项目,Solaris将当时流行的三大 Unix发行版(BSD, System V, Xenix)合为一体。原本Solaris的开发是要在x86和SPARC两大架构上运行,但后来Solaris只在Sun系统上出现。今天 Solaris成为了开源操作系统之一。

Java的舞台(1995)

  Java最原始的理念,是创建一种通过虚拟机跨平台运行的面向对象的编程语言。作为如今流行的编程语言之一,Java比C更安全而比Visual Basic更灵活。Java维护了一个安全的代码环境,防止了一些不安全的代码习惯,更支持分布式应用程序的开发。

Sun起诉微软(1997)

  微软一直对Java 怀有敌意,并暗使手段让当时如日中天的Windows系统对Java难以兼容。当Java对作为浏览器插件的ActiveX机制造成威胁时,微软通过反编 译开发了一套微软Java虚拟机默认安装在Internet Explorer上。同时微软也开发出一套和Java相类似的语言Visual J#,打算将Java程序员吸引进去.Net阵型。Sun就微软的这些行为起诉,这场官司延续到2004年,Scot McNealy 和 Steve Ballmer提出和解,而微软同意支付20亿美元的赔偿。

互联网泡沫里的泡泡(1999-2001)

  随着互联网的泡沫式发展,Sun的UltraSparc服务器(同时提供基于Java的Web服务)卖得火红火热,Sun公司的估价一度飙升到2000亿美元,此时其股价达到每股247美元。但到了2001年末的熊市,Sun的股价只剩49美元。

技术的巨人(2002-2004)

  经济泡沫过 后,Sun发布了一系列让人难以置信的产品和技术,其中不少都在后来的市场当中获得商业上相当的成功,不过除了一项开源设计,UltraSparc T1,一个硬件多线程的RISC架构CPU。另外,ZFS文件系统也终于获得了重视,目前被认为是最有潜力作为存储系统革命的根基技术。

Andy Bechtolsheim 的回归 (2004)

  Sun通过收购Kealia公司迎回其创始人Bechtolsheim后,Sun开发出基于AMD Opteron CPU的服务器,同样卖得相当红火,同时也让Sun的x86系列服务器浴火重生。

Schwartz的掌舵(2006)

  很多人没有 想当Schwartz会选择当Sun的CEO,毕竟他是软件出身的,虽然极具天赋,但似乎Sun还是靠买服务器为生。在此前,Schwartz曾对 InfoWorld的编辑说,他想让Sun成为Java公司。谁都看得到Java的价值,然而Sun至今未能从Java获利。

Sun收购MySQL(2008)

  经过几年的调整,Sun开始恢复元气,其产品线(大多为开源)包括了服务器应用、小型机N1管理包、开发环境、企业应用整合软件、企业服务总线等等,但其缺乏数据库应用。于是并购了广受欢迎的开源数据库MySQL。

Oracle收购Sun

  2009年4月20日, 甲骨文(Oracle)同意以74亿美金的价格并购Sun。Oracle的CEO Larry Ellison认为Sun的价值在于Java和Solaris,通过Sun的这两项产品,Oracle在2009年至少能获纯利15亿,到2010年应该 能增加到20亿。

2009年4月27日星期一

说说美国人眼里的中国人

说实话,我对中国在国际上的形象一直还是有点期待的,即使不是最好的,起码也不应该很差。但是最近的几件事,改变了我的看法。

最近一直在看stargate(SG1不是SGA),这部电视剧里中国人和中国神话人物出厂的比较少,但是即使从这不多的几个人和几集电视中也可以看出美国人眼中的中国人是什么样子的。

在SG1里,中国神话中的人物只出现了一位,就是大禹(lord Yu),在第三季出厂的时候,丹尼尔介绍说,Yu对古代中国的帮助很大,建立了中国古代的第一个王朝,被称为The Yu great。据此判断应该就是大禹了。不幸的是大禹居然是Gua'old,虽然是系统领主里对人类最好的一位,但是毕竟也是坏人。Yu第二次出场是在第五季,在这里Yu被介绍为load Yu Huang Shang Ti,如果估计的不差的话,应该就是玉皇大帝吧。感觉美国人对中国古代神话传说里的人物弄得不是很清楚。再看Yu手下的仆人,居然都穿着清朝人才穿的袍子,他的首席Jaffa居然头上写了个中字,实在有点让人无奈。

有中国人出场的是在第六季,美国空军要对五大国讲星际之门的时候,这时,中国大使出厂了。其他的不说,就中国那个大使的长相就够恶心人了,看起来就不像是正经人,感觉很是奸诈狡猾而且挑衅心理极为严重。反观英法两国大使和俄国的将军,起码感觉比较诚恳而且智慧。这一集里,中国大使给人的感觉就是完全挑衅为主,而且满嘴胡话。到了最后Thor出面解决了问题,英法两国都同意了,中国大使还是继续嘴硬。他对俄国的上校说了一句话,中国政府不甘心处于这样的二流地位,感觉这是美国人对中国政府的真实看法。

前两天,我和一个在美国的姐姐的姐姐聊天,说起美国人对中国的看法,感觉美国人对中国的看法其实和星际之门里反映出来的差不多。另一个在德国的哥们说,欧洲很多人也是这么看中国的。至于为什么这样子呢,我不太“明白”,只好留待看官自己参详了。只记得有句话说,如果只有一个人对你有看法,那可能是他的问题,如果很多人都对你有看法,那就是你的问题了。

俺们的第三艘航母该叫啥名?

军迷们盼中国的航母盼了有十年了吧,尤其是梁光烈国防部长发出“中国不能永远没有航母”的言论以后,航母已经不再是一个梦,是一个很现实的东西。

其实这几年以来各大网站都有人在讨论未来的航母应该叫什么名字,几乎每一次讨论都有人会提出应该叫“城管号”,而且肯定同意的人还都不少。

老冰挺赞成用“城管”这种特别能战斗的组织名字来命名第一艘航母。这个名字肯定让美帝苏修蒋匪帮各国反动派闻风丧胆,你看连革命人民都闻风丧胆诶,反动派们敢不闻风丧胆。

第二艘呢,叫“计生办”怎么样?这也是一个非常有战斗力的组织,同样能使革命人民闻风丧胆,所以反动派照样不敢不闻风丧胆。

那,第三艘该叫什么呢?
我表弟说叫“失业号”,个人觉得这个太露骨,还是叫“下岗号”或者“人民警察号”比较好,原因同上。
这个名字肯定让美帝苏修蒋匪帮各国反动派闻风丧胆,你看连革命人民都闻风丧胆诶,反动派们敢不闻风丧胆。

2009年4月22日星期三

Do some dreaming

转过来的,原文请看这里

1. 假设Oracle在收购SUN之后,不舍弃SUN的所有产品(包括硬件和芯片制造业务),那么Oracle该如何进行融合以及发展?Oracle收购Redhat,在高端市场主推Sun服务器+Solaris+Oracle,在中低端市场主推HP/DELL服务器+Linux+MySQL。
2. 通过Java的研发力量持续优化Oracle Fustion Middleware性能,在Enterprise Manager Grid Control中继续深入Host Server+Operating System+Application Server+Database的一站式监控调优解决方案。
3. HP和DELL不应该会因为Oracle收购SUN而放弃Oracle,投入微软的怀抱,至少在目前微软并无高端企业市场优势的情况下,HP和DELL更是不需冒此风险。同时,为了抗衡IBM,HP也只有选择和Oracle结成同盟,是否结盟,很大程度上要看Oracle的态度,那么Oracle在存储市场中继续跟HP合作,在己方已拥有SUN硬件的优势下,或许可以从HP获得更优厚的合作条件及利润回报。
4. 虽然IBM的Mark Loughridge说“甲骨文-Sun交易不会改变科技产业的现有市场竞争格局”,这个论调的原因是“甲骨文同Sun的合伙关系已持续了20年,甲骨文-Sun交易改变了什么?什么也没有。我们一直同Sun展开市场竞争,对甲骨文的实力也了如指掌。”,可惜任何人都能看出合作伙伴和一家人之间存在着多大的不同,Oracle在首次真正具备在全球范围内挑战IBM的实力之后,已经无可争辩地成为IBM最可怕的竞争对手。IBM是Java的最大客户,现在Java掌握在Oracle手中,这对于IBM来说无疑是很恶心的事情。如何通过Java在软件开发层面压制IBM,让我们拭目以待。
5. Oracle收购Twitter,持续推进企业级应用的Internet进程,发布基于微博客的企业级管理解决方案,设想一下,通过简单的Twitter Post和Follow来发布企业级应用的管理命令,获取应用的健康状况,整个管理模式也许就彻底改变了。
6. 在合适的时机,Oracle收购EMC,彻底完成在企业级IT硬件和软件领域三足鼎立的格局(IBM, Oracle, HP),IBM是黑色的,HP是白色的,Oracle是红色的。呃。。。微软在哪里?因为微软说永远不会有兴趣收购硬件厂商,那么他就永远进入不了这个游戏圈子。

2009年4月21日星期二

也说ORACLE收购SUN

ORACLE收购SUN了。今天早晨听见老杨说这个消息的时候,我也着实吃了一惊。一方面在意料之中,SUN迟早会被收购的也许被ORACLE收购还好一点,一方面也在意料之外,毕竟这场交易来的太快了一点,SUN跟IBM的谈判刚刚结束,就对ORACLE投怀送抱,还是让人有点吃惊。

个人认为对ORACLE来说,这场交易还是很划算的,毕竟可以买到很多东西,JAVA/SOLARIS/MYSQL,一堆一堆的出名的产品。SUN的资产包括硬件和软件两方面,个人对ORACLE运营SUN的硬件不太看好,毕竟ORACLE是做软件出身的,运营硬件恐怕有点问题,倒不如转手把SUN的硬件卖给INTEL和HP。

SOLARIS--山重水复疑无路,柳暗花明又一村。
至于软件方面solaris+ORACLE的模式已经在很多高端服务器上取得了成功,ORACLE收购SUN后,一方面可以进一步改进ORACLE在SOLARIS上的性能,另一方面对这个已经有很多年历史的操作系统来说也可以取得继续发展的资金。不太明晰的地方有两点,一是ORACLE会如何处理SOLARIS和LINUX的关系,毕竟ORACLE已经有自己的企业级LINUX了,另一方面是OPENSOLARIS的归宿。

JAVA--沉舟侧畔千帆过,病树前头万木春。
JAVA是ORACLE这次收购的重头戏,个人认为ORACLE这次收购重点打击对象不是IBM和微软,而是SAP。跟ORACLE一样SAP也把自己的架构坐在JAVA EE平台上。JAVA这下落到了ORACLE的手里,SAP毕竟不像IBM,有自己的JVM实现,SAP下一步会如何行动?另外不知道这次收购会不会引起JAVA阵营的分裂,毕竟IBM的实力也不可小觑。还有就是ORACLE会如何处理JAVA ME/JAVA FX,以及那些开源社区。ORACLE会不会延续SUN在JAVA社区的管家婆的身份?在JAVA EE方面ORACLE已经拥有了WEB LOGIC了,如今再买GLASSFISH,再加上以前的ORACLE AS,那么ORACLE就已经有三种应用服务器了,个人的看法是ORACLE肯能会完全开放GLASSFISH,继续发展WEB LOGIC,完全扔掉ORACLE AS。在IDE方面,ORACLE已经拥有JDEVELOPER和WORKSHOP了,ORACLE似乎已经废掉了WS,至于NETBEANS和JDEV,可能会融合成一个基于NETBEANS的IDE。至于JROKET和JVM,ORACLE应该会以JVM为主。总
的来说,JAVA归ORACLE所有可能对大家都比较合适,JAVA应该能继续其企业级应用的霸主地位。

MYSQL--莫愁前路无知己,天下无人不识君。
很多人认为被ORACLE收购后,MYSQL恐怕不会继续发展了,个人私下以为不会。长期以来MYSQL一直占据低端数据库市场,从未进入ORACLE数据库的领土。而且MYSQL在WEB2.0的网站项目中大量使用,这块对ORACLE来说,一直是空白,因此ORACLE/MYSQL可以形成高低组合,抢占市场。如果说MYSQL对谁有威胁的话,那肯定是对微软的SQLSERVER了。从市场份额上看,ORACLE公司估计已经抢占了数据库市场将近60%的份额,几乎立于不败之地。因此对
ORACLE来说,对待MYSQL的最好方式就是继续发展。有疑问的地方在于,以后ORACLE数据库还能免费下载么,XE还会继续存在么。

virtualbox--两个黄鹂鸣翠柳,一行白鹭上青天。
最近一直传闻ORACLE要收购一家VM厂商,现在看来应该不太可能了。我个人用过virtualbox,但是没有用过OVM,但是二者都是基于XEN的VM,应该ORACLE会大搞融合。我预计的情况是ORACLE会以VBOX为主(毕竟使用的人数要多很多),同时维持开源和免费的策略,挺看好VBOX。

OpenOffice--惶恐滩头说惶恐,零丁洋里叹零丁。
支持OPENOFFICE能够继续打击微软,估计ORACLE还是投入一些钱来做,但是能支持到什么程度就不好说了。个人觉得可能ORACLE不会大力发展这个东西,不好还好SUN已经将其开源了。

2009年4月18日星期六

netbeans试用

说说自己用过的几个JAVA IDE

开始做JAVA以来基本上都是用eclipse,以前对ORACLE痴迷的那阵子,也用用jdeveloper,这两天试了试sun的netbeans,感觉也很不错。

整体上来说,eclipse是三者里面功能最弱的,jdeveloper是最强,后者的功能强到和vs.net差不多,仅仅拖拽就能完成一些小型项目了,而netbeans则介于两者之间。使用eclipse的最大的好处是用的人很多,插件很多,jdeveloper的优势在于其跟ORACLE数据库绑定的非常紧密(最新版本对weblogic的支持也很好),而netbeans对多语言支持的很好比如ruby,c/c++,而且自带的例子也很好,很便于学习。

在JAVA SE来说,netbeans的支持最好,使用netbeans做出来的app程序在各个平台上都跟本地程序差不多,而且响应很迅速,传说永中office就是用netbeans做的,另外开发方式也是类似vs.net式的。而jdeveloper也是使用awt/swing做的,也可以很好,只是外观是ORACLE独有的那种格式,当然了开发方式也是拖拽式的。eclipse基本就不支持做本地程序。

在web开发方面来说,eclipse的web编辑器几乎就是一个纯文本编辑器,在这方面netbeans也差不多,而jdeveloper几乎是所见即所得的开发方式,跟dreamwaver差不多,而且支持很多ORACLE自定义的标签(当然也包括struts)。

在JAVAEE来说,jdeveloper很强,跟vs.net有的一拼,netbeans也很好,eclipse需要自己配置,不过由于国人习惯盗版,打了myeclipse插件之后也还挺好用的。其实根本就不用去盗版myeclipse,weblogic自带一个开发工具workshop也很好,不在myeclipse之下,习惯盗版的哥们可以考虑用用(不用输入licence)。

运行速度来说,eclipse最快,当然是在不包括myeclipse插件的情况下,netbeans也很快,jdevloper最慢。

个人选择的话我的顺序是netbeans,eclipse,jdeveloper,jdev主要是跟ORACLE数据库绑定的太紧了。

刘霞:呼吁释放我的丈夫刘晓波

从牛博转过来的,能翻墙的去看看吧。

刊载于4/16/2009 《华盛顿邮报》

呼吁释放我的丈夫刘晓波


我的丈夫刘晓波是08宪章的主要起草人之一。08宪章以前捷克斯洛伐克的77宪章为蓝本,呼吁在中国进行全面的政治改革,包括建立民主政府,以普世公认的 标准保障人权。2008年12月10日是世界人权宣言签署60周年,这一天08宪章由300多中国公民签署发布,截至今天联署者已超过8000人。

很明显,08宪章在全体华人中引起了共鸣。也许正是因为这个原因,当局认为我的丈夫对国家政权构成了危险。2008年12月8日,中国警方在未出示逮捕证的情况下逮捕了我的丈夫,并被拘押至今,尽管他们从未对他提出任何控罪。

尽管由于参与起草08宪章,我的丈夫陷入了困境,但我相信晓波没有后悔。他一向坚定地致力于促进并保障中国人的人权,特别是那些弱势群体的人权。事实上, 这已经是我第四次亲眼目睹他被警察从家中拖走。在此之前,他曾因参加1989年天安门广场的民主运动而被监禁半年。 1996年,由于他撰写文章呼吁民主自由,再次被判入狱三年。2006年,他又一次被北京警方拘押,持续审问12个小时后才被释放。

虽然我和丈夫深知起草并签署08宪章可能带来的后果,但丈夫被拘留仍然给我们两人带来了巨大的痛苦。很早以前,我们俩人就商定不生孩子,不论是男孩女孩, 父亲被投入监狱对于他们来说总是件十分残酷的事儿。所以,我们现在还是独身。丈夫被拘押后,我们只能靠书信联系,俩人不断地给对方写信,虽然我们知道这样 的信件也许对方永远不会收到。在他被绑架的近4个月来,当局只允许我们见了两次面。我被带到一个秘密地点,我和丈夫一边吃饭一边谈话,狱警一刻不停地在旁 边监视着我们。谈话中我了解到,他一直被单独关押在一个小房间里,里面只有一盏灯泡。我带给他的60多本书,多数都被监狱官员没收。想到他在监狱里孤苦伶 仃的生活,我感到难以忍受。

现在我担心,政府正在准备对他进行审判,试图以“煽动颠覆国家政权罪”来判决他。当局经常用这个罪名来惩处持不同政见者,一旦按这个罪名判决刑期通常十分 漫长。警方已经传唤、调查了几乎所有的原始签署者,这是在搜集“证据”以便给我丈夫“定罪”。他们这样做,也是在向所有的民主运动参与者发出明确的信号, 告诉他们当局不会容忍持不同政见者。

我恳求奥巴马总统能够过问我丈夫的案子,向中国政府表达让我的丈夫重获自由的希望。我的丈夫没有做错任何事,他被监禁不仅是我个人的大不幸,也是无数和他 一样渴望国家自由民主,却又没有正常表达渠道的中国人的巨大悲剧。请奥巴马总统站在刘晓波一边,帮助我实现与丈夫团圆的梦想。

作者为刘晓波之妻,居北京。英文由华盛顿的人权组织劳改研究基金会翻译。

Washington Post, 4/16/2009


An Appeal for a Chinese Dissident

By Xia Liu

Thursday, April 16, 2009

BEIJING -- My husband, Liu Xiaobo, was one of the primary drafters of a document known as Charter 08. Modeled after the Charter 77 petition created in the former Czechoslovakia, Charter 08 calls for comprehensive political reforms in China, including the establishment of a democratic government and the protection of universally recognized human rights. It was signed and issued by more than 300 Chinese citizens on Dec. 10, 2008, the 60th anniversary of the signing of the Universal Declaration of Human Rights, and to date it has been signed online by more than 8,000 others.

Charter 08 has clearly resonated with everyday Chinese people. Perhaps this is why my husband, who was arrested on Dec. 8 by Chinese police without an arrest warrant, was seen as such a threat to the regime that he remains in police custody today, even though no charges have been brought against him.

Despite the hardship that his involvement in the Charter 08 movement has caused him, I am sure that Xiaobo has no regrets. He is deeply committed to promoting and protecting the rights of all people, particularly those who do not enjoy the advantages that he has as an intellectual. Indeed, this was the fourth time that I have had to witness my husband being dragged from our home by Chinese police. He previously served half a year in prison for his participation in the 1989 pro-democracy demonstrations at Tiananmen Square. In 1996, he was taken away and sent to prison for three more years for promoting freedom and democracy in his writings. Then, in 2006, he was once again taken into custody and was interrogated for 12 hours before being released.

Although my husband and I were fully aware of the possible retaliation that his advocacy might inspire, his detention is still very painful for us both. We agreed long ago that we would not have a child, as it would be too cruel to subject him or her to the absence of an imprisoned father. Thus, we are both alone now. We write to each other constantly, knowing our letters will never reach each other. In the nearly four months since his abduction, authorities have allowed me only two visits with him. After being taken to an undisclosed location, I was permitted to talk with him as we shared a meal under the unremitting surveillance of prison guards. During our conversations, I learned that he has been confined alone to a small room lit by a single light bulb and that most of the more than 60 books I had brought him were confiscated by prison officials. It is difficult for me to bear the extent of his isolation.

Now I fear that the government is preparing to stage a show trial and convict my husband of "inciting the subversion of state power," a charge frequently leveled against political dissidents and one that typically carries a lengthy prison sentence. Police have summoned and investigated nearly all of the original signatories of Charter 08, as they gather "evidence" of my husband's "crime." In doing so, they are sending a clear signal to others in the democratic movement that dissent will not be tolerated.

I implore President Obama to intervene on my husband's behalf and to express to the Chinese government his wish that my husband be freed. My husband has done nothing wrong, and his imprisonment is a great tragedy not only for me but also for the countless people of my country who lack a voice but share his desire to see China become a free, democratic nation. Please, President Obama, stand in solidarity with Liu Xiaobo, and help me to be reunited with my husband.

The writer lives in Beijing. Her column was translated by the Laogai Research Foundation, a Washington group working to expose human rights violations in China.

2009年4月14日星期二

星际之门中的众神

星门里的神 埃及九柱天神:
埃及人认为世界的原初是一片茫茫的大海,或成为圣水,圣水神叫努(Nu),神在水中产生(Goa'uld?)。这一观念的产生远在拉(Ra)神成为至高无 上神之前。有一种观念认为最初在水中产生的事物都是甲虫形或者蛇形。甲虫神科荷普拉是埃及现存的神灵中最古老的神灵。这是一种比拉神要早得多的观念,这种 古老的观念后被其他观念所代替,拉神成为全埃及范围的太阳神,有几种关于他的出生的故事:圣水努中生出一朵荷花,太阳神拉就在荷花中孕育。
埃及神话分:1.哈爾莫普里斯神話 2.哈里歐普里斯神話 3.孟斐士神話,这三大系统,因时间和空间的不同,会有一些矛盾之处。
巴比伦神话
巴比伦神话被认为是分成两派众神战争的结果,被撕开的战败者Tiamat提阿马特(《创世记》里叫阿莫罗卡Omarka)的尸体造成了宇宙万物。
《艾努玛·艾利修》的世界创造神话,这个故事被记录在七块很大的粘土板上。在很高的地方,天还没得到命名,在下面,坚固的大地还没有名字来称呼他的时候, 只有他们(众神)的最初的父系首领淡水和造就他们所有的妈妈海水, 这两种水在一个体中混合在一起,产生了他们的下一代,即一些年轻的神(Goa'uld?)。天空神阿努(ANU)诞生后,阿努生出了后来被称为“全知神” 的EA。年轻的众神精力充沛,并且总是吵闹不停(Goa'uld的内部斗争?)。祖神阿卜苏Apsu不顾妻子提阿马特Tiamat的阻挠,想把这些年轻的 神杀掉。可是,知道这个计划的EA先发制人,用咒语使祖神陷入睡眠,待他的“光辉缠绕在身上”后,竟将祖神杀掉。这样,EA就成了水神,不久生下儿子贝 勒.马杜克(也叫Belus贝勒斯)。马杜克具有威严、智慧、全知全能等特征。提阿马特要替夫报仇,众神畏惧,马杜克出,劈了提阿马特,打碎她的头骨,把 她的尸体象干鱼片那样撕成两半,半成天,半成地,遂定乾坤之位。



1)Ra(拉):埃及太阳神,众神之王,人躯鹰首,头顶日盘,中王国和新王国时代握有绝对的权威。苏(Shu)及奈夫努特(Tefnut)之父,奴特 (Nut)与盖布(Geb)的祖父,奥西里斯(Osiris)伊西斯(Isis)赛特(Seth)奈夫蒂斯(Nephthys)的曾祖父,荷鲁斯 (Horus)阿努比斯(Anubis)的曾曾祖父。古埃及晚期他变成宇宙的主宰阿蒙·拉。宿主:8000年前1个地球上的埃及小孩,《星际之门》电影版 被原子弹解决。
◆ 2)Shu(苏):空气之神,支撐天空的柱子。[返回]
◆ Tefnut(奈夫努特):湖泊雨云女神,具有母狮头的女神,狮首人躯,头晌饰有蛇和日盘。
◆ 3)Nut(奴特):天空女神,常被画成一具有蓝色皮肤的女人,身体含有星星,或有双翼。
◆ Geb(盖布):大地之神,圣兽是鸭,常以黑或绿皮肤男人的形象出现,表现生长的万物及肥沃的尼罗河。
◆ 4)Osiris(奥西里斯):地狱判官,冥界之王,头戴羊角椎形王冠。宿主:Sarah, Daniel的同学。见SG1 4.14 "The Curse" 诅咒
◆ Isis(伊西斯):生命与健康之神,头饰为双牛角托一日盘之王冠,奥西里斯之妻,她象征忠贞的妻子和尽职的母亲。
◆ Seth(赛特):沙漠及军队守护神,双重性格,驴首人躯。Ra被推翻后一直藏匿在地球爱搞个人崇拜,后被Sam一掌打死。见SG1 3.02 "Seth"
◆ Nephthys(奈夫蒂斯):赛特之妻,常为带翼之妇女,阿努比斯的母亲。
◆ 5)Anubis(阿努比斯):埃及冥王,木乃伊神,人身狼头,奥西里斯与奈芙蒂斯(塞特之妻)之子。升了天,也没逃过Daniel魔爪的那位。‘5.16 "Last Stand" 最后立场’中出场,‘8.18 "Threads" 线索’中和Oma一起消失。
◆ Horus &Heru'ur(何露斯):太阳神,法老,主神之一,奥西里斯和伊西斯之子,鹰头人身。在飞船上,让四小强给炸死了。 ◆ Hathor(哈托尔):古埃及爱、舞、酒及外国之神,埃及最古老的女神之一,也是古埃及所有女神中最美的,外形幻化成母牛,戴双角头饰,两角之间嵌一日 盘,号称古埃及所有法老的母亲。第一次出场:SG1 1.14 "Hathor",‘3.01 "Into The Fire" 火拼’中被O'Neill扔进了冰池中。
◆ Baal(巴力):号称最有人气的神!随时间地点的不同,他代表了不同的地方神,如闪族人、腓尼基人、古犹太人、叙利亚、阿拉伯、巴比伦、迦南、波斯和埃 及都有人崇拜。SG1后期出现较多,克隆了自己,留了不少悬念。第一次出场:SG1 7.02 "Homecoming" 归乡
◆ Apophis(阿波斐斯):冥府之蛇,蛇神,也是太阳神Ra的死对头。被SG-1整死了好多次的那位老熟人。第一次出场:SG1 1.01 "Children Of The Gods" 众神的儿女
◆ Sokar(索卡尔):技巧神,冥界神,鹰首之木乃伊。在地狱星球,让四小强给炸死的那位。见SG1 2.17 "Serpent’s Song" 蛇之挽歌
◆ Bel.Marduk(贝勒.马杜克):巴比伦的众神之首。隐匿在一神庙里数千年,终于附在一名SGC的俄国士兵身上,但未出庙门就被C4炸了。见SG1 5.08 "The Tomb" 坟墓
◆ Nirrti(奈特):印度黑暗毁灭女神。爱好科学?常搞些小实验,如隔空取物,预测未来,第一次出场SG1 1.15 "Singularity" 幸存者,‘616 Metamorphosis 变形’中在O'Neill的‘劝说’下被467星球人掐死。
◆ Ares(阿瑞斯):希腊战神,宙斯的儿子。其座驾是唯一一个与古人飞船交过手Goa'uld的母舰…点背!
◆ Cronus(克罗诺斯):希腊神话中的提坦,在被他的儿子宙斯废黜之前一直统治着宇宙。后被两个Teal'c给打死。见SG1 3.03 "Fair Game" 公平竞争
◆ Yu(禹):大家都熟悉,在中国治水的那位。被SG-1称为‘最友善的敌人’,后死于假Sam的手下。见SG1 7.02 "Homecoming" 归乡

Asgard(北欧神话):Buri(布瑞,祖先,生产者)一出生便有个儿子,博尔(borr)意为生产,后又生有3个儿子,奥丁(odin,神圣)维利(vili,精神)伟(ve,意志)。[返回]
欧洲有两大神话:一是南方的"希腊神话";二是北方的"北欧神话"。北欧神话是个多神系统,可分成四个体系:巨人、神、精灵以及侏儒(如魔戒)。有三位命运女神乌尔德(过去)、维尔丹蒂(现在)和丝库尔德(未来),有12位主神,各有自己的宫殿。
北欧神话认为在世界诞生之前,太古太空的中央出现了一个无底洞,洞的中心有一处活泉,名为赫威高密尔(Hvergelmir),沿着十二条大河流向四方 (Asgard人的来源?)。无底洞之北为冰雪世界尼夫尔海姆(Niflheim);无底洞之南为火焰之国穆斯帕尔海姆(Muerpellsheim), 由火焰巨魔苏尔提尔(Surtr)镇守。南北冰火交融互济,一个名为伊密尔(Ymir)的霜巨人从无底洞中诞生,同时诞生的还有一头名叫奥德胡姆拉 (Audhumla)的大母牛。大母牛依靠舔食盐岩为生,在它舔过的地方诞生了阿瑟(Aesir,世界柱石,支撑者)神族的祖先布瑞(Buri,生产 者)。而生产者布瑞诞生的同时,他就有了一个儿子博尔(Borr,生产)。


◆ 1)Odin(奥丁)&Woden:众神之王,知识之神、战争之神。是英语Wednesday的由来,valhalla神殿的主人。Ajir司令官的上司。
◆ Frigg(芙丽嘉):众神之后,Odin之妻,婚姻及母爱之神,有个金轮织机,照亮夜空(北欧人称‘芙丽嘉的织轮’即猎户星座)。
◆ Loki(洛基):火神、邪神,Odin的弟弟,喜欢恶作剧,造成了不少麻烦。偷偷摸摸的把O'Neill给克隆的那位前遗传学家。见SG1 7.03 "Fragile Balance" 脆弱的平衡
◆ 2)Thor(索尔):雷神,Odin与大地女神乔德(jord)长子,是英语Thursday由来。Asgard舰队的最高指挥官,SG-1的老熟人。见SG1 2.06 "Thor’s Chariot" 雷神的战车
◆ Sif(西芙):土地和收获女神,Thor的妻子,传说中的大美女。
◆ Tyr(提尔):战神,Odin的儿子。是英语Tuesday的由来。
◆ Baldur(巴尔德尔):光明之神,Odin和Frigg的儿子,后被Loki玩死了。
◆ Hodur(霍尔德尔):黑暗之神,Odin和Frigg的儿子,Baldur的孪生兄弟。
◆ Bragi(布拉吉):Odin的儿子,美神,掌管诗歌和音乐之神。
◆ Fenris(芬莉斯):魔狼芬利斯,Loki第三个儿子,在诸神的黃昏里杀死了主神Odin。
◆ 3) Heimdall(海姆达尔):众神的守护神,Odin的孙子。配合SG-1救出Thor,并守护着Asgard人祖先的那位基因学家。 ◆ Freyr(弗雷尔):丰饶之神,主官收成以及生殖和爱情,海洋之神尼奥尔德(Niord)之子。保护K'Tau星球的Asgard人。
◆ Freya(弗丽亚):繁育之神,掌管生育以及爱情,Freyr的妹妹。是英语Friday的由来。

2009年4月12日星期日

使用ORACLE UCP

ORACLE UCP是指Universal Connecti了n Pool for JDBC,其实说白了就是ORACLE实现了一个数据库连接池,类似阿帕奇的commons-pool,使用这个东西可以提高JDBC程序的性能,并且不受应用服务器限制。

使用UCP需要:
  • JDK 1.6
  • Oracle JDBC thin driver supporting JDK 1.6
  • Oracle Universal Connection Pool library
以下是一段样例代码,链接的ORACLE数据库中自带的HR用户。

import java.sql.*;
import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.PoolDataSource;

public class UcpConnection {
public static void main(String args[]) throws SQLException {
try
{
//Creating a pool-enabled data source
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
//Setting connection properties of the data source
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("hr");
pds.setPassword("hr");
//Setting pool properties
pds.setInitialPoolSize(5);
pds.setMinPoolSize(5);
pds.setMaxPoolSize(10);
//Borrowing a connection from the pool
Connection conn = pds.getConnection();
System.out.println("\nConnection borrowed from the pool");
//Checking the number of available and borrowed connections
int avlConnCount = pds.getAvailableConnectionsCount();
System.out.println("\nAvailable connections: " + avlConnCount);
int brwConnCount = pds.getBorrowedConnectionsCount();
System.out.println("\nBorrowed connections: " + brwConnCount);
//Working with the connection
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select user from dual");
while(rs.next())
System.out.println("\nConnected as: "+rs.getString(1));
rs.close();
//Returning the connection to the pool
conn.close();
conn=null;
System.out.println("\nConnection returned to the pool");
//Checking the number of available and borrowed connections again
avlConnCount = pds.getAvailableConnectionsCount();
System.out.println("\nAvailable connections: " + avlConnCount);
brwConnCount = pds.getBorrowedConnectionsCount();
System.out.println("\nBorrowed connections: " + brwConnCount);
}
catch(SQLException e)
{
System.out.println("\nAn SQL exception occurred : " + e.getMessage());
}
}

UCP的配置可以参考UCP的手册,其他的用法,这篇文章里就不详细说明了,OTN上有文章讲的很详细,想看的话,点击这里
}

2009年4月10日星期五

民主协商建国的历史回顾

原文请看这里

今年是中国人民政治协商会议(当时曾称为“新政协”,以区别于1946年召开的旧政协)召开及《共同纲领》制定六十周年。有必要让人们知道,当初开国先贤们想建立的,究竟是一个什么样的新国家?还原这段历史并汲取经验教训,将有助于推动国家的政治体制改革。

一 民主宪政的共识


抗日战争期间,中共运用统一战线策略,在大后方重庆利用国民参政会等机构,与中间党派合作反对国民党的一党专政,并达成了实施民主宪政、成立联合政府的共识。

中间党派的共同特点是以知识分子为主体,有独立政治主张或利益诉求,对国共两党的政策皆有批评,但不具备军事实力。他们曾在大后方发起宪政运动,不断批评蒋介石的独裁政治,要求废除国民党的一党专政,实行西方式的民主宪政,逐渐形成了国共两党之外的“第三方面”。

1939 年11月,第三方面的三党(国家社会党、青年党、第三党)三派(救国会派、职教派、乡建派)负责人及个别无党派人士,在重庆举行会议,成立统一建国同志 会。会上通过了左舜生、章乃器起草的《统一建国同志会信约》,提出实施宪政、党派平等、学术思想自由、计划建设、军队属于国家、反对内战等十二条主张。该 会于1942年改组为中国民主政团同盟,1944年更名为中国民主同盟。

1944年9月,中国共产党在国民参政会上提出改组国民党的一党政府、建立联合各党各派共同抗日的民主联合政府的主张,受到第三方面的欢迎。美国总统特使赫尔利也敦促国共双方联合其他国内政治力量建立联合政府,并就此于同年11月9日在延安与毛泽东达成五项协议。

毛 泽东曾主张“新民主主义的宪政”,并在1945年4月召开的中共“七大”上,作了题为《论联合政府》的政治报告,提出:“人民的言论、出版、结社、思想、 信仰和身体这几项自由,是最重要的自由”;“没有人民的自由,就没有真正民选的国民大会,就没有真正民选的政府”。对于当时中间党派所主张的“军队国家化 ”,毛也表示了谨慎的赞同。

中共是当时拥有军队和地盘的最大在野党,其在陕甘宁边区推行的“三三制”政治样板,与国民党“一个主 义.一个政党,一个领袖”的统治模式形成鲜明对照,吸引了第三方面人士。在《新华日报》等中共媒体上,当时也有大量呼吁民主政治的文章。1945年7月, 褚辅成、黄炎培、冷遹、傅斯年、左舜生、章伯钧六位国民参政员联袂访问延安,当黄向毛提出如何摆脱政权更迭的“历史周期律”时,毛泽东声称:我们已经找到 新路,我们能跳出这周期率。这条新路,就是民主。

抗战胜利后,国共双方在“重庆谈判”中达成的《双十协定》及随后召开的政治协商 会议,令社会各阶层对国内和平及民主建国充满憧憬。与此同时,在国内形成了一股组党风潮:黄炎培、章乃器、胡厥文等组成了民族工商业家和知识分子为主体的 民主建国会,马叙伦、王绍鳌等教育界人士组成了民主促进会……,第三方面的阵营扩大了。

统一建国同志会《信约》中的原则,后来被 应用于民主同盟、民主建国会的政纲等文件,建设现代民主国家的宪政、人权、经济民主、军队国家化等理念,都有完备的体现。“中间路线”是第三方面人士的共 识,例如张东荪曾主张:“建立一个资本主义与共产主义中间的政治制度”;“在政治方面比较上多采取英美式的自由主义与民主主义;同时在经济方面比较上多采 取苏联式的计划经济与社会主义。从消极方面来说,即采取民主主义而不要资本主义,同时采取社会主义而不要无产专政的革命。我们要自由而不要放任,要合作而 不要斗争。不要放任故不要资本家垄断,不要斗争故不要阶级斗争。” [1]对于中共的暴力革命路线和土地改革模式,第三方面一直持反对立场。

二 联合政府的政治框架


1946 年国共两党内战的爆发,导致了第三方面的重新组合:国民党中的反蒋人士,组成了以李济深为首的国民党革命委员会;民主同盟中的青年党、民社党及一部分社会 贤达,参加了国民党政权召开的国民大会;其余党派则采取了抵制的态度,并进一步受到国民党的压迫。民主同盟于1947年被当局宣布为“非法”,以这一事件 为转折,迫使部分第三方面党派逐渐放弃中间路线,选择了与中共合作。这些党派后来被称为“民主党派”。

随着国民党的军事失利,中 国的政局开始重新洗牌。关于未来的政权组成,中共与“老大哥”苏共曾有所切磋。1947年11月30日,毛泽东致电斯大林说,一旦中国革命取得最后胜利, 按照苏联和南斯拉夫的经验,除中国共产党之外,所有政党都应该退出政治舞台了,这样将会加强中国革命的势力。斯大林于1948年4月20日覆电说:中国各 在野政党,代表着中国居民中的中间阶层,并且反对国民党集团,所以应该长期存在,中国共产党将不得不同它们合作,反对中国的反动派和帝国主义列强,同时保 持自己的领导权,即保持自己的领导地位。可能还需要这些政党的某些代表参加中国人民民主政府,而政府本身也要宣布为联合政府,从而扩大它在居民中的基础, 孤立帝国主义及其国民党代理人。应当考虑到,中国人民解放军胜利后建立的中国政府,就其政策而言,还是民族革命的,即民主政府,而不是共产主义政府。目前 还难以预料这将持续多长时间,至少在胜利后会是这样。[2]

斯大林一锤定音,决定了1949年后中国大陆的政治格局。中共的军事胜利比预计提前了两年,但作为一个以农民为群众基础的政党,文化教育的平均水准低于国民党,缺乏接管一个大国的人才储备,因此,与以知识分子为主体的民主党派合作,也是时势使然。

中 共中央于1948年5月1日发布《纪念五一劳动节口号》,提出:“各民主党派,各人民团体,各社会贤达,迅速召开政治协商会议,讨论并实现召开人民代表大 会,成立民主联合政府。”同日,毛泽东就召开新政协致函在香港的民革主席李济深和民盟务负责人沈钧儒,提议“发表三党联合声明”,并附声明草案,就是否增 加其他民主党派、人民团体联署等问题征求意见。

中共的主张得到了民主党派的积极回应,认为符合它们以往提出的相同主张,召开政治 协商会议“不是某一党一派的道路,而是全国人民共同的道路;通过新政治协商会议以达到民主联合政府之实现,也不是一党一派的要求,而是一切为民主事业奋斗 的党派、团体和各阶层人士的共同要求。”[3]但民主党派中对共产党能否真正实行民主,历来存有怀疑。储安平曾指出:“共产党今日虽然大呼民主,大呼自 由,而共产党本身固不是一个能够承认人民有思想自由言论自由的政党”。[4]施复亮也曾担心:“希望国民党统治区域实现真正的民主固然是一种空想,要在中 共统治区域实现广泛的民主恐怕也是一种奢望”[5]。谁都不希望在结束旧的一党专政之后,又产生新的一党专政。

关于新民主主义革 命的领导权,毛泽东于同年4月1日在晋绥干部会议上强调,“只能和必须由无产阶级和中国共产党充当领导者”。当时国民党内一些反蒋人士曾倡导在李济深、冯 玉祥等领导下的“国民党整体复兴运动”,认为若没有一个强大政党与中共“发生平衡作用”,即使组织了“容许若干小党参加以为点缀”的联合政府,“中国民主 宪政之真实基础将永久不易确定”。[6]中共坚决反对这种主张,毛泽东在1949年元旦发表《将革命进行到底》,主张“为着推翻中国人民的共同敌人而采取 一致的步骤……而不是建立什么‘反对派’,也不是走什么‘中间路线’”。

同年6月,毛泽东发表了《论人民民主专政》,他从政治和 经济的现实出发,反对破坏工商业的“农业社会主义思想”,仍主张“利用一切于国计民生有利而不是有害的城乡资本主义因素,团结民族资产阶级,共同奋斗”; 他同时主张“强化人民的国家机器”,强调工农联盟的重要性,认为民族资产阶级“不应当在国家政权中占主要的地位”。在这篇文章中,建立中央集权体制及推行 计划经济的思路初现端倪,与《论联合政府》一文的立场有所不同。此后,他还连续发表了《丢掉幻想,准备斗争》、《别了,司徒雷登》、《唯心历史观的破产》 等文章,开始对主张英美式民主的中间路线提出批判。

三 筹备新政协


1948年9月,在香港中共地下党的安排下,民主党派领袖沈钧儒、谭平山、章伯钧、蔡廷锴乘船秘密北上,抵达哈尔滨。哈尔滨在地理上与前苏联接近,中共中央曾考虑在这里召开新政协,并宣布建立新中国。后来因平津战役迅速获胜,才决定改在北平开会和建都。

中 共与沈钧儒等就《关于召开新的政治协商会议诸问题》草案交换了初步意见,又将修订后的草案向在香港的李济深、何香凝、周新民、马叙伦、陈其尤、李章达、沈 志远、彭泽民、章乃器、孙起孟、郭沫若征求意见,于同年11月25日达成了《关于召开新的政治协商会议诸问题的协议》,决定了新政协筹备会的任务及人选。 不久,李济深、何香凝、郭沫若等四十余人分三批先后到达。

毕竟形势比人强,随着“三大战役”的胜利,国民党的失败已成定局。 1949年1月21日,民主党派及无党派人士李济深、沈钧儒、马叙伦、郭沫若等五十五人发表声明,首次公开表示“愿在中共领导下,献其绵薄,共策进行,以 期中国人民民主革命之迅速成功,独立、自由、和平、幸福的新中国之早日实现”。[7]

但民主党派中部分人士仍有所保留:民盟常委 张东荪向毛泽东提出一套“新型民主”主张,在革命的领导权问题上也持不同观点;三民主义同志联合会常委陈铭枢提出:“任何一个参加革命的阶级,仍旧应该保 持他们本身的利益和立场,这些自由权利及政治地位,在友党方面,必须真诚地尊重与承认”。

将人群划分为左、中、右,是一种习惯思维,中共中央统战部在一份题为《新政协的阵营》的综合报告中,对内定参加新政协的民主党派也做了这种分析。

报 告认为:民盟中央常委十一人中,“右派分子居多数,左派分子仅占两个,但其总部及各地区的实际领导权已逐渐转移到进步分子手里,现在它的组织内部主要是人 民救国会、农工民主党与无党派分子,三者之中都有左、中、右”。文件认为沈钧儒、史良、胡愈之领导的人民救国会,“会员中进步分子占优势”;而章伯钧领导 的农工民主党“上层多右派分子”,“民盟著名领袖除沈钧儒、章伯钧外,尚有张澜、黄炎培、张东荪、罗隆基,他们在民盟群众中的威信虽已降低,但仍成为右派 及中派的中心。张澜与西南地方势力向来保有联系。罗隆基是亲美分子,主张联合政府中容许反对派。张东荪企图做民盟主席,拉拢张澜、黄炎培、罗隆基等,排斥 沈钧儒、史良以至章伯钧”。报告建议对民盟“须采取改组中央常委、建立进步分子为主导的核心、容许共产党员在内等措施”加以改造。

对 于从国民党分化出来的国民党革命委员会及三民主义同志联合会、国民党民主促进会,报告也作了详尽分析:“在国民党革命委员会中以李济深为首的右派集团,在 政治上主张,以三民主义为建国最高原则,而不愿用新民主主义;希图结合资产阶级右翼,形成反对派,以防中共控制;主张保留蒋党‘起义’部队的编制,以图收 集残余的力量,并联络地方军阀,策动地方武装,从而培植其争夺领导权的资本……”,“谭平山、王昆仑领导的三民主义同志联合会为国民党革命委员会中比较进 步的力量”,而国民党民主促进会“实际上是以李济深、蔡廷锴为中心的一个封建性小集团”,并提出应使三民主义同志联合会“在国民党革命委员会中起积极作用 ”。

报告对民主建国会的分析是:“其中下层中也有不少小资产阶级进步分子及革命知识分子,但尚不能起决定作用。该会政治倾向一般 代表产业界自由资产阶级的要求,黄炎培、章乃器为他们的政治代表人物。章乃器、施存统曾经公开地主张中间路线与改良主义,章乃器于此,比施存统更来得坚 决,他说‘在国共两条路外,自己要造第三条道路’。只在他们进入解放区后,言论见解,才有若干改变”;对民主建国会及产业界,“将只能以右派并力争中派居 多,可以有个别的进步分子在代表团里面,但不可能单靠他们起积极作用。”

报告还认为:“以马叙伦为首的中国民主促进会,其政治倾向,迄今为止是代表中等资产阶级与小资产阶级的左翼。其组成分子中有一批进步的文化人,这是使它左倾的原因之一;更重要的原因是实际上属我党领导的‘上海人民团体联合会’与它相结合,推动它左倾。”

对前身为美洲华侨洪门会党的致公党,报告溯及其领导人陈其尤与陈炯明的亲属关系,认为其内部分子复杂,“实际上支持李济深的政治意图”,“该党带有极浓厚的封建性质,其主要的组成分子上层为封建官僚,下层有小部分流氓无产者。”[8]

报告在总体表述上,长期目标是扶植左派,逐步孤立和取代右派。此外,刘少奇在1949年7月访问苏联时,给苏共中央斯大林报告中也谈到:

现 在政协筹备会已组成,共有筹备委员134人,其中党员43人,肯定跟我们前进的进步人士48人,中间人士43人,其中中间偏右的只有12人,在进步人士中 有15个秘密党员,共产党可以保证对政协筹备委员会的绝对领导。在筹委会中另外还设立了常务委员会,有委员21人,同样可以保证我党的领导。[9]

四 新政协与《共同纲领》


1949年9月21日至30日,中国人民政治协商会议在北京召开,这个由各党派、各阶层和利益集团的著名精英所组成的会议,虽不是经由选举产生,但较此前任何一届制宪会议都具有广泛的代表性和民主色彩。

与 会的四十五个单位,分为党派、区域、军队、团体、特邀五类。十四个党派单位中,除中国共产党和新民主主义青年团外,还有中国国民党革命委员会(民革)、中 国民主同盟(民盟)、中国民主促进会(民进)、中国致公党、中国农工民主党(第三党)、中国人民救国会、中国国民党民主促进会、三民主义同志联合会、民主 建国会(民建)、九三学社、台湾民主自治同盟(台盟)等十一个党派,无党派人士也作为一派位列其中。

以许德珩为首的九三学社,是 一个以大学教授为主的政治性学术团体,有政治主张而无政治纲领;以台湾共产党创始人、“二二八”事件主角之一谢雪红为首的台湾民主自治同盟,其成员皆系台 籍反国民党人士。这两个党派并未申请参加新政协,但被安排与会。还有一些要求参加新政协的党派,如民社党革新派、孙文主义革命同盟、中国少年劳动党、中国 农民党,皆以“组织不纯”“成分复杂”等理由能获准。这些党派先后自行宣告解散,其代表人物被邀以个人名义出席。此外,对要求与会的光复会、中国民治党、 人民民主自由联盟、民主进步党、中国人民自由党等,均以“成员十分复杂,性质多属反动”为由被拒绝与会。

围绕新政协代表的提名, 各民主党派内争不断,如身在上海的救国会“七君子”之一的王造时,即因争取代表资格与沈钧儒发生争执;救国会代表宋云彬在日记中记载,沈钧儒对力争代表资 格的庞荩青说:“名单必经统战部同意,而代表亦非运动争取得”。[10]黄炎培也在日记中谈到,代表名单“取舍及先后完全以中共提出为凭”,民建内部多人 反对提名冷遹任政协代表,但“潘汉年坚持,越反对越坚持,卒不敢有异议”。[11]嗣后成立的新政府,各党派在职务分配上也存在竞争,中共同样扮演了仲裁 者角色。

新政协召开前,即已传出救国会不久将解散的风声。会后不久,国民党民主促进会、三民主义同志联合会并入民革;救国会宣布 解散,其成员溶入民盟并掌握了领导权。救国会和三民主义同志联合会与中共关系密切,事实上改变了民革、民盟的内部成分。据说当时还有进一步合并民主党派的 方案,为此,民进的马叙伦等已被安排为民盟中常委,合并方案又被临时中止。新政协的十一个民主党派最终减少了三个,形成了延续至今的八个民主党派格局。

新 政权的合法性,来自新政协及其制订的大宪章式文件《中国人民政治协商会议共同纲领》。这一文件带有临时宪法的性质,宣布“以新民主主义即人民民主主义为中 华人民共和国建国的政治基础”,确认人民“有思想、言论、出版、集会、结社、通讯、人身、居住、迁徙、宗教信仰及示威游行的自由权”。

《共同纲领》保留了联合政府的理念框架,并未从字面上强调“中国共产党的领导”和军队的掌控,其对新政权的性质表述如下:

中 国人民民主专政是中国工人阶级、农民阶级、小资产阶级、民族资产阶级及其他爱国民主分子的人民民主统一战线的政权,而以工农联盟为基础,以工人阶级为领 导。由中国共产党、各民主党派、各人民团体、各地区、人民解放军、各少数民族、国外华侨及其他爱国民主分子的代表们所组成的中国人民政治协商会议,就是人 民民主统一战线的组织形式。中国人民政治协商会议代表全国人民的意志,宣告中华人民共和国的成立,组织人民自己的中央政府。

对 于国家的武装力量,《共同纲领》规定:“中华人民共和国建立统一的军队,即人民解放军和人民公安部队,受中央人民政府人民革命军事委员会统率,实行统一的 指挥,统一的制度,统一的编制,统一的纪律”,从文字表述上与“军队国家化”并无抵触。对未来将行使国家权力的人民代表大会,则规定“各级人民代表大会由 人民用普选方法产生之”。

《共同纲领》最难产的是经济政策部分,几经修改,最后由毛泽东敲定:“中华人民共和国经济建设的根本方 针,是以公私兼顾、劳资两利、城乡互助、内外交流的政策,达到发展生产、繁荣经济之目的。”国家通过调剂国营经济、合作社经济、农民和手工业者的个体经 济、私人资本主义经济和国家资本主义经济,“使各种社会经济成分在国营经济领导之下,分工合作,各得其所,以促进整个社会经济的发展。”

《共同纲领》颁布后,各民主党派随即宣布以《共同纲领》为本党的纲领,并加上了“接受中国共产党的领导”的表述。

五 联合政府的人事安排


新 政协的召开被认为是统一战线策略的成功范例,它显示出新政权的精英政治色彩及中共对民主党派、社会贤达的尊重。在出席新政协的662位代表中,共产党员约 占44%,党外人士占56%.其中工农和各界的无党派代表约占26%,各民主党派的成员约占30%,中共以及“老大哥”苏共都承认新政权是一个联合政府。

中共在新政权的领导作用,首先体现在人事安排上。各民主党派在新政协的代表名额分配与新政权的职务安排,起决定作用的是中共。刘少奇在1949年给斯大林的报告中说:

…… 它们的组织散漫,内部极不团结。例如所有民主党派都无法提出自己参加政协会议的代表名单,因为他们内部争吵。它们的代表名单,都必须由共产党发表意见,才 能提出。但各民主党派都有几个领导人物,这些人物因为在中国进行长期的政治活动,在人民中是有些影响的,它们的党组织就靠这些领导人物来维系。在某(每) 一个党派中都有左、中、右三种分子……。[12]

1949年10月1日,毛泽东在北京天安门城楼上宣布中华人民共 和国中央人民政府成立。除毛泽东出任主席外,六位副主席中有张澜、李济深、宋庆龄三位非中共人士;沈钧儒出任最高人民法院院长;五十六位中央人民政府委员 中,非中共人士约占半数;政务院名单中,非中共人士黄炎培、郭沫若出任副总理,章伯钧、马叙伦、陈劭先、王昆仑、罗隆基、章乃器、邵力子、黄绍竑、谭平 山、蒋光鼐、朱学范、李书城、梁希、傅作义、沈雁冰、张奚若、李德全、史良、何香凝、李四光担任了政务委员和部长职务,联合政府的色彩浓厚。

联 合政府的人事安排,曾在中共党内引起不满,当时有“早革命不如晚革命,晚革命不如反革命”之类的议论。对此,毛泽东回答说:安排民主人士“好处很多”,“ 第一,可以‘赚’人,各方面的非党人物都有当副主席、部长、司令员的,‘朝里有人’,国民党不打自垮。……第二,可以‘赚’来四万万人民,赚来土地改革。 第三,可以‘赚’一个社会主义。这叫做和平过渡到社会主义。”[13]

1954年9月在北京召开的第一届全国人民代表大会, 通过了《中华人民共和国宪法》。与《共同纲领》相比,“五四宪法”首次明确了“在中国共产党领导下”的大前提,以及“中国共产党为领导的各民主阶级、各民 主党派、各人民团体的广泛的人民民主统一战线”等内容,并对政府机构作出重大调整,原中央人民政府委员会不复存在,全国人民代表大会成为国家最高权力机 构。

大会所通过的人事名单中,国家最高层职务完全由中共人士担任,实现了“党政合一”, 原任中央人民政府副主席、最高人民法院院长、政务院副总理的党外人士,皆转任人大常委会副委员长。联合政府色彩开始淡化,共产党的领导地位日形突出。在 1949年建国时起过重要作用的政治协商会议,从此成为“统一战线团体”。

结 语


在 其后的曲折岁月中,历经“反右”、“文革”等政治运动,政治协商制度遭到粗暴践踏,民主党派沦为“政治花瓶”,政治协商变成了“一言堂”,最终演变为党内 外都不容任何异议的个人专断。共和国的建国共识是民主宪政,偏离了这一目标之后,民主法制建设长期滞后,历时六十年仍未建成一个公平和谐的公民社会。

英 国历史上的《大宪章》和美国历史上的《独立宣言》,至今仍享有崇高的法理地位。《共同纲领》作为中国特色的大宪章,是中华人民共和国建国的法理依据,今天 也依然有效。《共同纲领》中的建国目标,有的迄今仍未兑现(如普选产生各级人大),有的被摒弃后又重新恢复(如保护私营经济),有的仍未得到切实保障(如 人民的自由权利)。

没有民主监督的政治体制,必定会导致执政能力的自我削弱。在重新认识到“民主是个好东西“的今天,回顾这段民主协商建国的历史,应该承认:从和而不同、表达异议到求同存异,都是现代国家政治生活的应有之义。


2009年2月14日 风雨读书楼
《炎黄春秋》 2009年第四期

2009年4月6日星期一

熊培云:说说我为什么不高兴(南都专栏)

梭罗说,我们首先是人,然后才是公民。以下是培云发表在《南方都市报》上的专栏文章,随意列举了自己身处这个转型国家时的最真切感受,种种不高兴的理由。感兴趣的朋友,亦可随之补充。

——思想国·21世纪评论


据说在经济危机之下,世界已经进入一个“炫耀肌肉”的时代了。国外媒体最近注意到中国的一个新变化:虽然中国业已超过德国成为仅次于美国和日本的世界第三大经济体,它还成功举办了奥运会并进行其首次太空行走,大家理所当然地认为中国会很快乐的,但中国高兴不起来。

与此相关的是,最近有几人合写了一本书,向世界宣告“中国不高兴”。

在上一篇文章中,我谈到今日中国的一些知识分子对时局的思考过于封闭与偏执,与上世纪初的开放与包容精神相比可谓“一代不如一代”。我举的是胡适的 例子。胡适那一代人虽然也知道中国要建立“有兵的文化”,但并不把中国之落后简单地归罪于国外势力或者“帝国主义”,而是首先从中国内部找原因。在胡适看 来,那个时代的当务之急是完成文化与制度上的改良,一方面要“整理国故,再造文明”,另一方面要实施宪政这平常人的政治,以清除“贫穷、疾病、愚昧、贪 污、扰乱”这困扰中国几千年的五大祸害。

早在若干年前,龙应台先生写过一篇流传很广的文章——《中国人,你为什么不生气?》。在这篇文章中,龙先生说:“在一个法治上轨道的国家里,人是有 权生气的。”而且,“不要以为你是大学教授,所以作研究比较重要;不要以为你是杀猪的,所以没有人会听你的话;也不要以为你是个大学生,不够资格管社会的 事。你今天不生气,不站出来的话,明天——还有我、还有你我的下一代,就要成为沉默的牺牲者、受害人!如果你有种、有良心,你现在就去告诉你的公仆立法委 员、告诉卫生署、告诉环保局:你受够了,你很生气!你一定要很大声地说。”

当说,不高兴是一项基本人权。问题在于,谁能代表“中国不高兴”?众所周知,中国作为一个国家组织,本身并无情绪。既然中国是无数中国人组成的,如果有情绪,有喜怒哀乐,那也是具体每个中国人的事。

“不高兴派”的确可以告诉大家自己很生气,但不要冒充中国。我在国外也经常见到“一个人的示威”,比如有一年在柏林的马路边上便看到一位中年男子举 着个纸牌——“反对美国入侵伊拉克”。显而易见,他只是代表自己。如果他自诩代表整个德国,代表所有德国人的意志,那他就已经是一个“侵略者”、一个“意 淫犯”了。

每个人都有不高兴的事情。借这个机会,我想说说作为一个中国公民同时作为一个人,有哪些事情让我不高兴。当然,在此我也只代表自己。即使有人看完我的“不高兴”而感同身受,我仍要强调,我所说的只代表我自己的经验与感受。

细想下来,今日世界与中国让我不高兴的事还挺多,不妨略举数例:

我的父母在乡下吃了一辈子共和国的苦和亏,被征了一辈子的皇粮国税“剪刀差”,到老年却没有社保,以至于我不得不像“临时政府”一样为他们尽责—— 不同在于我不向他们征税。为什么21世纪的中国仍要“养儿防老”而不能做到“养政府防老”?那么多的财政收入究竟要用到什么紧要地方?纳税人养政府,政府 却不养纳税人。为此,我不高兴。

我回到乡下,看到村庄空空荡荡,道路坑坑洼洼,一片萧瑟景象。,家乡长了几百年的大树被掌权者贩卖。在那里,我真切地感受到故乡沦陷。地球是圆的,阳光只照耀城市。为此,我不高兴。

走在城里,我看着新修的马路被一次次挖开,虽然GDP因此增长,有人因此大赚其钱,但既然总要这样折腾,为什么不给马路预装一根拉链,而且只在半夜拉开?为什么人民(当然包括行人)没有免于被折腾的自由?为此,我不高兴。

开车时,我看到三三两两的妇女抱着租来的孩子站在马路中间乞讨;不开车时,我看到司机从不知道礼让斑马线上的行人,有时甚至将人撞飞。孙立平先生说,中国的危机不是社会动荡,而是社会溃败。为此,我不高兴。

在一个代议制国家,我的利益被人堂而皇之地代表。然而,代表我利益的人姓甚名谁我竟不知晓——即使是那隐姓埋名的佐罗,我也知道他的刀剑与相貌。在他们穿红戴绿满脸喜庆参加一年一度的“政治嘉年华”之前,为什么从不询问我需要什么利益?为此,我不高兴。

我照章纳税十几年,没有收到过一张税单,更不知道自己所交的税款最后用在哪里。为什么我只看得到税务局,却看不到“税权局”?为什么宪法里只有纳税 的义务条款而无权利条款?都说预算是众人之事,为什么我看不到公共预算?没有预算的政府就是“看不见的政府”,没有预算公开的工作就是“地下工作”。为 此,我不高兴。

今日中国,“拆迁党”四处招摇。在没有《物权法》时,我盼着《物权法》出台,以阻挡“推土机经济”扫荡民宅;然而《物权法》出台后,扫荡民宅的事仍 然时有发生。我曾经一厢情愿地讴歌“‘钉子户’引导人民”,然而事实却是“更多的‘钉子户’倒在路上”,却是穷人家的房子“风能进,雨能进,官商勾结的推 土机更能进。”为此,我不高兴。

独坐书房,读西欧财政史。读到17世纪英国中央政府给社会带来的经济负担不到5%,想起2007年中国财政收入占GDP比例占到了20.80%,而且全年财政收入的1/3被用于“三公消费”,想起大学生不去创业,而是争考公务员。国富民穷,权力诱人。为此,我不高兴。

我时而文思泉涌,给一些媒体写文章,谁知文章发表后里面有几句话不是我写的,而我写的又不知道哪里去了。为此,我不高兴。

打开电脑,我做网站,有人不高兴。我不做网站,只看别人的,有人不高兴。为什么他们不高兴优先于我不高兴?下网之前,我看见周久耕说不让房价下跌是为人民服务,我知道周久耕在说谎。为此,我不高兴。

深更半夜,我打开电视,无数影视明星和药贩子混在一起,还在像吃了春药一样亢奋。他们从早到晚贩卖假药,和电视台一样不知羞耻,只当这一代中国人全是最易上当受骗的“东亚病夫”。不是要反低俗么,怎不见有人管?为此,我不高兴。

网络销售大行其道,如今实体书店一家家倒闭。偶尔逛书店,发现几个“不高兴”的人偷梁换柱、以偏盖全、炫耀肌肉,以中国的名义冒充我在不高兴。为此,我不高兴。(熊培云 《南方都市报》专栏)

从牛博转过来的,原文的话,翻墙看吧。

县人大常委会委员失窃1800万元财物 疑犯落网

人民网-京华时报4月6日报道 2008年9月4日,陕西省平利县发生特大盗窃案,该县一人大常委委员兼矿老板家中被盗,案值高达1800余万元。安康警方近日破获该案。

据了解,窃贼趁矿老板龙某家中无人时,将保险柜盗走,柜内存放黄金1900克、白金项链2条、黄金项链、戒指、白金戒指等十余件金银首饰、现金4万余元,另盗走手机和笔记本电脑各一部,加上高档烟酒以及存折、银行卡、借条等有价证券,案值高达1800余万元。

平利县公安局成立了专案组。经过7个月的侦破,在西安市公安局的大力支持下,3月28日,专案组民警在西安成功将犯罪嫌疑人郝海波抓获。

现年21岁的郝海波2008年上半年在平利县一足浴店任经理,暗中了解了平利县大部分有钱老板的身份、从事工作和住所等。

这篇报道真奇怪,怎么不问问一个县人大常委哪里来的这么多钱。

2009年3月26日星期四

ORA-12737错误

今天群里一个哥们碰见ORA-12737错误,情况是这样的:服务器装在win2003上,客户端使用了instant client(linux平台)。

ORA-12737: Instant Client Light: unsupported server character set ZHS16GBK

看来是即时客户端不支持服务器的ZHS16GBK字符集。

ORACLE给的解释如下:

ORA-12737: Instant Client Light: unsupported server character set string
Cause: The character set specified is not allowed for this operation or is invalid. Instant Client Light has only minimal character sets.
Action: Do not use Instant Client Light for this character set

翻译过来就是说即时客户端支持的字符集有限,不要用这个东西。
感觉ORACLE有时候就是这么操蛋,给这种解释。

2009年3月24日星期二

新版的下载类

import java.io.*;
import java.net.*;
import java.util.*;

// This class downloads a file from a URL.
class Download extends Observable implements Runnable {
// Max size of download buffer.
private static final int MAX_BUFFER_SIZE = 1024;

// These are the status names.
public static final String STATUSES[] = {"Downloading",
"Paused", "Complete", "Cancelled", "Error"};

// These are the status codes.
public static final int DOWNLOADING = 0;
public static final int PAUSED = 1;
public static final int COMPLETE = 2;
public static final int CANCELLED = 3;
public static final int ERROR = 4;

private URL url; // download URL
private int size; // size of download in bytes
private int downloaded; // number of bytes downloaded
private int status; // current status of download

// Constructor for Download.
public Download(URL url) {
this.url = url;
size = -1;
downloaded = 0;
status = DOWNLOADING;

// Begin the download.
download();
}

// Get this download's URL.
public String getUrl() {
return url.toString();
}

// Get this download's size.
public int getSize() {
return size;
}

// Get this download's progress.
public float getProgress() {
return ((float) downloaded / size) * 100;
}

// Get this download's status.
public int getStatus() {
return status;
}

// Pause this download.
public void pause() {
status = PAUSED;
stateChanged();
}

// Resume this download.
public void resume() {
status = DOWNLOADING;
stateChanged();
download();
}

// Cancel this download.
public void cancel() {
status = CANCELLED;
stateChanged();
}

// Mark this download as having an error.
private void error() {
status = ERROR;
stateChanged();
}

// Start or resume downloading.
private void download() {
Thread thread = new Thread(this);
thread.start();
}

// Get file name portion of URL.
private String getFileName(URL url) {
String fileName = url.getFile();
return fileName.substring(fileName.lastIndexOf('/') + 1);
}

// Download file.
public void run() {
RandomAccessFile file = null;
InputStream stream = null;

try {
// Open connection to URL.
HttpURLConnection connection =
(HttpURLConnection) url.openConnection();

// Specify what portion of file to download.
connection.setRequestProperty("Range",
"bytes=" + downloaded + "-");

// Connect to server.
connection.connect();

// Make sure response code is in the 200 range.
if (connection.getResponseCode() / 100 != 2) {
error();
}

// Check for valid content length.
int contentLength = connection.getContentLength();
if (contentLength < size ="="" size =" contentLength;" file =" new" stream =" connection.getInputStream();" status ="=""> MAX_BUFFER_SIZE) {
buffer = new byte[MAX_BUFFER_SIZE];
} else {
buffer = new byte[size - downloaded];
}

// Read from server into buffer.
int read = stream.read(buffer);
if (read == -1)
break;

// Write buffer to file.
file.write(buffer, 0, read);
downloaded += read;
stateChanged();
}

/* Change status to complete if this point was
reached because downloading has finished. */
if (status == DOWNLOADING) {
status = COMPLETE;
stateChanged();
}
} catch (Exception e) {
error();
} finally {
// Close file.
if (file != null) {
try {
file.close();
} catch (Exception e) {}
}

// Close connection to server.
if (stream != null) {
try {
stream.close();
} catch (Exception e) {}
}
}
}

// Notify observers that this download's status has changed.
private void stateChanged() {
setChanged();
notifyObservers();
}

}

想扩展一下这个类实现多线程下载,FTP下载和断点续传。

2009年3月23日星期一

编程的首要原则

转自云风的blog,原文请看这里

刘未鹏的 blog 上写了一篇 编程的首要原则(s)是什么? ,这段时间在我的 google reader 上被许多人分享。

我问自己,我目前的首要原则是什么?

其实想说的,那篇里都有人说了。如果非要说首要,我也认可最多人认可的:

KISS - Keep It Simple Stupid

不过对 DRY - Don’t Repeat Yourself 我反而认为是次要的,当然是在和 KISS 相冲突的时候。

如果换一句和 KISS 原则相当分量的话,我会说:不要用愚蠢的方法做事。很矛盾?Repeat Yourself 往往代表了一些愚蠢的方案,且并不 simple ,至少会付出更多的体力。我想,KISS 的最后一个 S 指的是大智若愚的愚,而自做聪明则是另一种愚蠢。

在 KISS 的大原则下,我想其实可以分出一些细节的东西,也是别人都提过的:

最近两年我对同事说的最多的几句话,“弄清你的问题是什么”,“你不一定需要解决这个问题” 。

因为什么都不做才是最简单的。要知道什么可以不做,必须了解你的问题。

面向对象以及复杂软件技术的滥用,或是找不到更 Simple 的方案解决问题(以性能、以需求等为借口去实现更复杂的方案)往往都是对需求了解不清,或者眼光太短。把手段当成了目的。(以为达到目的,必须采用某种手段,而如何应用这种手段就变成了目的)

同时,我觉得过度抽象也来源于对问题的认识不清。我还没想好后面要写什么,实现些什么,所以先利用“抽象” 把其它的部分搭起来。久而久之,不分析具体问题,先做抽象就变成了惯性。而抽象层本身往往是软件中最复杂的部分,离 KISS 原则最远的一块。

以下是个人的想法:
我想,KISS 的最后一个 S 指的是大智若愚的愚,而自做聪明则是另一种愚蠢。其实我现在手头就有一个项目,仅仅为了实现下载功能,就反反复复包装了17层,把抽象用到了令人乍舌的地步。记得有句话说,如果清楚自己要做什么,3层就够了,如果不清楚,17层也不够。个人感觉3层足够了,UI一层,逻辑一层,数据一层。

KISS原则说起来容易,做起来真的不容易。

2009年3月19日星期四

用wget备份网站

wget -nc --convert-links -r http://fanng.blogspot.com
今天发现wget的这个功能很好用,用来备份个人博客很方便。
将这个命令加入一个job,隔一段时间定时运行即可。

顺便附上一篇介绍wget的好文章。
wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. 
所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。 
wget 可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作"递归下载"。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。 
wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务 器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。 
wget的常见用法
wget虽然功能强大,但是使用起来还是比较简单的,
基本的语法是:wget [参数列表] "URL" 用""引起来可以避免因URL中有特殊字符造成的下载出错。
下面就结合具体的例子来说明一下wget的用法。
1、下载整个http或者ftp站点。
wget http://place.your.url/here
这个命令可以将http://place.your.url/here 首页下载下来。使用-x会强制建立服务器上一模一样的目录,如果使用-nd参数,那么服务器上下载的所有内容都会加到本地当前目录。 

wget -r http://place.your.url/here
这个命令会按照递归的方法,下载服务器上所有的目录和文件,实质就是下载整个网站。这个命令一定要小心使用,因为在下载的时候,被下载网站指向的所有地址 同样会被下载,因此,如果这个网站引用了其他网站,那么被引用的网站也会被下载下来!基于这个原因,这个参数不常用。可以用-l number参数来指定下载的层次。例如只下载两层,那么使用-l 2。

要是您想制作镜像站点,那么可以使用-m参数,例如:wget -m http://place.your.url/here
这时wget会自动判断合适的参数来制作镜像站点。此时,wget会登录到服务器上,读入robots.txt并按robots.txt的规定来执行。

2、断点续传。
当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的,只需要使用-c参数,例如:
wget -c http://the.url.of/incomplete/file
使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。

3、批量下载。
如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:wget -i download.txt
这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)

4、选择性的下载。
可以指定让wget只下载一类文件,或者不下载什么文件。例如:
wget -m --reject=gif http://target.web.site/subdirectory
表示下载http://target.web.site/subdirectory,但是忽略gif文件。--accept=LIST 可以接受的文件类型,--reject=LIST拒绝接受的文件类型。

5、密码和认证。
wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:
--http-user=USER设置HTTP用户
--http-passwd=PASS设置HTTP密码
对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。

6、利用代理服务器进行下载。
如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个.wgetrc文件。文件中可以设置代理服务器:
http-proxy = 111.111.111.111:8080
ftp-proxy = 111.111.111.111:8080
分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:
--proxy-user=USER设置代理用户
--proxy-passwd=PASS设置代理密码 
这两个参数。
使用参数--proxy=on/off 使用或者关闭代理。
wget还有很多有用的功能,需要用户去挖掘。



wget的使用格式 
Usage: wget [OPTION]... [URL]...
* 用wget做站点镜像: 
wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/
# 或者
wget -m http://dsec.pku.edu.cn/~usr_name/
* 在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载 
wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &
# 或者从filelist读入要下载的文件列表
wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &
上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。
* 使用代理下载 
wget -Y on -p -k https://sourceforge.net/projects/wvware/
代理可以在环境变量或wgetrc文件中设定 
# 在环境变量中设定代理
export PROXY=http://211.90.168.94:8080/
# 在~/.wgetrc中设定代理
http_proxy = http://proxy.yoyodyne.com:18023/
ftp_proxy = http://proxy.yoyodyne.com:18023/


wget各种选项分类列表
* 启动 
-V, --version 显示wget的版本后退出
-h, --help 打印语法帮助
-b, --background 启动后转入后台执行
-e, --execute=COMMAND 执行`.wgetrc'格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
* 记录和输入文件 
-o, --output-file=FILE 把记录写到FILE文件中
-a, --append-output=FILE 把记录追加到FILE文件中
-d, --debug 打印调试输出
-q, --quiet 安静模式(没有输出)
-v, --verbose 冗长模式(这是缺省设置)
-nv, --non-verbose 关掉冗长模式,但不是安静模式
-i, --input-file=FILE 下载在FILE文件中出现的URLs
-F, --force-html 把输入文件当作HTML格式文件对待
-B, --base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
--sslcertfile=FILE 可选客户端证书
--sslcertkey=KEYFILE 可选客户端证书的KEYFILE
--egd-file=FILE 指定EGD socket的文件名
* 下载 
--bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
-t, --tries=NUMBER 设定最大尝试链接次数(0 表示无限制).
-O --output-document=FILE 把文档写到FILE文件中
-nc, --no-clobber 不要覆盖存在的文件或使用.#前缀
-c, --continue 接着下载没下载完的文件
--progress=TYPE 设定进程条标记
-N, --timestamping 不要重新下载文件除非比本地文件新
-S, --server-response 打印服务器的回应
--spider 不下载任何东西
-T, --timeout=SECONDS 设定响应超时的秒数
-w, --wait=SECONDS 两次尝试之间间隔SECONDS秒
--waitretry=SECONDS 在重新链接之间等待1...SECONDS秒
--random-wait 在下载之间等待0...2*WAIT秒
-Y, --proxy=on/off 打开或关闭代理
-Q, --quota=NUMBER 设置下载的容量限制
--limit-rate=RATE 限定下载输率
* 目录 
-nd --no-directories 不创建目录
-x, --force-directories 强制创建目录
-nH, --no-host-directories 不创建主机目录
-P, --directory-prefix=PREFIX 将文件保存到目录 PREFIX/...
--cut-dirs=NUMBER 忽略 NUMBER层远程目录
* HTTP 选项 
--http-user=USER 设定HTTP用户名为 USER.
--http-passwd=PASS 设定http密码为 PASS.
-C, --cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许).
-E, --html-extension 将所有text/html文档以.html扩展名保存
--ignore-length 忽略 `Content-Length'头域
--header=STRING 在headers中插入字符串 STRING
--proxy-user=USER 设定代理的用户名为 USER
--proxy-passwd=PASS 设定代理的密码为 PASS
--referer=URL 在HTTP请求中包含 `Referer: URL'头
-s, --save-headers 保存HTTP头到文件
-U, --user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION.
--no-http-keep-alive 关闭 HTTP活动链接 (永远链接).
--cookies=off 不使用 cookies.
--load-cookies=FILE 在开始会话前从文件 FILE中加载cookie
--save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中
* FTP 选项 
-nr, --dont-remove-listing 不移走 `.listing'文件
-g, --glob=on/off 打开或关闭文件名的 globbing机制
--passive-ftp 使用被动传输模式 (缺省值).
--active-ftp 使用主动传输模式
--retr-symlinks 在递归的时候,将链接指向文件(而不是目录)
* 递归下载 
-r, --recursive 递归下载--慎用!
-l, --level=NUMBER 最大递归深度 (inf 或 0 代表无穷).
--delete-after 在现在完毕后局部删除文件
-k, --convert-links 转换非相对链接为相对链接
-K, --backup-converted 在转换文件X之前,将之备份为 X.orig
-m, --mirror 等价于 -r -N -l inf -nr.
-p, --page-requisites 下载显示HTML文件的所有图片
* 递归下载中的包含和不包含(accept/reject) 
-A, --accept=LIST 分号分隔的被接受扩展名的列表
-R, --reject=LIST 分号分隔的不被接受的扩展名的列表
-D, --domains=LIST 分号分隔的被接受域的列表
--exclude-domains=LIST 分号分隔的不被接受的域的列表
--follow-ftp 跟踪HTML文档中的FTP链接
--follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
-G, --ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
-H, --span-hosts 当递归时转到外部主机
-L, --relative 仅仅跟踪相对链接
-I, --include-directories=LIST 允许目录的列表
-X, --exclude-directories=LIST 不被包含目录的列表
-np, --no-parent 不要追溯到父目录
问题
在递归下载的时候,遇到目录中有中文的时候,wget创建的本地目录名会用URL编码规则处理。如"天网防火墙"会被存为"%CC%EC%CD%F8%B7%C0%BB%F0%C7%BD",这造成阅读上的


wget 使用举例
wget -r -p -np -k http://www.linuxdiyf.com
· -r:在本机建立服务器端目录结构;
· -p: 下载显示HTML文件的所有图片;
· -np:只下载目标站点指定目录及其子目录的内容;
· -k: 转换非相对链接为相对链接。

2009年3月18日星期三

判断表空间是否还可以压缩的脚本

 declare
    cursor c_dbfile is
          select  tablespace_name
                  ,file_name
                  ,file_id
                  ,bytes
          from    sys.dba_data_files
          where   status !='INVALID'
          order   by tablespace_name,file_id;
    cursor c_space(v_file_id in number) is
          select block_id,blocks
          from   sys.dba_free_space
          where  file_id=v_file_id
          order  by block_id desc;
  blocksize       number;
  filesize        number;
  extsize         number;
  
  begin
    select value
    into   blocksize
    from   v$parameter
    where  name = 'db_block_size';
    for c_rec1 in c_dbfile
    loop
      filesize := c_rec1.bytes;
      <>
      for c_rec2 in c_space(c_rec1.file_id)
      loop
        extsize := ((c_rec2.block_id - 1)*blocksize + c_rec2.blocks*blocksize);
        if extsize = filesize
        then
          filesize := (c_rec2.block_id - 1)*blocksize;
        else
          exit outer;
        end if;
      end loop outer;
      if filesize = c_rec1.bytes
      then
        dbms_output.put_line('Tablespace: '
        ||' '||c_rec1.tablespace_name||' Datafile: '||c_rec1.file_name);
        dbms_output.put_line('Can not be resized, no free space at end of file.');
        dbms_output.put_line('.');
      else
        if filesize <>
        then
          dbms_output.put_line('Tablespace: '
          ||' '||c_rec1.tablespace_name||' Datafile: '||c_rec1.file_name);
          dbms_output.put_line('Can be resized to: '||2*blocksize
          ||' Bytes, Actual size: '||c_rec1.bytes||' Bytes');
          dbms_output.put_line('.');
        else
          dbms_output.put_line('Tablespace: '
          ||' '||c_rec1.tablespace_name||' Datafile: '||c_rec1.file_name);
          dbms_output.put_line('Can be resized to: '||filesize
          ||' Bytes, Actual size: '||c_rec1.bytes);
          dbms_output.put_line('.');
        end if;
      end if;
    end loop;
  end;
  /

群里WU叔写的代码,用于判定一个表空间能被压缩到什么程度。知道resize的程度之后,只需要运行alter database datafile '......' resize 15000M就可以了。

摸鱼儿

元好问的所有词里面,可能就是这首摸鱼儿最广为流传,究其原因,当然是老金的神雕了。

摸鱼儿
              元好问

  序:泰和五年乙丑岁,赴试并州,道逢捕雁者云;“今旦获一雁,杀之矣。其脱网者悲鸣不能去,竟自投于地而死。”予因买得之,葬之汾水之上,累石为识,号曰雁丘。时同行者多为赋诗,予亦有《雁丘词》。旧所作无宫商,今改定之。

  问世间、情是何物,直教生死相许?
  天南地北双飞客,老翅几回寒暑。
  欢乐趣,离别苦,就中更有痴儿女。
  君应有语,渺万里层云,千山暮雪,只影向谁去?

  横汾路,寂寞当年箫鼓,荒烟依旧平楚。
  招魂楚些何嗟及,山鬼暗啼风雨。
  天也妒,未信与,莺儿燕子俱黄土。
  千秋万古,为留待骚人,狂歌痛饮,来访雁丘处。

这首词前面写的很是不错,后面那部分在我看来,就是完全掉书袋,引用了一大堆典籍。要解说这首词,还是金庸解说的最好。

黄蓉道:“杨过既在谷底,只有差雕儿再去救他。”当下作哨招雕。但连吹数声,双雕竟毫不理睬。黄蓉好生奇怪,数十年来,双雕闻唤即至,从不违命,何以今日对自己的口哨直似不闻?

  她又一声长哨,只见那雌雕双翅一振,高飞入云,盘旋数圈,悲声哀啼,猛地里从空中疾冲而下。黄蓉心道:“不好!”大叫:“雕儿!”只见雌雕一头撞在山 石之上,脑袋碎裂,折翼而死。众人见了都吃了一惊,奔过去看时,原来那雄鹰早已气绝多时。众人见这雌雕如此深情重义,无不慨叹。黄蓉自幼和双雕为伴,更是 伤痛,不禁流下泪来。

  陆无双耳边,忽地似乎响起了师父李莫愁细若游丝的歌声:“问世间,情是何物,直教生死相许?天南地北双飞客,老翅几回寒暑?欢乐趣,离别苦,就中更有 痴儿女。君应有语,渺万里层云,千山暮雪,只影向谁去?”她幼时随着李莫愁学艺,午夜梦回,常听到师父唱着这首曲子,当日未历世情,不明曲中深意,此时眼 见雄雕毙命后雌雕殉情,心想:“这头雌雕假若不死,此后万里层云,千山暮雪,叫它孤单只影,如何排遣?”触动心怀,眼眶儿竟也红了。

在射雕英雄传里,双雕的父母也是这么死的,看来老金很喜欢这首词啊。

2009年3月16日星期一

一个简单的HTML解析器

这个解析器还不能很好的工作,但是架子大概已经有了,慢慢完善吧。

import URLTest.URLUtil;

public class HtmlParser {
public String leader;
public String tag;
public String body;
public String end;
public String trailer;

public HtmlParser more;
public HtmlParser parts;

static String tags[]={"html","body","table","tr","td"};

public HtmlParser(String text){
this (text,tags,0,0);
}

public HtmlParser(String text, String[] tags2){
this (text,tags2,0,0);
}

public HtmlParser(String text, String[] tags2, int level, int offset) {
String lc=text.toLowerCase();
int startTag=lc.indexOf("<"+tags[level]);
int endTag=lc.indexOf(">",startTag)+1;
int startEnd=lc.indexOf(" int endEnd=lc.indexOf(">",startEnd)+1;
int startMore=lc.indexOf("<"+tags[level],endEnd);

if(startTag<0||endTag<0||startEnd<0||endEnd<0){
return;
}


leader=text.substring(0,startTag);
tag=text.substring(startTag,endTag);
body=text.substring(endTag,startEnd);
end=text.substring(startEnd,endEnd);
trailer=text.substring(endEnd);
System.out.println("leader is :"+leader);
System.out.println("tag is :"+tag);
System.out.println("body is :"+body);
System.out.println("end is :"+end);
System.out.println("trailer is :"+trailer);

if(level+1 parts=new HtmlParser(body,tags,level+1,offset+endTag);
body=null;
}

if(startMore>=0){
more=new HtmlParser(body,tags,level,offset+endEnd);
trailer=null;
}
}

public static void main(String[] args) {
HtmlParser hp=new HtmlParser(URLUtil.getHtml("http://www.google.com"));
}

}

2009年3月15日星期日

用JAVA实现下载

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * 

Title: 个人开发的API


 * 

Description: 将指定的HTTP网络资源在本地以文件形式存放


 * 

Copyright: Copyright (c) 2004


 * 

Company: NewSky


 * @author MagicLiao
 * @version 1.0
 */
public class HttpGet {

  public final static boolean DEBUG = true;//调试用
  private static int BUFFER_SIZE = 8096;//缓冲区大小
  private Vector vDownLoad = new Vector();//URL列表
  private Vector vFileList = new Vector();//下载后的保存文件名列表

  /**
   * 构造方法
   */
  public HttpGet() {

  }

  /**
   * 清除下载列表
   */
  public void resetList() {
    vDownLoad.clear();
    vFileList.clear();
  }

  /**
   * 增加下载列表项
   *
   * @param url String
   * @param filename String
   */
  public void addItem(String url, String filename) {
    vDownLoad.add(url);
    vFileList.add(filename);
  }

  /**
   * 根据列表下载资源
   */
  public void downLoadByList() {
    String url = null;
    String filename = null;
    
    //按列表顺序保存资源
    for (int i = 0; i < vDownLoad.size(); i++) {
      url = (String) vDownLoad.get(i);
      filename = (String) vFileList.get(i);

      try {
        saveToFile(url, filename);
      }
      catch (IOException err) {
        if (DEBUG) {
          System.out.println("资源[" + url + "]下载失败!!!");
        }
      }
    }

    if (DEBUG) {
      System.out.println("下载完成!!!");

    }
  }

  /**
   * 将HTTP资源另存为文件
   *
   * @param destUrl String
   * @param fileName String
   * @throws Exception
   */
  public void saveToFile(String destUrl, String fileName) throws IOException {
    FileOutputStream fos = null;
    BufferedInputStream bis = null;
    HttpURLConnection httpUrl = null;
    URL url = null;
    byte[] buf = new byte[BUFFER_SIZE];
    int size = 0;
    
    //建立链接
    url = new URL(destUrl);
    httpUrl = (HttpURLConnection) url.openConnection();
    //连接指定的资源
    httpUrl.connect();
    //获取网络输入流
    bis = new BufferedInputStream(httpUrl.getInputStream());
    //建立文件
    fos = new FileOutputStream(fileName);

    if (this.DEBUG) 
  System.out.println("正在获取链接[" + destUrl + "]的内容...\n将其保存为文件[" + fileName + "]");

    //保存文件
    while ( (size = bis.read(buf)) != -1) 
      fos.write(buf, 0, size);
    
    fos.close();
    bis.close();
    httpUrl.disconnect();
  }

  /**
   * 设置代理服务器
   *
   * @param proxy String
   * @param proxyPort String
   */
  public void setProxyServer(String proxy, String proxyPort) {
    //设置代理服务器
    System.getProperties().put("proxySet", "true");
    System.getProperties().put("proxyHost", proxy);
    System.getProperties().put("proxyPort", proxyPort);

  }

  /**
   * 设置认证用户名与密码
   *
   * @param uid String
   * @param pwd String
   */
  //public void setAuthenticator(String uid, String pwd) {
   // Authenticator.setDefault(new MyAuthenticator(uid, pwd));
 // }

  /**
   * 主方法(用于测试)
   *
   * @param argv String[]
   */
  public static void main(String argv[]) {

    HttpGet oInstance = new HttpGet();
try {
//增加下载列表(此处用户可以写入自己代码来增加下载列表)
       oInstance.addItem("
","");

//开始下载
oInstance.downLoadByList();
    }
    catch (Exception err) {
      System.out.println(err.getMessage());
    }

  }

}

使用JAVA抓取网页内容

今天碰见一个哥们问,怎么使用JAVA抓取网页内容,查了查资料,写了个demo。基本想法是,通过URL打开HTTPconnection,然后可以拿到一个输入流,然后把输入流读入到一个StringBuffer 。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLUtil {

public static String getHtml(String urlString) {
try {
StringBuffer html = new StringBuffer();
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStreamReader isr = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(isr);
String temp;
while ((temp = br.readLine()) != null) {
html.append(temp).append("\n");
}
br.close();
isr.close();
return html.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public static void main(String[] args) {
System.out.println(URLUtil.getHtml("http://www.sina.com.cn"));
}
}

其中的问题是不能处理多媒体信息。

生成etags的脚本

周末学习到了一些emacs的使用技巧。

关于如何配置emacs,使其在linux下可以正常显示汉字,而不出现方框,可以参考博士的文章

这里给出一个有效生成tag文件的脚本,非常好用(make_etags)。

#!/bin/sh

trap "rm -f /tmp/$$" 0 1 2 3 15
rm -f ./TAGS
find `pwd`/ -type f -name '*.[chyl]' -print | \
xargs etags --append -o TAGS

find . -type d -print | \
while read DIR; do
[ "$DIR" != "." ] && ln -f -s `pwd`/TAGS $DIR
done

将该文件拷贝到工程所在目录,运行该文件即可。

2009年3月11日星期三

ORACLE sql调整(三)

使用SPM

SQL PLAN MANAGEMENT是ORACLE11g中引入的新功能。SQL PROFILE实际上一些hint和统计信息,来帮助优化器得到更好的执行计划;stored outline是将稳定的执行计划存储起来,供以后使用;而SPM则是将生成的执行计划放在一个库中进行管理,使用了spm,优化器就不会突然选择效率很 低的查询。

capture SQL plan baseline:
捕捉sql plan baseline在默认情况下是关闭的,所以需要打开:
alter session
set optimizer_capture_sql_plan_baselines = true;

运行以下语句:
select * /* ARUP */ from sales
where quantity_sold > 1 order by cust_id;
-- Change the optimizer mode
alter session set optimizer_mode = first_rows;
-- Second execution. Opt Mode changed
select * /* ARUP */ from sales
where quantity_sold > 1 order by cust_id;
-- Gather stats now
begin
dbms_stats.gather_table_stats (
ownname => 'SH',
tabname => 'SALES',
cascade => TRUE,
no_invalidate => FALSE,
method_opt => 'FOR ALL INDEXED COLUMNS SIZE AUTO',
granularity => 'GLOBAL AND PARTITION',
estimate_percent => 10,
degree => 4
);
end;
/
-- Third execution. After stats
select * /* ARUP */ from sales
where quantity_sold > 1 order by cust_id;

/* ARUP */并不是sql hint主要是方便我们比较容易的表示这条语句。

然后可以在EM里点击 Server tab -> SQL Plan Control->SQL Plan Baseline,enable之。

Using Baselines:

alter session set
optimizer_use_sql_plan_baselines = true;


SQL> explain plan for select * /* ARUP */ from sales
2 where quantity_sold > 1 order by cust_id;
Explained.

SQL> select * from table(dbms_xplan.display(null, null, 'basic'));
PLAN_TABLE_OUTPUT
---------------------------
Plan hash value: 143117509
--------------------------------------------------------------
| Id | Operation | Name |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT ORDER BY | |
| 2 | PARTITION RANGE ALL | |
| 3 | TABLE ACCESS BY LOCAL INDEX ROWID| SALES |
| 4 | BITMAP CONVERSION TO ROWIDS | |
| 5 | BITMAP INDEX FULL SCAN | SALES_TIME_BIX |
--------------------------------------------------------------

-- disable baselines

SQL> alter session set optimizer_use_sql_plan_baselines = false;
Session altered.

SQL> explain plan for select * /* ARUP */ from sales
2 where quantity_sold > 1 order by cust_id;
Explained.

SQL> select * from table(dbms_xplan.display(null, null, 'basic'));

PLAN_TABLE_OUTPUT
----------------------------
Plan hash value: 3803407550

--------------------------------------
| Id | Operation | Name |
--------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT ORDER BY | |
| 2 | PARTITION RANGE ALL | |
| 3 | TABLE ACCESS FULL | SALES |
--------------------------------------

其实很多操作完全可以在EM里完成,具体可参照:
http://www.oracle.com/technology/obe/11gr1_db/manage/spm/spm.htm