-
http://www.nytimes.com/2009/07/08/world/asia/08china.html?_r=1&ref=global-home
挑选过的两张图片下,事件双方的角色发生了神奇的变化:施暴者成了“protester”,成了值得同情的受压迫者,而受害者则成了手握凶器的暴徒。不过,这手法,怎么如此的似曾相识?
逛了逛New York Times和Financial Times,两家对于此次事件的标题用词都是“clash(冲突)”,而不是“riot(骚乱)”。不过,冲突的话至少需要两方都出手吧?但这事一开始完全是单方面的暴力行为,既然是单方面的,何来“冲突”一说?这事要是发生放在西方,即使不是恐怖主义事件,也绝对会被定义成是骚乱,而不是一个取向暧昧的“冲突”。
接下来让我们仔细阅读一下这篇文章。
文中,维族人的身份是“tears in their eyes”的女人们、“protestor(抗议者)”,“angry Uighurs(愤怒的维族)”以及“ sons and husbands(儿子与丈夫们)”。而汉族呢,除了接近中性的“Han Chinese(汉族中国人)”外,另外的称呼就只剩“mob(暴徒)”了。那么,亲爱的读者,你觉得你应该同情谁呢?“sons and husbands”还是“mobs”?不过我们不会告诉你这个问题的答案,因为你需要的是独立思考。
接下来,对于5号的骚乱,只有一句简短的描述:“which 156 people were killed and more than 1,000 injured when angry Uighurs attacked Han civilians and battled with security forces across the city. ” 构句是如此的精巧,你既可以将伤亡理解为“angry Uighurs 攻击 Han civilians”的过程中发生的,也可以理解为“security forces镇压angry Uighurs”的过程中发生的。如果感到理解困难,没关系,下面还有一段帮你做出选择。
相对于之前骚乱面目模糊的叙述,对于汉族人反击的形容则具象多了:“thousands of Han Chinese armed with sticks, shovels, pipes and meat cleavers tried to march to the Uighur quarter to exact revenge for those Han civilians who were killed on Sunday.” 加上文章开头巨大清晰地配图,hoho,你不会不明白那里发生了什么吧?
综上,我想,你已经拥有了自己独立的看法。
更重要的是,这个看法是你自己思考得出的,作为媒体,我们只是帮助你理解而已。
Thanks,New York Times。再一次让我体验到了你的优雅与客观。
-
2009-05-02
构建Linux下的函数库编译方案 - [Linux]
就快离开学校了,最近打算把大学这几年积累下来的代码重构一下,写成类似于ACE那种形式的C++代码库,方便调用。也算是留给学弟学妹们的礼物。
在整理过程中遇到许多问题,感觉都颇有启发性。尤其是构建编译方案的过程,几乎让我重新学习和认识了make工具,收益匪浅。下面就把这个过程和盘托出,权当笔记,也希望对大家有用。
一:初始编译方案:
目录树:
|-- Makefile
|-- README
|-- doc
| |-- CHANGES
| |-- COPYING
| |-- CREDITS
| |-- INSTALL
| `-- TODO
|-- inc
| |-- Exception.h
| |-- HashTable.h
| |-- MessageQueue.h
| |-- Mutex.h
| `-- Semaphore.h
|-- lib
|-- mks
| `-- linux.mk
|-- obj
|-- sample
`-- src
|-- Exception.cpp
|-- HashTable.tpl
|-- MessageQueue.cpp
|-- Mutex.cpp
`-- Semaphore.cpp
主Makefile:
include mks/linux.mk
TARGET = libisrc.a
SOURCE_FILES = $(wildcard $(SRC_DIR)/*.$(SRC_EXT))
OBJS = $(patsubst $(SRC_DIR)/%.$(SRC_EXT), $(OBJ_DIR)/%.$(OBJ_EXT), $(SOURCE_FILES))
$(LIB_DIR)/$(TARGET): $(OBJS)
ar -rv $@ $(OBJS)
$(OBJ_DIR)/%.$(OBJ_EXT) : $(SRC_DIR)/%.$(SRC_EXT) $(INC_DIR)/%.h
$(CC) -c $< $(CFLAGS) -o $@ $(INCLUDE)
$(OBJ_DIR)/%.$(OBJ_EXT) : $(SRC_DIR)/%.$(SRC_EXT)
$(CC) -c $< $(CFLAGS) -o $@ $(INCLUDE)
.PHONY:clean
clean:
$(RM) $(OBJS)
$(RM) $(LIB_DIR)/$(TARGET)linux.mk:
CC = g++
ORACLE_HOME = /opt/oracle/instantclient
# Compile options
CFLAGS = -Wall -O -g
LFLAGS =
INCLUDE = -I./include \
-I$(ORACLE_HOME)/sdk/include
LIB = -L$(ORACLE_HOME)
# shell related
SHELL = /bin/bash
RM = rm -f
CP = cp -f
# dirctories
INC_DIR = include
SRC_DIR = src
OBJ_DIR = obj
LIB_DIR = lib
# file extension
SRC_EXT = cpp
OBJ_EXT = o说明:
doc -- 各种文档
inc -- 头文件
lib -- 最终生成的目标库文件
mks -- 共享makefile文件
obj -- 存放编译生成的.o文件
sample -- 范例程序
src -- 代码文件
Makefile -- 主Makefile
linux.mk -- Makefile通用变量
然而随着添加到库中的源文件越来越多,开始发现一些组织不合理的地方:
1、没有在目录结构上显示出分类
所有头文件都挤在一个目录下(源文件也一样),显得很杂乱。
2、编译选项庞杂
不同分类的源文件需要不同的编译选项(主要是-I和-L),现在的模式要求把所有的编译选项都写在一起,导致编译选项很庞杂,最终影响编译速度。
3、不能快捷地对分类进行配置
倘若在某个应用中,不需要数据库相关类库,即不需编译数据库相关的文件。在当前的设置下,只能删除相关的源代码文件(编译时的目标列表是用wildcard函数自动生成的),而不能在编译选项中灵活配置。
考虑到这样的问题应该是共性的,很多开源项目都应该遇到过,于是下载了ACE的源代码,想研究一下它是怎么组织的,却发现也都挤在一个文件夹下。既然没地参考,只能自己想了。二:改进
最后决定新的编译方案如下:
1、建立分类子文件夹
inc下和src下都建立分类子文件夹。把相关类别的代码放到子文件夹中,有些公用性质的源文件则仍保留在inc下。
例如,ipc相关的文件Mutex.h Semaphore.h都放到inc/ipc下,Mutex.cpp,Semaphore.cpp放到src/ipc下,log.h和log.cpp则仍旧放在inc和src下。
2、分离不同分类的Makefile
src根目录下放置一个Makefile,负责编译src目录下的文件,src中的每个子文件夹中包含一个Makefile,负责编译当前目录中的文件。这么做就实现了不同的代码分类由单独的Makefile文件负责,编译选项也可随不同类别灵活配置。
3、编译输出的.o统一存放至/obj目录下,方便ar读取,生成.a静态库文件。
4、主Makefile中设置SUBDIR变量,通过这个变量遍历各个分类目录,调用子Makefile进行编译
倘若不想包含某个模块,在主Makefile中的SUBDIR变量中删掉相关目录就可以了。
目录树:|-- Makefile
|-- README
|-- doc
| |-- CHANGES
| |-- COPYING
| |-- CREDITS
| |-- INSTALL
| `-- TODO
|-- inc
| |-- Exception.h
| |-- HashTable.h
| |-- IPC
| | |-- MessageQueue.h
| | |-- Mutex.h
| | `-- Semaphore.h
| |-- MDB
| | |-- MDB.h
| | |-- MDBColumn.h
| | |-- MDBDriver.h
| | |-- MDBDriver_Mysql.h
| | |-- MDBDriver_Oracle.h
| | |-- MDBField.h
| | |-- MDBResult.h
| | |-- MDBResult_Mysql.h
| | |-- MDBResult_Oracle.h
| | |-- MDBRow.h
| | |-- MDBStatement.h
| | `-- MDBStatement_Oracle.h
| |-- Net
| | |-- Socket.h
| | |-- TcpClient.h
| | `-- TcpListener.h
| `-- Print.h
|-- lib
|-- mks
| `-- linux.mk
|-- obj
|-- sample
| `-- MDB
| |-- Main.cpp
| |-- Main.o
| |-- Makefile
| `-- mdb
`-- src
|-- Exception.cpp
|-- HashTable.tpl
|-- IPC
| |-- Makefile
| |-- MessageQueue.cpp
| |-- Mutex.cpp
| `-- Semaphore.cpp
|-- MDB
| |-- MDB.cpp
| |-- MDBColumn.cpp
| |-- MDBDriver.cpp
| |-- MDBDriver_Mysql.cpp
| |-- MDBDriver_Oracle.cpp
| |-- MDBField.cpp
| |-- MDBResult.cpp
| |-- MDBResult_Mysql.cpp
| |-- MDBResult_Oracle.cpp
| |-- MDBRow.cpp
| |-- MDBStatement.cpp
| |-- MDBStatement_Oracle.cpp
| `-- Makefile
|-- Makefile
|-- Net
| |-- Makefile
| |-- Socket.cpp
| |-- TcpClient.cpp
| `-- TcpListener.cpp
`-- Print.cpp
主Makefile:
include mks/linux.mk
TARGET = libisrc.a
SUBDIRS = . Net IPC MDB
SRC_FILES_WITH_DIR = $(foreach subdir, $(SUBDIRS), $(wildcard $(SRC_DIR)/$(subdir)/*.cpp))
SRC_FILES = $(notdir $(SRC_FILES_WITH_DIR))
OBJS = $(patsubst %.$(SRC_EXT), $(OBJ_DIR)/%.$(OBJ_EXT), $(SRC_FILES))
all: subdirs $(LIB_DIR)/$(TARGET)
subdirs:
@ for subdir in $(SUBDIRS); do \
(cd src/$$subdir && $(MAKE)); \
done
$(LIB_DIR)/$(TARGET): $(OBJS)
ar -rv $@ $(OBJS)
.PHONY: clean
clean:
@ for subdir in $(SUBDIRS); do \
(cd $(SRC_DIR)/$$subdir && $(MAKE) clean); \
done
$(RM) $(LIB_DIR)/$(TARGET)linux.mk:
#copliler
CC = g++
# shell related
SHELL = /bin/bash
RM = rm -f
CP = cp -f
# dirctories
INC_DIR = inc
SRC_DIR = src
OBJ_DIR = obj
LIB_DIR = lib
# file extension
SRC_EXT = cpp
OBJ_EXT = o
INC_EXT = h子Makefile:
HOME = ..
include $(HOME)/mks/linux.mk
CFLAGS = -Wall -O
LFLAGS =
INCLUDE = -I$(HOME)/$(INC_DIR)
LIBRARY =
SOUCE_FILES = $(wildcard *.$(SRC_EXT))
OBJS = $(patsubst %.$(SRC_EXT), $(HOME)/$(OBJ_DIR)/%.$(OBJ_EXT), $(SOUCE_FILES))
$(HOME)/obj/%.$(OBJ_EXT) : %.$(SRC_EXT) %.$(INC_EXT)
$(CC) -c $(CFLAGS) $< -o $@ $(INCLUDE)
$(HOME)/obj/%.$(OBJ_EXT) : %.$(SRC_EXT)
$(CC) -c $(CFLAGS) $< -o $@ $(INCLUDE)
all: $(OBJS)
.PHONY:clean
clean:
$(RM) $(OBJS)
这么做目录结构干净很多,分完类的代码整齐划一,还可以分类调试。呵呵,先沾沾自喜一下。
正规的开源项目一般会用AutoMake之类的工具为自己生成编译方案。但是自动化方案意味着屏蔽了许多底层设计上的细节,不利于学习。工具有时使人变笨(例如Google),就是这个道理。所以,初级阶段还是尝试自己构建编译方案比较好。一来能够更深入的理解Make的特性,编写出更好的Makefile;而来也能提高自己的设计能力,何乐而不为? -
《南京!南京!》终于上映了,首日票房900万,mtime和豆瓣上的评分都在8.5以上。按目前的形势,最终实现“叫好又叫座”应该没有问题。陆川也能舒口气了。
不过,意料之中,豆瓣上很“适时”地出现了一篇“批评”为主调的“精英”评论,而且很快在争议声中占据了首页。
文中首先用第一段指出,此部电影有“重大缺陷”,陆川“作为编剧和导演严重失败”。随后在第二段中抛出一个电影研究专业名词,然后自说自话地给出了解释,为众多不明真相的围观群众进行了一次知识普及。这段的言外之意很明显:我是专业人士,素养深厚,谁说我没水平就是自己粗浅没文化。观众由此被挟持。如此高立意奠定基调之后,开始从各个方面分析陆川"叙事的失败",其间旁征博引,润物无声地向观众展现自己的渊博(再次以此挟持观众),最终给出结论:“《南京》真是令人失望透顶。”、陆川“精神可嘉,水平着实有限。”。
基本上我认为这类评论就是狗屎。
所谓分析,是属于科学范畴的纯理性的行为。具体的事物可以被拆解分割,形成最小的问题单元,然后互相比较,得出结论。但艺术可以被这么分析么?艺术基本上就是一种创作者观念的表达,属于完全感性的范畴。陆川也曾经表示,有些段落是他做梦的时候想到的。如果艺术可以被解构分析,那,分析一下蒙娜丽莎,总结出一些理论,然后就能靠这画出同样品质的“丽莎蒙娜”了?同样,比较的话,米开朗基罗的雕像和王羲之的书法放在一起,谁优谁劣?
伊恩·麦克尤恩对于文学理论也有过类似的评价:
Me, I am a realist and materialist, and literary theory always struck me as a fabulous waste of time, people wishing to import into their notions of the world untested theories with no evidence, just a sort of smattering of scientific vocabulary to give it some supposedly objective credibility.看出“被研究者”对于“研究者”的不屑了么?所以,电影研究?还不如回去数数今天掉了多少根腿毛来的有意义。和这种人较劲纯粹是浪费时间。
不过,这件事又一次证明了一个事实,那就是在中国,做点实事不容易。
无论做得是好是坏,总有人会把你说的一无是处。别说什么“孰能无过”,无过也有三分错,错就错在你做了,给人留了把柄。于是,最安全的方式就是什么都不做,翘个二郎腿斜着眼睛评论别人。流氓无产者,基本上就是这种状态:我什么都没有,你又能拿我怎么样?
拿我熟悉的领域来举个例子:
开发个软件,做的不好,挨骂:“垃圾,比起xx(一般为国外某大公司)差远了。”
无可厚非,谁让你没做好呢?
做的不错,挨骂:“x国xx年之前早有了,抄的!无耻!”
有是有,但是我也是独立开发的呀,难道德国人发明了汽车日本人就不能造汽车了么?
做的不错,国外也没有,挨骂:“你他妈的怎么不免费啊,还有脸收钱,真他妈黑心!”
这怎么说也是我的劳动成果啊,索取一点劳动报酬难道不正常么?
做的不错,国外也没有,也免费了,挨骂:“你他妈的怎么不开源啊,一点共享精神都没有,垃圾!”
.....开源也是讲究自愿的吧?这么逼我开源,不是强行共产么?再说我开源了,你愿意贡献代码么?
做得不错,国外也没有,也免费了,也开源了,挨骂:“你怎么有这么多闲工夫做这个?还开源了免费了,有钱人吧?公务员吧?草泥马!”
回头看看,下载的人很多,没有人上传过一行代码。
so,这就是畸形的现状:不做事情的人带着道德优越感评论打压做事的人,结果就是不做事情的人安全地名利双收,做事情的人冒着巨大的风险付出了很多努力到头来却莫名其妙地一文不名。
想起吴晓波的一句感叹:“我很庆幸能生活在这个充满了变化和激情的大时代,但是说实话,我希望它快点过去。”的确,这是个充满了变化和激情的大时代,但这也是个畸形的时代,一个混乱的时代。
我也希望它快点过去。
-
无意间发现了中国传媒大学近几年都在举办校园歌曲比赛,至今已经四届了。
下载了几首试听,很是惊喜。其中有几首,歌词,旋律,配乐以及混音,做得都相当的不错,接近专业水平(或许在我这个业余人士看来)。
和往常对校园歌曲印象不同的是,这些歌曲风格非常多样,民谣,摇滚,R&B,Rap,甚至还有一首类似于戏曲的。下面挑几首喜欢的介绍一下。
1、说唱《大闹天宫》
短促婉转的二胡和锣配上非常富有节奏感的说唱,非常符合孙悟空戏谑无忌的形象,歌词也不错。说唱的曲风多少带点痞气,但如果孙悟空不痞的话就不是孙悟空了。只是在最后的获奖名单里没有看到这首,可能是评委们不太喜欢这种音乐风格?可惜了。
2、《孟姜女》
用京剧元素创造了一种悠远的沧桑感:空无一人的剧场中,灯光昏暗的舞台上,独自吟唱的歌者。结构较快的主歌与舒缓幽怨的副歌相辅相成,非常的大气。但是感觉太过专注于技巧,歌曲内容本身离“校园歌曲”已经有点远了。最后这首得了银奖。
3、《再也不要》
金奖得主(第一名),典型的校园歌曲,清新明快,朗朗上口,非常适合传唱。女歌手的声线和张含韵有几分相像,但明显中气更足一点,很“专业”,很有“范儿”。编曲也不错,歌词尤其出色。最后一句峰回路转的“再也不要让我离开你”作为点睛之笔,升华了整首歌的感情层次。如果没有这句,整首歌就全是怨妇的唠叨了。虽然技巧上可能和《孟姜女》相比差了点,但既然选的是校园歌曲,这首夺冠当之无愧。
4、《幸福的等号》
相比上面几首,这首制作的比较简单,女歌手的声音也一般,但也因此有种“青涩”的感觉,加上旋律也不错,也算是首好歌。但让人崩溃的是唱歌的女生的口语是在太糟烂了,歌曲的后半部分却还有段挺长的英文独白,差不多毁了整首歌,真是让人哭笑不得。
托计算机多媒体技术发展的福,校园歌曲再也不只是简陋的木吉他加清唱了,音效可以更好,风格可以更多样。当年的校园歌曲多数如民谣般平淡如水,现在则是可乐咖啡绿茶一应俱全,清淡浓烈样样都有。
可是,我还是有点怀念那平淡如水的味道,那种清澈纯真的滋味,还有,那个白衣飘飘的年代。
今晚回寝,再听一遍老狼。
PS:
歌曲在这里有下:http://cmfs.cuc.edu.cn/
-
2009-04-13
Spring is comming! - [花花世界]
这张照片是二月份在老房子附近的立交桥边拍的,那几天无锡的温度最高冲上过二十五度,已经是春风拂面。这朵迎春显然是按耐不住,提前开放了。
回到哈尔滨依然是冰天雪地,今年的雪还碰巧特别多,断断续续下到三月末。直到最近才开始回暖,草坪中开始慢慢探出一丝丝绿色。前天一场春雨过后,各种野草一野之间都冒了出来。mm们的短裙也纷纷闪现,花枝招展地在学校里四处漂动。都说哈尔滨没有春天,这点在女生身上表现地特别明显:换下冬装就是夏装,不带一点犹豫。
蓝天、新绿加美女,连续几天都心情大好。
今天从食堂回实验室的路上,左顾右盼的间,忽然看到有一株迎春花开了。前些天的绿色只是前奏,这些拥簇在一起的淡黄色的花朵,才是春天归来的正式宣告。
压抑的冬季已经结束,一系列的计划要开始实施。
第一件事,
穿上新买的跑鞋,明天开始,早起晨跑!
-
又看了一遍预告片。
之前觉得这个片名应该用很急促、坚硬的语气念出来,现在却觉得,“南京,南京”,应该是两声叹息。
七十年前的伤口,依然隐隐作痛。
如今的中国已经不似当年那般羸弱,我们有世界上最庞大的基础制造能力,从袜子到步枪到核弹,一应俱全。甚至航母,只要我们想,也不是问题。
但,除去这些东西,还原到人本身,我们又有多少进步?
判断一个人的生存状态,第一印象往往最可靠。这个原则,放大到民族、国家的层面,同样适用。
想知道西方人对我们的印象?看电影就可以。从来没看到西方电影中的中国人有多少正面的形象。我们是美国最大的债权国,GDP进入世界前三,可在“中国”这个词依然和贫穷落后联系在一起,我们的面孔是蜡黄的,营养不良的,木讷的。
深入一点,我们的脸可以被进一步的具化:在政治上我们是被洗脑的共产者;在礼仪上我们是随地吐痰的乡巴佬;在文化上我们是厚颜无耻的盗版者;在经济上我们是血汗工厂的工人和镶着金牙的暴发户。
当然,有很多是种族偏见,但仔细审视一下我们自己,我们的精神面貌经得起拷问么?
信仰消逝的我们焦虑,浮躁。对于这个时代的混乱与不公,人人都认为自己是受害者。人人都在咒骂,在不满,在怀疑,在愤怒,却没有多少人在想自己能做些什么,自己该做些什么。网络给了人们自由发言的能力,让每个人的意见都能被所有人看到,但网络却并不能要求发言的人为自己的言行负责。于是网络成了我们这个时代最明亮的一面镜子,照出了贪官污吏与各种丑恶黑暗,也照出了某些国人最歇斯底里的一面。网络放大了我们所有的劣性。
先修身,然后才能家国天下。国家和民族是由我们这些细胞构成的,底层如若崩坏,再好的制度又能如何?
不要说“在中国,努力有用么?”,这永远是懦夫的托词。
如果我们不能改变每个个体的精神面貌,我们永远无法赢得真正的尊重,在赢得普遍尊重之前,我们仍然难称大国。
我们需要的是冷静与清醒与务实,阅读那段惨痛的历史,让我们的心静下来。
一部电影不能改变一个时代,但如果能够唤醒大家内心的某种力量,也就足够令人感到欣慰了。
4月22日,期望《南京!南京!》,能有这种力量。
---------------------------
更新:期望很高,失望也很大。不得不承认,这部电影里“优秀”还有很远的距离。整部电影面目模糊,意向含混,最后光明的结尾成了最大的败笔。
在这个沉重的题材面前,陆川还是太年轻了。
只能继续等待。
-
2009-04-01
Working PHP and Oracle under Redhat EL 5 - [Linux]
众所周知,PHP对MySQL的接口做得很好,LAMP名声在外,但是对于其他数据库的支持貌似就差了点。以前试着用过一次PHP的SQLServer接口(mssql),感受是做得相当粗糙。但是考虑到SQLServer是windows阵营的,应用也仅限于windows操作系统,也就情有可原了。但是对于Oracle这个重量级&跨平台通吃的家伙,PHP的支持又怎样呢?
手册中有两个关于Oracle的函数库。其中一个名为Oracle Functions,是比较旧的哪个版本,已经废弃。第二个为OCI8 函数库,是当前使用的版本。基本上实现了OCI的功能(包括事务与LOB操作等),看起来还不错(没用过,因此性能有待考证)。
顾名思义,OCI8函数库使用OCI实现,而使用OCI是必须要安装Oracle提供的客户端的。虽然Oracle的客户端是免费软件,但并不是自由软件,所以一般的发行版在打包的时候不会包含进来。因此,需要自己动手配置一下才能使用。
下面的步骤在Redhat EL 5上测试通过,在其他发行版上应该也是大同小异,写在这里以供参考。
1、安装配置Oracle客户端
a) 下载Oracle Instant Client
下载basic,sdk,sqlplus三个包
instantclient-basic-linux32-11.1.0.7.zip
instantclient-sdk-linux32-11.1.0.7.zip
instantclient-sqlplus-linux32-11.1.0.7.zip
b) 安装并配置
按照Oracle的传统,放在/opt下
# mkdir /opt/oracle
# unzip instantclient-basic-linux32-11.1.0.7.zip
# unzip instantclient-sdk-linux32-11.1.0.7.zip
# unzip instantclient-sqlplus-linux32-11.1.0.7.zip
解压完后都在一同个目录instantclient_11_1中
# mv instantclient_11_1 /opt/oracle/instantclient
编写tnsnames.ora
# mkdir -p /opt/oracle/instantclient/network/admin
# cd /opt/oracle/instantclient/network/admin
# vi tnsnames.ora
填入如下内容ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.101.251)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)其中HOST为Oracle服务器的IP,SERVICE_NAME为Oracle实例名。
在/etc/profile的最后中添加如下内容export ORACLE_HOME=/opt/oracle/instantclient
export TNS_ADMIN=/opt/oracle/instantclient/network/admin
export LD_LIBRARY_PATH=/opt/oracle/instantclient
export ORACLE_SID=ORCL使配置生效
# source /etc/profile将sqlplus放入bash寻找路径
# cp sqlplus /usr/local/bin测试一下:
# sqlplus sys/sys@ORCL as sysdba
如果显示SQL*Plus: Release 11.1.0.7.0 - Production on Wed Apr 1 20:47:27 2009
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
SQL>表示Oracle Instant Client配置成功。
2、安装PHP相关组件
虽然手册中说OCI8 Functions是内建在PHP中的,不需要安装,但是运行oci_connect()时,提示
Fatal error: Call to undefined function oci_connect() ......究其原因,是因为虽然“内建”,但在默认编译时时并没有包含。解决方法有两个:一是从源代码重新编译PHP,具体步骤可以看这里;二是使用PECL中的oci8扩展。
按方便程度来说,最好的选择自然是后者。过程如下:
PECL和PEAR使用同一套包管理系统,所以要先安装PEAR才能使用PECL。
至于PHP开发包么,是因为PECL取回的是源代码,需要开发包来编译扩展,所以也是必需的。
使用yum,可以很简单地搞定这些。
# yum install php-pear
# yum install php-devel编译安装前,还需要做一项准备工作。(共享库文件是带版本号的,默认编译时无法找到,需要建立没有版本号的共享库文件。用符号连接即可解决问题)
ln -s libclntsh.so.11.1 libclntsh.so
ln -s libocci.so.11.1 libocci.so
安装oci8扩展:
# pecl install oci8
安装过程中会提示输入ORACLE_HOME的路径,也就是instant所在路径Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] :填写shared,instantclient,/opt/oracle/instantclient即可
最后,修改/etc/php.ini,在其中加入extension=oci8.so,重启apache,这样就OK了。3、测试
只需要测试一下能不能连上数据库,如果oci_connect没问题的话,其余函数应该也是没有问题的。<?php
$conn = oci_connect('hr', 'passwd', 'orcl');
if (!$conn) {
$e = oci_error();
print htmlentities($e['message']);
exit;
}
else{
print "successfully connect to oracle.";
}
?>---------------------------------
4、更新:
除了直接使用oci8函数外,还可以使用PEAR中的MDB2库来连接Oracle。
如果不知道PEAR是什么,请看这里:PEAR简介:用PEAR来写你的下一个php程序
关于MDB2,请看这里:http://pear.php.net/package/MDB2/
简单来说,MDB2对PHP内置的原始接口进行了抽象封装,为不同的数据库提供了统一的面向对象接口。MDB2涵盖了多种主流数据库,稳定性也不错。因此,如果喜欢用面向对象的方式写程序,又不想“重复发明轮子”,MDB2是个不错的选择。
这篇文章详细介绍了如何安装使用MDB2以及MDB2的oci8驱动,并且给出了范例程序(Oracle的文档服务很是贴心。不得不承认,还是商业软件的文档支持更好)。如果只想知道如何安装使用MDB2,下面是我的快速参考:
a) 安装PEAR
如果是从本文的第一段一步步走下来的话,那此时已经安装过PEAR了。如果不确定有没有安装过,运行
# yum list | grep php-pear
若输出中包含类似
php-pear.noarch 1:1.4.9-4.el5.1 installed
的信息,那就是已经安装过了。
如果没有,则运行以下命令安装
# yum install php-pear
b) 安装MDB2及MDB2的oci8驱动
PEAR内建了自己的包管理系统,就和yum一样,运行几个命令即可自动化下载安装。
安装MDB2
# pear install MDB2
安装oci8驱动
# pear install MDB2#oci8
安装过程中可能会警告WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update这是因为PEAR包管理系统的协议升级了,客户端需要升级。按照提示,运行如下命令即可解决这个问题:
# pear channel-update pear.php.net
c) 测试(修改自Oracle例程中的init.inc.php)<?php
require_once 'MDB2.php';
$dsn = array(
// The type of database to connect to
// OCI8 should be the most common for
// connections to Oracle databases.
'phptype' => 'oci8',
// Usually this is the database host
// to connect to. Since oracle manages
// this through connection identifiers, one
// must be used here. If this variable is
// not set, MDB2 will try to retrieve the
// SID through the corresponding environment
// variable.
'hostspec' => null,
// The username to use when connecting to the
// database.
'username' => 'hr',
// The corresponding password.
'password' => 'passwd',
);
// Establish database connection
$db = MDB2::connect($dsn);
// Check if the connection was established successfully
// using PEAR errorhandling.
// More on PEAR error handling can be found here:
// http://pear.php.net/manual/en/core.pear.pear-error.php
if (PEAR::isError($db)) {
die('Could not create database connection. "'.$db->getMessage().'"');
}
else{
print "successfully connect to oracle.";
}
?>
-
初八还没过,就得知已经有两个同寝的同学已经回学校了。
在学校里对假期望眼欲穿,严重的时候可以想起回家就一阵激动。可真正回到家了,却发现对于闲散的假期生活,我们已经无所适从。此时的期盼,便是尽早回到学校。然后在度过几个月后,继续对家的想念。
这样的轮回,真是让人尴尬。
想起一个同学的qq签名:生活的理想就是理想的生活。可究竟什么是理想的生活?在美丽的理想的驱使下,当我们奋力追求理想的生活的时候,自己当前的生活已经被无意识地扭曲了。每天在电脑前面早九点、晚十点,宅男式的生活方式掏空了我们的健康;久拖不决的项目,反反复复耗尽了我们的精力。身处这个浮躁的时代中尤其浮躁的IT行业,心也不再静地下来,拿起本书就一目十行,放下就忘得一干二净。在这个人人自危,主动加班的年代,工作已经将生活蚕食地七零八落。
我们正当青春,却已疲态尽显。没有迎来理想的生活之前,或许我们就垮了。
If you work for a living, why do you kill yourself working ?
为什么,当前的生活就不能是理想的生活?
It's time to change, and we can change。
在此给自己定下新年的三个目标:
1、分清工作与生活的界线
工作是工作,生活是生活,下班时间少想或者不想工作的事。再重要的事情,第二天工作时间再解决。给自己找份和电脑无关的业余爱好,也算是养性怡情。
2、多多锻炼,身体最重要
拒绝“年轻时以命搏钱,年老时用钱买命”。身体是一辈子的根本,一定要重视自己的健康。多多参与体育活动,一来锻炼身体,二来也能多与人交流。
3、拥抱现实世界,多读书
现在网络越发像个垃圾场,脑残愤青漫天飞,什么样的言论都有。与其把时间花在网络上的各种超链接中,被大量无用的垃圾信息淹死,不如合上电脑,打开台灯,细读几本好书。目标不高,因为自知改变习惯是很难的,但是必须要改。希望在这一年中可以完成自我调整,迎接自己第一份真正的工作。记录在此,谨以自勉。
-
牛博被和谐了。
无论牛博自身对错与否,如此剥夺一群人发言的权利,在我看来都是错的,不为什么,就因为程序不正义。
无论多么证据确凿的罪犯,都需要经受公正的审判。没有公正的程序,今天可以用来和谐你不喜欢的人,明天就可以用来和谐你。
况且除了那些歇斯底里的激进份子和那些不堪入目的留言,牛博上还是有很多冷静的人存在的。比如说三联的土摩托,比如说曾经的王老板。
在此转帖牛博上我最喜欢(没有之一)的文章:不能再去牛博读了,那就放在这里,常看常新。
大路朝天,各走一边
王老板 @ 2008-8-10 17:40:18
在某个严肃的饭桌上,有一个年轻人正襟危坐,他看上去若有所思,但又有些心不在焉。他偶尔仔细聆听席间的争论,偶尔又露出不耐烦的神情。这时候,坐在年轻人左边一位脸色红润的大汉忽然搂住了他的肩膀,大汉满嘴酒气,热情奔放,浑身上下都洋溢着人格,他像一名苦难的阶级兄弟一样对年轻人背诵了一遍中国近代史,然后他大声的说道:“孩子!不要忘记这些!这些日本人、美国人、法国人……外国人对我们所干的事情!一定不要忘记!不要忘记那些资产阶级剥削冷酷的嘴脸,不要忘记革命者沸腾纯真的热血!记住这些,你就是我们的兄弟!”
说完这些,他揣着酒杯扑进了一片杯觥交错之中。正在年轻人发愣的时候,坐在他右边斯文而彬彬有礼的学者也把脑袋凑了过来。学者聪明而不动声色,他先蔑视的瞟了一眼那位醉醺醺的大汉,转而用真诚的眼光凝视着年轻人。和大汉不同的是,学者先把中国的当代史背诵了一遍,随即他也有些激动的对年轻人说道:“ 孩子,这就是这个政权曾经干过的事情,你虽然没有经历这些,但你以后不能忘记这些。你忘记了,你忽视了,你就是无知、无耻,你就是民主的敌人。”
听完这些,年轻人的脑子隐隐有些发胀,两片屁股辗转反侧,不知道该放在哪一边。他本想保持沉默,但他发现左边那位貌似已经喝醉了的大汉在偷偷的瞄着他,右边那位体面的学者也在暗自观察他。年轻人有些气馁,又有些茫然,他犹豫了半晌,终于站了起来,大声的说:“我能不能不记住这些,去追求客观的真、善、美?”
“不能!”两个中年人异口同声的嚷嚷起来,“这是不可磨灭的仇恨!”“这是你死我活的斗争!”“以自私为美的资产阶级身上也有真善美?幼稚!”“这个邪恶的政权身上也有真善美?滑稽!”
年轻人憋红了脸,他说:“我没有经历过你们所说的那些,但我也清楚那些曾经犯下的罪恶,有些罪恶已经过去了,有些罪恶依然存在。经历过这些,并不意味着深刻,没有经历过这些,也不代表无知。现在,我正年轻,风华正茂。我追求健康的人格,快乐的生活。我憎恨某些东西,但我并不想也变成那样。我不想永远活在过去之中,我也不想背负这样的包袱。我从来不曾丢弃自己反对和质疑的精神,但也不愿因此而失去客观理性,和自己最淳朴的感情。我喜欢站在不同的角度去看待问题,但永远不会站在某个立场上去看待问题。我认为,前者让我更开阔,后者让我更狭隘。
我从小疾病缠身,我也见到过很多苦难,我也为那些苦难的人做过一些微不足道的事情。我从来不曾忘记自己是个从偏僻小县城走出来的青年,我过去、现在、将来都不会成为一个洋洋得意的精英。我有时候也愤怒,但更多的时候,我乐观而积极。我热爱这个国家,我相信美好的未来——不管这是否幼稚可笑,我愿意为此而奋斗。对于你们,我满怀尊敬,同时我也希望你们能理解我的想法。我希望每天起床的时候,不是满怀着仇恨,而是满怀着希望和爱。
在《卡拉马佐夫兄弟》的结尾,阿辽沙说:最要紧的是,我们首先应该善良,其次要诚实,再其次是以后永远不要互相遗忘。我喜欢这段话,也想把这段话送给大家。我就说这么多,我希望大家能够携手共进,成为朋友。”
年轻人说完就坐了回去。饭桌上沉默半响,然后爆发出了各种叫声:“脑残!”“五毛!”“傻逼!”“装逼犯!”“说的真他妈恶心!”“GCD天天操你屁眼,你还在这里追求什么客观,什么真善美,呸!”“难道你已忘记那些学生的鲜血了吗?”“日本人是怎么屠杀我们中国人的!”“什么鸡巴糊涂脑子!”“操你支那狗的老娘!”
年轻人吃了一惊,这时候他才发现饭桌上有着很多跟他岁数相仿的年轻人,他们的眼神充满狂热,分别仰慕的看着大汉和学者,而厌恶的看着自己。年轻人有些不知所措,而大汉和学者则幸灾乐祸的看着他。
“快点滚吧!你不配呆在这里!”有一个更大的声音响了起来,席间众人纷纷附和。听到这句话,年轻人终于松了一口气,于是他站起来,匆匆说了一句再见,然后就一溜烟的跑掉了。 -
笔记本坏了之后,只能用实验室的台式机看电影,可是这机器的声卡有问题,电流声很大,忍无可忍之中上淘宝买了块声卡。二手的创新,很实惠。无意中,发现淘宝有nano的液晶屏配件卖,而且很便宜。当年nano被摔坏掉之后,由于实在是修不起(苹果售后要九百),一直扔在角落里。其实也就是换个屏幕而已,只是当时竟然一点都没想到上网搜搜有没有卖相关配件的,让一千多块钱的东西以砖头的形态放了这么久。
两天后声卡、液晶屏相继寄到。声卡没得说,驱动xp自动识别,插上就好使,音质也不错。至于液晶屏,费了很大劲把nano的后盖打开之后,在忐忑中把液晶屏换了下来。连上电脑,屏幕闪动了几下,我的呼吸几近停止。好在之后就正常进入了系统。用iTunes传了几首歌进去,一切正常。由于放得太久,电池是不行了,于是又买了一块电池换上。
就这样,花费不到一百,把nano给修好了。不计算贬值的话,等于挽回了一千块的损失,呵呵。
分析这件事的因果链条,和塞翁失马的故事何其相像。所谓因祸得福,此事乃证也。
虽说如此,但这样的大悲大喜,我脆弱的神经实在是承受不了。明年就是本命年了,不求多福,只求平平安安。套用胡总的话,2009,不折腾就行了。
-
最近连着做错了好几件事情。
第一件事:把自己的T60给活生生地搞坏了。本来就是风扇有点声音,很小,只有一点点,差不多就跟某些硬盘的读盘声一样大小。简单打开来清了几次灰,没有什么效果,是需要加点油了。本来已经和卖笔记本的说好了回去他给我拆,我硬是没忍住,自己拆了。结果脑子一热,一颗螺丝拧错了地方,把显卡上的一块显存给压坏了。保守估计,如果能换显卡的话,需要三四百;如果不能,则需要换主板,少则一两千,多了四五千也不止。而且,不能保证和以前一样稳定。
一失足成千古恨,小不忍则乱大谋,我的懊悔之情,犹如一江春水向东流。可惜世上没有时间机器,只能叹口气,作罢。
第二件,电脑坏了,第二天郁闷地有点失魂落魄,居然差点把饭卡给弄丢了。幸亏可爱的同学们素质高,饭卡得以失而复得。在学校五年了,第一次犯下这样的低级错误。
第三件,在卓越买书,居然买重了一本。一张订单,总共才买两本书,居然没有发现(靠,我居然连用了两个居然)。当时只是觉得,这次有点贵啊,两本书要七十多块。货送到了,才发现多了一本,后悔也晚了。自己的失误自己的责任,没法退货。
在这鸡飞狗跳的2008年里,我一直过的比较顺利,本来都已经满怀希望地准备迎接牛气冲天的2009了,却一不小心,在这时晚节不保。好在古人有言:“祸兮,福之所倚”。但愿过了这纷乱的年末,能迎来一个像样的牛年。
-
“饥荒从来都是政治造成的,所谓天灾只是借口而已。”
--- 路透社2008年度图片,图2
-
忍不住下了星尘(Stardust)的高清版本,又看了一遍。
虽然已经是第N遍,两个多小时却一点都没有觉得闷,证明这是部好片,至少是部好“故事片”。相反,昨天重看变形金刚的时候不住地快进,因为整部片子吸引人的也就那几个为数不多的精彩镜头,爽过了就完了,至少不会惦记。
不过高清版本下,Yvaine的那张大嘴显得越发明显,最后带上王冠时那几个镜头,那血盆大口甚至让我感觉有些“狰狞”。真不知道为社么为会选这么个演员。想象中,如果星星是女孩的话,也应该是有着精细面容,娇小文静又不失机敏的。你想,能在夜空中独自安静闪烁、注视大地的人,能长着一张似乎有说不完地话的大嘴么?可是可恶的导演啊......
大学这几年天南海北接触的人多了,对于“萝卜青菜各有所爱”这句俗语的理解是愈发地深刻。记得本科的时候在杂志上看到丹麦的平民王妃,称不上那种breathtaking的“漂亮”,但至少我觉的配得上“漂亮”这个词,而且很有气质。同寝的却纷纷表示太过于粗犷,像老太婆。还有一次,在实验室看到有个同学在盯着电脑淫笑,凑过去一看,直接崩溃。照我的审美观:黑瘦、土气,属于那种扔在人堆里找不出来的那种。可那位同学却表示“多漂亮啊!”,无语。类似的例子还有很多,千奇百怪。但是审美这种东西是完全主观的,唯物主义派不上用场,倘若争论起来肯定分不出对错。你觉得人家怪,人家还觉得你傻呢。所以,只能求同存异。
或许这也可以从生物学的角度解释,各有所爱,人人都能找到合适的伴侣。往小里说,社会才能因此和谐;往大里说,人类才能生生不息、
唉,审美观,其实是个大问题。
-
民主体制本身并不是一切,它的运作必须另有一种健全的文化精神与之配合。
——余英时最近网上流行一个笑话,主要用来嘲笑某党“摸着石头过河”的理论。大意是某人正在小心翼翼地淌水过河被路人看到,笑其不走不远处早已造好的大桥,而在这里浪费时间。说白了,dumbass一个。
其中的寓意不言自明:过河的人是某党,河对岸是和谐社会,而所谓的桥,就应该是“西式民主”了。笑话设计地很精巧,讽刺地也很到位。但,也只能是个笑话而已。
首先,希腊先贤有言:“人不能一次踏进同一条河流”,同样地,不同国家要渡过的,是同一条河流么?不同国家所处的外部环境,内部环境,文化基础完全不同,而中国尤其复杂。生硬地移植带来的结果只能是混乱。菲律宾的政治体制可完全是米国模式,照理说它应该和米国一样有米才是,可事实呢,今年送米(这里指真的稻米)都得军队护送了。除此之外,菲律宾出名的也就剩下“菲佣”了。
其次, 讨论一下桥存在的真实性。放眼世界,貌似目前尚无成功过桥的先例。俄国人被米国用米元骗上了桥,结果刚跨出去一步桥就塌了。如果不是这几年高涨的油价和普金铁腕整治寡头,俄罗斯恐怕已经被淹死。伊拉克,阿富汗这些被强行输入“民主”的国家(也就是被强行架上桥的),也没能走到对岸,现在是什么状态,大家也看到了。所以,所谓的桥,恐怕只是NED和CNN之类描述出来的海市蜃楼而已。换个角度,即使没有成功的先例,也不能证明完全没有可能,但是这个概率,恐怕非常地低。如果有人依然要过桥,而无视整个国家将面临的巨大风险,那只能是脑残。
对于自由与秩序的渴望人人都有,但不同的是建立在期望的实践路径上。所谓的“精英”们最容易犯的错误便是过于天真,而政治最忌讳的便是这一点。美国的政治制度与法律也不是在开国之初便全部设计好的,而是在之后的数百年间,通过一个个法案与重大案例,逐渐完善的。只有这个逐渐完善的过程,制度才能深入人心,形成一种文化,一种精神。制度本身就是一种契约,而靠暴力维系的契约永远无法长久。契约的维系只能靠对契约的尊重。没有文化底蕴的配合,制度就只是摆设(再次参考菲律宾案例),因为不会有人遵守它,尊重它,也不会有人去维护它。
通向和谐的道路是艰难的,但必须靠我们自己一步步走出来。没有捷径,没有银弹。
-
2008-11-28
Devil‘s Face - [乱象]

这张照片拍得非常好(如果是视频截图的话,那就是“截”得特别好)。
本来是摄影瑕疵的红眼在这里却起到了特别的效果,让一个人立马拥有了魔鬼的脸。再加上那笑容,邪气十足。不管这些人是因为什么原因成为了恐怖分子,从他们向平民开枪的那一瞬间,他们就丧失了做人的资格。这样的人,只能被成为魔鬼。
恐怖主义已经不是某些国家的问题,而是危害整个人类社会的毒瘤。本有机会在911之后大国携手压制住这股势力。无奈美国借反恐之名四处开战,假意反恐,实则扩大自己的势力范围。八年的反恐战争,恐怖分子没有消失,反而愈加猖狂。
今天看到新闻,新疆武警部队已经升格为正军级,看来中国的反恐形势也不容乐观。
唉,何时才能世界大同、和谐共处?把希望寄托于奥巴马?我只能说但愿。
愿在袭击中的受害者生者平安,死者安息。
-
2008-11-24
Dr. Hubert Farnsworth - [光影]

As geek as you can.












