学而不思则罔,思而不学则殆

有其事必有其理, 有其理必有其事

  IT博客 :: 首页 :: 联系 :: 聚合  :: 管理
  85 Posts :: 12 Stories :: 47 Comments :: 0 Trackbacks

#

本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载,但任何对本文的引用都须注明作者、出处及此声明信息。谢谢!!

  在网络应用中,“负载均衡”已经不能算是什么新鲜话题了,从硬件到软件,也都有了很多的方法来实现负载均衡。我们这里讨论的负载均衡,并不是指依靠DNS转向或其它硬件设备等所作的负载均衡,而是指在应用层所作的负载均衡。

  一般而言,只有在大型在线系统当中才有必要引入负载均衡,那么,多大的系统才能被称为大型系统呢?比如动辄同时在线数十万的网络游戏,比如同时在线数在10万以上的WEB应用,这些我们都可以理解为大型系统,这本身就是一个宽泛的概念。

   设计再好的服务器程序,其单个程序所能承载的同时访问量也是有限的,面对一个庞大且日益增长的网络用户群,如何让我们的架构能适应未来海量用户访问,这 自然就牵涉到了负载均衡问题。支持百万级以上的大型在线系统,它的架构核心就是如何将“百万”这么大的一个同时在线量分摊到每个单独的服务器程序上去。真 正的逻辑处理应该是在这最终的底层的服务器程序(如QQ游戏平台的游戏房间服务器)上的,而在此之前所存在的那些服务器,都可以被称为“引路者”,它们的 作用就是将客户端一步步引导到这最终的负责真正逻辑的底层服务器上去,我们计算“百万级在线”所需要的服务器数量,也是首先考虑这底层的逻辑服务器单个可 承载的客户端连接量。

  比如:按上篇我们所分析QQ游戏架构而言,假设每个服务器程序最高支持2W的用户在线(假设一台机子只运行一个 服务器程序),那么实现150万的在线量至少需要多少台服务器呢?如果算得简单一点的话,就应该是:150/2=75台。当然,这样算起来,可能并不能代 表真正的服务器数量,因为除了这底层的服务器外,还要包括登录/账号服务器以及大厅服务器。但是,由于登录/账号服务器和大厅服务器,它们与客户端的连接 都属于短连接(即:取得所需要信息后,客户端与服务器即断开连接),所以,客户端给这两类服务器带来的压力相比于长连接(即:客户端与服务器始终保持连 接)而言就要轻得多,它们的压力主要在处理瞬间的并发访问上。

  “短连接”,是实现应用层负载均衡的基本手段!!!如果客户端要始终与登录/账号服务器以及大厅服务器保持连接,那么这样作的分层架构将是无意义的,这也没有办法从根本上解决用户量不断增长与服务器数量有限之间的矛盾。

   当然,短连接之所以可以被使用并能维护正常的游戏逻辑,是因为在玩家看不到的地方,服务器与服务器之间进行了大量的数据同步操作。如果一个玩家没有登录 到登录服务器上去而是直接连接进了游戏房间服务器并试图进行游戏,那么,由于游戏房间服务器与大厅服务器和登录/账号服务器之间都会有针对于玩家登录的逻 辑维护,游戏房间服务器会检测出来该玩家之前并没有到登录服务器进行必要的账号验证工作,它便会将玩家踢下线。由此看来,各服务器之间的数据同步,又是实 现负载均衡的又一必要条件了。

  服务器之间的数据同步问题,依据应用的不同,也会呈现不同的实现方案。比如,我们在处理玩家登录这个问 题上。我们首先可以向玩家开放一些默认的登录服务器(服务器的IP及PORT信息),当玩家连接到当前的登录服务器后,由该服务器首先判断自己同时连接的 玩家是不是超过了自定义的上限,如果是,由向与该服务器连接着的“登录服务器管理者”(一般是一个内部的服务器,不直接向玩家开放)申请仲裁,由“登录服 务器管理者”根据当前各登录服务器的负载情况选择一个新的服务器IP和PORT信息传给客户端,客户端收到这个IP和PORT信息之后重定向连接到这个新 的登录服务器上去,完成后续的登录验证过程。

  这种方案的一个特点是,在面向玩家的一侧,会提供一个外部访问接口,而在服务器集群的内部,会提供一个“服务器管理者”及时记录各登录服务器的负载情况以便客户端需要重定向时根据策略选择一个新的登录接口给客户端。

   采用分布式结构的好处是可以有效分摊整个系统的压力,但是,不足点就是对于全局信息的索引将会变得比较困难,因为每个单独的底层逻辑服务器上都只是存放 了自己这一个服务器上的用户数据,它没有办法查找到其它服务器上的用户数据。解决这个问题,简单一点的作法,就是在集群内部,由一个中介者,提供一个全局 的玩家列表。这个全局列表,根据需要,可以直接放在“服务器管理者”上,也可以存放在数据库中。

  对于逻辑相对独立的应用,全局列表的 使用机会其实并不多,最主要的作用就是用来检测玩家是不是重复登录了。但如果有其它的某些应用,要使用这样的全局列表,就会使数据同步显得比较复杂。比 如,我们在超大无缝地图的MMORPG里,如果允许跨服操作(如跨服战斗、跨服交易等)的话,这时的数据同步将会变得异常复杂,也容易使处理逻辑出现不可 预测性。

  我认为,对于休闲平台而言,QQ游戏的架构已经是比较合理的,也可以称之为休闲平台的标准架构了。那么,MMORPG一般的架构是什么样的呢?

   MMORPG一般是把整个游戏分成若干个游戏世界组,每个组内其实就是一个单独的游戏世界。而不同的组之间,其数据皆是相互独立的,并不象QQ休闲平台 一样所有的用户都会有一个集中的数据存放点,MMORPG的游戏数据是按服务器组的不同而各自存放的。玩家在登录QQ游戏时,QQ游戏相关的服务器会自动 为玩家的登录进行负载均衡,选择相对不忙的服务器为其执行用户验证并最终让用户选择进入哪一个游戏房间。但是,玩家在登录MMORPG时,却没有这样的自 动负载均衡,一般是由玩家人为地去选择要进入哪一个服务器组,之所以这样,是因为各服务器组之间的数据是不相通的。其实,细致想来,MMORPG的服务器 架构思想与休闲平台的架构思想有异曲同工之妙,MMORPG的思想是:可以为玩家无限地开独立的游戏世界(即服务器组),以满足大型玩家在线;而休闲平台 的思想则是:可以为玩家无限地开游戏房间以满足大量玩家在线。这两种应用,可以无限开的都是“具有完整游戏性的游戏世界”,对于MMORPG而言,它的一 个完整的游戏地图就是一个整体的“游戏世界”,而对于休闲平台,它的一个游戏房间就可以描述为一个“游戏世界”。如果MMORPG作成了休闲平台那样的全 服皆通,也不是不可以,但随之而来的,就是要解决众多跨服问题,比如:好友、组队、帮派等等的问题,所有在传统MMORPG里所定义的这些玩家组织形式的 规则可能都会因为“全服皆通”而改变。

  架构的选择是多样性的,确实没有一种可以称得上是最好的所谓的架构,适合于当前项目的,不一定就适合于另一个项目。针对于特定的应用,会灵活选用不同的架构。但有一点,是可以说的:不管你如何架构,你所要作的就是--要以尽可能简单的方案实现尽可能的稳定、高效!

  <全文完>
posted @ 2006-12-08 17:27 易道 阅读(367) | 评论 (0)编辑 收藏

本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载,但任何对本文的引用都须注明作者、出处及此声明信息。谢谢!!

  要了解此篇文章中引用的本人写的另一篇文章,请到以下地址:
  http://blog.csdn.net/sodme/archive/2004/12/12/213995.aspx
  以上的这篇文章是早在去年的时候写的了,当时正在作休闲平台,一直在想着如何实现一个可扩充的支持百万人在线的游戏平台,后来思路有了,就写了那篇总结。文章的意思,重点在于阐述一个百万级在线的系统是如何实施的,倒没真正认真地考察过QQ游戏到底是不是那样实现的。

   近日在与业内人士讨论时,提到QQ游戏的实现方式并不是我原来所想的那样,于是,今天又认真抓了一下QQ游戏的包,结果确如这位兄弟所言,QQ游戏的架 构与我当初所设想的那个架构相差确实不小。下面,我重新给出QQ百万级在线的技术实现方案,并以此展开,谈谈大型在线系统中的负载均衡机制的设计。

  从QQ游戏的登录及游戏过程来看,QQ游戏中,也至少分为三类服务器。它们是:
  第一层:登陆/账号服务器(Login Server),负责验证用户身份、向客户端传送初始信息,从QQ聊天软件的封包常识来看,这些初始信息可能包括“会话密钥”此类的信息,以后客户端与后续服务器的通信就使用此会话密钥进行身份验证和信息加密;
  第二层:大厅服务器(估且这么叫吧, Game Hall Server),负责向客户端传递当前游戏中的所有房间信息,这些房间信息包括:各房间的连接IP,PORT,各房间的当前在线人数,房间名称等等。
  第三层:游戏逻辑服务器(Game Logic Server),负责处理房间逻辑及房间内的桌子逻辑。

  从静态的表述来看,以上的三层结构似乎与我以前写的那篇文章相比并没有太大的区别,事实上,重点是它的工作流程,QQ游戏的通信流程与我以前的设想可谓大相径庭,其设计思想和技术水平确实非常优秀。具体来说,QQ游戏的通信过程是这样的:

   1.由Client向Login Server发送账号及密码等登录消息,Login Server根据校验结果返回相应信息。可以设想的是,如果Login Server通过了Client的验证,那么它会通知其它Game Hall Server或将通过验证的消息以及会话密钥放在Game Hall Server也可以取到的地方。总之,Login Server与Game Hall Server之间是可以共享这个校验成功消息的。一旦Client收到了Login Server返回成功校验的消息后,Login Server会主动断开与Client的连接,以腾出socket资源。Login Server的IP信息,是存放在QQGame\config\QQSvrInfo.ini里的。

  2.Client收到Login Server的校验成功等消息后,开始根据事先选定的游戏大厅入口登录游戏大厅,各个游戏大厅Game Hall Server的IP及Port信息,是存放在QQGame\Dirconfig.ini里的。Game Hall Server收到客户端Client的登录消息后,会根据一定的策略决定是否接受Client的登录,如果当前的Game Hall Server已经到了上限或暂时不能处理当前玩家登录消息,则由Game Hall Server发消息给Client,以让Client重定向到另外的Game Hall Server登录。重定向的IP及端口信息,本地没有保存,是通过数据包或一定的算法得到的。如果当前的Game Hall Server接受了该玩家的登录消息后,会向该Client发送房间目录信息,这些信息的内容我上面已经提到。目录等消息发送完毕后,Game Hall Server即断开与Client的连接,以腾出socket资源。在此后的时间里,Client每隔30分钟会重新连接Game Hall Server并向其索要最新的房间目录信息及在线人数信息。

  3.Client根据列出的房间列表,选择某个房间进入游戏。根据我的抓 包结果分析,QQ游戏,并不是给每一个游戏房间都分配了一个单独的端口进行处理。在QQ游戏里,有很多房间是共用的同一个IP和同一个端口。比如,在斗地 主一区,前50个房间,用的都是同一个IP和Port信息。这意味着,这些房间,在QQ游戏的服务器上,事实上,可能是同一个程序在处理!!!QQ游戏房 间的人数上限是400人,不难推算,QQ游戏单个服务器程序的用户承载量是2万,即QQ的一个游戏逻辑服务器程序最多可同时与2万个玩家保持TCP连接并 保证游戏效率和品质,更重要的是,这样可以为腾讯省多少money呀!!!哇哦!QQ确实很牛。以2万的在线数还能保持这么好的游戏品质,确实不容易! QQ游戏的单个服务器程序,管理的不再只是逻辑意义上的单个房间,而可能是许多逻辑意义上的房间。其实,对于服务器而言,它就是一个大区服务器或大区服务 器的一部分,我们可以把它理解为一个庞大的游戏地图,它实现的也是分块处理。而对于每一张桌子上的打牌逻辑,则是有一个统一的处理流程,50个房间的 50*100张桌子全由这一个服务器程序进行处理(我不知道QQ游戏的具体打牌逻辑是如何设计的,我想很有可能也是分区域的,分块的)。当然,以上这些只 是服务器作的事,针对于客户端而言,客户端只是在表现上,将一个个房间单独罗列了出来,这样作,是为便于玩家进行游戏以及减少服务器的开销,把这个大区中 的每400人放在一个集合内进行处理(比如聊天信息,“向400人广播”和“向2万人广播”,这是完全不同的两个概念)。

  4.需要特 别说明的一点。进入QQ游戏房间后,直到点击某个位置坐下打开另一个程序界面,客户端的程序,没有再创建新的socket,而仍然使用原来大厅房间客户端 跟游戏逻辑服务器交互用的socket。也就是说,这是两个进程共用的同一个socket!不要小看这一点。如果你在创建桌子客户端程序后又新建了一个新 的socket与游戏逻辑服务器进行通信,那么由此带来的玩家进入、退出、逃跑等消息会带来非常麻烦的数据同步问题,俺在刚开始的时候就深受其害。而一旦 共用了同一个socket后,你如果退出桌子,服务器不涉及释放socket的问题,所以,这里就少了很多的数据同步问题。关于多个进程如何共享同一个 socket的问题,请去google以下内容:WSADuplicateSocket。

  以上便是我根据最新的QQ游戏抓包结果分析得到的QQ游戏的通信流程,当然,这个流程更多的是客户端如何与服务器之间交互的,却没有涉及到服务器彼此之间是如何通信和作数据同步的。关于服务器之间的通信流程,我们只能基于自己的经验和猜想,得出以下想法:

   1.Login Server与Game Hall Server之前的通信问题。Login Server是负责用户验证的,一旦验证通过之后,它要设法让Game Hall Server知道这个消息。它们之前实现信息交流的途径,我想可能有这样几条:a. Login Server将通过验证的用户存放到临时数据库中;b. Login Server将验证通过的用户存放在内存中,当然,这个信息,应该是全局可访问的,就是说所有QQ的Game Hall Server都可以通过服务器之间的数据包通信去获得这样的信息。

  2.Game Hall Server的最新房间目录信息的取得。这个信息,是全局的,也就是整个游戏中,只保留一个目录。它的信息来源,可以由底层的房间服务器逐级报上来,报给谁?我认为就如保存的全局登录列表一样,它报给保存全局登录列表的那个服务器或数据库。

  3.在QQ游戏中,同一类型的游戏,无法打开两上以上的游戏房间。这个信息的判定,可以根据全局信息来判定。

   以上关于服务器之间如何通信的内容,均属于个人猜想,QQ到底怎么作的,恐怕只有等大家中的某一位进了腾讯之后才知道了。呵呵。不过,有一点是可以肯定 的,在整个服务器架构中,应该有一个地方是专门保存了全局的登录玩家列表,只有这样才能保证玩家不会重复登录以及进入多个相同类型的房间。

  在前面的描述中,我曾经提到过一个问题:当登录当前Game Hall Server不成功时,QQ游戏服务器会选择让客户端重定向到另位的服务器去登录,事实上,QQ聊天服务器和MSN服务器的登录也是类似的,它也存在登录重定向问题。

  那么,这就引出了另外的问题,由谁来作这个策略选择?以及由谁来提供这样的选择资源?这样的处理,便是负责负载均衡的服务器的处理范围了。由QQ游戏的通信过程分析派生出来的针对负责均衡及百万级在线系统的更进一步讨论,将在下篇文章中继续。

  在此,特别感谢网友tilly及某位不便透露姓名的网友的讨论,是你们让我决定认真再抓一次包探个究竟。

  <未完待续>
posted @ 2006-12-08 17:26 易道 阅读(309) | 评论 (0)编辑 收藏

本文作者:sodme 本文出处:http://blog.csdn.net/sodme
版权声明:本文可以不经作者同意任意转载,但转载时烦请保留文章开始前两行的版权、作者及出处信息。

   QQ游戏于前几日终于突破了百万人同时在线的关口,向着更为远大的目标迈进,这让其它众多传统的棋牌休闲游戏平台黯然失色,相比之下,联众似乎已经根本 不是QQ的对手,因为QQ除了这100万的游戏在线人数外,它还拥有3亿多的注册量(当然很多是重复注册的)以及QQ聊天软件900万的同时在线率,我们 已经可以预见未来由QQ构建起来的强大棋牌休闲游戏帝国。
  那么,在技术上,QQ游戏到底是如何实现百万人同时在线并保持游戏高效率的呢?
   事实上,针对于任何单一的网络服务器程序,其可承受的同时连接数目是有理论峰值的,通过C++中对TSocket的定义类型:word,我们可以判定这 个连接理论峰值是65535,也就是说,你的单个服务器程序,最多可以承受6万多的用户同时连接。但是,在实际应用中,能达到一万人的同时连接并能保证正 常的数据交换已经是很不容易了,通常这个值都在2000到5000之间,据说QQ的单台服务器同时连接数目也就是在这个值这间。
  如果要实现 2000到5000用户的单服务器同时在线,是不难的。在windows下,比较成熟的技术是采用IOCP--完成端口。与完成端口相关的资料在网上和 CSDN论坛里有很多,感兴趣的朋友可以自己搜索一下。只要运用得当,一个完成端口服务器是完全可以达到2K到5K的同时在线量的。但,5K这样的数值离 百万这样的数值实在相差太大了,所以,百万人的同时在线是单台服务器肯定无法实现的。
  要实现百万人同时在线,首先要实现一个比较完善的完成端 口服务器模型,这个模型要求至少可以承载2K到5K的同时在线率(当然,如果你MONEY多,你也可以只开发出最多允许100人在线的服务器)。在构建好 了基本的完成端口服务器之后,就是有关服务器组的架构设计了。之所以说这是一个服务器组,是因为它绝不仅仅只是一台服务器,也绝不仅仅是只有一种类型的服 务器。
  简单地说,实现百万人同时在线的服务器模型应该是:登陆服务器+大厅服务器+房间服务器。当然,也可以是其它的模型,但其基本的思想是一样的。下面,我将逐一介绍这三类服务器的各自作用。
   登陆服务器:一般情况下,我们会向玩家开放若干个公开的登陆服务器,就如QQ登陆时让你选择的从哪个QQ游戏服务器登陆一样,QQ登陆时让玩家选择的六 个服务器入口实际上就是登陆服务器。登陆服务器主要完成负载平衡的作用。详细点说就是,在登陆服务器的背后,有N个大厅服务器,登陆服务器只是用于为当前 的客户端连接选择其下一步应该连接到哪个大厅服务器,当登陆服务器为当前的客户端连接选择了一个合适的大厅服务器后,客户端开始根据登陆服务器提供的信息 连接到相应的大厅上去,同时客户端断开与登陆服务器的连接,为其他玩家客户端连接登陆服务器腾出套接字资源。在设计登陆服务器时,至少应该有以下功能:N 个大厅服务器的每一个大厅服务器都要与所有的登陆服务器保持连接,并实时地把本大厅服务器当前的同时在线人数通知给各个登陆服务器,这其中包括:用户进入 时的同时在线人数增加信息以及用户退出时的同时在线人数减少信息。这里的各个大厅服务器同时在线人数信息就是登陆服务器为客户端选择某个大厅让其登陆的依 据。举例来说,玩家A通过登陆服务器1连接到登陆服务器,登陆服务器开始为当前玩家在众多的大厅服务器中根据哪一个大厅服务器人数比较少来选择一个大厅, 同时把这个大厅的连接IP和端口发给客户端,客户端收到这个IP和端口信息后,根据这个信息连接到此大厅,同时,客户端断开与登陆服务器之间的连接,这便 是用户登陆过程中,在登陆服务器这一块的处理流程。
  大厅服务器:大厅服务器,是普通玩家看不到的服务器,它的连接IP和端口信息是登陆服务器 通知给客户端的。也就是说,在QQ游戏的本地文件中,具体的大厅服务器连接IP和端口信息是没有保存的。大厅服务器的主要作用是向玩家发送游戏房间列表信 息,这些信息包括:每个游戏房间的类型,名称,在线人数,连接地址以及其它如游戏帮助文件URL的信息。从界面上看的话,大厅服务器就是我们输入用户名和 密码并校验通过后进入的游戏房间列表界面。大厅服务器,主要有以下功能:一是向当前玩家广播各个游戏房间在线人数信息;二是提供游戏的版本以及下载地址信 息;三是提供各个游戏房间服务器的连接IP和端口信息;四是提供游戏帮助的URL信息;五是提供其它游戏辅助功能。但在这众多的功能中,有一点是最为核心 的,即:为玩家提供进入具体的游戏房间的通道,让玩家顺利进入其欲进入的游戏房间。玩家根据各个游戏房间在线人数,判定自己进入哪一个房间,然后双击服务 器列表中的某个游戏房间后玩家开始进入游戏房间服务器。
  游戏房间服务器:游戏房间服务器,具体地说就是如“斗地主1”,“斗地主2”这样的游 戏房间。游戏房间服务器才是具体的负责执行游戏相关逻辑的服务器。这样的游戏逻辑分为两大类:一类是通用的游戏房间逻辑,如:进入房间,离开房间,进入桌 子,离开桌子以及在房间内说话等;第二类是游戏桌子逻辑,这个就是各种不同类型游戏的主要区别之处了,比如斗地主中的叫地主或不叫地主的逻辑等,当然,游 戏桌子逻辑里也包括有通用的各个游戏里都存在的游戏逻辑,比如在桌子内说话等。总之,游戏房间服务器才是真正负责执行游戏具体逻辑的服务器。
   这里提到的三类服务器,我均采用的是完成端口模型,每个服务器最多连接数目是5000人,但是,我在游戏房间服务器上作了逻辑层的限定,最多只允许300 人同时在线。其他两个服务器仍然允许最多5000人的同时在线。如果按照这样的结构来设计,那么要实现百万人的同时在线就应该是这样:首先是大厅, 1000000/5000=200。也就是说,至少要200台大厅服务器,但通常情况下,考虑到实际使用时服务器的处理能力和负载情况,应该至少准备 250台左右的大厅服务器程序。另外,具体的各种类型的游戏房间服务器需要多少,就要根据当前玩各种类型游戏的玩家数目分别计算了,比如斗地主最多是十万 人同时在线,每台服务器最多允许300人同时在线,那么需要的斗地主服务器数目就应该不少于:100000/300=333,准备得充分一点,就要准备 350台斗地主服务器。
  除正常的玩家连接外,还要考虑到:
  对于登陆服务器,会有250台大厅服务器连接到每个登陆服务器上,这是始终都要保持的连接;
  而对于大厅服务器而言,如果仅仅有斗地主这一类的服务器,就要有350多个连接与各个大厅服务器始终保持着。所以从这一点看,我的结构在某些方面还存在着需要改进的地方,但核心思想是:尽快地提供用户登陆的速度,尽可能方便地让玩家进入游戏中。


posted @ 2006-12-08 17:24 易道 阅读(402) | 评论 (0)编辑 收藏

前几天看到卢亮的 Larbin 一种高效的搜索引擎爬虫工具 一文提到 Nutch,很是感兴趣,但一直没有时间进行测试研究。趁着假期,先测试一下看看。用搜索引擎查找了一下,发现中文技术社区对 Larbin 的关注要远远大于 Nutch 。只有一年多前何东在他的竹笋炒肉中对 Nutch 进行了一下介绍

Nutch vs Lucene
Lucene 不是完整的应用程序,而是一个用于实现全文检索的软件库。
Nutch 是一个应用程序,可以以 Lucene 为基础实现搜索引擎应用。

Nutch vs GRUB
GRUB 是一个分布式搜索引擎(参考)。用户只能得到客户端工具(只有客户端是开源的),其目的在于利用用户的资源建立集中式的搜索引擎。
Nutch 是开源的,可以建立自己内部网的搜索引擎,也可以针对整个网络建立搜索引擎。自由(Free)而免费(Free)。

Nutch vs Larbin
"Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。[引自这里
Nutch 则还可以存储到数据库并建立索引。
Nutch Architecture.png
[引自这里

Nutch 的早期版本不支持中文搜索,而最新的版本(2004-Aug-04 发布了 0.5)已经做了很大的改进。相对先前的 0.4 版本,有 20 多项的改进,结构上也更具备扩展性。0.5 版经过测试,对中文搜索支持的也很好。

下面是我的测试过程。

前提条件(这里Linux 为例,如果是 Windows 参见手册):

  • Java 1.4.x 。因为我的系统上安装的Oracle 10g 已经有 Java 了。设定环境变量:NUTCH_JAVA_HOME 。
    [root@fc3 ~]# export NUTCH_JAVA_HOME=/u01/app/oracle/product/10.1.0/db_1/jdk/jre
  • Tomcat 4.x 。从这里下载。
  • 足够的磁盘空间。我预留了 4G 的空间。

首先下载最新的稳定版:

[root@fc3 ~]# wget http://www.nutch.org/release/nutch-0.5.tar.gz

解压缩:

[root@fc3 ~]# tar -zxvf nutch-0.5.tar.gz
......
[root@fc3 ~]# mv nutch-0.5 nutch

测试一下 nutch 命令:

[root@fc3 nutch]# bin/nutch 
Usage: nutch COMMAND
where COMMAND is one of:
crawl one-step crawler for intranets
admin database administration, including creation
inject inject new urls into the database
generate generate new segments to fetch
fetchlist print the fetchlist of a segment
fetch fetch a segment's pages
dump dump a segment's pages
index run the indexer on a segment's fetcher output
merge merge several segment indexes
dedup remove duplicates from a set of segment indexes
updatedb update database from a segment's fetcher output
mergesegs merge multiple segments into a single segment
readdb examine arbitrary fields of the database
analyze adjust database link-analysis scoring
server run a search server
or
CLASSNAME run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
[root@fc3 nutch]#

Nutch 的爬虫有两种方式

  • 爬行企业内部网(Intranet crawling)。针对少数网站进行。用 crawl 命令。
  • 爬行整个互联网。 使用低层的 inject, generate, fetchupdatedb 命令。具有更强的可控制性。

以本站(http://www.dbanotes.net)为例,先进行一下针对企业内部网的测试。

在 nutch 目录中创建一个包含该网站顶级网址的文件 urls ,包含如下内容:
http://www.dbanotes.net/

然后编辑conf/crawl-urlfilter.txt 文件,设定过滤信息,我这里只修改了MY.DOMAIN.NAME:

# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*\.)*dbanotes.net/

运行如下命令开始抓取分析网站内容:

[root@fc3 nutch]# bin/nutch crawl urls -dir crawl.demo -depth 2 -threads 4 >& crawl.log

depth 参数指爬行的深度,这里处于测试的目的,选择深度为 2 ;
threads 参数指定并发的进程 这是设定为 4 ;

在该命令运行的过程中,可以从 crawl.log 中查看 nutch 的行为以及过程:

......
050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
050102 200336 crawl started in: crawl.demo
050102 200336 rootUrlFile = urls
050102 200336 threads = 4
050102 200336 depth = 2
050102 200336 Created webdb at crawl.demo/db
......
050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
050102 200336 crawl started in: crawl.demo
050102 200336 rootUrlFile = urls
050102 200336 threads = 4
050102 200336 depth = 2
050102 200336 Created webdb at crawl.demo/db
050102 200336 Starting URL processing
050102 200336 Using URL filter: net.nutch.net.RegexURLFilter
......
050102 200337 Plugins: looking in: /u01/nutch/plugins
050102 200337 parsing: /u01/nutch/plugins/parse-html/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/parse-pdf/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/parse-ext/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/parse-msword/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/query-site/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/protocol-http/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/creativecommons/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/language-identifier/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml
050102 200337 logging at INFO
050102 200337 fetching http://www.dbanotes.net/
050102 200337 http.proxy.host = null
050102 200337 http.proxy.port = 8080
050102 200337 http.timeout = 10000
050102 200337 http.content.limit = 65536
050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html; n
utch-agent@lists.sourceforge.net)
050102 200337 fetcher.server.delay = 1000
050102 200337 http.max.delays = 100
050102 200338 http://www.dbanotes.net/: setting encoding to GB18030
050102 200338 CC: found http://creativecommons.org/licenses/by-nc-sa/2.0/ in rdf of http:
//www.dbanotes.net/
050102 200338 CC: found text in http://www.dbanotes.net/
050102 200338 status: 1 pages, 0 errors, 12445 bytes, 1067 ms
050102 200338 status: 0.9372071 pages/s, 91.12142 kb/s, 12445.0 bytes/page
050102 200339 Updating crawl.demo/db
050102 200339 Updating for crawl.demo/segments/20050102200336
050102 200339 Finishing update
64,1 7%
050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml
050102 200337 logging at INFO
050102 200337 fetching http://www.dbanotes.net/
050102 200337 http.proxy.host = null
050102 200337 http.proxy.port = 8080
050102 200337 http.timeout = 10000
050102 200337 http.content.limit = 65536
050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html;
nutch-agent@lists.sourceforge.net)
050102 200337 fetcher.server.delay = 1000
050102 200337 http.max.delays = 100
......

之后配置 Tomcat (我的 tomcat 安装在 /opt/Tomcat) ,

[root@fc3 nutch]# rm -rf /opt/Tomcat/webapps/ROOT*
[root@fc3 nutch]# cp nutch*.war /opt/Tomcat/webapps/ROOT.war
[root@fc3 webapps]# cd /opt/Tomcat/webapps/
[root@fc3 webapps]# jar xvf ROOT.war
[root@fc3 webapps]# ../bin/catalina.sh start

浏览器中输入 http://localhost:8080 查看结果(远程查看需要将 localhost 换成相应的IP):

nutch web search interface.png

搜索测试:

nutch web search result.png
posted @ 2006-11-29 16:24 易道 阅读(385) | 评论 (0)编辑 收藏

把安装过程大概做个说明记录,一是有个总结,二是希望能帮到其他的朋友,有不恰当的地方希望大家指正,呵呵
安装Redhat AS 3.0就不多说了,我是自定义安装,把以后需要的工具如gcc等都装上了,省的以后用的时候没有还得装,麻烦,呵呵,你就随便了


安装j2sdk-1_4_2_02-linux-i586-rpm.bin(或其他版本都ok)
下载后双击安装
______________________________________________________

配置环境变量
编辑/etc/profile 加入下面句:
PATH=/usr/j2se/bin (改为你安装j2sdk的路径)
JAVA_HOME=/usr/j2se (改为你安装j2sdk的路径)
CLASSPATH=/usr/j2se/lib/tools.jar:/usr/j2se/lib/dt.jar (改为你安装j2sdk的路径)
export PATH JAVA_HOME CLASSPATH

重新启动使之生效
_________________________________________________________________
Tomcat 5.0.25

http://www.apache.org/下载得到jakart...t-5.0.25.tar.gz
#gunzip jakarta-tomcat-5.0.25.tar.gz
#tar xvf jakarta-tomcat-5.0.25.tar
#mv jakarta-tomcat-5.0.25 /usr/local/tomcat5.0.25
#cd /usr/local/tomcat5.0.25/bin
#./catalina.sh start

然后测试 http://localhost:8080/ 看到那个猫了吧,恭喜你tomcat安装ok

_____________________________________________________________________

安装apache2.0.50
估计用到的工具有:gcc,automake,autoconfig;libtools,m4 大家可以去下载rpm包安装就行了,别忘了写人环境变量噢 :-P

http://www.apache.org/下载后

gunzip httpd-2.0.50.tar.gz
tar xvf httpd-2.0.50.tar
cd httpd-2.0.50/bin
./configure -prefix=/usr/local/apache2 -enable-so (可改为你自己的目录;-enable-so用于加载connector,不可省略,你还可以加上你自己的其他模块)
make
make install
cd /usr/local/apache2/conf
vi httpd.conf
更改:servername 你的机器ip或域名
group nobody
listen yourip:80 (apache2以后把port已经改成了listen)

保存后,cd ../bin
./apachectl start

测试:http://localhost/ 看到apache的欢迎界面了吧,ok

_____________________________________________________________________________________

整合apache2与tomcat5.0.25

用连接器jakarta-tomcat-connectors-jk2-src-current.tar.gz(就是jk2),大家可到http://jakarta.apache.org/site/sourceindex.cgi下载

gunzip jakarta-tomcat-connectors-jk2-src-current.tar.gz
tar xvf jakarta-tomcat-connectors-jk2-src-current.tar
cd jakarta-tomcat-connectors-jk2-src-current/jk/native2
./configure --with-apxs2=/usr/local/apache2/bin/apxs (注意改为你的apache安装目录)
make
cd ../build/jk2/apache2
/usr/local/apache2/bin/apxs -n jk2 -i mod_jk2.so
现在大家可以看到mod_jk2.so文件已经在你的apache/modules/ 中了

编辑apache/conf/httpd.conf
LoadModule jk2_module modules/mod_jk2.so 保存

在apache/conf/中新建文件workers2.properties,内容为下(注意其中目录要改为你的目录噢):

[shm]
file=/usr/local/apache2/logs/shm.file
size=1048576
# Example socket channel, override port and host.
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
# define the worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
# Uri mapping
[uri:/*]
worker=ajp13:localhost:8009

保存后,就快大功告成啦,呵呵

cd apache2/bin
./apachectl start

测试:http://localhost/ 大家是不是看到了那个猫猫的界面啊,恭喜恭喜,整合成功咯!!!(可别忘了启动tomcat)

posted @ 2006-11-29 12:21 易道 阅读(287) | 评论 (0)编辑 收藏

今天看站点的log,发现有几个搜索nutch的反向链接过来。其实我只是在java编码规范一文提了一下这个词,这样的结果肯定让前来的朋友倍感失望。
  下面将我对nutch的一些试用公布一下,供有兴趣的朋友参阅。需要说明的是,nutch现在没有稳定的release,还在不断地根据反馈进行修 改,而且目前还不支持汉语的检索。总而言之,现在这个版本对中国用户而言还不实用。我想,这也应当是一直研究并关注nutch的车东没有写笔记的原因吧。
  前几天和车东在msn上谈起,觉得目前搭建网站时实现本站检索的最好的方案,是采用车东基于lucene的开源项目web lucene的软件包。而nutch似乎比较适合于建立垂直搜索引擎网站,至少目前如此,我认为。

1、下载安装


  不知为什么,这个网站不能直接访问。我用的是2003-09-18的打包(有兴趣的朋友可从此下载),在Red Hat Linux 8.0+JRE 1.4.1+Tomcat 4.1试用通过。
tar zxvf nutch-2003-09-18.tar.gz
cd nutch-2003-09-18 <----命令执行完后所在目录称之为$NUTCH_HOME,仅供描述之用。
ant
ant package
bin/nutch <---如果一切正常,此时应出现“Usage: nutch COMMAND”等字样

2、试运行脚本说明


  这个脚本是cutting在tutorial中说明的整理。脚本中的命令最好通过脚本依次运行,$s1、$s2和$s3三个变量的赋值表达式是一样的,但三个值不相同,这依赖于运行的上下文。我第一次运行时,就犯了弱智的错误,拆开运行,结果出错。:)
初始准备


mkdir db建立目录存放web database

mkdir segments

bin/nutch admin db -create建一个新的空的数据库
第一轮抓取


bin/nutch inject db -dmozfile content.rdf.u8 -subset 3000从DMOZ列表中取得URL并加入数据库

bin/nutch generate db segments根据数据库内容,生成一个抓取列表(fetchlist)

s1=`ls -d segments/2* | tail -1`刚才生成的抓取列表放在最后一个目录中,取其名

bin/nutch fetch $s1利用机器人抓页面

bin/nutch updatedb db $s1利用抓取结果更新数据库
第二轮抓取


bin/nutch analyze db 5迭代5次分析页面的链接

bin/nutch generate db segments -topN 1000将排行前1000个URL生成新的抓取列表

s2=`ls -d segments/2* | tail -1`执行抓取、更新、并迭代2次分析链接

bin/nutch fetch $s2

bin/nutch updatedb db $s2
第三轮抓取


bin/nutch analyze db 2

bin/nutch generate db segments -topN 1000

s3=`ls -d segments/2* | tail -1`

bin/nutch fetch $s3

bin/nutch updatedb db $s3

bin/nutch analyze db 2(为下一次做准备?)
索引并去重


bin/nutch index $s1

bin/nutch index $s2

bin/nutch index $s3

bin/nutch dedup segments dedup.tmp
重启tomcat


catalina.sh start在./segments所在的目录中启动

3、脚本的改动与下载


  DMOZ的文件太大了,下载不易,如果仅为实验,似乎也没必要从那里选URL。我改了一下脚本,在$NUTCH_HOME目录下建立一个urls.txt文件,里面一行一个打算搜索的网站的URL,nutch将从这个urls.txt中取站点的URL。
  脚本可以下载以参考,运行脚本放在$NUTCH_HOME目录下,参考下列命令运行:
sh all.sh

4、提供web检索


  前面忙活了半天,只是把网页抓回来、解析了网页并做作了索引。下面说明一下如何利用nutch自己带的jsp程序提供检索服务。
cd $TOMCATHOME/webapps
mv ROOT ROOTOLD
mkdir ROOT
cd ROOT
cp $NUTCH_HOME/nutch-2003-09-18.war ./ROOT.war
jar xvf ROOT.war
cd $NUTCH_HOME
$TOMCAT_HOME/bin/shutdown.sh
$TOMCAT_HOME/bin/catalina.sh start

  此时,如果不出意外,应可以访问了。
  我的试用URL是http://cdls.nstl.gov.cn/se/,(其中我把nutch改动了一下,没把它放在ROOT目录下),供参考。此时,不要检索汉字,只能检索英文,如hedong 或lucene什么的。

  试用仓促,难免有错,欢迎朋友进行交流。

参考文献:
基于Lucene/XML的站内全文检索解决方案
http://www.chedong.com/tech/weblucene.html

Lucene学习笔记(2)
http://hedong.3322.org/archives/000208.html

posted @ 2006-11-29 11:50 易道 阅读(308) | 评论 (0)编辑 收藏

刘氏养生有十条

刘纯在《短命条辨》里说:“经曰。正气存内。邪不可干。夫正气衰者有三。过饱。气恼。不劳。故尔养生者以十条克之。”

★第一条:

早晨起床第一件事就是喝凉开水。这就是刘纯说的:“晨起胃气最弱。故尔饮凉水以激胃气。此为养生第一。”。也就是说,人刚睡醒的时候胃气最弱,还不能吃东西;只能喝凉开水去刺激胃肠道,使得下丘脑产生饥饿感。

然后再去撒尿、洗脸、锻炼身体、吃早饭。刚开始喝凉开水的时候,不要一次喝得很多;要从几百毫升开始,慢慢增加水量。早晨锻炼身体不要过份用力,否则一天没力气。早饭必需吃,但是不要吃得太多。我每天喝一碗肉汤,泡一个窝头就行了。

现 代医学发现,人类的新陈代谢率在凌晨四时左右是最低的。心跳次数很少,呼吸次数很少,消化液分泌也很少。因此早晨起床,确实不能吃难于消化的食物。但是人 类早晨必需吃东西,否则不能补充上午的能量,而且容易发生胆结石。那么怎样才能快速让胃肠道工作呢?喝水!因为水是最容易被胃肠道吸收的。为什么要喝凉开 水呢?要刺激胃肠道蠕动,使得下丘脑产生饥饿感。临床证明,许多胃病患者,都是因为早晨起床就吃食物而造成的。

有人说,你让小孩子喝凉开水,小孩子岂不拉稀?你让有胃病的人喝凉开水,胃病人岂不胃疼?你让来月经的妇人喝凉开水,妇人岂不腹疼?是的,可能如此。因此要慢慢来,要逐渐培养这个习惯。

但是有许多人早晨一睁眼就吃早餐,甚至在床上吃饭;这是享福吗?不是。也有些人早晨一睁眼就喝茶、喝饮料、甚至喝酒;这是享福吗?不是。还有些人早晨一睁眼就撒尿、洗脸、锻炼身体,这是享福吗?不是。这都是违反了人生规律。

★第二条:

午饭了,你要首先要喝猪蹄熬的保元汤,然后 吃粗粮,以及小菜。这就是刘纯说的:“午时喝保元汤勿食肉。进补而避肉毒。又进粗食小菜以裹肠毒。谓之七分饱。此为养生第二。”。

肉汤可以分别是牛筋汤、猪蹄汤、羊蹄汤、肉皮汤、鲫鱼汤、牛肉汤、排骨汤、鸡汤。粗粮可以分别是玉米、小米、荞麦、大麦、豆类、红薯、芋头等。小菜可以分别是土豆、柿子茭、萝卜、茄子、冬瓜等。

请注意 刘纯在这里提出了三个概念:避肉毒、裹肠毒、七分饱。

什么叫避肉毒?刘纯说:“肉汤不害人。而肉块入腹。变生肉毒。极害人矣。”。也就是说,肉汤直接被人吸收,几乎没有粪便,不会伤害人。但是吃进块状的肉类,在结肠内形成粪便,就会很伤害人。这是真的吗?

现代医学发现,人吃进块状的肉类,最多只能吸收30%,而其余的70%在结肠内形成了粪便;这种肉类的粪便经过发酵, 就会产生许多有害的化学产物;例如:低级脂肪酸、乳酸、丁酸、二氧化碳、尸胺、甲烷、组织胺、色胺、氨气、吲哚、酚类、粪臭素、硫酸脂、硫化氢。这些毒素就会使人发生自体中毒。自体中毒的近期表现就是疲乏烦躁、食不甘味、便秘上火、小病不断、甚至全身骨胳疼痛;而远期表现就是快速衰老而短命。

要知道,警察驱散人群,用的就是粪便的硫化氢;农民制造可燃气体甲烷,就是使用粪便,;厕所的怪味,来自粪便的氨气。你看,这些有害的气体就在你的肚子里。因此尽管你涂脂抹粉,尽管你西服革履,尽管你仪表堂堂,但是你一肚子臭气。你不得病得什么?

因此吃牛排、猪排、炖鸡、炒肉片、烤鸭子、红烧鱼块、鸡蛋等,对于人体是有害的。因为口福之后,就是一肚子恶臭的粪便。要知道,肉类的粪便是极其恶臭的。这些恶臭的毒素被人吸收之后,对于人体的损害是不可估量的。它是人类许多莫名其妙的疾病的不可知的病因。 因此不吃块状的肉类,不制造恶臭的粪便,可以避免许多疾病。

有 人说,既然成年人吃肉块、鱼块、牛奶、鸡蛋就会形成有毒的臭大粪;那么婴儿吃母奶也会形成有毒的臭大粪,但是婴儿吃母奶没有中毒啊?错了。婴儿必需吃母 奶,因为母奶含有婴儿必需的免疫物质。但是婴儿吃母奶之后是拉稀的,而且每天要拉四五次;这就是婴儿的自我保护的本能。倘若婴儿吃母奶之后不拉稀,那么你 的麻烦就大了;因为婴儿不是拒绝吃奶,就是肠套迭、甚至高热不退而昏迷。那么让成年人吃肉块、鱼块、牛奶、鸡蛋之后,也去拉稀行不行?当然可以。不过,这 不是吃饱撑的吗?

有些人说,喝肉汤与吃肉块一样,都会增加胆固醇。错了。喝肉汤的时候已经去掉浮油,因此不含胆固醇。而吃肉块的时候确实很难去掉脂肪,因此极易吃进胆固醇。

但是人类必需补充动物蛋白质,因为小孩子生长身体需要它,而且人类的每天细胞代谢丢失了许多动物蛋白质,需要它去补充;因此只补充植物蛋白质是不行的。 但是肉汤极易被人体直接吸收而不会形成粪便,也就不会使人发生自体中毒。

但是人类必需有粪便,那么什么样的粪便对于人的害处少一些呢?素食!素食不仅不会形成恶臭的粪便,而且还有一个治疗作用,这就是裹肠毒!

什 么叫裹肠毒呢?现代医学发现,人在不吃不喝的状态下,消化道的消化腺照样分泌消化液,诸如:胃要分泌胃液,十二指肠要分泌十二指肠液,胰腺要分泌胰液,肝 脏要分泌胆汁等。这些消化液一方面对于人体是有利的,能够帮助食物消化;另一方面对于人体是有害的,因为这些消化液如果不和食物发生反应,而被人体再吸 收,那么就会产生毒性。

比 如:食道癌病人出现了食道梗阻,如果医生使用静脉高营养,那么尽管营养液配制的十分科学,但是病人却因为消化液再吸收而越来越虚弱。又如:肠梗阻的病人, 如果医生不能及时解除肠梗阻,那么病人就会消化液中毒死掉。再如:发生胆道梗阻的病人,如果医生不能及时消除黄疸,那么病人就会因为胆红素中毒而死掉。为 什么?因为病人把消化液再吸收了,而产生了自体中毒。

有人说,你让我经常饿着肚子,岂不让我把消化液再吸收了?不会!因为你每天不是空腹。

动 物试验也发现这个问题。如果给一条空腹的狗,制造胃瘘收集两升胃液,然后把两升胃液又灌给这条狗。那么这条狗就会中毒而半死不活。这就是人类必需通过消化 道吃饭的道理。那么人类吃什么样的饭,能够充分利用消化液呢?纤维素!因为纤维素能够充分吸附消化液。那么哪些食物含有大量纤维素呢?粗食小菜!

刘完素的重大历史贡献就是反对吃细粮和脂肪,这在当时是独特的见解。时至今日,虽然人类已经承认脂肪是有害的,但是现在绝大多数人依然认为细粮是人类不可缺少的食物。

应当指出,细粮和脂肪为人类提供了高热量,然而人类不需要高热量。因为高热量给人类带来许多疾病,并且使人类的许多疾病难于治疗。

有 热性病的人、有高血脂的人、有糖尿病的人应当吃粗粮;尤其是癌症、肝炎、精神病等属于热性病的人,一定要吃粗粮。这是因为细粮,诸如:大米、糯米、白面等 含有大量的淀粉,能够补充热量。如果这些病人补充太多的热量,那么就会出现发热、疼痛、烦躁等症状。当然,更不能吃糖类。

许多素食主义者反对吃动物蛋白质,认为动物蛋白质含有大量细菌、病毒、寄生虫;如果大量食用,就会生病。但是,如果动物蛋白质充分加热熬汤,就会避免这些问题。其实,动物蛋白质对于人体伤害不是吃不吃的问题,而是吃进之后的粪便问题。因此,如果不让动物蛋白质形成有毒的粪便,那么就避免了伤害。相反,素食主义者吃进大量的淀粉、植物油、葱、姜、蒜、辣椒等热性东西,对于人体照样是有害的。中国人是世界上消耗淀粉、植物油、葱、姜、蒜、辣椒等热性东西,最多的人群;因此也是世界上发病率最高的人群。也就是说,素食主义者提倡的清淡食物,其实不然;恰恰是高热量食物。

许 多家长最苦恼小孩子半夜不睡觉、白天哭闹、经常发烧?为什么?就是因为家长给小孩子吃了太多的细粮。小孩子补充了太多的热量,当然要发泄。拿谁出气,当然 拿家长出气。让你半夜也不睡觉,白天跟着着急,到医院去挂急诊。这一切不可思议的现像,都是因为糊涂父母制造。这就叫因果报应。

小孩子长大了,不能坐下看书,心里好像长了草,贪玩又胡闹;老师一趟一趟请家长。怎么回事?都是你给小孩子吃了很多细粮、脂肪、糖果、巧克力,让他烧包;都是热量太多闹的。

你总闹嗓子疼,经常感冒,不是大疖子就是满脸痤疮。怎么搞的?你装什么糊涂,都是你自己吃了太多的馒头、米饭、面包。

你得了一点儿小病,怎么看也不好;心里十分苦恼。难道人间没有仙丹妙药?其实,你整天吃有害的东西,谁也救不了你。什么是有害的东西?细粮、脂肪、糖果、巧克力。

你上有老,下有小。老的一身病,小的整天闹,你也不舒服;全家不安宁,这是怎么啦?一切都是你让全家胡吃海塞;于是口福之后,全家都在胡折腾。

你想让全家平安无事吗?告诉你一个秘方,这就是吃粗粮。

那么应当吃什么样的粗粮呢? 我最爱吃窝头。窝头是按照一份黄豆粉加四份玉米粉做的,黄豆粉含有植物蛋白。这种饮食的营养是全面的。动物蛋白、植物蛋白、纤维素都包括了。玉米粉补充的纤维素,能够促使大便通畅;据说还补充了微量元素。最好是玉米面和黄豆面,要去当地的大超市购买。两者的比例是:四份玉米面,一份黄豆面。把两者放在盆里混合均匀,用滚开的水去合面,盖上盖儿闷上10分钟。然后做成内空的山状,用大火蒸30分钟。这就是又清香又松软的窝头。也可以把玉米面放在肉汤里做成粥喝。

玉 米粉还有一个鲜为人知的作用,这就是我父亲说的玉米刮油。什么叫玉米刮油呢?用现代语言来说,就是减肥;就是长期吃玉米粉不长肥膘,而且胖子长期吃玉米粉 就要变瘦。这是什么道理呢?给狗做试验发现,狗吃窝头之后,大便里含有许多脂肪;而这些脂肪不是来自喂养的食物。那么这些脂肪是从哪里来的呢?其中的道理 还是说不清楚。然而狗长期吃窝头之后,它真的变瘦了;这就叫玉米刮油。因此我父亲说:“玉米刮油,幸福长寿。”。

玉 米也叫御米,是帝王经常吃的食物。现在有的大饭店、大超市卖的宫廷小窝头,是很昂贵的。过去,天津人爱吃熬鱼贴饽饽,这是一种美味的减肥饭菜;可惜现在吃 的人不多了。不过,如果使用单纯玉米粉蒸窝头,那么蒸出来的窝头是很硬的。可以在玉米粉里掺入黄豆粉,或者花生粉,以及蚕豆粉;如此蒸出来的窝头才是又清 香又松软。可惜很多人不爱吃窝头,甚至有些南方人不知窝头为何物。太遗憾了。

玉 米粉分为两种,一种是黄色的,另一种是白色的;其中,黄色的玉米粉品质较好。购买黄色玉米粉的时候要注意两个问题:第一要用手指捻一捻玉米粉是否加了黄色 染料;如果手指被染成黄色,那么这是假的玉米粉。第二要用舌头尝一尝玉米粉,是否很苦;如果舌头感觉很苦,那么这是发霉的玉米粒磨成的粉末。

中国的农民原来是吃玉米的,因此他们很少发生疾病;但是自从1962年开始,中国的农民改吃大米、小麦以后,他们的各种疾病发生率猛增。据说,日本每年从中国进口大量的玉米;美国每年从墨西哥进口大量的玉米。这些国家的人很聪明,知道吃粗粮有益健康。而中国却要从美国、加拿大进口大量的小麦;这不能不说中国人的饮食方法出了问题。

这套饮食方法是我们家祖传的,几百年来都是如此吃饭。因此刘家不吃淀粉和脂肪。

为了调节口味,要吃一些小菜。什么叫小菜?小菜基本是素菜!例如:土豆炒柿子茭,鱼汤炒萝卜丝、肉汤炖土豆、肉汤烧茄子等。

不错,红烧肉、东坡肘子、鱼香肉丝、米粉肉、白切鸡、烤鸭子、涮羊肉、熬鱼等,的确十分香,也十分诱人。但是这些东西,吃进肚子里,就会变成恶臭的粪便。

但是怎样做素菜,也是一门学问。有些人在素菜里放进许多植物油、葱、姜、蒜、辣椒,这是素菜吗?不是!照样害人。因为如此的素菜,同样会造成血热。因此做素菜要保持原汁原味,用肉汤调味即可。

有 人说,照你这么一说,我们人类不能享受口福啦。是的,我们人类为什么要强调口福?为什么其它动物不强调口福?而且我们人类强调口福的结果是什么呢?是疾 病!我们人类的疾病远远多于其它动物,其原因就在于我们人类太精明而不聪明。大自然有许多东西,然而许多东西是不能随便吃的;例如:植物油、葱、姜、蒜、 辣椒。但是我们人类要自作聪明,要吃它们;甚至在很好的蔬菜里加入它们,这就是画蛇添足了。我去过很多国家,吃过很多异国饭菜,几乎都是强调原汁原味。唯 独中国的饭菜加入极多的佐料。为什么我们中国人特别强调佐料呢?这也是我们中国人特别爱生病的原因。

因 此我们不要吃各种各样的零食,尤其是油炸的、熏烤的、香甜的食物,因为我们的肚子不是垃圾桶。我从小就这样吃饭,因此我不认为随便吃东西是好事。尤其是, 现在食品卫生的状况令人担忧,人们更不能随便吃东西。许多人惊呼:“现在的食品让人不敢吃了。”。那么我告诉你,不乱吃就是了。其实,我的这种饮食方法, 既保护了胃气,又增强了营养,还减少了毒素的摄入和吸收。但是有些人认为我如此吃饭是偏食,是不懂得科学。那么,你说我的饮食结构是不是很科学?不过,我 不反对别人乱吃东西,谁爱吃谁吃;因为吃出病来,就要去医院受罪。因此,我看见许多人喝酒,看见许多人吃冰激凌,看见许多人吃羊肉串;我就说:“很好,医 生不会失业。”。

那么什么叫七分饱呢?你先喝肉汤再吃饭,这个饭就吃不了很多。因此尽管你吃得很饱,而实际上你没有吃很多的饭。这就叫七分饱。

有 人说,你让我先喝肉汤,就会冲淡消化液,那么我的消化能力就会变弱了。不会的!小孩子长到半岁,先吃母奶,后吃饭;他的消化能力变弱了吗?中国广东人、香 港人、澳门人,先喝鸡汤,后吃饭;他们的消化能力变弱了吗?再说,现在许多中外人士都如此吃饭,他们没有说消化能力变弱了。

过 去,外国人骂中国人是东亚病夫;现在,有些外国人骂我们中国人是中国猪。当然这是十分可气的。但是,我们中国人看见市场有什么食物,就吃什么食物;看见市 场有什么药物,就吃什么药物。好像我们中国人的肚子是个无底洞。你说,我们中国人是不是世界上的少见人群。为什么我们中国人如此贪吃呢?

你 看,我们中国人吃饭总是吃几个大碟子,几个大馒头,几碗大米饭;真可怕。尤其在国外吃自助餐,看见我们中国人拿着大盘子装得满满的肉、蛋、面包,而且吃完 了又装一大盘,甚至又吃完了又来一大盘;我感到很羞耻。因为我看到一些外国食客看着他们呆呆地发楞;因为我看到一些餐馆服务员互相笑一下,说:“柴那(china)!柴那(china)!”,甚至伸出了小拇指;我真想走过去,告诉我的同胞少吃一点儿,又怕他冲我瞪眼睛。中国人啊,中国人,为什么不能先喝肉汤,后吃饭呢?当然在国内,没有人嘲笑你,因为大家都是如此吃饭;可是到国外,如此吃饭岂不是猪!

如此吃饭,真的很舒服吗?不舒服!不仅撑得难受,而且撑出病来。因为吃进大量的固体食物,你最多只能消化吸收30%,而其余的70%变成了粪便;而且肉块形成的粪便是有毒的。呜乎,我们中国人要想健康,就一定要遵守吃饭的规矩——先喝肉汤后吃饭,作到七分饱。

总之,你看,古人的养生之道,在吃的方面是否研究得很仔细。这是一种特殊的饮食方法。这种吃饭方法看似很低档,实际上很讲究;也很费钱费时间。你看,肉汤补充了动物蛋白,窝头补充了纤维素,小菜调剂了口味。

在这里,我们不得不佩服刘纯的主张。你看,他让你吃肉,又说吃肉块容易中毒,而让你喝肉汤。你看,他怕你喝肉汤没有粪便,没有粪便也会中毒;又让你吃粗粮小菜去排大便。因此,这种饮食方法造成了刘氏家族的健康无病,也受到了世界上千百万人的推崇。

★第三条:

午 饭之后要散步半小时,然后午睡。这就是刘纯说的:“饭后小憩。以养精神。此为养生第三。”。午睡是非常重要的,因为午饭是一天之内的最重要的补充营养的时 机。而午睡的时候,就减少了其它部位的血液供应;使得胃肠道得到充足的血液供应,去充分吸收食物。但是午睡时间不要太长,有一个小时就可以了。

★第四条:

午睡之后要喝果 汁,这是补充维生素的时候。这就是刘纯说的:“小憩之后喝果汁。以滋血脉。此为养生第四。”。不要图省事买汁喝,要自己动手压榨水果。最安全的好喝的水果汁,是梨和苹果等量压榨而成。为什么要喝汁呢?要补充大量的维生素!那么吃水果岂不是更好吗?是的,如果你每天能够吃3——5斤水果,那么当然可以。

★第五条:

下午要做健身。这就是刘纯说的:“申时。动而汗出。喊叫为乐。此为养生第五。”。每天下午大约16点的时候,是人体新陈代谢率最高的时候,此时锻炼身体不容易受伤。有些人认为活动身体,就叫锻炼身体。错了!不管你采取什么方式锻炼身体,必需全身出汗,必需大声喊叫,只有这样才能强身健体。

我每天下午要在跑步机上慢跑热身锻炼;然后使用弧形腹肌板锻炼腹腰,使用平卧推举器锻炼上肢,使用垂直上蹬机锻炼下肢等负重锻炼;最后使用沙袋打拳进行专科锻炼,而且不停地喊叫。你看这是三步锻炼:热身、负重、专科;这是缺一不可的锻炼方法,已经习惯成自然了。

因为一个人:“老在腿上,死在嘴上。”因此老年人的腿脚锻炼最重要,而腿脚的锻炼要以足弓为主。锻炼足弓的方法是蹦跳,其中做跳绳运动最安全。当然每个人都有自己独特的健身方法,只要坚持都很好。有人说,每天忙极了;哪有时间做健身。告诉你,抽出半个小时就行了。

现在有人愿意练气功、练武术、练健美都很好。但是千万别当哑巴,只有这样才能让清气上升,浊气下降。

★第六条:

不要吃晚饭。这就是刘纯说的:“过午不食。去肥气而养胃气。此为养生第六。”。人不能一天到晚吃得很饱,这样容易生病;因此中医和佛家都有:“过午不食。”的教诲。过午就是过了13点。也正因为如此,我们中国人的传统是不吃晚饭的。事实证明,不吃晚饭不会影响人的健康。反而因为诱发强烈的饥饿感而不容易生病。当然喝一碗保元汤,或者喝一碗粥、或者吃点儿水果也可以。现代人总爱闹病,可能就是因为吃了很饱的晚饭撑的。

什么叫去肥气?俗话说:“马不吃夜草不肥。”。同样的道理,人不吃晚饭也不会肥胖。目前大多数人群太肥胖,据说,在美国大约有60% 的人群是胖子;然而美国人的饭量并不大。这是为什么呢?这是因为美国人爱吃晚饭和夜宵。为什么吃晚饭和夜宵会肥胖呢?因为人在夜里睡觉不消耗热量,因此吃 进去大量的热量就会转化为脂肪。这些脂肪存积在肾囊里,那么肚子就丰满了,然后肚子就越来越大了。当然这些脂肪也分布在身体各个部位,诸如:皮下、血液、 心肌、肝赃等,这造成了人体功能的减退。

那 么什么叫养胃气呢?人不吃晚饭就会饿,其效果与喝开胃汤同功。因此不吃晚饭不吃亏,因为等于你喝了免费的开胃汤。谁如此好心眼,让你喝免费的开胃汤?这就 是大自然看见你不吃晚饭,而赏赐给你的。你不感到快乐吗?紧接着,你饿一会儿就不饿了,你开始自己吃自己了。大肥膘慢慢地消失了,你慢慢地苗条了。别人很 惊奇,问你吃了什么减肥药?你说,天机不可泄漏。

有人说,你刘弘章胡说八道。因为你不干体力活,不知道吃晚饭的重要。错了,因为我从16岁 在清华大学附中住校念高中,直至在北京医学院住校念大学,每天锻炼身体跑一万米,你说累不累?当然累!而且正是长身体的时候,但是我不吃晚饭。老师和同学 都奇怪。现在有些人下班回家,扯开肚皮大吃特吃晚饭。美其名曰:“补充营养。”。其实不然,这叫找病。因为不保持饥饿感,不得病得什么?

一 个人不可吃的太多。七分饱的概念,不仅是每顿饭七分饱,而且整天都是七分饱。然而我们吃的太多,我们总是担心自己饿着,总是担心孩子饿着,总是担心老人饿 着,总是担心病人饿着;我们总是问人家吃饱了没有。然而我们好心办了坏事,因为我们把自己和别人撑出病来;而且浑然不知。

我 们中国人不知道从什么时候吃起了晚饭和夜宵。怪哉!要知道,不吃晚饭,不会把人饿死。但是晚饭吃得多,会把人撑死。这是最基本的养生常识。尤其是小孩子, 如果晚饭吃得很饱,那么极易发热。即便是年青人,如果晚饭吃得很饱,那么极易做恶梦而损害大脑。况且老年人,如果晚饭吃得很饱,那么极易发生猝死。

吃晚饭和夜宵的坏习惯, 造成了中国食品的紧张。一边是农民大量地生产粮食,牧民大量地生产牲畜,果农大量地生产水果,渔民大量地捕捞鱼虾;一边是汽车、火车不停地运输;而另一边呢,是十三亿个无底洞。然而这一切生产运输,都可以减半。因为人类不必吃晚饭。

因此如果不遵守这一条规律,那么就谈不上养生之道。

★第七条:

睡觉之前要烫脚。这就是刘纯说的:“临睡烫脚。温经络以升清气。清气升而不死。此为养生第七。”。一个人,尤其是老年人,容易在睡梦中猝死。其原因有血粘度增高,心律纹乱、呼吸暂停等各种推测;但是往往防不胜防。但是中医强调睡前烫脚,刺激足部的穴位,利用经络的作用是可以预防的。烫脚的水应当是滚开的,先用开水熏脚,然后用热水泡脚;水变温之后再把脚擦干。

★第八条:

一个人必需有宗教信仰。怪哉!养生之道与宗教有什么关系?且听刘纯怎么说。他说:“信佛而通达。通达而知足。知足而不恼。不恼而常乐。常乐而不病。故佛乃上工。此为养生第八。”。

原来 宗 教信仰能够使人快乐;宗教领袖是人类高明的医生。这是真的吗?这是真的!我们随便翻开任何一种宗教的教义,都是人生的百科全书。其内容涉及到自然、人类、 青年、老人、生命、爱情、仁慈、行善、自制、愤怒、憎恨、罪恶、道德、幸福、快乐、心灵、真理、工作、命运、苦难、统治、法律、忏悔、思考、服从、引导、 奉献、信仰、报答、拯救、死亡、祈祷、责任、义务、友谊、财富、理想、心灵、真理、休息、骄傲、谦虚、嫉妒、沉默、名誉、帮助、宽厚、诚信、勇敢、教育、 学问、才能、智慧、愚蠢、家庭、婚姻、正义、战争、和平等各个方面的知识。而这些知识不是老师能够告诉我们的,也不是随便一本书能够告诉我们的。你只有读 了宗教的教义,才感觉人生原来如此,你才能成为一个精神贵族。因此你醒来睁开眼,就会庆幸自己还活着。因此该吃饭了,你会能庆幸自己能够吃上饭;但是要慢慢吃。因此该睡觉了,你会庆幸自己平安渡过一天。

这种发自内心的快乐,与看滑稽戏不同,与听相声不同,与听笑话不同。因为这些节目只是让你一时快乐,过一会儿该烦恼还是烦恼。 因此宗教不是精神鸦片,而是人的精神支柱。没有宗教信仰的人极易发生精神抑郁症,也极易被疾病吓倒;只有信仰宗教才能保持正常的心理状态。

例如许多教义都说:

我不知道我现在做的哪些事是对的,那些事是错的,只有我死的时候才知道这些是非。所以我现在所能做的,就是尽力做好每一件事,然后等待着死。

我不去想是否能够成功。既然选择了远方,便只顾风雨兼程;我不去想身后会不会袭来的寒风冷雨,既然目标是地平线,留给世界的只能是背影 .

我要记住应该记住的,忘记应该忘记的;我要改变能够改变的,接受不能改变的。

也许有些人很可恶,有些人很卑鄙。而当我们设身为他着想的时候,应当知道他比我们还可怜。所以请原谅你见过的人,好人或者坏人。

时间能够冲刷一切。以时间来冲刷感情,时间越长,冲突越淡;仿佛不断稀释的茶水。

如果敌人让你生气,那说明你还没有战胜他的把握   ;如果朋友让你生气,那说明你仍然重视他的友情。

有些事情,我们无法控制它们;因此我们只能控制自己。

死亡教会人的一切,如同考试之后公布的结果;虽然恍然大悟,但为时晚!

男人在结婚之前,觉得适合自己的女人很少;而结婚之后就觉得适合自己的女人很多。
每个人都有潜在的能量,只是很容易 : 被习惯掩盖,被时间迷离,被惰性消磨。

人生短短一百年,不要给自己留下了什么遗憾;想笑就笑,想哭就哭,该爱的时候就去爱,不要压抑自己。

当幻想和现实矛盾时,你总是很痛苦的;要么你被痛苦击倒,要么你把痛苦踩在脚下。

真正的爱情不讲究热闹、不讲究排场、不讲究繁华、更不讲究钱财。

我们确实活得艰难,一方面要承受各种外部的压力,更要面对自己内心的困惑。在苦苦挣扎中,如果有人向你投以理解的目光,你会感到一种生命的暖意,或许仅有短暂的一瞥,就足以使你感奋不已。

后悔是一种耗费精神的情绪。后悔是比损失更大的损失,是比错误更大的错误。所以我们不要后悔。

日出东海落西山,愁也一天,喜也一天;因此遇事不要钻牛角尖,那么人也舒坦,心也舒坦。

⒄生命是平等的,没有什么东西比生命宝贵。

⒅凡是靠力气吃饭的人都是婴儿,因为他们的头脑简单。

⒆这个世界每天都在变化,今天是富人,明天不一定是富人;今天是穷人,明天不一定是穷人。

⒇暴富的财产必将减少;而点滴积存的金钱必然增加。

因此你要想长命百岁,就必需克服气恼的坏毛病而快乐。找谁快乐?去请教宗教人士。世界上的宗教团体很多,比较大的宗教团体是佛教、基督教、伊斯兰教。

★第九条:

性功能正常的人,每个月性交一次就可以了。这就是刘纯说的:“独睡而养精气。精气足而长寿。房事每月一次足矣。此为养生第九。”。

动 物的性交是有季节性的,但是人的性交是随意的。由于每次性交都消耗了巨大的体能,因此造成了人类的疾病增多。娶个老婆要漂亮的,当个小妈伺候着。错了!老 婆应当是能干的,是个参谋长,而不是泄欲器,至于外表是次要的;而且夫妻生活要节制,要按照精满自溢的原则,憋不住再来,不可强行射精。一般应当一个月, 性交一次就可以了。

夫 妻之间一定要同床睡觉吗?不必!古人的床都是单人床。如果不信,请到故宫看一看,就会发现,无论是皇帝,还是后妃,他们睡的床都是单人的。就是到古傢具商 店去买床,你也买不到古双人床;有人说,我能买到古大床!错了,那叫起居床;是古人起床之后吃早点用的床,中间放一个小炕桌;也是招待亲朋用的,类似于现 代的沙发。

那么古人怎样性交呢?男的到女的屋里去!性交之后,男的再回到自己的屋里。皇帝就不必如此了;是被点名的后妃,被太监抬来,性交之后又被抬走。既便是百姓家也是如此分床睡。当然太穷的人家,一间屋子半间炕,全家只能睡在一起了。

分 床睡有什么好处呢?讲卫生!因为人睡着之后,容易不自觉地放屁磨牙打呼噜,甚至是大声说梦话,大声傻笑,有的人还有梦游行为。因此无论是气味,还是声音, 都影响对方的健康。如此一来,白天的我爱你,就变成了黑夜的我害你。然而许多妻子不理解丈夫的分床睡。怎么办呢?你要跟她讲道理,指出互相拥抱而睡是不可 能的,因为睡着了就会分开;而且互相影响睡不好。再说,新婚不如远别,一个月性交一次才有新鲜感。性交应当选择女方月经后的一周之内,这是避孕的安全期。

★第十条:

每个月要清肠一次。这就是刘纯说的:“人欲长生。肠欲常清。逢月圆而清肠。泻污浊而去毒。此为养生第十。”。

结 肠是人的垃圾桶。每个人每天都揣着一个垃圾桶去学习、工作、甚至性交也揣着它。一个人每天排泄粪便,并不能干净彻底地清除粪便。这是因为结肠的袋状结构, 就像一串糖葫芦一样,虽然能够阻止粪便的自由排泻,但是也造成了粪便与肠壁的粘连,而如此就造成了自体中毒和静脉血液回流不畅的现像。因此一个人每月应当 选择一天清肠。届时可以喝20%的2050克甘露醇溶液;也可以用开水沏520克番泻叶喝。

结肠里有脏东西,这是中西医共同的认识。认为定期泻肚子,是清除肠道里脏东西的重要手段。 清肠 之日,不要外出。每次腹泻之后,要清洗肛门。 清肠 之后的一两天,可能大便要减少。这不是便秘,而是结肠里没有粪便。

结 肠里的粪便是肮脏的。我做手术的时候,尽管戴着口罩,尽管手术室充满了消毒水的味道;但是切开病人的结肠,依然是臭气熏天。这种气味,只有在每个月水泻的 时候才能闻到。但是如果病人已经喝了甘露醇,清洁了胃肠道;那么手术切开病人的肠子,就可能没有熏人的味道。可见每个月拉一天肚子,清除结肠道里的脏东 西,防止自体中毒,是非常必要的。更重要的是,人的结肠袋里的粪块,很难在正常排便的时候被清除掉,时间长了就会凝集成粪石。这可能是每月清理结肠的真正 道理。有人说,这是吃饱撑的,没事拉肚子玩。然而 清肠 之后,你就会体验到,一身轻松的美好滋味。粪便是有害的,必需及时地完全地排出;但是我们不能及时地完全地排出,因此每个月 清肠 一天是必要的。那么一个人能不能减少粪便呢?回答是能!如果每天多喝肉汤,多喝果 就能减少粪便的形成。

上述就是从明朝以来,中国流行的刘氏养生十条;它制造了特殊化的人群。

顺口溜记下来就是:

★凉水肉汤吃粗粮, 睡果汁健身房;过午不食去烫脚,念经夫妻要清肠。
posted @ 2006-11-28 16:12 易道 阅读(1390) | 评论 (0)编辑 收藏

⑴无疾而终,中医古称气数已尽。

⑵亚健康,中医古称交病。

⑶慢性萎缩性胃炎,中医古称进食疼。

⑷胆结石,中医古称胆黄。

⑹小儿多动症。中医古称小儿阳盛。

⑺精神抑郁症。中医古称思虑伤脾。

⑻肥胖。中医古称肥人。

慢性支气管炎,是由于支气管壁增厚,而阻止肺泡的痰液排出。 痰喘病的病因=主观原因 + 客观原因 + 诱发条件;其中,主观原因=胃气下降 + 营养不良;客观原因=肺热 + 痰液粘稠;诱发条件=烟雾刺激。痊愈=三分治 + 七分养;其中,七分养=加入沙参、瓜蒌的 [ 开胃汤 ]+ 肉皮冻;三分治= [ 纳气散 ]

⑴慢性呼吸衰竭,中医古称肺痿。

⑵慢性气管炎,中医古称痰喘。

⑶慢性肺心病,中医古称肺水。

⑷支气管哮喘,中医古称气喘。

⑸支气管扩张,中医古称肺痈。

疮疖的病因=主观原因+客观原因+诱发条件;其中,主观原因=胃气下降+营养不良;客观原因=内热+便秘;诱发条件=辛辣发物。痊愈=三分治+七分养;其中,七分养=加入杭白菊、草决明的[开胃汤]+鱼汤;三分治=[平疮散]

⑴慢性扁桃腺炎反复发作,中医古称乳蛾。

⑵慢性阑尾炎反复发作,中医古称肠痈。

⑶急性胆囊炎,中医古称胆热。

⑷急性胰腺炎,中医古称脾心病。

⑸女孩子性早熟,中医古称经早。

 

冠心病是由于血液粘稠,而形成了心脏的冠状动脉血栓。 昡晕病的病因=主观原因 + 客观原因 + 诱发条件;其中,主观原因=胃气下降 + 营养不良;客观原因=阴虚 + 阳亢;诱发条件=吃肥肉。痊愈= 三分治 + 七分养;其中,七分养=加入沙参、川芎的 [ 开胃汤 ]+ 肉皮冻;三分治= [ 通玄散 ]

⑴原发性高血压病,中医古称眩晕。

⑵脑血栓,中医古称偏枯。

⑶冠心病,中医古称胸痹。

⑷震颤麻痹,中医古称振掉。

 

什么叫衰老?衰老的过程就是慢性脱水! 衰老的最基本的特征是皮肤皱纹。皮肤皱纹是皮肤的生物学脱水,是体内水份的减少,是皮肤的木乃伊。因此不能忽视皮肤皱纹。这是身体发出的警告:你开始衰老了, 内脏也同时发生了萎缩

什么叫新的生活方式呢?每天就从起床开始说起吧:

①卯时起床,喝一升凉开水。

②活动一下身体,吃早餐。早餐以稀饭面条为主。

③辰时办公。

④午时吃午饭。午饭先喝牛筋汤,或者牛肉汤,或者鲤鱼汤;然后吃瘦肉、排骨、鱼类;搭配一点粗粮蔬菜。

⑤饭后午睡;午睡后,喝水果汁;然后负重锻炼身体。

⑥晚餐喝稀饭面条。如此一天的吃饭才能作到七分饱。

⑦临睡前用热水烫脚;和妻妾一个月性交一次。

⑧临睡前吃一丸[地黄丸]

⑨白天遇事不生气不着急。

⑩坚持春捂秋冻的习惯。

古人用石磨碾碎粮食。有些含纤维素少的粮食能够碾成细粉,叫作细粮;比如,小麦、糯米、稻米。有些含纤维素很多的粮食只能碾成粗粉,叫作粗粮;比如,玉米、高粮、荞麦、黄豆、小米。 在所有的蔬菜水果中,西红柿的维生素含量比较高,但是一定要生吃。其它能够榨汁的蔬菜水果,有红萝卜、青萝卜、白萝卜、胡萝卜、芹菜、菠菜、白菜、黄瓜、百合、马齿莧、梨子、苹果、桔子、弥猴桃、西瓜、柑子、橙子、柠檬、桃子、樱桃、荔枝、菠箩、荸荠、草葿等。

亚健康的原因=主观原因 + 客观原因 + 诱发条件;其中,主观原因=胃气下降 + 营养不良;客观原因=阴精亏虚;诱发条件=生活失检。养生之道= 三分治 + 七分养;其中,七分养=加入沙参、草决明的 [ 开胃汤 ]+ [ 保元汤 ] ;三分治= [ 养正散 ]

posted @ 2006-11-28 16:11 易道 阅读(597) | 评论 (0)编辑 收藏

     摘要: 肌无力的原因,是肌肉的微血管里有微小的血栓。 肌无力的病因=主观原因 + 客观原因 + 诱发条件;其中,主观原因=胃气下降 ...  阅读全文
posted @ 2006-11-28 16:10 易道 阅读(967) | 评论 (0)编辑 收藏

刘完素观点:“人乃纯阳之体。而油脂细粮乃生热之物。故健者食之病也。病者食之甚也。”也就是说,人类不要吃入高脂肪、高淀粉的食物。这个观点为后世的养生之道奠定了基础。遗训:“但做好事。莫问前程。”

刘纯总结出一套预防疾病的养生十条,和治疗疾病的生饥、食疗、慎用药的三分治七分养方法;使得后世受益无穷。他的遗训:“人无胃气不治。药不亲尝不发。”以及“宁可饿死。不可毒死。宁可傻死。不可气死。宁可累死。不可闲死。”

那么美国人怎么管理中医,或者自然医学呢?很简单,我们中国人到了美国,不是开个饭馆,就是开个自然诊所。你到律师楼交 70 美元,办个自然诊所的注册手续就行了;然后你就自己配药,卖给你的病人。你的医术好,就会一传十,十传百,于是生意兴隆。而美国的西医也乐得把病人推给你,省得给自己找麻烦。但是如果你把病人治坏了,那么就会惹来官司;此外没有任何管理部门找你的麻烦。

那么中国医疗怎样再变化呢?参考美国的医疗方式,可以这样考虑:

①实行全国人民公费体检、防疫、诊断、手术、抢救;按照每人每年平均200元拨款。不过是2600亿元;只是占全国税收的10%左右。

②乡镇、街道医院负责公费的每年一次例行体检。

③传染病医院负责公费防疫。

④区县级以上医院负责公费诊断、手术、抢救。

⑤以上医院医护人员的工资由国家支付,实行医疗费节约归医院所有;医院再把这些节约费用发给个人。

⑥慢性病的治疗归私人医院、诊所负责,病人要自己掏腰包。

⑦禁止各种医疗方法、各种药物的宣传广告。

⑧鼓励各个医院、诊所、药舗制造内部制剂。

⑨允许各个医院兴办健身房、饭店、旅店;以付养医。

⑩把地方卫生局设在医院,把地方防疫站设在传染病医院。

一个医生的最高奖牌是什么呢? 联合国世界名医奖! 这是联合国世界和平基金会,为了奖励为人类健康做出贡献的医生设立的。作为一个中医,最高奖牌是 联合国世界自然医学奖 。这是联合国世界和平基金会,为了奖励为人类健康做出贡献的自然医学医生设立的。

什么叫辨证施治呢?例如,所有的感冒病人都属于风热袭肺,因此都要始终按照清热宣肺的主方去治疗。但是这个病人痰多,就要在主方上临时加点化痰药;那个病人咳血,就要在主方上临时加点止血药;还有的病人气喘,就要在主方上临时加点止喘药。但是临时加药是次要的,而且不能和主方冲突。这就叫辨证施治。可是今天看见病人痰多,就放弃了清热宣肺的主方,改用滋阴化痰的方法;明天看见病人咳血,就放弃了清热宣肺的主方,改用补血止血的方法;后天看见病人气喘,就放弃了清热宣肺的主方,改用止咳定喘的方法;或者主方是止血,可是加入了活血药;主方是滋阴,可是加入了利尿药;主方是清热,可是加入了补阳药;那么这就不叫辨证施治,而是叫对症治疗了。

有人认为癌症、尿毒症、艾滋病等疾病是最可怕的。错了!最可怕的疾病是顽固性厌食症。中医强调 [ 有胃气则生。无胃气则死。 ] 认为胃气就是人体的元气;损害了胃气就是死路一条。 这是中医许多治则中的最基本的一条原则。那么什么是胃气呢?刘纯说:“胃气者。知饥也。”也就是说,一个人有了饥饿感,吃饭才能被消化吸收;否则,吃饭就是酒肉穿肠过。 胃气就是饥饿感!在 [ 短命条辨 ] 一书中,刘纯指出,人体的最大弱点,就是消化吸收能力很差。这也是人体最容易被伤害的功能;因此保持旺盛的饥饿感是求生的先决条件。一个人没有饥饿感就要生病了;一个病人没有饥饿感就要死了。

[ 开胃汤 ] 的主药广木香,是一种行气开胃的草药。木香有青木香、广木香、云木香、川木香之分;其中青木香使人腹泄和憋气,不能用于刺激下丘脑;云木香、川木香的气味浓郁,味道不好;只有广木香气味淡薄比较好。但是广木香容易发霉,发霉的广木香熬汤之后,口味很苦,而苦寒伤胃;因此在购买的时候应当注意是不是发霉。如果使用其它的行气药物代替广木香是不行的:比如,青皮和枳实,是破气药物,在刺激下丘脑的同时,会造成支气管痉挛;又如,陈皮是行气化痰药物,在刺激下丘脑的同时,会造成癌块的破潰、脓肿的多脓,潰疡的扩大;再如,香附是行气活血药物,在刺激下丘脑的同时,会造成癌块的转移、脓肿的疼痛、潰疡的出血。 [ 开胃汤] 要频饮,就是为了避免一次顿服而出现胃强脾弱的现像。不过,即便是频饮,有些人也会出现轻微的胃强脾弱,届时一定要吃容易消化的半流食,才能克服。

[ 开胃汤] 的另一种草药是消食开胃的生北山楂果,药铺里卖的是干燥的生北山楂片,其大部分消化酶已经被干燥破坏;最好到水果店去买新鲜的山楂果。但是有些地区和季节,买不到新鲜的山楂果,那么只好去买干燥的北山楂片。由于干燥的北山楂片的大部分消化酶已经被干燥破坏,因此干燥的北山楂片和新鲜的山楂果,两者的用量应当是相同的。如果使用其它的消食药物代替生的北山楂是不行的,比如,炒山楂和焦山楂,是止泻药物。又如,南山楂,去了果皮就是果核,非常酸,很刺激胃;只能制做炒山楂和焦山楂的原料,是不能煮汤喝的。

肿块没有切除,为什么消失了呢?中医叫 [ 气化 ] ,西医叫吸收。病理生理学解释,这叫吞噬细胞的胞饮作用。也就是说, [ 控岩散 ] 把癌细胞变成了坏死组织,而坏死组织被吞噬细胞吃掉了。而刺激吞噬细胞胃口大开的因素,是 [ 开胃汤 ] ,是病人的饥饿感。如果没有强烈的饥饿感,那么肿块就不会消失。这就是必需坚持喝 [ 开胃汤 ] 的原因。这也是三分治七分养,疗效好坏的关键。 一个人一天只能午饭吃饱,在早餐和晚餐的时候要少吃;而在其它的时间,即便是饿了,也不能吃饭,这就叫保持胃气——饥饿感。为什么要自己饿着自己呢?这是因为,下丘脑发出饥饿感信号之后,除了能够增强胃肠的消化腺分泌之外,还有另外一个重要作用,这就是促进了坏死组织的吸收。婴儿一天要吃六次奶,此外饿了要喝果汁,就不会产生食火。小孩子一天要吃三次饭,此外饿了要喝果汁,就很少闹病。成年人一天要吃一次午饭,早晚要少吃饭,此外饿了要喝果汁,就不会发生离奇古怪的疾病。人过七十岁,要一天要喝六次肉汤做的半流食,此外饿了要喝果汁,就不会发生猝死。然而许多人不听这一套,饿了就吃,这就叫为嘴伤身。

那么怎样检查吞噬细胞的 数量是多少呢?

很简单,检查你的白血球数量就行了。一个人发生了炎症,白血球的数量就增多了;这是因为骨髓生成白血球的数量,并且排放入血的数量都增多了。那么骨髓靠什么生成白血球呢?靠蛋白质!因此营养不良的炎症病人,由于白血球数量不多,不能吞噬病原体,其炎症过程十分危重,极易发生败血症而死亡。因此白血球数量很少不是好事,这说明一个人的非特异性免疫力很低了,不能吞噬病原体。如果给人吃素食,或者给病人吃有毒的中药,以及给病人放疗化疗;那么人体的很多白血球的数量是很少的,其免疫力就会很低;别人打个嚏喷,他就会感冒;也不会把肿块吃掉。

但是白血球的数量极多也不是一件好事,血癌病人的白血球数量是极多的。这是因为骨髓生成变质白血球的数量,并且排放入血的数量都增多了。这种变质的白血球没有吞噬能力,只是大量地消耗蛋白质;因此血癌病人出现了严重的低蛋白血症。

有些人的营养状态良好,检查白血球 数量也是正常的;可是血肿,或者脓包,以及癌块的吸收速度很慢。这是为什么呢?这是因为吞噬细胞的活性很低!

那么,如何检查吞噬细胞的活性高低 呢?

当然最可靠的是饥饿感。自己如何根据客观指征,去判断自己有无胃气呢?对着镜子看舌头。如果舌质淡红,舌头上有一层薄薄的白苔,那么这就是有胃气。反过来,如果舌质很苍白,而且没有任何舌苔,那么就是很危险了。

另外,家属怎样判断病人有无饥饿感呢?如果你看见他像饿狼一样吃饭,这就叫有饥饿感,那么他就死不了。妻子怎样判断丈夫有无饥饿感呢?如果妳看见他皮肤长了一个毛囊炎,在七天之内化脓了,就说明吞噬细胞的活性很高;这就叫有饥饿感,那么他就死不了。检查血液,要抽血做E-玫瑰花结形成细胞试验(E-RFC),如果正常值在40%——70%之间,这就叫有饥饿感,那么自己就死不了。

需要注意的是,在以后的临床使用中发现:

[ 开胃汤] 一次顿服是不舒服的,必需作为药引子少量多次地饮用;无论是饭前还是饭后,都要每次饮用100毫升左右。

②必需根据具体病情,在 [ 开胃汤] 加入其它的药物,才能有针对性。

③山楂果的市场具有季节性。如果买不到新鲜的山楂果,可以买山楂片。但是山楂片是晒干的果实,其大部分消化酶已经被破坏。因此买山楂片与山楂果的剂量,应当是一样的。

[ 开胃汤] 既然是开胃的,就不能苦寒伤胃,也不能气味很大。如果病人嫌有药味,可以加入小红枣10个矫味。要把红枣切开,和其它的药材一起泡一起煮。

[ 开胃汤] 是自己写好处方,在当地中药舖购买,然后自己动手熬水喝。不要请药房代煎;因为药房煎出的药汤很少,不符合药引子的要求。 [ 开胃汤] 熬好了,家属要尝一尝,应当是酸的,略有苦味;如果很苦,就是买了发霉的药材。千万不要给病人喝,应当倒掉;重新购买重新熬。中国大陆的同仁堂药材质量好。国外有华人街的地方就有中药舖,药材质量都很好。

⑥一个胃气不好的人,在升提胃气的过程中,不要把 [ 开胃汤] 研磨成细粉口服,因为不容易被吸收,所以必需熬汤喝。 

[开胃汤]的时候,可能会出现一些现像,也要注意。  

①有些病人喝水都吐,怎么办?要给予胃肠道封闭。去西药房买2%的普鲁卡因注射液;取两支打开放在杯子里,加入10毫升的凉开水;喝下去。过10分钟再喝 [ 开胃汤] 。如果还吐,再喝普鲁卡因。直至不吐,再停用普鲁卡因。

②有些病人喝了 [ 开胃汤] 以后,胃返酸,怎么办?可以把生山楂剂量减半。

③有些病人喝了 [ 开胃汤] 以后,肚子饿;但是吃了东西,肚子胀。这叫胃强脾弱,不要吃普食。要每天喝六次肉汤,然后逐渐改为半流食,再逐渐改为普食。

[ 开胃汤] 的付作用是什么呢?喝了放臭屁!因此大总统、大明星、外交官、包括谈恋爱的年青人,千万要注意。另外,结肠造瘘以后,使用粪袋的病人也要注意。怎样克服这个付作用?只能少出门。病人喝了 [ 开胃汤] 以后,放屁很多很臭,拉屎也很臭,甚至撒尿的臊气味很大,出汗也有臭味,这是为什么呢?这是因为食物被充分消化吸收之后,产生了许多代谢废物。这些废物包括吲哚、硫化氢、氨气等臭东西。这是好事,这叫下气通。如果消化不好,酒肉穿肠过,那么拉屎放屁就没有臭味。如果拉屎放屁不但不臭,反而还有檀香味;那么就麻烦了,这是肝癌的先兆。

posted @ 2006-11-16 11:15 易道 阅读(703) | 评论 (0)编辑 收藏

     摘要: [ 控岩散]口服说明书 处方来源 : 明朝永乐太医刘纯[药治通法]第十条:乳岩治法。 ...  阅读全文
posted @ 2006-11-16 11:02 易道 阅读(3079) | 评论 (18)编辑 收藏

     摘要: [ 苏厥散]口服说明书 处方来源:明朝永乐太医刘纯[药治通法]第四条:虚胖治法。 主要成份:红参、虫草、肉桂、灵芝、...  阅读全文
posted @ 2006-11-16 11:01 易道 阅读(4005) | 评论 (11)编辑 收藏

     摘要: 刘家药物 替代药物举例 ...  阅读全文
posted @ 2006-11-16 10:59 易道 阅读(1471) | 评论 (5)编辑 收藏

     摘要: 证候群 病名 ...  阅读全文
posted @ 2006-11-16 10:57 易道 阅读(1456) | 评论 (1)编辑 收藏

SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具,这样就可以在没有硬件条件下来进行嵌入式系统的开发。

以下操作均在Fedora Core 1.0里通过。

Skyeye项目资源列表
http://gro.clinux.org/projects/skyeye/


文档摘要:
1、什么是SkyEye?
2、SkyEye可以做什么事情?
3、安装SkyEye
4、安装arm-elf交叉编译器
5、测试你的arm-elf-gcc编译器
6、执行你的hello程序
7、一个应用程序的开发实例
8、编译并运行uClinux-dist-20030909.tar.gz
9、加入网络功能
10、安装完成SkyEye后,下一步将做什么?


1、什么是SkyEye?

SkyEye是开源软件的一个项目,SkyEye的目标是在Linux和Windows操作系统里提供一个完全的仿真环境。SkyEye仿真环境相当于一个嵌入式计

算机系统,你可以在SkyEye里运行一些嵌入式Linux操作系统,如ARMLinux,uClinux,uc/OS-II(ucos-ii)等,并能分析和调试它们的源代码。

如果你想知道关于SkyEye和嵌入式系统更详细的信息,请访问下面的站点:
www.SkyEye.org
http://www.skyeye.org/index_cn.html

通过SkyEye能仿真下面的硬件:
CPU核心:ARM7TDMI, ARM720T, ARM9, StrongARM, XScale
CPU: Atmel AT91/X40, Cirrus CIRRUS LOGIC EP7312, Intel SA1100/SA1110, Intel XScale PXA 250/255, CS89712, samsung 4510B,

samsung 44B0(还不全)
内存: RAM, ROM, Flash
周边设备: Timer, UART, ne2k网络芯片, LCD, 触摸屏等

目前能在SkyEye上运行下面的操作系统和系统软件:
uC/OSII-2.5.x(支持网络)
uClinux(基于Linux2.4.x内核, 支持网络)
ARM Linux 2.4.x/2.6.x
lwIP on uC/OSII
基于uC/OSII, uClinux, ARM Linux的应用程序


2.SkyEye可以做什么事情?
1. 通过SkyEye可以帮助促进嵌入式系统的学习,在不需要额外硬件的情况下学习和分析uclinux操作系统和其它嵌入式操作系统,如ucosII等


2. SkyEye可用于嵌入式系统的教学。
3. 希望通过skyeye促进操作系统的研究,如ucosII,uclinux+RTAI,uclinux2.5.x等。
4. 可以基于SkyEye进行仿真特定硬件模块的研究。
5. SkyEye可以作为嵌入式集成开发环境开发嵌入式系统(当然需要对SkyEye做大量的工作)。
注:引自陈渝《SkyEye Project FAQ》


3、安装SkyEye

http://gro.clinux.org/projects/skyeye/下载skyeye-0.7.0.tar.bz2包:

tar jxvf skyeye-v0.7.0.tar.bz2

进入解压后的skyeye目录,如果SkyEye的版本低于0.6.0,则运行下面的命令:

./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest

如果SkyEye的版本高于0.6.0,则运行下面的命令:

./configure --target=arm-elf --prefix=/usr/local

接下来执行:

make
make install

安装完成后执行skyeye

注意:
a.如果你使用的是Mandrake Linux发行版,那么你在编译SkyEye时遇到错误,并且错误与readline, ncurse, termcap等有关,你可以试试下面

的方法:

ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h

接着再make和make install看能否成功!
b.如果你的Linux发行版是Debian Linux,那么不要使用gcc 2.95或是gcc 3.0,请使用gcc 3.2+
c.gcc的版本要在2.96或以上
d.如果SkyEye的版本大于0.6.0,那么使用LCD仿真需要在Linux系统里安装GTK软件。


4、安装arm-elf交叉编译器

下载arm-elf-tools-20030314.sh
ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm
或到
ftp://166.111.8.229/OS/Embeded

执行:
chmod a+x arm-elf-tools-20030314.sh
然后:
./arm-elf-tools-20030314.sh

ls /usr/local/bin/

你应能看到以arm-elf开头的可执行文件,其中arm-elf-gcc就是用来编译你目标平台的编译器的,当然还有一些小工具,后面将一一讲来。


5、测试你的arm-elf-gcc编译器

先写一个小程序hello.c
PHP 代码:
#include <stdio.h>

int main(void)
{
    
int i;

    for(
i = 0; i < 6; i++){

        
printf("i = %d  ",i);

        
printf("Hello, embedded linux!\n");
    }

    return
0;
}
然后执行:

arm-elf-gcc -Wl,-elf2flt -o hello hello.c

-elf2flt参数是将elf文件格式转为flat文件格式,这个工具是在你安装交叉编译器产生的。

或者你可以写个Makefile文件,执行:

make

这里是我的Makefile文件,仅供参考:
PHP 代码:
# begin

CC = arm-elf-gcc

CFLAGS
= -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g
LDFLAGS
= -Wl,-elf2flt

LIBS
=
OBJS = hello.o

all
:    hello

hello
:  $(OBJS)
        $(
CC) $(CFLAGS) $(LDFLAGS) -o hello $(OBJS) $(LIBS)

clean:
        
rm -rf *.o *.elf *.gdb hello

# end
如果编译通过,就会产生hello可执行文件。用下面的命令:

file hello

你会发现,它是BFLT(binary FLAT),你目标平台所支持的文件格式。


6、执行你的hello程序

这里,我们将借助genromfs这个小工具来完成测试,这个工具就是你在安装交叉编译器时产生的,你可以直接使用它。

http://gro.clinux.org/projects/skyey...-1.0.4.tar.bz2包:

tar jxvf skyeye-binary-testutils-1.0.4.tar.bz2

cd testsuits/at91/uclinux2(当然你还可以用别的)

mkdir romfs(建一个目录,后面用)

mount -o loop boot.rom /mnt/xxx

cp -r /mnt/xxx/* romfs

另外,把你编译好的可执行程序拷贝到/romfs/bin目录里,这里就是hello了!

genromfs -f boot.rom -d romfs/

注:可以用genromfs -h来获得帮助!

OK!执行下面的命令:

skyeye linux

(skyeye)target sim

(skyeye)load

(skyeye)run

kernel start.....

很熟悉了吧。。。

cd /bin

hello

可以看到结果了吗?

其实到了这一步,你就可以开发自己的程序了!


7、一个应用程序的开发实例

下面介绍的程序主要是完成一个网络应用,网络应用的标准模型是客户机-服务器模型,它的主要执行过程如下:
(1)系统启动服务器执行。服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求;
(2)在网络的某台机器上,用户执行客户机程序;
(3)客户机进程与服务器进程建立一条连接;
(4)连接建立之后,客户机通过网络向服务器发出请求,请求某种服务;
(5)服务器接收到客户机请求后,根据客户机请求的内容进行相应的处理,然后将处理结果返回;
(6)服务器断开与客户机的连接,继续睡眠,等待其他客户机的请求;

Linux系统中的很多服务器是在系统初启时启动的,如时间服务器、打印服务器、文件传输服务器和电子邮件服务器等。大多数时间这些服务器

进程处于睡眠状态,等待客户机的请求。

下面这两个客户机-服务器程序比较简单,主要是对网络客户机-服务器模型的实际运行有大致印象。这个客户机-服务器的操作过程非常简单:

客户机与服务器建立连接之后,服务器向客户机返回一条消息。

服务器程序的源代码如下:
PHP 代码:
/* tcpserver.c */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define WAITBUF 10

int main(int argc, char *argv[])
{
    
int sockfd, new_fd;
    
struct sockaddr_in server_addr;
    
struct sockaddr_in client_addr;
    
unsigned int sin_size, portnumber;
    
char hello[]="Hello! Socket communication world!\n";

    if(
argc != 2)
    {
        
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
        exit(
1);
    }

    if((
portnumber = atoi(argv[1])) < 0)
    {
        
fprintf(stderr, "Usage: %s portnumber error\a\n", argv[0]);
    }

    if((
sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        
fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
        exit(
1);
    }

    
bzero(&server_addr, sizeof(struct sockaddr_in));
    
server_addr.sin_family = AF_INET;

    
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
server_addr.sin_port = portnumber;

    if(
bind(sockfd,(struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
    {
        
fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
        exit(
1);
    }

    if(
listen(sockfd, WAITBUF) == -1)
    {
        
fprintf(stderr, "Listen error:%s\n\a", strerror(errno));
        exit(
1);
    }

    while(
1)
    {
        
sin_size = sizeof(struct sockaddr_in);
        if((
new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -1)
        {
            
fprintf( stderr, "Accept error:%s\n\a", strerror(errno));
            exit(
1);
        }
        
fprintf(stderr, "Server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
        if(
send(new_fd, hello, strlen(hello), 0) == -1)
        {
            
fprintf(stderr, "Write Error:%s\n", strerror(errno));
            exit(
1);
        }

        
close(new_fd);
    }
    
close(sockfd);
    exit(
0);
}

给服务器程序写一个Makefile文件,如下:
PHP 代码:
# start

CC = arm-elf-gcc

CFLAGS
= -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g
LDFLAGS
= -Wl,-elf2flt

LIBS
=
OBJS = tcpserver.o

all
:    tcpserver

tcpser
:  $(OBJS)
    $(
CC) $(CFLAGS) $(LDFLAGS) -o tcpserver $(OBJS) $(LIBS)

clean:
    
rm -rf *.o *.elf *.gdb hello

# end

客户机程序的源代码如下:
PHP 代码:
/* tcpclient.c */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define RECVBUFSIZE 1024

int main(int argc, char *argv[])
{
    
int sockfd;
    
char buffer[RECVBUFSIZE];
    
struct sockaddr_in server_addr;
    
int portnumber, nbytes;
    
    if(
argc != 3)
    {
        
fprintf(stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
        exit(
1);
    }

    if((
portnumber=atoi(argv[2])) < 0)
    {
        
fprintf(stderr,"Usage:%s hostname portnumber\a\n", argv[0]);
        exit(
1);
    }
    
    if((
sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        
fprintf(stderr, "Socket Error:%s\a\n", strerror(errno));
        exit(
1);
    }
    
    
bzero(&server_addr, sizeof(server_addr));
    
server_addr.sin_family = AF_INET;
    
server_addr.sin_port = portnumber;
    
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
    
    if(
connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
    {
        
fprintf(stderr, "Connect Error:%s\a\n", strerror(errno));
        exit(
1);
    }
    
    if((
nbytes = recv(sockfd, buffer, RECVBUFSIZE, 0)) == -1)
    {
        
fprintf(stderr, "Read Error:%s\n", strerror(errno));
        exit(
1);
    }
    
buffer[nbytes]='\0';
    
printf("I have received:%s\n", buffer );
    
close(sockfd);
    exit(
0);
}

最后,skyeye-binary-testutils-1.1.0.tar.bz2/at91x40/uclinux1包里提取boot.rom,用步聚6中的方法,把tcpserver程序放在boot.rom的

bin目录中

在目标板上运行tcpserver 2000

在主机上运行./tcpclient 10.0.0.2 2000

看看结果!

程序的源码的注释因篇幅不在这给出,大家可以参考一些Linux网络编程的书籍,我也会在我的主页上更新一些资料,有需要的朋友可以去下载




8、编译并运行uClinux-dist-20030909.tar.gz

ftp://166.111.68.183/pub/embed/uclinux/soft/
或到ftp://166.111.8.229/OS/Embeded/uclinux/pub/uClinux/dist下载
uClinux-dist-20030909.tar.gz

假设把它下载到/usr/src/目录下,然后依次执行下面的命令:

tar zxvf uClinux-dist-20030909.tar.gz
cd uClinux-dist/

在图形方式下可用命令make xconfig

在命令行方式下用命令make menuconfig

vendor/product中选择GDB/ARMulator
kernel版本选择2.4
然后save and exit

运行下面这两条命:
make dep
make

此时在/usr/src/uClinux-dist/linux-2.4.x目录下会生成可执行文件linux
在/usr/src/uClinux-dist/images/会生成romfs.img等文件

在uClinux-dist目录下建立仿真AT91的skyeye配置文件skyeye.conf,内容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000


这个时候就可以用skyeye来调试运行kernel了,在/usr/src/uClinux-dist执行如下命令:

skyeye linux-2.4.x/linux

(skyeye)target sim

(skyeye)load

(skyeye)run

kernel start.....

注意:
要在skyeye.conf所在目录下执行skyeye linux-2.4.x/linux


9、加入网络功能
a.用root用户进行操作。
b.你要看你的/lib/modules/'uname -r'/kernel/drivers/net/目录里有没有tun.o
如果没有的话你就需要编译你的linux内核来获得tun.o了。
c.(1)运行tun设备模块:

#insmod /lib/modules/'uname -r'/kernel/drivers/net/tun.o

如果你没有该设备,那你就要用下面的命令来创建它:

#mkdir /dev/net
#mknod /dev/net/tun c 10 200

(2)运行vnet(虚拟集线器)设备模块(这一步不是必需的):
获取vnet的源码,然后创建设备:

#mknod /dev/net/vnet c 10 201
#chmod 666 /dev/net/vnet

创建vnet.o
#make vnet.o

插入模块vnet.o
#insmod vnet.o

进入test目录,用test来测度vnet.o
#cd test
#make
#./testvnet1

d.配置skyeye.conf文件

cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
# format: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=10.0.0.1


下面将对上面的一些参数作下说明:
state=on/off意思是仿真的NIC(网络接口板)是有线的还是无线的;
mac=仿真适配器的MAC地址;
ethmod=tuntap/vnet在主机环境里使用的虚拟设备;
hostip=意思是主机环境与keyeye交互用的IP
格式: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd

For example:
#set nic info state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=10.0.0.1

net: state=on, mac=0:4:3:2:1:f, ethmod=vnet, hostip=10.0.0.1

注意:
如果你想在同一时刻运行两个或更多的skyeye,那么请为每一个skyeye使用不同的skyeye.conf

e.运行skyeye linux-2.4.x/linux

10、安装完成SkyEye后,下一步将做什么?

1、对于嵌入式操作系统的初学者和入门者和入门的学生而言,他们可以先看一些有关操作系统和嵌入式操作系统方面的教材和书籍,如与

uC/OS、Minix、uClinux、Linux相关的书籍等。然后可以在Skyeye上开发一些简单的应用程序例子(如进程间通信、进程优先级、死锁情况、网

络应用等),对某些操作系统功能(如进程调度、内存管理、网络子系统、文件子系统等)进行简单的修改和扩展,并通过Skyeye进行运行和调试

,看看会发生什么情况。

2、对于有一定经验的软件工程师而言,在SkyEye上完成一定的应用系统原型开发是值得一做的事情。比如移植或开发一个文件子系统或网络子

系统到一个特定的操作系统中,相信比在一个真实的开发板上开发要容易一些。在Skyeye上进行一些操作系统的移植和开发(如移植RTLinux、

RTAI等其它操作系统到Skyeye上)也是很有挑战性的工作。

3、对于硬件工程师而言,对Skyeye进行扩充,设计新的硬件仿真(如USB、IDE硬盘等)使得Skyeye的硬件仿真功能更加强大,支持更多功能的软

件,是很有意义的事情。

参考:
SkyEye项目站点里的一篇中文文档;
陈渝《SkyEye Project FAQ》;
skyeye-0.7.0中的README文档。

后记:
为了让大家能快速上手,进行实际的开发工作,我赶凑了一篇文档,很粗糙。但我坚信随着更多的有经验的人的加入;随着我们自己水平的提

高,一定会出现更多、更好的文章来。就让我们快点行动起来吧!

最后,我再次建议大家看一下《嵌入式Linux技术与应用》这本书。

可以到http://www.skyeye.org/document.htm或是
ftp://166.111.68.183/pub/embed/skyeye/document/或是
http://www.huihoo.org/mirrors/skyeye/
下载文档,可以获得更多有关skyeye和嵌入式Linux开发的知识和经验。
posted @ 2006-11-10 13:38 易道 阅读(467) | 评论 (0)编辑 收藏

仅列出标题
共6页: 1 2 3 4 5 6