| Profilo di 宗文方寸之间FotoBlogElenchi | Guida |
|
|
12 aprile 如何从第二个线程触发COM事件有两篇文章说得比较透彻
1)How to start a second thread in an MFC-based ActiveX control to fire events in Visual C++
2)PRB: Firing Event in Second Thread Causes IPF or GPF
主要的想法就是用窗口消息将第二个线程想要触发的事件传递到组件的套间线程内部,这样才能满足COM的套间线程模型的假定。 27 marzo 网页中OCX控件HWND为空问题当网页中的OCX控件没有出现到屏幕上之前(或者尺寸为0时),它的WM_CREATE消息将不会被调用. 这样当script程序调用一些必须要有有效HWND的操作时就会导致MFC/ATL底层库的崩溃(调试版本则会ASSERT)。
在MFC中的调试版本:
ASSERT(::IsWindow(m_hWnd)); 在ATL中的调试版本:
ATLASSERT(::IsWindow(m_hWnd)); MFC的解决办法是:在派生类中钩住OnSetClientSite,创建一个窗口,代码如下:
// CMyControl is derived from COleControl.
void CMyControl::OnSetClientSite() { // It doesn't matter who the parent window is or what the size of // the window is because the control's window will be reparented // and resized correctly later when it's in-place activated. if (m_pClientSite) VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(0,0,0,0), CRect(0,0,0,0))); COleControl::OnSetClientSite(); } ATL的解决办法:
// CMyControl is derived from CComControl STDMETHOD(SetClientSite)(IOleClientSite *pClientSite) { if (pClientSite) { RECT rc = {0,0,0,0}; // Don't have access to the container's window so just use the // desktop. Window will be resized correctly during in-place // activation. HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc); _ASSERT (hWnd); } return IOleObjectImpl<CMyControl>::SetClientSite (pClientSite); } HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
{ // Get the container's window. _ASSERT (m_spClientSite); LPOLEINPLACESITE pInPlaceSite = NULL; HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite, (void**)&pInPlaceSite); _ASSERT (SUCCEEDED (hr) && pInPlaceSite); HWND hParent = NULL; hr = pInPlaceSite->GetWindow (&hParent); _ASSERT (SUCCEEDED (hr) && hParent); pInPlaceSite->Release (); // Set container window as our parent window
SetParent (hParent); return CComControlBase::InPlaceActivate(iVerb, prcPosRect); } 本文摘自Microsoft原始文档 http://support.microsoft.com/kb/195188/en-us ,略有翻译。 12 marzo 数学中的悖论(1)-分球定理如果有人说,你能将一个地球那么大的东西分解成若干(有限)个部分,然后将这些部分分别经过多次旋转或者平移(都是刚性的,不做任何变形),重新拼接在一起竟然可以变得像乒乓球那么大,你是不是觉得不可思议呢?
1924年,Banach-Tarski提出并证明的分球定理恰恰保证了这一点。该定理说:一个球U可以分解为两个不相交的集合X和Y的并,使得U全等于X,也全等于Y。两个集合全等就是说这两个集合可以分别分解为相同数目的有限个不相交的子集的并,其中对应的两个子集可以经旋转和平移完全重合。多次运用分球定理,当然就可以让地球这么大的东西全等于小小乒乓球啦。可谓“藏须弥于芥子”啊。
这个极度违背人们日常常识的东西竟然是数学的定理?!是的,令人惊讶,但它与所有其它的数学结论都没有任何矛盾。有时候,常识也未必像你想象的那样永远可靠呢。
简单的说,这个结论和大家的常识不一致的根本原因是两个集合虽然全等,但有可能它们都没有办法定义符合常识的体积(不是说体积为0哦,而是没有办法定义体积)。所以虽然地球和乒乓球全等,但它们的体积还是可以很悬殊的。 11 marzo 梁启超《清代学术概论》札记2(3)“盖无论何人之言,决不肯漫然置信,必求其所以然之故;常从众人所不注意处觅得间隙,既得间,则层层逼拶,直到尽头处;苟终无足以起其信者,虽圣哲父师之言不信也。”
(4)吾乡前辈大师戴震:“不以人蔽己,不以己自蔽”,“传信不传疑”,“知十而皆非真,不若知一之为真知也。”
最后一句话,实在令人深思啊!如果日积月累积累真知,全人类的知识就会逐渐增长,不会陷入“生住异灭”的循环。
(5)还是戴震:“尊者以理责卑,长者以理责幼,贵者以理则贱,虽失之谓顺;卑者幼者贱者以理争之,虽得谓之逆。于是下之人不能以天下之同情、天下之同欲达之与上;上者以理责其下,而在下之罪,人人不胜指数。人死于法,犹有怜之者;死于理,其谁怜之!”
(6)康有为《大同书》:“无家族,男女同栖不得逾一年,届期须易人。”
柏拉图《理想国》,马克思对家庭都有类似这样的想法,看来这些哲人的乌托邦都对付不了家庭导致的私心。这样违背人性的东西也只能在乌托邦中存在。
(7)“故吾所恶乎舞文贱儒,动以西学缘附中学者,以其名为开新,实则保守,煽思想界之奴性而滋益之也。”“摭古书片词单语以傅会今义,最易发生两种流弊。一、倘所印证之义,其表里适相吻合,善已;若稍有牵合附会,则最易导国民以不正确之观念,而缘郢书燕说以滋弊。……”
(8)“今后欧美科学,日日输入,我国民用其遗传上极优粹之科学的头脑,凭借此等丰富之资料,将来必可成为全世界第一等的‘科学国民’。”
梁氏八九十年前的这个预言,看来基本落空了。实际上,我国国民目前迫切需要的,还是科学的启蒙,科学的普及。我国民中少数优粹的科学的头脑被淹没于无所不在的非理性不重实证的传统文化之中。梁氏以为的中国文艺复兴--清代朴学在中国实际上起到的作用和文艺复兴相去甚远,其原因还待我们思索。
(9)“……物质文明烂熟,而‘精神上之饥饿’益不胜其苦痛。佛教哲学,盖应于此时代要求之一良药也。”
梁氏此语,大谬也。且与他所肯定的(3)(4)(7)等条自相矛盾,也说明梁氏文章,热情鼓吹很是动人,但不以说理见长。
精神上的饥饿,不必须要信仰某种宗教或哲学来治疗。让我引用柯南翻译的Richard Dawkings的《科学是一种宗教吗?》(http://www.oursci.org/magazine/200505/0512.htm)的两段话说明这一点:
“提供安慰对科学而言更困难。和宗教不同,科学不能让人们和他们所爱的人在死后团圆。从科学的观点看,这个世界上被损害的人,无法期待伤害到他们的人来世会遭到大快人心的因果报应。我们可以争辩说,如果来生的说法是虚幻的(我相信它是虚幻的),它所提供的安慰是虚伪的。但是这还不够,倘若人们永远没有发现它是虚妄的,一个虚假的信念能够和一个真实的信念一样提供安慰。但是如果安慰来的那么廉价,科学也能提供其他的廉价手段,例如止痛片。这些手段提供的安慰或许是或者不是幻觉,但是它们确实有效。
“然而,科学确实能做到振奋人心。所有大的宗教都为崇敬、对奇迹和宇宙之美的赞叹留下了空间。令人颤抖和喘气的崇敬——几乎是膜拜——心中对奇迹的赞叹,这些正是科学可以提供的。它远远超越了圣徒和神秘主义者最疯狂的梦想。超自然在我们(对世界的)解释中没有任何位置的这一事实、我们对宇宙和生命如此丰富的理解,并没有减少敬畏。正相反,仅仅在显微镜下一瞥蚂蚁的大脑,或者从望远镜中一瞥拥有10亿个世界的古老星系,就足够让井底之蛙式的赞美诗相形见绌。”
精神上的饥饿,只能通过疑问、求真、创造加以消解。 02 marzo 梁启超《清代学术概论》札记1(1)“佛说一切流转相,例分四期,曰:生、住、异、灭。”
梁氏借此说明所有学说或思潮,分为启蒙期(生)、全盛期(住)、蜕分期(异)、衰落期(灭)。这个说法有些武断了。凡科学学说,一旦被实验证实,则基本上永远保持其正确性,只是有可能在扩大使用范围时会出错。比如牛顿力学,比如生物进化论。数学也基本上不会衰落,只有协调和完备与否的问题。那些不可实证的学说则有可能适合梁氏的说法,比如梁氏论及的清代学术,又比如心理学,还比如绝大多数所谓社会科学。
(2)“凡事物之含有宗教性者,例不许作为学问上研究之问题。一作为问题,其神圣之地位固已摇动矣!”
此言说得好!其实,又有什么不可以研究的问题呢?欧洲的启蒙运动正是从试图讨论那些教会不允许的问题开始的。所谓“人文主义”,说到底就是以人为中心,破一切神圣的东西。目前“中华文化”“老祖宗”就是这样神圣的东西。有以“中华文化”作为挡箭牌拒绝对风水啦、中医啦等进行科学研究的,岂不谬哉!
福建游-引子-福州三坊七巷从2.19(初二)开始到2.28结束,走过了大半个福建省。
2.19(初二) 北京飞福州,当天下午坐火车去武夷山。中间正好有点时间,花了一个多小时简单逛了逛三坊七巷。名人故居很多,有林则徐母家故居,还有我们老校长的父亲严复先生的故居。《天演论》等名著就是严复先生翻译的,“物竞天择,适者生存”就是他老人家翻译自然选择时的用词。他们应该是输入西方现代科学的第一代人。多少年过去了,英雄和狗熊都成为尘土,只有有生命力的弥因(meme)永远流传下来。
17 febbraio New year resolution 2007元旦上英语课的时候,preston老师说他们在元旦前夕有个传统,就是New Year Resolution。Same idea,其实中国也有这个传统的,不是吗?“一年之计在于春”,这里的春应该主要就是指春节前后。
听着四周热热闹闹连绵不断绚烂多姿的烟花爆竹声,心却非常安宁,来做做我的New Year Resolution好了。
去年的软件实现基本上达到了以前设计的架构的极限了,要想有所进步,必须对架构做非常大的改动,希望今年上半年能完成这个新架构,并将旧代码逐步迁移到新架构中。
图像内容智能分析虽然目前还没有特别好的应用方式,但前景明显是很不错的。今年内要加强图像内容分析(计算机视觉,神经网络,小波分析)方面的基础理论学习,找到比较实用的算法实现,并找到比较好的应用方式,逐步开始实施推广这项技术。
Linux上的用户界面一直不太理想,我有个不太成熟的想法,就是基于XML语言扩展一套可以插件化的用户界面描述语言和设计工具。今年可以开始这方面的初步研究,争取有个初始的版本,然后开源在网上招集志同道合的人一起做。
一直对英语有比较大的兴趣,说是过了那个没什么用的六级,其实听说读写都很烂。要持续不断地学习英语,今年达到能够在老外说得慢点的情况下基本能够沟通的水平。
另外重点读一读希腊罗马的历史:修昔底德(Thucydides)的《伯罗奔尼撒战争史》,吉本(Gibbon)的《罗马帝国衰亡史》,弄明白欧洲文化的基本源流。
春节、五一、十一长假分别再走走南中国的几个地方。
目标当然全部实现最好,如果不能,只要尽我的努力就可以了。毕竟,享受人生这个过程远比实现什么目的更重要。
2007年2月17日除夕夜 05 settembre 翻译:《唯我主义者》翻译自美国作家Fredrick Brown的微型小说:
瓦尔特是个不折不扣的唯我主义者,就是那些只相信他自己是唯一真实的存在的人。在他们眼里,其他人甚至整个世界都只不过是出于他的想象,一旦他停止想象,它们都将不复存在。
某天瓦尔特准备实证他的唯我主义哲学。在这个星期里,老婆跟另一个男人跑了,他又失去了搬运工的工作,连赶开挡路的黑猫时都会摔断了腿。
他在医院里暗自决定结束这个不能更糟糕了的世界。 看向窗外,注视着群星,他想着它们很快都将消失,果然那些星星就真的消失了。接着他决定让所有其他的人都化为乌有,于是这医院就很奇异地寂静下来。嗯,很好,下面,干掉这个世界吧。这样,他发现自己存在于虚无之中了。于是他又很容易地消除了自己的肉体。还剩最后一步,就是连他自己也彻底清除,一切就结束了。 然而没有作用,自己依然存在。 怎么回事啊,太奇怪了,他想,难道我的哲学还有什么局限? “是的”,虚无中有个声音响起。 “你是谁?”瓦尔特问。 “你刚刚用思维灭绝了整个宇宙,而我就是创建那个宇宙的人。现在你可以接我的班了——”,那人深深呼吸了一下,“——我终于可以结束我自己了。我太累了,还是你来顶替我吧。” “可是,我怎么结束呢?你知道我正试图这样做……” “是的,我知道,”那个声音说道,“那也就是我曾经试图去做的。你也必须重复我的方法,就是说,重新创建一个宇宙。你得一直等到有个人象你一样相信唯我主义的哲学而且他想结束的时候,你就可以让他接替你,而你就可以退休了。再见吧。” 声音寂灭了。
留下独自在虚无中的瓦尔特。而他也只有一件事好做——他创造了天和地。 这花了他七天时间。 顺便说一下,瓦尔特的全名是瓦尔特·B·耶和华。 04 settembre 《天下无贼》 好多人说《天下无贼》的台词,今天抽空看了一下。
挺喜欢开始的那个段子,充分体现了冯式的幽默。
但是冯导想拍悲剧总是拍不好,总是有点忽悠人的架势。女贼因为怀孕想从良因为被善良和单纯打动去保护那个傻小子我可以理解,但是最后会因为要圆傻小子的搞笑的天下无贼梦让自己的丈夫陷入生命危险是绝对不可理解不可理喻的,都怪导演太喜欢煽情。看到这里就象是看到古龙小说里面的人物开始进行道德说教或者大谈哲理一样倒胃口。
还有那个黎叔虎头蛇尾,一句“黎叔很生气,后果很严重”没有着落,成为贼头的夸夸其谈,只能让人赞颂咱们伟大的公安干警了。
刘德华男贼表演得比较到位,很喜欢这个角色。不是为了某种宗教或者神秘的信仰,而是为了自己的爱人自己的后代去拼命。 对《乡土中国》的一点小意见 费孝通先生的《乡土中国》,久闻其名,最近才开始读。
这本薄薄的一小册书很有趣味,有些观点比较有意思,比如谈及中国“家族”的作用推论出异性尤其是夫妻感情淡漠,比如论及“差序格局”对国人有私德无公德的道德观念的无情剖析(附带说一下,“差序格局”倒是颇类似于李宗吾先生的《心理与力学》里面的观点)等等。
但是我以为也有很多过于牵强倒因为果的地方。
比如论及文字下乡的部分,其主要观点是因为乡土社会中语言的重要程度大于文字,因而文字不能流行。这个恐怕不能这样说。实际上乡间对识文断字的人是非常尊重的,还有“敬惜字纸”的说法,景况好些的人家都会送儿子上私塾。千年以来的科举制度,使得文字有种特别的功效--改善家族的处境。是的,乡土社会中确实语言比文字更普遍,那是因为很多人不识字不得已,而不是文字不重要。不识字的原因我想主要还是贫穷,而贫穷的主要原因当然应该是繁重的赋税和重农轻商。那么这样说来,文字不能流行就不是因为大家相互太熟悉因而文字作为交流工具显得不是那么重要,而是由于国家政策导致大多数人不能识字导致的。毕竟我想任何人包括费先生所说的乡土社会中的人都有追求更好的地位更好的生活的向往的。
还有其它一些小意见,等下回再说。 20 agosto 论数学的基础 数学家罗素曾经这样说过,“数学是这样的一门学问,它既不知道自己说的是什么,也不知道自己说得是否正确”(大意,找不到原文了)。这句话看上去很让人吃惊,毕竟大部分人认为数学是最精确最不会出错的学科。
其实他的话可以这么来理解。
数学的各种命题都会涉及到很多概念,有些概念是用另外的概念定义的。比如“三角形是三个首尾相接的线段组成的图形”,这里三角形是用线段来定义的。那么总会有些概念是无法定义的,这些被成为原子概念。比如几何学里面的“点”、“线”、“面”等。这样这些原子概念数学就不在追究它们究竟是什么,于是“数学就不知道自己说得是什么了”。
数学里面有很多定理,很多定理都是通过其它定理来证明的。三国时期吴国的赵爽曾经用“面积定理”来证明“勾股定理”,参见http://www.mmit.stc.sh.cn/telecenter/CnHisScience/ggdl.htm。这样一定也存在一些没有办法证明的定理,这些定理一般被称为公理。几何学里面比较有名的公理是“平行公理”,即过直线外一点只能作一条平行线,该公理被提出来以后的一千多年里一直有人试图证明它但都失败了。这些公理究竟是否正确,数学也是不关心的,所以说“数学也不知道自己说得是否正确”。
这么说,岂不是大事不妙,我们怎么能依赖这个胡说八道的数学呢?
其实,可以从两个方面来考虑。
首先,关于概念的问题,只是一个“名”和“实”的问题。数学大师希尔伯特也说,“我们必须可以用桌子、椅子、啤酒杯而不是点、线、面来同样展开我们的几何学”,原子概念不可定义又有什么关系呢,毕竟这些概念间的关系是才是最重要的也是我们最关心的。
其次,关于公理的问题,这个比较复杂,又涉及到三个问题。
其一是,数学公理和概念是否代表实际,代表到什么程度。你在地球表面上尽可能画两条平行的直线,因为地球是圆的,它们迟早要相交。在空间,光线的路径应该是直线吧,可是根据爱因斯坦的广义相对论,光线会被引力场弯曲。这样我们知道了,没有纯粹的点,也没有纯粹的直线和平面,所以概念以及概念之上的公理并不能完全地符合实际。但是在小范围内还是符合得很好,数学大师高斯和黎曼就证明了曲面局部性质和平面几何是一致的。
其二是,公理之间是不是协调的,有没有矛盾。有矛盾的意思是,在公理系统中通过逻辑推理可以推出互相否定的定理来。这个问题的一个附属问题是,公理之间是否是独立的,就是说,其中的某个公理是不是不需要,可以从别的公理推出来。研究某个公理是否独立,就是用将该公理以其否定了来代替看替换过后的体系是否是协调的来判定。哥德尔、科恩等逻辑学家已经证明了我们目前采用的数学公理体系是没有矛盾的相互独立的。
其三是,公理体系是不是完备的。完备的意思是,这个体系能否证明所有理论上可能的定理,当然其中的某些证明实际上可能需要很多时间和人力。哥德尔第一不完备性定理回答了这个问题,该定理说一切包含算术系统的公理体系,要么是有矛盾的,要么是不完备的。换句话说,所有包含算术系统在内的无矛盾的公理体系都是不完备的,有些定理是无法证明的。这个结果看上去很悲观,但实际上才充分说明了数学是不可穷尽的,是丰富多彩的。很多数论上有名的问题得不到回答可能就是这个原因。
嗯,从上面说的这些,我们可以看出,罗素的话看上去不可思议,其实正好说明了数学的严谨,也就是说数学对自己究竟能解决哪些问题不能解决哪些问题这个涉及到本身的问题也有着精确的回答。这,就是严密的精确的美丽的数学。
14 agosto 在VC6中安装STLport进入DOS命令行(cmd)
进入VC安装目录下的vc98\bin子目录 执行vcvars32.bat设置cl需要的环境变量 解压缩到随便一个目录,以下称为目录X
进入目录X下的src子目录 set INCLUDE=目录X\stlport;%INCLUDE% set LIB=目录X\stlport;%LIB% copy vc6.mak makefile nmake clean all nmake install 此时安装完毕, 头文件被安装到VC安装目录的vc98\include\stlport目录下, 库文件被安装到vc98\lib目录下, DLL被安装到WIN32系统目录下了.
在VC的集成环境中将头文件目录(VC安装目录的vc98\include\stlport)增加在最开始即可
STLport相对于VC6 STL的优点: 1.和linux上用的STL一致 2.增加了hash,超长字符串等不在标准内但常用的模板类 3.代码可读性好 4.Warning少 09 agosto 先有鸡还是先有蛋?还记得十七年前上大学时候的一个晚上,我们宿舍的八个人不知怎么就热烈讨论起“是先有鸡还是先有蛋?”的问题。我那个时候以为这是一个关于名词定义的哲学问题,是无解的。但是对这类问题的兴趣却一直深深埋在我的心底。后来有空读了一些生物学尤其是进化论方面的科普书籍,其中《自私的基因》《进化是什么》等几本书更是让我看了一个又一个通宵。这之后的某天,突然我明白了,“鸡与蛋”的问题并非是一个哲学问题,而是一个进化论的问题,是可以有精确的答案的。
达尔文的进化论的一个基本论点是所有的生物拥有共同的祖先,这个论点已经被大量的生物学研究所证实,《伊甸园之河》这本书里面还用了相当多的篇幅论证了这个论点。而且进化的历史就是物种分化的历史,就是博物学上物种分类的依据。因此我们可以断定最早的鸡一定有其父母,而且既然这是最早的鸡,那么其父母就不会和其是同一物种(“鸡”)。注意,我们为什么说两种生物不是一个物种呢?物种又是靠什么来区分的呢?只能是其基因型。所以说最早的鸡和其父母的基因型一定不同。我们知道,作为卵生动物的鸡,是从一个受精卵细胞通过有丝分裂逐步长成的,在细胞有丝分裂的过程中,不会产生变异,因此,这只鸡来源的那个受精卵(“蛋”)的基因和这只鸡也是相同的。所以这个蛋就是最早的鸡“蛋”。
也就是说,先有蛋(受精卵),后有鸡。
那么有人问,那这颗蛋哪里来的呢?回忆一下高中生物书就知道了,这颗蛋产生于其父母的精子和卵子的结合,而精子和卵子是由父亲和母亲的细胞通过减数分裂得到的,在减数分裂的过程中,同源染色体会发生基因交换和变异。正是这些变异导致这颗蛋不同于其父母的基因型。新的物种就是这样产生的。
总结来说,要点就是:“鸡”必须从“蛋”来,但是“蛋”可未必一定要从“鸡”来。
呵呵,后来我搜索google才发现很多人早就得出这个结论了。比如“http://www.iambencn.com/blog/2006/05/29/chicken-and-egg-debate-unscrambled/”。不过我还是蛮高兴自己独立推导出这个答案。 Linux的核心启动流程(FC5)下面以RedHat Fedora Core5(Linux 2.6.15-1.2054_FC5)为基础说说Linux的启动流程。
打开计算机电源后,第一个执行的程序是ROM BIOS,该程序根据设置选择一个引导设备,比如软盘、硬盘、光盘或者USB盘等,然后读入引导设备上的一小段程序(称为BootLoader,常见的有lilo,grub等)。
BootLoader会读入相关的引导选单并执行。一般的引导选单上会指定从哪个设备的哪个分区读入操作系统内核,给操作系统传入哪些命令行参数(cmdline)、初始的RAMDISK(initrd)等等。BootLoader将系统核心以及initrd读入内存并传递好cmdline/initrd后就结束了自己的使命,控制权转移到Linux kernel。
我采用的BootLoader是grub,被安装在第一个SCSI盘的第一个分区上,其上的grub.conf内容如下(#后的注释是我加的,下同):
default=0
timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz title Fedora Core (2.6.15-1.2054_FC5) root (hd0,0) # 指定操作系统内核(Kernel)文件所在的磁盘和分区 kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ # 指定操作系统的文件名称以及cmdline initrd /initrd-2.6.15-1.2054_FC5.img # 指定initrd title MiniLinux-USB (2.6.15-1.2054_FC5) root (hd1,0) kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=/dev/ram0 initrd /boot/initrd-minilinux-usb.img 操作系统内核(Kernel)会执行各种必要的初始化如内存页表、进程表等等数据结构,初始化被编译到Kernel的内核模块以及设备驱动等等,很多初始化都需要分析cmdline以便在多个策略中选择。
接下来的启动流程分为两个分支:
1) 如果BootLoader指定了initrd,则解压initrd指定的初始RAM DISK映像到/dev/ram0并挂装/dev/ram0作为根文件系统,然后执行/init。
/init的目的一般是装载最终的根文件系统所必须的文件系统内核模块,建立一些设备特别文件并挂装最终的根文件系统(如果不是/dev/ram0)。 我安装的RedHat FC5的initrd-2.6.15-1.2054_FC5.img文件是个gzip压缩过的cpio文件,在启动完成后位于/boot目录下(因为启动分区被安装在/boot目录下, 参见下篇“linux的应用启动流程”一文)。我们可以执行下述命令提取其内容
mkdir -p xxx
cd xxx gunzip -c /boot/initrd-2.6.15-1.2054_FC5.img | cpio -idv 我们可以看到下面有很多目录和文件:
bin/ dev/ etc/ init* lib/ proc/ sbin@ sys/ sysroot/ ./bin:
insmod* modprobe@ nash* ./dev:
console null ram@ ram1 systty tty0 tty10 tty12 tty3 tty5 tty7 tty9 ttyS1 ttyS3 mapper/ ptmx ram0 rtc tty tty1 tty11 tty2 tty4 tty6 tty8 ttyS0 ttyS2 zero ./dev/mapper:
./etc:
./lib:
BusLogic.ko ext3.ko jbd.ko scsi_mod.ko sd_mod.ko ./proc:
./sys:
./sysroot:
其中/init内容如下:
#!/bin/nash #由/bin/nash解释执行
mount -t proc /proc /proc #挂装proc文件系统
setquiet #安静模式 echo Mounting proc filesystem echo Mounting sysfs filesystem mount -t sysfs /sys /sys #挂装sysfs文件系统 echo Creating /dev mount -o mode=0755 -t tmpfs /dev /dev mkdir /dev/pts mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts mkdir /dev/shm mkdir /dev/mapper echo Creating initial device nodes mknod /dev/null c 1 3 mknod /dev/zero c 1 5 mknod /dev/systty c 4 0 mknod /dev/tty c 5 0 mknod /dev/console c 5 1 mknod /dev/ptmx c 5 2 mknod /dev/rtc c 10 135 mknod /dev/tty0 c 4 0 mknod /dev/tty1 c 4 1 mknod /dev/tty2 c 4 2 mknod /dev/tty3 c 4 3 mknod /dev/tty4 c 4 4 mknod /dev/tty5 c 4 5 mknod /dev/tty6 c 4 6 mknod /dev/tty7 c 4 7 mknod /dev/tty8 c 4 8 mknod /dev/tty9 c 4 9 mknod /dev/tty10 c 4 10 mknod /dev/tty11 c 4 11 mknod /dev/tty12 c 4 12 mknod /dev/ttyS0 c 4 64 mknod /dev/ttyS1 c 4 65 mknod /dev/ttyS2 c 4 66 mknod /dev/ttyS3 c 4 67 #以上创建必要的设备特别文件 echo Setting up hotplug. hotplug # 设置可以热插拔的设备插拔时的处理程序 echo Creating block device nodes. mkblkdevs # 利用sysfs文件系统自动创建当前发现的块设备的特别文件,关于sysfs将是另一篇文章的内容了 echo "Loading jbd.ko module" insmod /lib/jbd.ko echo "Loading ext3.ko module" insmod /lib/ext3.ko echo "Loading scsi_mod.ko module" insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module" insmod /lib/sd_mod.ko echo "Loading BusLogic.ko module" insmod /lib/BusLogic.ko # 前面几个insmod装载接下来挂装最终的根文件系统所必需的驱动程序模块 mkblkdevs # 创建刚刚这些驱动程序发现并注册到sysfs文件系统中的块设备的特别文件 echo Creating root device. mkrootdev -t ext3 -o defaults,ro /dev/root # 分析kernel cmdline寻找根文件设备并创建一个特别文件指向该设备(如果是以“LABEL=”开始则自动寻找分区表上对应该LABEL的分区)并加入到/etc/fstab中 echo Mounting root filesystem. mount /sysroot #将最终的根文件系统临时挂装到/sysroot下 echo Setting up other filesystems. setuproot # 设置proc,sys等文件系统到/sysroot下 echo Switching to new root and running init. switchroot # 将/sysroot切换为最终的根文件系统,并执行其上的/init,见后 2) 如果BootLoader没有指定initrd,直接挂装cmdline上指定的root设备作为根文件系统,接下来按照下面的顺序寻找init程序并建立第一个进程:
run_init_process("/sbin/init"); // 找到就建立第一个进程(pid=0),不会返回了,下面三行同此
run_init_process("/etc/init"); run_init_process("/bin/init"); run_init_process("/bin/sh"); panic("No init found. Try passing init= option to kernel."); // 寻找不到,打印错误信息,系统挂起 不管是哪个分支,到此为止,核心启动流程结束,后面由最终的根文件系统上的init控制转入应用启动流程,这个待下篇文章再说吧。
15 luglio Linux的核心启动流程前段时间自己裁剪了一个Linux玩玩,顺便写点东西吧。
下面以RedHat Fedora Core4(Linux 2.6)为基础说说Linux的启动流程。
打开计算机电源后,第一个执行的程序是ROM BIOS,该程序根据设置选择一个引导设备,比如软盘、硬盘、光盘或者USB盘等,然后读入引导设备上的一小段程序(称为BootLoader,常见的有lilo,grub等)。
BootLoader会读入相关的引导选单并执行。一般的引导选单上会指定从那个设备的那个分区上读入操作系统,给操作系统传入哪些命令行参数(cmdline)、初始的RAMDISK(initrd)等等。BootLoader将系统核心以及initrd内存读入并传递好cmdline/initrd后就结束了自己的使命,控制权转移到Linux kernel。
我采用的BootLoader是grub,被安装在第一个SCSI盘的第一个分区上,其上的grub.conf内容如下(#后的注释是我加的,下同):
default=0
timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz title Fedora Core (2.6.11-1.1369_FC4) root (hd0,0) # 指定操作系统所在的磁盘和分区 kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ # 指定操作系统的文件名称以及cmdline initrd /initrd-2.6.11-1.1369_FC4.img # 指定initrd title MiniLinux-USB (2.6.11-1.1369_FC4) root (hd1,0) kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/ram0 initrd /boot/initrd-minilinux-usb.img Kernel会执行各种必要的初始化如内存页表,内核的数据结构,被编译到kernel的内核模块以及设备驱动等等,很多初始化都需要分析cmdline以便在多个策略中选择。
下面的启动流程分为两个分支:
1) 如果BootLoader指定了initrd,则解压initrd指定的初始RAM DISK映像到/dev/ram0并挂装/dev/ram0作为根文件系统,然后执行/init。
/init的目的一般是装载根文件系统所必须的文件系统内核模块,建立一些设备特别文件并挂装最终的根文件系统(如果不是/dev/ram0)。 我安装的RedHat FC4的initrd-2.6.11-1.1369_FC4.img文件是个gzip压缩过的cpio文件,在启动完成后位于/boot目录下(因为启动分区被以下篇“linux的应用启动流程”一文描述的方式安装在/boot目录下了)。我们可以执行下述命令提取其内容
mkdir -p xxx
cd xxx gunzip -c /boot/initrd-2.6.11-1.1369_FC4.img | cpio -idv 我们可以看到下面有很多目录和文件:
bin/ dev/ etc/ init* lib/ loopfs/ proc/ sbin@ sys/ sysroot/
./bin:
hotplug@ insmod* modprobe@ nash* udev* udevstart* ./dev:
console null ram systty tty1 tty2 tty3 tty4 ./etc:
udev/ ./etc/udev:
udev.conf ./lib:
BusLogic.ko* ext3.ko* jbd.ko* scsi_mod.ko* sd_mod.ko* ./loopfs:
./proc: ./sys: ./sysroot: 其中/init内容如下:
#!/bin/nash
mount -t proc /proc /proc setquiet echo Mounted /proc filesystem echo Mounting sysfs mount -t sysfs /sys /sys echo Creating /dev mount -o mode=0755 -t tmpfs /dev /dev mknod /dev/console c 5 1 mknod /dev/null c 1 3 mknod /dev/zero c 1 5 mkdir /dev/pts mkdir /dev/shm echo Starting udev /sbin/udevstart # 利用sysfs文件系统自动创建存在的设备的特别文件,关于sysfs将是另一篇文章的内容了 echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug # 通知内核当有热插拔设备插上或拔下时的要调用的用户层处理程序 echo "Loading scsi_mod.ko module" insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module" insmod /lib/sd_mod.ko echo "Loading BusLogic.ko module" insmod /lib/BusLogic.ko echo "Loading jbd.ko module" insmod /lib/jbd.ko echo "Loading ext3.ko module" insmod /lib/ext3.ko # 前面几个insmod装载接下来装载最终根文件系统需要的驱动程序 /sbin/udevstart # 自动创建由刚刚这些设备驱动程序注册到sysfs里面的设备的特别文件 echo Creating root device mkrootdev /dev/root # 分析kernel cmdline寻找根文件设备并创建一个特别文件指向该设备(如果是LABEL=开始自动寻找分区表上该LABEL的分区) echo Mounting root filesystem mount -o defaults --ro -t ext3 /dev/root /sysroot echo Switching to new root switchroot --movedev /sysroot # 将/sysroot作为最终的根文件系统,并执行其上的/init,见后 2) 如果BootLoader没有指定initrd,直接挂装cmdline上指定的root设备作为根文件系统,接下来按照下面的顺序寻找init程序并建立第一个进程:
run_init_process("/sbin/init"); // 找到就建立第一个进程(pid=0),不会返回了,下面三行同此
run_init_process("/etc/init"); run_init_process("/bin/init"); run_init_process("/bin/sh"); panic("No init found. Try passing init= option to kernel."); // 寻找不到,打印错误信息,系统挂起 不管是哪个分支,到此为止,核心启动流程结束,后面由最终的根文件系统上的init控制转入应用启动流程,这个待下篇文章再说吧。 12 luglio linux系统下select和poll的实现机理1.用户层应用程序调用select()
2.核心层调用sys_select() ------> do_select()
最终调用文件描述符fd对应的struct file类型变量的struct file_operations *f_op的poll函数。
poll指向的函数返回当前可否读写的信息。 1)如果当前可读写,返回读写信息。 2)如果当前不可读写,则阻塞进程,并等待驱动程序唤醒,重新调用poll函数,或超时返回。 核心层的相关函数(select.c):
do_select( ... ) { poll_table *wait; ... for (;;) { set_current_state(TASK_INTERRUPTIBLE); for (i = 0 ; i < n; i++) { unsigned long mask; struct file *file; ... file = fget(i); mask = POLLNVAL; mask = file->f_op->poll(file, wait); if ((mask & POLLIN_SET) && ISSET(bit, __IN(fds,off))) retval++; if ((mask & POLLOUT_SET) && ISSET(bit, __OUT(fds,off))) { retval++; } if (retval || !__timeout || signal_pending(current)) break; __timeout = schedule_timeout(__timeout); // 此处阻塞,等待驱动wake_up_interruptible } current->state = TASK_RUNNING; } 3.驱动需要实现poll函数。
当驱动发现有数据可以读写时,通知核心层,核心层重新调用poll指向的函数查询信息。 例如:
static unsigned int test_poll(struct file *file, poll_table * wait) { poll_wait(file, &queue, wait); // 此处将当前进程加入到等待队列中,但并不阻塞 return POLLIN |POLLRDNORM |...; } static void test_...(...)
{ wake_up_interruptible(&queue->proc_list); } static void test_init(...) { init_waitqueue_head(&queue->proc_list); } 11 luglio 吉本论宗教前几天看何炳棣先生的书《读史阅世六十年》,提到英国史学大家爱德华·吉本名著《罗马帝国衰亡史》上的一句名言:
The various modes of worship, which prevailed in the Roman world, were all considered by the people, as equally true; by the philosopher, as equally false; and by the magistrate, as equally useful.
流行于罗马帝国寰宇之内的各种各样的(宗教)信仰(和膜拜),一般人民看来,都是同样灵验; 明哲之士看来,都是同样荒诞; 统治阶级看来,都是同样有用。
吉本的这本书,论述基督教的发家史尤为详尽和精当。 09 luglio 針炙針出漏洞連連針炙針出漏洞連連 馬里諾(John Marino)是我見過最不屈不撓的人,他努力不懈要打破美國跨州自行車大賽的紀錄,並在1980年達成了心願──12天又3小時之內橫越了4800公里。我希望能像馬里諾一樣,所以那年我很認真鍛鍊,除了每週和他一起騎數百公里之外,我也仿效他的素食養生法、攝取大量維他命、禁食、洗腸、泥浴、虹膜診斷、負離子、整脊、推拿按摩,以及針灸。 雖然我嘗試了大多數的秘方,但它們都沒有顯著效果。不過,因為包以爾(Jonathan Boyer)在1985年的橫美大賽(那是我和馬里諾共同創辦的)打敗了我,我注意到他的支援團隊裡有一位華裔針灸師。基於馬里諾和包以爾的成功,看來其中可能有生物醫學上的原因。 傳統中醫主張,氣是生命的能源,它流遍全身的經脈;12個主要經脈各自代表一個器官系統。這12個經脈有365個針炙點,每一點代表一年裡的某一天。當陰陽失調,氣就淤塞,引發疾病。在氣不通的點上扎針(目前據信有2000個點),據稱具有療效,並能增進健康。 這個理論在生物學現實上沒有任何基礎,因為在科學上沒有發現任何像氣的東西。不過,像針灸這樣的醫療程序可能因為其他原因而有效,卻與它原來的錯誤理論無關。 電針灸(透過針炙的針給予組織電刺激)在減緩痛楚的效果,要比傳統的針灸好一倍。尤利特(George A. Ulett)是這麼說的,他具有醫學和哲學的博士學位,既是開業醫師又是針炙師,他的著作《超越陰陽:針炙如何真的有效》和教科書《針炙的生物學》,先後在1992年和2002年由美國聖路易士市格林(Warren H. Green)出版。尤利特斷定,電針灸刺激神經化學物的釋放,諸如β腦內啡、腦克啡、代腦啡,因而減緩痛楚。尤利特說,事實上根本不需要針,電刺激皮膚(穿皮電刺激神經)就足夠了。他還指出,運用這種技術,手術時麻醉劑的用量可減少50%。 這些發現可能有助於解釋德國慕尼黑科技大學林德(Klaus Linde)等人,發表於2005年5月4日《美國醫學會期刊》的研究結果。研究比較了302位偏頭痛患者,這些患者有的接受了針炙,有的接受了「假針炙」(針扎在不對的地方),有的是沒有接受針炙。研究期間,患者的頭痛情形有做病中日誌。受試者完全不知道自己屬於哪一組,評估人也不知道他們所看的日記是誰的,治療過程則由專業的針炙師掌控。 結果很戲劇化:「在接受針炙的小組中有反應(頭痛天數減少50%以上的)的比例為51%,假針炙小組裡則有53%,而在輪候名單(未接受針炙)的那一組裡也有15%。」於是研究人員下結論說,這個結果「也許是因為扎針的非特定生理學效應,或是強而有力的安慰劑效應,又或是這兩者的結合?」 在我的經驗中,「扎針」(針灸師輕拍並轉動剛插入的針)並不會疼痛,但是絕對可以感知得到。如果針炙的效果不只是安慰劑,它就是透過物理刺激和體內釋放的天然止痛藥來達到功效。 「假針炙」與「真針炙」的效用相當,說明氣的理論充滿了漏洞。不過,被針戳的效果不容忽視。搞清楚針炙與痛的心理學和神經生理學,將會找到更好的理論。 所有另類醫學的主張和處方,可以指引一條研究的方向;但科學是唯一能告訴我們它們到底行不行得通的工具。 【本文出自科學人2005年9月號】 告别中医中药 告别中医中药(征求意见稿)
张功耀,中南大学科学技术与社会发展研究所,长沙,410083
内 容 提 要
以文化进步的名义,以科学的名义,以维护生物多样性的名义,以人道的名
义,我们有充分的理由告别中医中药。 关键词:废除 中医 中药
1879年,浙江儒学保守派人士俞樾先生发表《废医论》,最早,也最明确地
提出了废除中医的主张〔1〕。俞先生的这个“废医”(“废除中医”的简称,下 同)主张,明显影响了曾经赴日留学的两位浙江后生,一位是余云岫,另一位就 是鲁迅。前者赴日先攻物理,后转大阪大学主攻医学,回国后却以斥责中医为 “伪学”而名闻海内外,有自撰的3集本《医学革命论》流传后世。后者赴日学 习西医,回国后却以改造中国人的思想为己任,其中包括“废除中医”,代表作 就是短篇小说《药》。在这些“海归派”的倡导下,在20世纪的20年代形成了一 股废医热潮。除余云岫和鲁迅之外,还有政治人物孙中山,学者胡适、梁启超、 严复、丁文江,都是“废医”主张的强力倡导者。有学者已经指出过,这些“海 归”的废医派人士均把废医主张与国民性的改造联系在一起。〔2〕然而,中国 的文化是很难改造的。几乎所有新起的思想,不管是内生的还是外部引入的,都 要被淹没在庸众思维的汪洋大海之中。即使在科学思想有了一定普及的今天,要 继续说服人们接受这个120多年以前就提出的废医主张,也还有许多艰苦的理论 工作要做。 以文化进步的名义
在我国,主张通过“弘扬优秀传统文化”来与高度发达的现代文明竞争的
“爱国者”不少,但却没有任何一个“爱国者”具备了理解和保守中国旧文化的 能力。同样,尽管中国至今仍不乏批评主张“废除中医”的人,却没有任何“护 医使者”指明了中医的前途。有不少人曾经试图通过“中医现代化”来振兴中医, 实际结果却总是事与愿违。中医越是“现代化”,中医所暴露出来的缺点也就越 多。典型的例子是,曾经被中医称为“大补之王”的人参(Panax ginseng, L.), 经现代化研究以后,既没有发现其确切的营养价值,也没有发现其确切的药用价 值,相反却发现了它对于某些疾病(如高血压、便秘、咯血、重感冒、失眠、过敏) 的有害作用。为回避这个严酷的现实,另有一些人提出了一种底气不足的新主张。 他们认为,中医是越古老越可靠,中医的前途不在于现代化,而在于复古。可是, 这个复古倾向一冒头就被人们嗤之以鼻了。明眼人心里很清楚,复古只会掩盖中 医的缺点,不会给中医带来任何积极的后果。由之,中医走入了一种进退维谷的 尴尬境地。笔者首先想要论述的是,中医走入今天这种境地,是它从来不曾主动 地寻求进步造成的。 中医祖于不立方剂的《内经》和《难经》。在马王堆汉墓中发现西汉古方以
前,我国中医史家常以东汉张仲景著《伤寒论》始立冬寒之方为中医方剂的开始。 嗣后,复有河间医生刘完素著《素问玄机原病式》始明温暑,易州张元素传《医 学启源》理脾胃,其徒弟东垣老人李杲写《兰室秘藏》讲内伤,张子和以《儒门 事亲》攻痰饮,丹溪先生朱震亨以《丹溪心法》究阴虚,至此形成了“中医六 宗”。中医史上也还出版过《医林改错》那样的书。这看上去,中医也是不断进 步的和求实的。其实不然。中医六宗带有标榜性质,并无实质性的进步。其创新 程度,还不如轻便自行车与山地自行车之间的差异。那些自认为可以进行医学纠 错的人,自己所犯的医学错误甚至更为严重。 就世界范围看,最古老的医学都是草本医学。笔者曾经考查过古巴比伦、古
印度、古埃及、古希腊、古代中美洲地区的医学。〔3〕将其与中国古代医学相 比较,不难发现,所有古代医学都有十分相似的起源。比如,西医里边的“发炎” (inflame,inflammation)就与中医里边的“上火”是一致的。在化学药物兴起 之前,全世界所有古文明发源地的人民都是用草医草药治病的。从科学史的角度 看,古中国大概还是兴起草医草药较晚的文明地区之一。为使“护医使者”们对 它有个清醒的认识,我们不妨做稍微详细一点的论证。 高春媛女士曾经出版过《文物考古与中医学》一书,其中对甲骨文医学资料
总结得比较详尽。笔者阅读后发现,甲骨文中只有一个勉强可以解释得过去的 “病”字,却没有一个“医”字,哪怕是不可靠的“医”字也没有。〔4〕这表 明,在甲骨文流行的时代,中国还没有医学。至于立有方剂最早的中医著作,则 是长沙马王堆汉墓中出土的14种医书,其存续年代在公元前193年左右。如果拿 它与其它文明地区的医学做比较,中国古代医学的肇始年代,不仅与古美索不达 米亚地区的医学形成的反差较大,与古希腊医学所形成的反差也是相当大的。对 此,笔者已经指出过,19世纪50年代,法国考古学家在伊拉克发现的由20000多 个瓦版残片组成的《尼尼微医书》,其明确可追溯年代达到了公元前2100年,比 夏启王朝立国还要早大约100年左右,比甲骨文的存续年代早大约700年,比马王 堆医书早1900年。古希腊的医学原来以为是公元前8世纪才开始的。最近,从公 元前16世纪的草纸书中发现了古埃及人使用过来自克利特人的药方。这一证据把 希腊医学的历史往前推进了800多年。遗憾的是,如此久远的医学历史文物和文 献证据,在中华文明的考古中还没有发现。〔5〕 直到公元前6世纪,中国可能还没有“医”,只有“巫”。众所周知,中国
的“巫”是纯粹的“医骗子”。后来才逐步从“巫”当中分离出了“医”。由于 中国古代的“医”起源于“巫”,使得中国的“医”一开始就与“巫”搅在了一 起。事实上,我国今天流行的“中医”(尤其是民间中医)依然保留着“巫”的痕 迹。 中国古代何时才把“医”和“巫”分开,至今没有定论。有人以秦越人(扁鹊)
为中国最早的“医”。其依据是《史记·扁鹊仓公列传》记载了扁鹊的一个誓言: “信巫不信医,不治也。”于是,扁鹊成了中医的鼻祖。有考据认为,扁鹊生于 周威烈王19年(公元前407年),卒于周赧王五年(公元前310年)。如果这个说法确 实,那么,中医鼻祖扁鹊比西医鼻祖希波克拉底(公元前460-377年)小53岁。更 有甚者,我们至今没有发现扁鹊有任何医学著作流传后世。《汉书·艺文志》所 记载的《扁鹊内经》极有可能是伪托扁鹊之名刊刻的,而且已经失传。希波克拉 底则无可置疑地留下了10大册之巨的《希波克拉底文集》。据西方科学史家介绍, 这部比扁鹊的出生还要久远的古代医书所包含的医学主题有53个,迄今保存在巴 黎国家图书馆公元11世纪出版的《希波克拉底文集》,最大页码编号是5526。对 此,我们只要指出,华夏出版社出版的刘衡如、刘山永父子的校注本《本草纲 目》,连同“目录”和“索引”在内才2000页,足见《希波克拉底文集》著述的 宏大了。 要论历史悠久,希腊医学比中华医学的历史更悠久。要论内容丰富,希腊医
学比中华医学的内容更丰富。更何况希腊医学在希波克拉底之后,有盖仑(公元 二世纪) 和阿维森纳(公元九世纪)两次里程碑式的发展。可是,当16世纪化学医 学兴起的时候,欧洲人还是告别了他们的祖先遗留下来的草医草药,走上了化学 医学的道路。 继化学医学革命成功之后,医学在19世纪末又发生了生理医学革命。DNA双
螺旋结构发现以后,20世纪的人类正在酝酿一场基因医学革命。在中国,既没有 跟上化学医学革命的步伐,也失去了生理医学革命的机遇。人类文化多次长足的 进步,居然没有触动中国传统医学的任何方面。这种不思进取的文化,难道是先 进的文化吗?因此,以文化进步的名义,我们有理由告别既不可能复古,也不可 能走向现代化的中医中药。 以科学的名义
许多为“中国古代无科学”做驳斥的学者,总是试图指出中国和西方存在
“不同的科学”。这样的假定是虚幻的。衡量一种理论是否属于科学,最简单的 判定方式就是看它是否建立了明晰而可靠的原理关系或因果关系。中医之所以不 属于科学医学,就在于它的经验判断和理论陈述都没有达到这样的境界。 有人以为,中医虽然不属于科学医学,但应该有资格被称为经验医学。其实
不然!中医的绝大部分概念和陈述没有经验基础。诸如太阳、太阴、阳明、厥阴、 少阳、少阴之类的概念在经验世界是不存在的。也有一些概念,表面上看似乎存 在某些经验基础,但仔细分析后不难发现,它们脱离经验世界很远。药性的“五 味”(辛、甘、苦、咸、酸)和“四气”(寒、热、温、凉)表面上看很有些经验的 味道,其实它们不能在经验世界中得到任何解析。类似的还有“五脏”(心、肝、 脾、肺、肾)和“六腑”(胆、胃、小肠、大肠、膀胱、三焦),都是不能被赋以 任何经验意义的概念。另有一些表面上看属于经验世界的存在,但它的描述方式 却不具有任何经验性,而且描述也不精确。典型的例子就是中医的“脉诊”方法。 这种描述不精确,没有实际诊断价值的经验方法,使慈禧太后至今还背负着洗不 清的“喜脉案”。其实,迄今没有任何证据证明,人体的生理和病理变化可以通 过脉相来表达。因此,我们没有任何理由把中医断言为一种经验医学。 此外,中医也完全不是理性医学。理性科学以完全形式化的推理为特征。表
面上看,所有被完全形式化的概念只存在于理性思维领域,远离经验世界。可是, 几乎所有的理性概念都具有经验的可还原性。比如,“点”、“线”、“面”在 经验世界是不存在的,但它们却都可以用来解析经验世界的存在。你可以将桌子 上的某个位置叫做“点”,你也可以将地球在宇宙中的位置叫做“点”,如此等 等。遗憾的是,没有任何中医概念达到了这样既高度抽象,又可做经验还原的理 性思维境界。 为了进一步说明中医的非科学特征,我们不妨以《黄帝内经》中关于水肿病
的论述做一次具体的解剖: “帝曰:‘其有不从毫毛而生,五脏阳以竭也,津液充郭,其魄独居,孤精
于内,气耗于外,形不可与衣相保,此四极急而动中,是气拒于内,而形施于外, 治之奈何?’歧伯曰:‘平治于权衡,去菀陈莝,微动四极,温衣,缪刺其处, 以复其形。开鬼门,洁净府,精以时服,五阳已布,疏涤五脏,故精自生,形自 盛,骨肉相保,巨气乃平。’帝曰:‘善’。”〔6〕 这段文字以黄帝的口吻提出了这么一个病理学疑问:通常认为,疾病是从外
到里演化的,可是偏偏有些疾病“不从毫毛而生”,五脏自己就变得不起作用了, “水肿”就是一个典型的例子,这是为什么呢?然后,作者以“歧伯”的口吻教 导黄帝如何对水肿病人进行保养和治疗。其中,“平治于权衡,去菀陈莝”所表 达的是对水肿病人的治疗原则。它把治疗水肿比喻成称东西,把蕴积的部分去掉, 保持一种平衡,水肿就可以好了。这个教导明显是一种表面判断,没有任何深入 的趣味。肿了的病人要消肿,这是众人皆知的常识,实在不是一种了不起的“学 问”。然而,歧伯却以煞有介事的姿态讲出了一些连他自己都如坐云雾的“医 理”,其中引起中医学者最大兴趣的莫过于“缪刺疗法”。 按照《素问·水热穴论》的说法,人体中有水俞57处,亦称“肾俞57”。人
若有水肿病,可判断为“肾俞积阴”。按照“以左取右以右取左”的缪刺原则, 左边水肿刺右边,右边水肿刺左边,一直刺到“见血立已”。可是,水肿病人基 本上是左右俱肿或全身浮肿的。如此,如何才能“以左取右以右取左”呢?估计 写这段文字的作者也未必清楚。至于用这种方法处置水肿病人,会不会出现“以 复其形”(消肿)的医疗效果,也只好由患者的生命去作赌注了。至于“开鬼门, 洁净府,精以时服,五阳已布,疏涤五脏”之类的医疗措施,则没有任何明确的 操作含义。它是不是巫术,我们姑且不去妄加断言,但至少它为江湖医生施行巫 术留下了一个广泛的空间。 无可讳言,水肿病曾经是一种难以理解和治疗的疾病。在科学还不发达的古
代尤其如此。虽然水肿病被发现得很早,但直到19世纪,英国医生John Blackall 和Richard Bright才将肾源水肿、肝源水肿和心源水肿区别开来。 1898年,英国生理学家斯大林(Ernest H. Starling)描述了作用于毛细血管膜的 水压力和胶体渗透压力(oncotic forces)之后,人们才逐步认识到,水肿是因为 这两种力的平衡遭到破坏引起的。细胞内外钠离子含量的变化最有可能破坏这种 平衡。这也是西药医生劝告水肿病人少吃盐的科学依据所在。至此,关于水肿的 认识才走上了科学的道路。 由上可知,尽管不同的古文明地区在战胜疾病方面有大致相同的起源,但以
后的发展道路迥异。值得我们效法的是,西医在取得进步之后,便很快告别了前 人所取得的那些不可靠的认识,主动用新的科学理论来指导医学实践。中医则不 然。它具有强烈的“恋旧癖”。居然没有任何医学科学的进步使中医发生过丝毫 改变。 现代人当然没有理由去苛求古人的不开化。但是,如果现代人继续维护古人
的错误,就是对科学的亵渎和对人类生命的摧残了。因此,以尊重科学的名义, 我们有理由告别因果关系和原理关系都不明确的中医中药。 以维护生物多样性的名义
最近20多年来,由于化学药品自身的局限性和广泛被滥用的现实,欧美医药
学界出现了一种自然疗法(Natural Therapeutics)的研究取向。古代文明中曾经 流行过的草医(Herbal Medicine)和中国古代所特有的针灸(Acupuncture),受到 了这一研究取向的重视,甚至出现了以草药和针灸作为辅助疗法的小诊所。国内 一些不负责任的大众媒体,以此发表带渲染性的报道说,中医已经风靡世界了。 其实,正如前述,草本医学并不为中国所独有,而是在16世纪以前的一切古文明 世界中都存在的医学方法。因此,欧美医药学界推行的自然疗法也不是只参考中 国古代的医学记载。此外,值得特别指出的是,自然疗法研究具有很强的科学性, 与中国古代滥用自然界的恩赐有着根本性的不同。 我们以对姜的药用价值研究为例,来比较二者的不同:
相传,孔子是喜欢吃姜的。《论语》中有孔子“每食不撤姜”一说。王安石
说,姜能“疆御百邪”,把姜的药用价值夸大到了可以抵御所有外感疾病地步。 其它古文明地区(如古埃及人和古印度人)也有以姜入药止呕的记载。李时珍写作 《本草纲目》的时候,辑录了姜的药用价值达44种。但是,经自然疗法医药学家 核实。姜的确切药用价值只有两种,那就是“止呕”和“通关节”,即对反胃 (nausea)和骨软骨炎(osteoathritis)有效。〔7〕 这个确证过程是严格的。以姜的止呕作用为例:
早在上世纪的80年代,华盛顿中心医院的D. Mowrey医生把姜做成姜粉胶囊
用来缓解因流行性感冒而引起的呕吐。后来,又有一位德国医生发现了姜对于消 化不良和晕动呕吐也有疗效。1984年,美国宇航局(NASA)拨款支持姜粉胶囊抗晕 动的研究。研究小组把它与晕海宁(dimenhydrinate)、安慰剂(placebo),多潘 立酮 (domperidone)、敏克静(meclozine)、桂利嗪(cinnarizine)等进行了药用 价值的对比研究,他们在1489例对比实验中,发现给每4小时500毫克姜粉胶囊与 给每4小时100毫克的晕海宁,具有相同的抗晕动的效果。〔8〕而且,姜粉胶囊 没有明显的副作用。大约在相同时间里,自然疗法医药学家,以每4小时给姜粉 胶囊250毫克的剂量,在70例抗妊娠反应中也取得了显著疗效。这样,姜粉胶囊 在感冒、舟车运动和妊娠中出现的呕吐,都取得了可靠的疗效证明。 这样的研究与王安石和李时珍随意夸大姜的药理作用,以及中医方剂中滥用
姜入药,属于完全不同的规范。 滥立方剂在汉以后的中医文献中是一种普遍现象。随便翻开一本医书,往往
是一种疾病立有若干个方剂,一个方剂又同时使用了若干种“药物”。尽管保留 在各种中医文献之中的“良方”、“验方”、“奇方”、“神效方”汗牛充栋, 却都没有切实可靠的临床实验依据和医理。正由于此,中医方剂的“有效”没有 普遍意义。有的“疗效”甚至是非常有害的。其中,将鸦片用于止痛和止泻就是 有害“疗效”的例子。目前,西医为了缓解病人痛苦,从鸦片中提取单体吗啡用 于止痛,但在使用上有严格的规定。其所以做出这样严格的规定,就是因为西医 既认识到了吗啡的药用价值,也认识到了吗啡的毒性作用。这与中医滥用“佛粥” (鸦片的中医别名) 止痛和止泻是完全不同的。 中医立方混乱与它滥用“药物”是紧密联系在一起的。中医的“药”是否真
有药用价值,从来就没有得到过确证。事实上,中医方剂中的“药”不乏“食 品”、“污物”、“毒品”和“穿肠而过的异物”。比如,李时珍在《本草纲目》 中记载,把自缢的绳子烧成灰兑水服,可以治疗突发性癫狂。如果把这种绳子收 藏二年以上,效果会更佳。又记载,将丢弃路边的烂草鞋烧成灰兑酒喝,可以治 疗霍乱。诸如此类的配方是不可能具有确切的药用价值的。 熟悉中医方剂学的读者也许知道,中药医生遵循君臣佐使、六气岁物、七方
十剂、气味阴阳、五味宜剂、升降沉浮、五运六淫、十九畏、十八反的配伍方法 进行多味立方。某些“神效”方,可能真正起作用的只是其中的一味或者两味, 在立方的时候,却偏偏要开十几二十味。笔者在农村习医(中医)时见过的方剂曾 多达49 味。中医如此立方,模糊了中医药物对于疾病之间的医理关系,同时浪 费了许多“药材”资源,增加了患者的经济负担。 更有甚者,中医通常以“奇特”来追求“奇效”。于是,成对的人形首乌、
高山顶上的雪莲、悬崖上的灵芝、房顶上的茅草、灵猫的阴户、老虎的阴茎、猴 子的脑髓,沙漠腹地的发菜,如此等等,因为其“奇特”而被视为“药中珍品”。 于是乎,越是稀有的动植物资源,遭到的破坏也越严重。 因此,为避免不科学的医药措施继续危害生物的多样性,一切有良知的学者
都应该承担起一种文化责任,呼吁国人自觉告别中医中药。 以人道的名义
中医一直自我标榜为“仁术”。可是,这种“仁术”并没有表现出多少仁爱
特征。举其要者,有如下一些: 一、装腔作势,欺骗患者。
医学同其它科学一样,本是个不断丰富和发展的知识体系。事实上,人类的
疾病本身也是变化多端的。在一个特定的历史时期,除了医学尚未认识到和解决 的疾病外,还会出现一些新型的疾病,2002年底到2003年上半年在世界许多地方 流行的SARS就是典型的例子。因此,无论医学怎么发达,人类在一个特定的历史 时期都不可能战胜所有的疾病,尤其不能很快战胜那些新型的疾病。 中医则一直漠视这个事实。对于中药医生所接触的疾病,不管是已经认识的,
还是尚未认识的,他总可以用一些莫名其妙的概念术语来装腔作势地作些“辩 证”,就连SARS和AIDS那样的新型疾病,中药医生都要煞有介事是“辩证”一番。 不仅如此,它甚至能够针对所有的疾病开出药方。“包医百病”这个成语出自中 国,恐怕不是偶然的。 中国医学界这种不求甚解而又装腔作势的风气是中国传统医学的一种遗患。
为使中国的“护医使者”对中医的弊病有一个清醒的认识,我们不妨举这样一个 例子: 估计现代人不大会相信立春时节的雨水可以治疗不孕不育症。大概是唐朝的
掌禹锡首先在《本草拾遗》中记载了这个方剂。李时珍编修《本草纲目》时,在 “水部第五卷”进一步地引述了它:“立春雨水夫妻各饮一杯,还房,当获时有 子,神效。”〔9〕现代人固然会对这个“神效”嗤之以鼻,但李时珍则十分固 执地相信它是真的,并为这个方剂做了阐发:“立春节雨水,其性始是春升生发 之气,故可以煮中气不足,清气不升之药。古方妇人无子,是日夫妇各饮一杯, 还房有孕,亦取其资始发育万物之义也。”类似装腔作势的医理解释,不知骗了 多少病人,害了多少学士。鲁迅先生说:“中医不过是一种有意的或无意的骗子” 〔10〕,并不是恶意而刻薄的谩骂,而是确切的事实! 二、推行异物、污物、毒物入“药”,坑害患者。
由于中医在生理和病理上的盲目性,使得中医关于“药”的概念相当混乱,
其中最令人发指的是推行异物、污物、毒物入“药”。 1、污物入药。尽管没有人确证过将狗屎绞汁口服可以“解一切毒”、治疗
小儿霍乱、心绞痛、月经不调、发背痈肿等疾病,但《本草纲目》却在兽部第50 卷推荐了这样的方剂。〔11〕这样的污物入药在《本草纲目》的“水部”(如磨 刀水、三家洗碗水、古冢中水、洗脚水、溺坑水等)、“土部”(如蜣螂转泥、鞋 底泥、猪槽垢、香炉灰、粪坑泥、尿坑泥等)、“服器部”(如裹脚布、月经布、 内裤、篦梳、炊帚等)各卷中最为多见。 2、毒物入药。中医以毒物入药已经在“中医现代化”研究中得到了不少揭
示。其中以滥用矿物,让患者吞服大量的重金属或其它有害成分最为普遍。除中 医推荐用来治疗精神性疾病的朱砂、辰砂含汞,密陀僧、禹余粮含铅以外,国内 已有临床报道证明,中医成药的天王补心丹、牛黄解毒片、大活络丹、至宝锭、 紫雪散容易导致肾中毒,甚至双肾萎缩;六神丸、六应丸、喉症丸等,可引起洋 地黄样心律失常;云南白药、小活络丸、附子理中丸等中毒可出现口唇麻木、头 晕恶心、最终可致心律紊乱以致死亡。如此等等。目前的临床统计表明,在所有 中药的毒性作用中,以肝中毒最为多见。值得特别提醒读者注意的是,由于中医 入药的原理不清,方法上相当混乱,不可能指望在较短的时间内对所有中医药物 进行药理分析,和对其毒性进行一一甄别。因此,中医究竟选择了多少毒物入药, 至今还是一个未知数。这一点与西医在药品投入临床之前,事先阐明其毒副作用 及其用药限量是完全不同的。所谓“纯中药制剂,无毒副作用”的正确解读是: “纯中药制剂,尚未阐明其毒副作用”。 3、异物入药。几乎所有的中药方剂,真正起作用的可能只有一味,甚至所
有的药都没有用,真正起作用就是所喝的水。于是,在多味入药的方剂中,“多 余”的药物就成了穿肠而过的异物。患者花费大量的钱财购买一些穿肠而过的异 物,对患者所造成的坑害是可想而知的。“中医现代化”研究已经证明,即使是 “上好的”人参,对于所有的疾病来说都是没有意义的。可见,中医的异物入药 是何等的触目惊心! 患者花钱买回的“药物”中,竟然不乏污物、毒物和异物。它们不但不能解
除患者的痛苦,反而还要使患者不明不白地忍受各种危害。这样的“仁术”是道 德的吗? 古人入药混乱限于古人的认识水平。现代人明知其有害,却要竭力去维护它,
这种不道德的文化欺骗行为,难道是可以容忍的吗? 三、以严格的“奇方”追求“奇效”为难患者,并为医生的无效施治开脱责
任。 古代立方大多凭经验,没有什么理论。16世纪中叶,瑞士医生巴拉塞尔苏士
(比李时珍大35岁)根据当时的化学思想,首次指明了草本医学中所使用的药物, 真正起作用的是药物中的“精素”。为此,他通过结晶升华获得了人类第一个化 学药物:愈创木酚。与这种寻求药物内在起作用的“精素”不同,中医立方则通 过从药材的选择、药物的炮制、药物的收藏,做出一些莫名其妙的严格规定来追 求“奇效”。细辛要水渍令直,蜈蚣要足朱为上,黄精要七蒸七晒,螵蛸要胶于 桑树者,上党的人参,川西的当归,齐州的半夏,毒蛇含过的石头,总之,所有 中药必须“产之有地,采之有时,制之有法”,才能奏效。此外,还有将药物分 成上、中、下 “性三品”以应天适时,把握君、臣、佐、使和“五味”“四气” 的宜忌、标本、升降、沉浮的配伍法式以相宣摄。到了唐朝,气象变化也被引入 了用药法式,于是又有了“四时宜忌”和“五运六气用药式”。此外,还有“不 得违越”的剂型规定。甚至熬药用的水,烧火用的柴都是使中医方剂创造“奇效” 的严格规定。 这样严格而奇异的立方不为别的,只为追求“奇效”。显然,这样严格的规
定是很难做到的。于是就有“良方易得,好药难求”一说。立方如此严格,见效 了自然是“奇方”的“奇效”;如果不见效,当然就是没有“好药”或“真药” 了。由之,医生无效施治的责任被开脱得干干净净。而患者为了疾病的好转,不 得不按照这些严格要求,爬山涉水、劳民伤财去寻求“真”“奇”的药物。现在 我们知道,这些“真”“奇”的追求没有任何医学意义。 总览以上,这样的“仁术”何曾有丝毫的仁爱之心?今天,应该是我们彻底
揭露“仁术”真相的时候了。 ①中国一直是世界上消耗人参最多的国家,其基本消耗目的是用它来改善人
的活力,消除疲劳。19世纪,欧洲人依据中国人的这个习惯开始研究人参真实的 药用价值。其结果,居然是否定性的。20世纪,美国人也开始了对人参的研究。 但是,所有的研究都没有发现人参有任何确切的药用价值和营养价值。于是,经 美国食品与药品管理局(Food and Drug Administration,FDA )严格审查确认, 人参属于“一般认为安全”(Generally Recognized As Safe,GRAS)的食品,而 不是药品。1970年代以来,医学界陆续发现了人参的许多副作用。由之,这个被 列入“一般认为安全”的食品陆续有了一些安全防线,它告诫人们,重感冒,咯 血,过敏,失眠,便秘,高血压患者不宜进食人参。 参 考 文 献
〔1〕 俞樾,废医论,原载《春在堂全书·俞楼杂纂》(卷45)(M),清光绪
十一年刊本,第1-13页。 〔2〕 陈小野,余云岫医学革命论中的民性观点(J),第八届全国医史学术会议
(南宁,1988年)交流论文。 〔3〕 张功耀,文艺复兴时期的科学革命(M),湖南人民出版社,2005年版,第
97~110页。 〔4〕 高春媛,文物考古与中医学(M),福建科学技术出版社,1993年版,第39
~62页。 〔5〕 同〔3〕。
〔6〕 佚名,黄帝内经·素问·汤液醪醴论篇第十四(M),辽宁民族出版社,
1999年版,第37页。 〔7〕 Altman RD, Marcussen KC. Effects of a ginger extract on knee
pain in patients with osteoarthritis. Arthritis Rheum.(J) 2001;44:2531 –2538. 〔8〕 Wood CD, Manno JE, Wood MJ, et al. Comparison of efficacy of
ginger with various antimotion sickness drugs. Clin Res Pract Drug Reg Aff.(J) 1988;6:129–136. 〔9〕 李时珍,本草纲目(刘衡如、刘山永校注本),(M),华夏出版社,2002
年版,第279页。 〔10〕 鲁迅,呐喊·自序,《鲁迅全集》(第一卷),新疆人民出版社,1995
年版,第139页。 〔11〕 李时珍,本草纲目(刘衡如、刘山永校注本),(M),华夏出版社,2002
年版,第1790页。 (XYS20060612)
OCX打包成CAB的方法以下假定ggg.ocx依赖于bbb.dll,要打包这两个文件需要一个ggg.inf文件,内容如下
;-------------------------------- [Add.Code] ggg.ocx=ggg.ocx bbb.dll=bbb.dll [bbb.dll]
file-win32-x86=thiscab FileVersion= DestDir=11 [ggg.ocx]
file-win32-x86=thiscab clsid={3B951750-8218-4BAC-87EA-C12FCEAB4B6E} FileVersion= DestDir=11 RegisterServer=Yes ;------------------------------------------ 注意 1) [Add.Code]的安装和设置顺序是倒序的,就是说先安装bbb.dll,然后安装ggg.ocx 2) 其他节[bbb.dll][ggg.ocx]之间的顺序无关紧要 3) 注意版本必须和文件的版本一致,或者不写 |
|
|