关于作者

用户名:tuenhai
笔名:tuenhai
地区: kingdom
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



关注博客

本站统计

访问统计:
文章个数:67
评论个数:23
留言条数:6




Powered by BlogDriver 2.1

屠恩海's思想家园

 

与屠恩海联系: Mail: tuenhai#gmail.com 网址:www.tuenhai.com 屠恩海的关键词: 30不惑, 自负, 写博是为了提高

文章

常用网址  (作者置顶)

中医

 大医精诚 民间中医 医药论坛 中医名家 伤寒论坛 汉唐中医  中医在线  向天清吧  百草医学

- 作者: tuenhai 2006年02月19日, 星期日 09:03  回复(0) |  引用(0) 加入博采

有了蛀牙怎么办——中医如何防止蛀牙
摘要:有了蛀牙怎么办——中医如何防止蛀牙 查看全文

- 作者: tuenhai 2006年07月13日, 星期四 11:19  回复(0) |  引用(0) 加入博采

分形理论与干支语言学
摘要:分形理论与干支语言学 查看全文

- 作者: tuenhai 2006年07月12日, 星期三 06:52  回复(0) |  引用(0) 加入博采

“子不语怪力乱神”的两重境界
摘要:“子不语怪力乱神”的两重境界 查看全文

- 作者: tuenhai 2006年07月8日, 星期六 12:47  回复(0) |  引用(0) 加入博采

杂谈:动物给人类的一封信,蛇肉的作用,周易免费算命
摘要:杂谈:动物给人类的一封信,蛇肉的作用,周易免费算命 查看全文

- 作者: tuenhai 2006年07月6日, 星期四 16:33  回复(0) |  引用(0) 加入博采

孩子生病怎么办,什么人生病不看医生——读《不生病之真法》
摘要:孩子生病怎么办,什么人生病不看医生——读《不生病之真法》 查看全文

- 作者: tuenhai 2006年06月28日, 星期三 18:14  回复(0) |  引用(0) 加入博采

试解中医针炙治病千古之谜

试解中医针炙治病千古之谜


www.tuenhai.com 20051210




tuenhai一个最要好的朋友曾关节不适,求之于中医针炙,针起即愈。不得不叹服疗效之神奇。

可惜的是,神奇的中医越来越没落了,甚至有人开始以“伪”称之。
中医为什么会没落呢?中国人,智商测试据某些人说是不错的,但智商以外的呢?许多时候看到的是无尽的……千年以下,现代科学突飞猛进,中医基础理论却没有任何修正,不要说修正,连怀疑都不曾有人提出?莫非写作《黄帝内经》的是上帝老人家本人?若非上帝,谁能保证《黄帝内经》论述的中医基础理论如阴阳,五行,脏腑,归经等就没有错误?

中医没落是必然的,创新不是国人的强项,科学进步所需要的怀疑精神是普遍不被提倡的。

中医把万事万物分出阴阳五行,中医师通过望闻问切,察知一个人“阴盛”还是“阳衰”,五行何所偏废,然后投以相应中药,补偏纠废,扶正祛邪。理论上来说,中医是相当完美的。难度在于,如何通过望闻问切察知一个人的阴阳五行特征,又如何察知所有中药的阴阳五行特征?并把两者有机结合?

经络理论是中医针炙的根。经络是人身“隐形”的“高速公路”。“隐形”是说现代科学之发达,还是难以实验的方法发现经络的存在。“高速公路”是指经络在人体中起着“重要”作用。有人把人体分为九大层次,第一层次是“人体生理组织系统”,第二层次是“中医经络及穴位系统”,西医一般是基于人体第一层次的,中医是基于人体第二层次的。

经络是如何发现的?大体在远古,“天人合一”是人们普通的信念,人们都有“返观内视”的习惯,李时珍说:“内景隧道,唯返观者能照察之”。不少人能返观内视看到经络,把经络用于医学实践,发展出中医针炙。看来,以远古某个时期的标准来衡量中医师,不能“返观内视”经络者,都是不合格的。


针炙穴位能治病的原理何在?

有人说是把某种看不见的“能量”通过针炙影响穴位,经络,进而影响对应的生理组织系统。看不见的东东,不好评论,我们这里撇开这个玄虚的东东不谈,针炙为什么能治病?

《一针见效─认识针灸》一文中说:“针灸是利用调节虚实和平阴阳的作用,使经络运行血气顺畅,刺激脑部,使其产生脑内吗啡,达到抑制缓解疼痛的目的,不但以抗御病毒,还可以传导感应等生理功能的正常。”

还是说得云里雾里,因为从西医看,针刺破皮肤肌肉,是对人体生理组织的破坏,何谈“调节虚实和平阴阳”?tuenhai.com认为针炙的治病的奥秘就在这小小的对人体生理组织的破坏之中。原理同我们打预防针类似。在百度知道查了一下关于预防针的答案:

预防针有两种,一种是抗原,大多数预防针是这种,它是灭活的病毒或细菌等异体蛋白,用于刺激机体的免疫系统产生相应的抗体来达到预防该种疾病的目的,如我们知道的各种疫苗;另一种是抗体,它是用给动物接种疫苗使其产生抗体后将血清制成预防针备用,主要用于急症,如破伤风、狂犬病等等,因为发生这些情况时细菌或病毒已经进入人体而人体却没有相应的抗体来预防,此时就需要借助异体产生的抗体帮忙了,此类预防针多是用马的血清制成,但是在注射抗体性预防针时需要同时注射相应的疫苗,原因是在抵抗毒素的同时还要使机体能及时自己制造抗体来抵御入侵的细菌和病毒。
回答者:跨海登山 - 秀才 三级 11-22 18(http://zhidao.baidu.com/question/1401620.html)

tuenhai猜想的针炙治病原理与打预防针一样,通过物理的方法,对穴位所在物理组织施加小小的破坏,从而也对穴位也产生了小小的破坏作用,经络自成一套系统,“高速公路”某站(也即某穴位)出了意外,自有专门人员去应急修复,某穴位“修复”了,该穴位对应的病症也就得到了治疗。
知道这个原理,人人都能自我“针炙”治疗:
第一,知道某病要找哪些穴位
第二,知道穴位的位置
第三,对穴位施加物理影响(针刺,炙,按摩,拔罐……)

下面谈谈鼻塞的“针炙”治疗。感冒鼻塞是常见的小毛病,病虽小,但也烦人。诀曰:“不闻香臭从何治,迎香二穴可堪攻”。迎香在鼻翼两侧,我们可对迎香穴施加影响,有时效果称奇。比如,tuenhai有时以风油精擦迎香,一分钟鼻塞即通。你也可以试试其他方法对迎香穴施加刺激,或许效果更好。(更多文章请访问www.tuenhai.com 20051210)


附:
广益中医 http://www.tcm369.com/
伤寒网  http://www.shanghan.com/
百度贴吧中医吧    http://post.baidu.com/f?kw=%D6%D0%D2%BD
华夏中医 http://www.98800.net/
民间中医论坛 http://www.37tcm.net/forum/
大医精诚 http://www.dyjc.net
导医网“中医中药”栏目 http://www.daoyi.com/html/zyzy/
百拇医药“中医中药”栏目 http://www.100md.com/index/0L/
医药咨询网“中医常识”栏目 http://www.delia.com.ru/ArticleList/Article_22_AddDate_Desc_1.Htm
中医药学刊每期精选  http://www.zyyxk.com/special.asp

子午针炙经任务,青光眼针炙方法,针炙减肥的坏处,深圳鱼美人针炙减肥,中医针炙穴位图,

- 作者: tuenhai 2006年06月8日, 星期四 20:35  回复(0) |  引用(0) 加入博采

函数式编程语言Haskell入门(一)——Haskell编程资料

-函数式编程语言Haskell入门(一)——Haskell编程资料


www.tuenhai.com 20060529



Haskell是什么?
唐宗汉说:
Haskell“比 C++ 更快,比 Perl 更简洁,比 Python 更正规,比 Ruby 更灵活,比 C# 更规范,比 Java 更健壮,和 PHP 则毫无关系”。


函数式编程语言Haskell入门之网络学习资源



http://www.haskell.org/ Haskell主页
http://haskell.org/hawiki/ Haskell wiki
http://www.haskell.org/haskellwiki/Implementations Haskell工具下载
http://www-users.cs.york.ac.uk/~ndm/projects/winhugs.php Win下解释器下载
http://www.haskell.org/visualhaskell/ Win下解释器,编译器。要装VS2003

中文教程:
http://rufi.yculblog.com/post.58940.html rufi的Haskell教程
http://wiki.perlchina.org/main/print/Yet_Another_Haskell_Tutorial flw翻译的教程
http://www.acsu.buffalo.edu/~xluo2/haskell/ 另一个Haskell中文教程

有关文章:
http://svn.perl.org/perl6/pugs/trunk/docs/zh-cn/01Overview.html Haskell与Perl6
http://wiki.perlchina.org/main/show/Interview_with_Autrijus_Tang_perl_com Perl 国际化和 Haskell—采访唐宗汉
http://blog.csdn.net/xxmpp/archive/2005/08/29/467415.aspx Haskell简介
http://blog.csdn.net/xxmpp/archive/2005/09/19/484648.aspx  Haskell语法一
http://liubin.itpub.net/post/325/9755  haskell介绍
http://www.dircity.com/newspub/html/3-2/38169.html  关于Haskell

英文教程:
http://www.haskell.org/tutorial/ A Gentle Introduction to Haskell
http://www.isi.edu/%7Ehdaume/htut/ Yet Another Haskell Tutorial
http://www.haskell.org/~pairwise/intro/intro.html Haskell Tutorial for C Programmers

更多英文教程:
http://haskell.org/haskellwiki/Books_and_tutorials

上面的中文教程,为防止“年久失修”,tuenhai.com已经全文转贴在:
http://groups.google.com/group/tuenhai/
用haskell搜索可以很快找到。


为什么要写<函数式编程语言Haskell入门——Haskell编程资料>



这几天在看haskell的资料,多数是英文的。网上关于haskell的中文编程资料奇少,于是想动手把看过的有关英文资料翻译成中文。
1. 从哲学上来说,学习一种知识而没有与外界发生交互,相当于没有学习。
2. 顺便翻译,也不花费非常多的时间。
3. 看英文编程资料是比较郁闷的事情,因为要翻译,大脑就多了一个兴奋点,不太会睡着了。
4. 因为要翻译,人先天的思维惰性就会被克服一些。
不过,要说明的是,本人正处在英语学习阶段,翻译不一定准确,仅供参考(错误处请指正)

tuenhai.com的书橱里有不少直译的外国文学作品,拿起书就头大。本文自然以意译为主,文中代码在Windows XP调试通过(言外之意,没有调试通过的代码就略去了)。


Hugs 零起点



本节内容选自WinHugs Version 20051031的帮助。
安装好WinHugs后,从开始菜单启动,会出现下面的界面:

|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005
||---|| ___|| World Wide Web: http://haskell.org/hugs
|| || Report bugs to: mailto:hugs-bugs@haskell.org
|| || Version: 20051031 _______________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions


Hugs session for:
file:{Hugs}\libraries\Hugs\Prelude.hs
file:{Hugs}\libraries\Prelude.hs
Type :? for help
Main>

启动WinHugs解释器,标准库{Hugs}\libraries\Hugs\Prelude.hs 会自动载入。如果没有载入,可能是安装有错误。请查看安装说明。

使用Hugs就像使用计算器那么简单。也就是,你会用计算器就会用Hugs。输入表达式,回车,立即计算出结果。比如下面的例子:

Prelude> (2+3)*8
40

Prelude> sum [1..10]
55
Prelude>

开头的 Prelude> 表示Prelude模块已经加载,可以在 Prelude>后面输入表达式,会自动调用Prelude中定义的相应函数执行计算。
第一次,我们输入(2+3)*8,回车,返回值是40.
第二次,我们输入表达式sum [1..10],其中[1..10]表示1至10的list,sum是Prelude中预定义的函数,在这里表示把列表中的所有数相加。在Hugs实际是这样计算的: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55

如果不嫌烦,也可这样来求值:

Prelude> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
55
Prelude>

试试:
Prelude> sum [1..10000]
代码是不是非常简洁。如果用其他语言来写,大都要写个for循环来计算。

虽然使用Hugs就象使用计算器那么简单,不过Hugs和大多数计算器不同,Hugs不限制数字的长度。在现代所谓的高级语言中,绝大多数都做不到这点。比如VS 2005, c++等,数字一长就会溢出。从这非常小的一点就可以看出,所谓的高级语言其实都是过时了的,因为程序员的时间比机器的时间更宝贵,现在机器的配置已经不是问题,为什么不让程序员写更少的代码,而让机器来做更多的事情呢。原来tuenhai.com在VS2005中专门写了一个函数来实现大数计算,在Hugs中就用不着这么做了。

Hugs的表达式还可以包含很多的数据类型,比如:numbers,booleans,characters,strings,lists,functions,还有user-defined datatypes.
请看下面的例子:

Prelude> (not True) || False
False
Prelude> reverse "Hugs is cool"
"looc si sguH"
Prelude> filter even [1..10]
[2, 4, 6, 8, 10]
Prelude> take 10 fibs where fibs = 0:1:zipWith (+) fibs (tail fibs)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Prelude>

你不能在命令行里创建函数。要创建并使用函数,要写在文件里并在命令行里载入文件。
上面最后一个例子,我们定义的fib只是在当前表达式有效,并不能在后面的代码里引用它。还有,命令行的表达式只能是单行模式。

Hugs允许把整个程序作为值一样进行计算。例如,putStr "hello, " 是个很简单的程序,在屏幕上打印出"hello, ". 组合使用一个打印出字符串"world"的程序,可以这样:

Prelude> putStr "hello, " >> putStr "world"
hello, world
Prelude>

就象执行标准数学运行一样,类似操作也可以在程序之间进行。例如上面的例子。

在Hugs命令行键入表达式能立即返回结果。有两个特别的命令我们要记住:
:q 退出解释器。
:? 列出所有命令。这在你忘记某个命令的写法时非常有用。
在Hugs里,命令一般都用冒号:开头。
注意,终止键(一般是control-C 或者 control-Break)会终止编译或计算,打印出{Interrupted!},返回命令行等待输入。

在前面的例子中,我们已经使用过prelude中定义的函数,如sum,>>,take。模块是函数的集合,我们可以把包含自定义函数的模块写到文件中。请看下面的例子:

module Fact where
fact :: Integer -> Integer
fact n = product [1..n]

第一行:定义一个名为Fact的模块
第二行:双冒号之前的是函数名,在本例中是fact。双冒号之后是参数列表,用->来连接,第一个Integer表示一个Integer类型参数。最后一个Integer表示返回Integer的值,
第三行:函数的定义部分,n是参数,等号之后则是函数的逻辑部分。

我们把上面的代码保存到Fact.hs(保存路径下面节会讲到)。(在Hugs中约定,保存模块的文件名后缀用.hs,文件名通常用模块名) product函数是prelude中预定义的函数,用以计算数列中各数的乘积,用法和sum函数差不多。在数学中,n的阶乘通常写作n!,也就是fact n = n!
n! = 1 * 2 * ... * (n-1) * n
在数学中阶乘的定义:从1到所给数字中的所有正数相乘。

前面我们定义了一个函数,在使用这个函数之前,要把Fact.hs载入解释器。简单的方法就是使用:load命令。

Prelude> :load Fact
Reading file "Fact.hs":

Hugs session for:
/Hugs/lib/Prelude.hs
Fact.hs
Fact>

在WinHugs中,可以用菜单File,File Manager中载入新的模块。命令提示符变成Fact>表示已经成功载入。

注意,Hugs session for:中列出了已经载入的文件名,第一个总是标准库prelude。 Fact>表示已经载入Fact模块,可以用其中的函数进行计算:

Fact> fact 6
720
Fact> fact 6 + fact 7
5760
Fact> fact 7 `div` fact 6
7
Fact>

另一个例子:

Fact> comb 5 2 where comb n r = fact n `div` (fact r * fact (n-r))
10
Fact>

在上面这个例子中,我们在表达式中定义了comb,如果我们要在以后的代码中用它,就要把这个函数写到文件中。把下面定义加到Fact.hs文件中
comb n r = fact n `div` (fact r * fact (n-r))
重新加载Fact.hs,然后我们就可以随时使用comb函数:

Fact> :reload
Reading file "fact.hs":

Hugs session for:
/Hugs/lib/Prelude.hs
Fact.hs
Fact> comb 5 2
10
Fact>

象多数语言的入门教程一样,我们来写一个Hello World:

Prelude> putStr "Hello World"
Hello World
Prelude>

是不是很简单?如果你要通过外部可执行文件来运行上面的代码,你就要象下面这样把代码写到hello.hs文件中:

module Main where
main = putStr "Hello World"

编译器编译可执行文件一定需要定义一个名叫main的函数。如果只是在解释器中调试程序,函数名可以是其他名字。


开始使用Hugs



因tuenhai.com只有Windows环境,故Unix相关内容略去。
在WinHugs中用+或-符号来开关解释器环境参数。可以在下面的注册表项中自定义:
HKEY_CURRENT_USER\Software\Haskell\Hugs\Winhugs20051031
20051031是Winhugs的版本号。有个Option键,可以在值里设置主要参数。我的键值是:

-s -t -g -l -. +q -Q +w -k -o -O +u -I -T +A +R -H +98 -h917504 -p"%s> " -r"$$" -P".;{Hugs}\\libraries;{Hugs}\\libraries\\Hugs;{Hugs}\\my\\" -S".hs;.lhs" -E"&C:\\WINDOWS\\notepad.exe" -c40

上面注册表值中,-P后面是搜索目录设置,-E后面设置编辑器,默认是notepad.exe。
在安装WinHugs时已经初始化设置了主要的解释器环境参数。

我们也可以在WinHugs菜单File,Options中更改。tuenhai.com只更改了两处:
一. Compile time,Loading Files中加入自己的路径,把下面字符加在系统默认路径后面:

;{Hugs}\my\

上面;是多个搜索路径的分隔符,{Hugs}是WinHugs的安装目录,my是我新建的目录。
我在WinHugs的安装目录下新建了一个my文件夹,自己写的程序都放到这个文件夹里。同时要把这个文件夹的路径加入WinHugs的搜索路径中去,这样在命令行中引用任何自己的文件,都只要写文件名,而不用写路径。就象上节,:load Fact就可以加载Fact文件。

二. 在Hugs Options的WinHugs条,我把默认外部编辑器改成了EmEditor。


Hugs命令行的使用



Hugs能用命令行载入文件,检查或修改参数。几乎所有命令都用冒号:开头,可以用首字母缩写的方式使用常用命令。比如可用:l,:s,:q分别代替:load,:set,:quit命令。

多数Hugs命令带有参数,用空格分开。字符串常量可以包含空格,换行或者其他特殊字符。举例:

:load My File

上面的命令载入了两个文件,My和File。
下面的命令则只载入一个文件:

:load "My File"
:load "My\SPFile"
:load "My\ \ File"
:load My" "File

一般,我们不在文件名包含空格和特殊字符,也不包含引号。

tuenhai.com注:在WinHugs中载入文件,不能加文件扩展名,否则会失败:

Hugs> :load Fact.hs
Reading file "Fact.hs":
ERROR - Unable to open file "Fact.hs"

去掉扩展名:

Hugs> :l Fact
Reading file "D:\Program Files\WinHugs\my\\Fact.hs":

Hugs session for:
file:{Hugs}\libraries\Hugs\Prelude.hs
file:{Hugs}\libraries\Prelude.hs
file:{Hugs}\libraries\Hugs.hs
file:{Hugs}\my\\Fact.hs
Fact>

用putStr打印出字符串:

Prelude> putStr "Hello, world"
Hello, world
Prelude>

用++连接字符串:

Prelude> "Hello" ++ ", " ++ "world"
"Hello, world"
Prelude>

解释器不会执行含有语法错误,类型错误,或引用一个未定义变量的表达式:

Prelude> sum [1..)
ERROR: Syntax error in expression (unexpected `)')
Prelude> sum 'a'
ERROR: Type error in application
*** expression : sum 'a'
*** term : 'a'
*** type : Char
*** does not match : [a]
Prelude> sum [1..n]
ERROR: Undefined variable "n"
Prelude>

一个比较容易出错的地方是:没有应用于特定表达式的show函数,也就是没有该类型的Show类的实例。例如我们在模块里定义了一个类型T:

module Test where
data T = A | B

把这个模块保存到my文件夹Test.hs.然后用:l Test命令加载,命令提示符变成Test>表示已经加载成功。下面我们来测试一下:

Test> A
ERROR: Cannot find "show" function for:
*** expression : A
*** of type : T
Test>

要消除上面的错误,就要添加一个Show类的派生实例。最简单的方法是用下面的方法定义模块:

module Test where
data T = A | B deriving Show

然后Hugs就能计算和显示类型T的值:

Test> A
A
Test> take 5 (cycle [A,B])
[A, B, A, B, A]
Test>

要注意的是,我们可以用:set命令改变解释器的环境参数。

如果我们不带参数使用:set命令,就列出当前的所有参数设置。下面是tuenhai.com的设置:

Test> :s
TOGGLES: groups begin with +/- to turn options on/off resp.
s Print no. reductions/cells after eval
t Print type after evaluation
g Print no. cells recovered after gc
l Literate modules as default
. Print dots to show progres
q Print nothing to show progress
Q Qualify names when printing
w Always show which modules are loaded
k Show kind errors in full
u Use "show" to display results
I Display results of IO programs
T Apply 'defaulting' when printing types
A Auto load files
R Enable root optimisation

OTHER OPTIONS: (leading + or - makes no difference)
hnum Set heap size (cannot be changed within Hugs)
pstr Set prompt string to str
rstr Set repeat last expression string to str
Pstr Set search path for modules to str
Sstr Set list of source file suffixes to str
Estr Use editor setting given by str
cnum Set constraint cutoff limit

Current settings: +wkuAR -stgl.qQIT -h917504 -p"%s> " -r$$ -c40
Search path : -P.;{Hugs}\libraries;{Hugs}\libraries\Hugs;{Hugs}\my\
Source suffixes : -S.hs;.lhs
Editor setting : -E&E:\soft\study\EmEditor\EmEditor.exe
Compatibility : Haskell 98 (+98)

在Windows环境,执行:set命令修改参数后,会将变化记录到注册表相应键值(参见本文前面部分)。

我们也可以在Hugs中使用系统命令行,方法就是使用转义符! 比如在WinHugs中敲入:!dir 就是列出当前目录内容。多数时候,我们可以使用exit命令离开系统命令行返回Hugs。

可以用:?命令列出所有Hugs的命令:

Hugs> :?
LIST OF COMMANDS: Any command may be abbreviated to :c where
c is the first character in the full name.

:load load modules from specified files
:load clear all files except prelude
:also read additional modules
:reload repeat last load command
:edit edit file
:edit edit last module
:module set module for evaluating expressions
evaluate expression
:type print type of expression
:? display this list of commands
:set set command line options
:set help on command line options
:names [pat] list names currently in scope
:info describe named objects
:browse browse names exported by
:main run the main function with the given arguments
:find edit module containing definition of name
:cd dir change directory
:gc force garbage collection
:version print Hugs version
:quit exit Hugs interpreter

:module 命令改变当前模块。比如上面第一行:Hugs> :? 其中Hugs>表示当前模块是Hugs,我们要改变到系统模块Prelude,可以这么做:

Hugs> :m Prelude
Prelude>

:m是:module命令的缩写形式。命令提示符变成Prelude>表示切换当前模块成功。如果不指定模块名,就切换到最近载入的模块。要注意的是,只能在已经载入的模块内切换。通常,已经载入的模块显示在命令行中。

:cd dir命令用来改变当前工作目录到dir。如果不指定路径,将忽略该命令。

:gc命令可以强制垃圾回收,并打印出已回收的字位数目:

Prelude> :gc
Garbage collection recovered 95766 cells
Prelude>

:quit命令用来退出Hugs。

:load [filename ...]命令清除先前加载的模块,然后尝试从列出的文件中加载定义(definitions),如果某个文件有错误就暂停加载并显示错误信息,修正错误后会启动:reload命令。
在某些系统,在使用:edit命令后会自动执行:reload命令。(在Windowns系统中,解释器和编辑器在执行独立进程时例外)
如果不指定文件名,:load命令清除先前加载的definitions,只保留prelude中提供的definitions.
:load命令会到指定路径搜索用户输入的模块文件,首先搜索精确匹配的文件,如果找不到,系统会尝试加上.hs和.lhs后缀进行搜索。如果你输入:load Array,如果在工作目录下没有名为Array,Array.hs,Array.lhs的文件,系统就会从标准库中加载Array。

:also [filename ...]命令用来附加文件。和:load不同的是,:also不清除先前加载的模块。
(不过,在上一次Reading file以后你又修改了先前的模块,在执行:also前会重新加载修改过的文件)
举例:你先前加载了下面的文件:

Hugs session for:
file:{Hugs}\libraries\Hugs\Prelude.hs
file:{Hugs}\libraries\Prelude.hs
file:{Hugs}\libraries\Hugs.hs
file:{Hugs}\my\\Fact.hs

原来加载了四个文件,你要再加载Test.hs。如果用:l Test命令来加载的话就变成这样:

Hugs session for:
file:{Hugs}\libraries\Hugs\Prelude.hs
file:{Hugs}\libraries\Prelude.hs
file:{Hugs}\libraries\Hugs.hs
file:{Hugs}\my\\Test.hs

可见,:l命令清除了除默认加载的文件以外的文件。

原来加载囝四个文件,如果用:also Test来再加载Test.hs就变成:

Hugs session for:
file:{Hugs}\libraries\Hugs\Prelude.hs
file:{Hugs}\libraries\Prelude.hs
file:{Hugs}\libraries\Hugs.hs
file:{Hugs}\my\\Fact.hs
file:{Hugs}\my\\Test.hs

可见,:also不清除先前加载的所有文件。
如果成功加载,下面命令顺序是等价的:

:load
:also f1
.
.
:also fn

:reload重复最近一次:load命令。如果上次载入文件后,没有任何文件被修改,:reload将不起作用。

:project [project file]加载工程。

:edit [file]启动编辑器编辑文件。

:names [pattern ...]用来搜索所有已载入编译器的函数名称。如果不带任何参数,按字母顺序列出所有名称。
:names参数能接受1个或多个参数,命令行将打印出1个或多匹配的结果。例如:

Prelude> :n fold*
foldl foldl' foldl1 foldr foldr1
(5 names listed)
Prelude>

:names命令可以用通配符,*匹配任意字符,?匹配单个字符,\c精确匹配c。也可以指定匹配范围,如[a-zA-Z]匹配所有字母:

Prelude> :n *map* *[Ff]ile ?
$ % * + - . / : < > appendFile map mapM mapM_ readFile writeFile ^
(17 names listed)
Prelude>

:type expr命令用来不执行计算而打印出表达式的类型:

Prelude> :t "tuenhai.com"
"tuenhai.com" :: String
Prelude> :t putStr "tuenhai.com"
putStr "tuenhai.com" :: IO ()
Prelude> :t sum [1..10]
sum (enumFromTo 1 10) :: (Num a, Enum a) => a
Prelude>

注意,使用:set +t命令设置参数后,Hugs能自动显示多数表达式的类型:

Prelude> :set +t
Prelude> sum [1..10]
55 :: Int
Prelude>


关于WinHugs



WinHugs比较适合Haskell初学者练习使用。在WinHugs中某些库可能不适合使用。因此,大的工程不推荐使用WinHugs。
Hugs 98的标准库有:Array, Char, Complex, IO, Ix, List, Locale, Maybe, Monad, Numeric, Prelude, Random, Ratio, and System,在WinHugs中默认加载Prelude库。我们在学习Haskell要用到其他库的函数,这时可以在默认加载文件中加入import语句加载其他库。
在WinHugs中,默认加载的是下面的文件:

Hugs session for:
file:{Hugs}\libraries\Hugs\Prelude.hs
file:{Hugs}\libraries\Prelude.hs
file:{Hugs}\libraries\Hugs.hs

Prelude.hs是一个标准库,Hugs.hs中包含了main函数。试一下下面的命令:

Hugs> map Char.toUpper "Hello World"
ERROR - Undefined qualified variable "Char.toUpper"
Hugs>

因为没有加载Char库,程序出错。我们在Hugs.hs中用import语句加载Char库。点击WinHugs中列出的
file:{Hugs}\libraries\Hugs.hs
会自动调用默认编辑器打开Hugs.hs文件,文件内容修改为:

module Main where
import Char
main = putStr "Hello World"

然后在WinHugs中用:r命令重新加载文件:

Hugs> :r
Reading file "D:\Program Files\WinHugs\libraries\Hugs.hs":
Reading file "D:\Program Files\WinHugs\libraries\Char.hs":
Reading file "D:\Program Files\WinHugs\libraries\Data\Char.hs":
Reading file "D:\Program Files\WinHugs\libraries\Hugs\Char.hs":
Reading file "D:\Program Files\WinHugs\libraries\Data\Char.hs":
Reading file "D:\Program Files\WinHugs\libraries\Char.hs":
Reading file "D:\Program Files\WinHugs\libraries\Hugs.hs":

Hugs session for:
file:{Hugs}\libraries\Hugs\Prelude.hs
file:{Hugs}\libraries\Prelude.hs
file:{Hugs}\libraries\Hugs\Char.hs
file:{Hugs}\libraries\Data\Char.hs
file:{Hugs}\libraries\Char.hs
file:{Hugs}\libraries\Hugs.hs

从上可见,Char库已经加载。这时我们再用Char库里的函数就不会出错了:

Main> map Char.toUpper "Hello World"
"HELLO WORLD"


《函数式编程语言Haskell入门(一)——Haskell编程资料》就到这里。以上也是tuenhai.com的学习过程的记录,我是从零开始的,想必本教程很适合从零开始自学Haskell的初学者。本文续篇请关注tuenhai.com。
(更多文章请访问www.tuenhai.com 2006529)

- 作者: tuenhai 2006年05月29日, 星期一 09:37  回复(0) |  引用(0) 加入博采

静以养身与万病不治求之于肾——读《浅谈中医的精神保健》

静心养身与万病不治求之肾——读《浅谈中医的精神保健》


www.tuenhai.com 20060528



按:《浅谈中医的精神保健》是辛凯旋 于文强两位先生的大作,全文见下,并加上tuenhai.com不成熟的看法,请各位指正。


浅谈中医的精神保健

山东省交通医院(250031)辛凯旋 于文强

中医非常重视精神保健,视其为身体保健的核心。精神健康是身体健康的基础,只有精神愉快、无忧无虑,其他保健措施才会有效;否则忧心忡忡,惴惴不安,吃什么保健品也没有用。《内经》云[1]:“心者,君主之官也,神明出焉 ”,“故主明则下安,以此养生则寿,殁世不殆”,“主不明则十二官危,使道闭塞而不通,形乃大伤,以此养生则殃”。意思是说:“心”这个器官是管思想和情绪的,它是人体的最高领导。如果重视精神保健和精神修养,使“主明下安”,那么就可以做到身体健康,一生无殃;否则,情绪波动,则所有器官都处于危险状态,人体气血经络不通,长此以往,形体大伤,遗患无穷。


Tuenhai:精神保健确实是身体保健的核心。听过刘力红的一个讲座录音,讲到他特意到东北去,听王善人的传人为人讲病,其实相当于思想上给人疏导,重病之人当场症状消失,其他保健措施一般没有这么好的效果。


那么如何做好精神保健呢?按中医的观点,就是抓住一个“静”字。“静则寿[2],躁则夭”。心平气静则长寿,心浮气燥则夭亡。有人可能说:在当今市场经济激烈竞争的条件下,为了体面的生存,哪能“静”得下来?除非出家为僧。实际上,做好精神保健,正是为了体魄健壮,提高人的社会适应性和竞争力。“静”的含义是让人有张有弛,劳逸适度,达到“不管风吹浪打,胜似闲庭信步”的境界。


Tuenhai:要做好精神保健,为什么要抓住一个“静”字?有人认为“生命在于运动”,这种似是而非的说法很容易误导人。从理论上来说,动和静达到平衡才能使人健康长寿。从现实生活来看,工业社会,多数人都是静少动多,最大的表现为在一天之中,活动时间延长,睡眠时间缩短。现在夜生活越来越丰富,连续剧看起来没完没了,电脑网络让人着迷,还有歌舞会所……针对这个具体实际,“静”字就成为现代多数人的养生要诀。每日8小时睡眠之类学说其实是错误的,正确的是日出而作,日入而息,人体生物钟与大自然生物钟同步。具体做法可以是:晚上不看电视,电脑里面用软件,晚上到点就自动关机,傍晚多静少动,白天不午睡。从中医来说,tuenhai(tuenhai.com)在读《李可老中医急危重症疑难症经验专辑》,对于书中经常提到的一句话印象深刻:万病不治,求之于肾。一般人读到此,就是一个经验之谈,就放过去了,历代中医理论著作汗牛充栋,待学习的太多了。Tuenhai则是把这句话放大,中医里面广义的“心”相当于动,对应于白天 ; 中医里面广义的“肾”对应于静,相当于晚上。现代人白天消耗太大,所以要强心。现代人晚上休息不足,使“肾”的功能受到影响,所以要强肾。中医史上的“滋阴学派”对现代人多半不适合,因为多用寒凉,既不能强心,又不能补肾,在大方向上就不对了。多用一些强肾的中药,佐一些强心类,是适合多数现代人的日常保健方剂。采于秋冬旺于秋冬的中药大都能强肾,采于夏的中药大都有强心之用。


我想如果从以下四个方面努力,可使人逐步达到“静”的状态,保持精神健康:
1、对人生的认识:世间任何事物都有两重性,人也不例外。人具有生物性和社会性这两面性,一方面作为自然界的人,人具有其他生物的共性,如“生老病死”的规律,这是最基本的,正是:“莫羡离离春风草,落尽还生年复年”,人生一世,不过草木一春,作为自然界的具有生物性的人,人生并没有什么价值,和其他生物一样,不过是自然界的匆匆过客。“生者寄也,死者去也”,人来到世间就像住旅馆一样,只是寄住几天,终究还是要走的。正如李白所言“蟪蛄(蝉的一种)啼青松,安见此树老,石火无留光,还如世中人[3]”(人生就像打火石打出来的火光,一亮即逝)。但另一方面,作为社会的人,人生是有价值的,人应该有积极的人生态度。当今在中国共产党的领导下,经过二十多年的改革开放,中国正处于近百年来最繁荣昌盛的时代,我们作为炎黄子孙非常自豪,所以我们应在社会上,找到自己适当的位置。三百六十行,行行出状元,只要努力,都可以为振兴中华做出自己的贡献。人的能力有大小,只要有这颗爱国之心,尽力为人民、为国家做事,也就不枉此生了。这就是在人生态度上的一张一弛。


Tuenhai:对于人生的两性,生物性和社会性,生物性是生命的时间长度,社会性是生命的正性的空间活动量的大小,两者的乘积才是真正的生命。所以,看一个人的生命,应时空结合来看。一个人活在世上的时间很短,可是空间的活动能量很大,对人类作出了巨大贡献,普通人在世上活个百年,千年,又怎么能和他相比呢。只是,何谓正性,何谓负性,何谓对世人有益,何谓对世界有害,真假信息参杂,有时真不好分辨。


2、对人性的认识:任何人的心灵深处都有一种——“无限把握未来[4]”的愿望,这是人类心灵的一种基本的需求。处于两个极端的人即条件最好的和条件最差的人,这种需求更迫切。中间部分,即条件不好不坏的人,这种需求较平淡,所以从比较消极的角度来看,求“静”的方法,就是“知足常乐”了。
那么从积极的角度看,如何把握未来呢?所有的人都想预见自己的未来,以此来安顿那颗充满欲望的心。于是人们算卦卜未来,烧香寄厚望。当微弱的个人面对严酷的现实和不可抗拒的自然时,这是完全可以理解的。毛泽东在实践论里说:“感觉到了的东西,我们不能立刻理解它,只有理解了的东西才能更深刻的感觉它。”算卦也如此,天下的卦只有二卦,那就是“凶”和“吉”。如果心地善良,助人为乐,扶贫济困,肯定是吉多凶少,反之,损人利已,违法乱纪,贪污受贿肯定凶多吉少。所以要把握自己的未来,益寿延年,长命百岁,只能以德为本,助人为乐,遵纪守法,才能大吉大利。否则前途未卜,难以为继,更谈不上“心平气静”了。


Tuenhai:在这个世界上,每个人所处环境不同,看似付出同样的努力而收获不同。对于成功,只能和自己比,能持续进步就是成功。如果贪多冒进,不择手段,虽然也曾意气风发,一朝前功尽弃,这种没有持续性的成功不为成功。那怎么来达到持续性的成功,就象本文作者所说的,要“心地善良,助人为乐”,“以德为本,助人为乐”,这么做不是道德说教,而是积累成功的机缘。一切机会都不是偶然的,我们在当下努力的同时,要为未来积累成功机缘。本文作者在文中引用了毛泽东在实践论中关于“感觉”和“理解”的论述,是的,积累成功机缘讲究的是付出,你没有理解这个道理,你就不会在实践中深刻感觉到,并去身体力行。这大概就是“佛学”中梦寐以求的“慧”的范畴吧。


对人性的认识,再进一步讲,就是三字经所言“人之初,性本善,性相近,习相远”。就是说人的原始都很善良,没有坏人。在婴儿阶段天赋之性还近于先天的本性,总是善的。“习相远”,后来的习惯一加上,变得与天赋之性相远了。拿事实来看,我们每个人本来是善良的,习惯却很容易变坏,因为环境会改变人。等习惯养成了以后,就与本来的善良和纯洁越来越远,嗜好也越来越大。所以,不管做什么职业,乃至出将入相,富到拥有亿万美元,能保持原来朴素本质的人非常少。人越接近于本性的“善”,心情才越能接近于“静”的境界,所以向善的修养必不可少。
3、对文化的认识:对于不同的人,世界呈现不同的面貌,在精神贫乏者眼里,世界也是贫乏的。对音盲来说贝多芬等于不存在;对画盲来说齐白石、张大千等于不存在;对只读流行小报的人来说,从孔子、老子、到曹雪芹的整个民族文化宝库等于不存在;对终年在名利场上奔波的人来说,整个大自然等于不存在。想一想,您一生中有少时候,把自己排除在世界的丰富的美之外了。一个经常在阅读和沉思中与古今哲人文豪倾心交谈的人,与只读明星轶闻和凶杀故事的人,他们生活在何种不同的世界里。所以人不仅需要物质方面的追求,也要有社会文化方面的理想。据说一个人如果在14岁时不是理想主义者,他一定庸俗得可怕;如果在40岁时仍是理想主义者,又未免幼稚可笑。我们或许可以引申说,一个民族如果全体都陷于某种理想主义的狂热,当然太天真;如果在它的青年中竟然也难觅理想主义者,又实在太堕落了。由此我又相信,在理想主义普遍遭耻笑的时代,一个人仍然坚持做理想主义者,就必定不是由于幼稚,而是由于精神文化上的成熟和自觉。而这种成熟和自觉恰恰是通向“心静”境界的桥梁。


Tuenhai:这里说得很有意思!我们活在同一个地球上,却“生活在各种不同的世界里”,确实是的。所以我们要加强文化的修养,为学要博,然后才能跳出许多的局限,站在更高的地方看问题。比如,作为一个中国人,如果不对中医或周易有深刻理解,要了解时空统一的哲学是很难的。


4、对于处世方法的认识:世事纷争,到处充满了斗争和矛盾,回避是回避不了的,只有沉着应对、妥善处理、随机应变才能处于主动地位,心才能“静”得下来。老子说:“上善若水[5]”,就是提倡人们像水一样滋养万物而不与万物相争,你往高处走,我往低处流。居处善于像水那样安于低洼处,心胸善于像水那样清静深沉,交友善于像水那样施仁亲爱,说话善于像水那样遵守诚信,为政善于像水那样精简透明,处世善于像水那样无所不能渗透,行动像水那样顺势变化。唯有这样,在方法上后发制人,处处主动,方能立于不败之地而无忧无虑了。正如邵雍诗云:“水流任急性常静,花落虽频意自闲;不似世人忙里老,生来未始得开颜[6]。”
总之精神保健的内容不仅仅是一个“静”字所能概括,还包括文化、道德、信仰等多个方面,在此只是浅谈我的一管之见,抛砖引玉,共同探讨,齐登寿域。


Tuenhai:对于处世方法的讨论,是一个很实际的问题,每个人都会碰到。有时我们主观可能希望这样,但现实并非如此,许多时候,我们只能顺应大环境而为。
(更将文章请访问www.tuenhai.com 20060528 剡)


静心养身



参考文献
[1](唐)王冰撰注,鲁兆麟等点校.黄帝内经素问.沈阳:辽宁科学技术出版社,1997:17.
[2]南怀瑾.论语别裁.上海:复旦大学出版社,1996第二版:296.
[3]高步瀛.唐宋诗举要. 上海:上海古籍出版社,1978:36.
[4](苏)季塔连柯.马克思主义伦理学[M].北京:中国人民大学出版社.1984:100.
[5]刘康德.老子直解. 上海:复旦大学出版社,1997:29.
[6] 徐霖.养生长寿歌诀.北京:华艺出版社,1990:419.

- 作者: tuenhai 2006年05月28日, 星期日 09:08  回复(0) |  引用(0) 加入博采

VS.NET 学习方法论——tuenhai的 VS.NET 学习之旅

VS.NET 学习方法论——tuenhai的 VS.NET 学习之旅


www.tuenhai.com 20041212



题记 : 即使你没有一点编程经验,只要你愿意,并理解本文介绍的学习方法,你也可以象作者一样轻松、愉快地步入程序设计之门。让我们一起开始激动人心的 VS.NET 之旅。


一.通过 Internet 获取知识的能力是网络时代最重要的能力



在 26 岁的时候,给自己定下目标, 35 岁之前必须掌英语和程序设计。至今刚过而立,程序和英语都学得不怎么样,对学习方法倒是有所体悟,愿与大家分享。

在此先介绍一下tuenhai(tuenhai.com)的情况。26岁前主要从事语文教学,对计算机及英语可以说一窍不通。说出来可能让您笑话:计算机不会上网;英语不认识音标。水平虽然不怎样,志向却比天高,下决心改变自己,说干就干,花7000大洋购来电脑,开始自学计算机。26岁,人生翻开新篇章。

首先把自家电脑来个开膛破肚,把硬件拆了装,装了拆(可怜我的主板,修了几次,还是报废;显卡由于带电插拔烧断了“脚”,还是手机店的朋友帮忙焊接上的)。为了从网上快速查找到需要的教程文章,忍痛每月花100大洋窄带包月,想当时Down个X片足足用了两天两夜,结果下集只有声音没有图像,还把他听完,呜乎!

一向提倡在工作中学习,学的东西要和工作相关,工作和学习互相促进。做语文教师虽也可以自学计算机,但觉得进程太慢了(那时所在学校还未设计算机课程)。于是,刚学计算机不到半年的人“一不小心”就成了电脑教师。还好基本是入门级培训,不过也逼着我学得更快。本来是用拼音加加输入法的,因为工作关系,只好改用五笔。全国计算机等级考试要考DOS,于是又学了DOS。本来用FrontPage做网页,现在改用Dreamweaver MX,还有FireWorks MX,Flash MX也懂一点。对着主板随机手册和英文词典尝试几次,开机CMOS也可以进出自如。什么系统优化,GHOST系统备份都不在话下。做的网页虽然界面不怎么样,IP日访问量却是每天300以上(20060519tuenhai附注:那时日访问量300ip自我感觉就不错了,现在日访问量30000也不觉得咋样)。直到29岁,对Windows应用编程却还是一点不懂,VB6删了装,装了删,反复几次,觉得很难,始终未跨过编程第一道门槛。

前日跟在嵊州信息港工作的 MM 交流,言及在自学 Visual Studio .NET 程序设计, MM 问:你在闭关学习吗?tuenhai回答 : 你 ” 赞助 ” 学费的话tuenhai也许会考虑考虑。是的, 网络是所大学,最大的大学,网络可以改变世界,终将改变世界。网络更可以改变人生,可以让我们的学习生活无比精采,只要你懂得利用,善于利用。 现在已是网络时代,网络交流基本弥补了自学的不足,通过网络交流、学习更有学校教育所没有的优势。

你看到这里,如果你没有接触过程序语言,想了解一下 Visual Studio .NET 是个什么 ” 东东 ” ,你会如何做?第一,查手头书籍。个人开个计算机图书馆是不现实的,要查找的知识往往在手头书籍中找不到;第二,打电话问朋友。朋友懂不懂是个问题,即使懂,他有没有空?他有空,他不清楚你这边的实际情况,他说的并不一定是你想要的,或者他说的你不一定听得懂;第三,上图书馆查资料;第四,上书店;第五,跑去问老师;第六, ……

是的,传统是这么做的。但现在是网络时代了。你完全可能在不到一分钟之内找到你想要的答案。上网,打开 Internet Explorer ,在地址栏输入 http://www.google.com ,然后回车,在打开的页面中间输入框中敲入Visual Studio .NET 语言注意中、英文中间有个空格。然后再回车,页面显示:约有 66 , 900 项符合 Visual Studio .NET 语言 的查询结果,以下是第 1 - 10 项。 (搜索用时 0.12 秒) 怎么样,还用tuenhai给你介绍 Visual Studio .NET 是什么东东吗。你就尽情地点击文章标题,查看您需要的知识吧。

“ 软件是一个过去的时代, Web Service 将要来临。 ” 微软高级副总裁李开复说, ”Web Service 本身可以说是一个赌博,一个风险 ; 因为你可以相信,也可以不相信这件事情的发生。tuenhai只能说微软把整个公司都赌下去了,我们赌的未来就是 Web Service 。 ”你可不要告诉tuenhai你比盖茨厉害多了。我们追求超越盖茨不一定现实,但我们可以早一步接触网络,利用网络。


二.学习编程的过程中,既要善于向高手寻求帮助,更要乐于指导初学者。在交流中学习编程,其乐无穷



29 岁,开始从事企业管理工作。由于工作的关系,要用到 Microsoft Office 办公软件, Office 办公软件中有个 Visual Basic For Application ( VBA )语言,是 VB 的一个子集,具备 VB 的所有优点,内置于 Office 中,只能在 Office 中创建、编程和运行,可以录制宏并自动转换为代码。由于初次接触编程语言,感到自学 VBA 有难度。每逢在学习中遇到难题、困惑的时候,tuenhai就到到网上寻找学习资源,寻找答案。很快就找到关于 Microsoft Office 的极好社区,如 OfficeFans(http://www.officefans.net) , ExcelHome(http://club.excelhome.net/) ,于是立即在社区注册名字,学习 VBA 时中碰到疑问就到社区去问,每次都有网友热心解答。比如tuenhai的工作需要经常在 Excel 工作表第十行前插入空白行,要先选取工作表,鼠标指针定位到指定行,然后单击右键,选 ” 插入 ” 。重复操作,不胜其烦。于是在 OfficeFans 提问,经版主 kengzeng 指点,得到如下 VBA 代码:

Sub insert()
Sheets(“sheet2”).Rows(“10:10”).Insert
End Sub

原来要四步操作,现在一按快捷键就完成了。tuenhai原来并不懂 VBA ,对 ” 集合 ” 、 ” 对象 ” 、 ” 方法 ” 、 ” 属性 ” 、 ” 事件 ” 、 ” 枚举 ” 等编程概念也不甚了了,但由于有网上高手的指点、帮助,tuenhai仍旧可以在工作中应用 VBA ,多次应用下来,用到的一些 VBA 代码不去死记也差不多会背了,对 VBA 的一些概念、理论开始有所了解。

万事开头难。学习一开始碰到难题,如果解决不掉,就可能从此放弃学习了,如果这时有热心人解答他的疑问,然后在实际中立即可以应用新知识,新知识得到了即时巩固,学习的兴趣得到激发和增强,学习就得以继续和深化。当然,对于有 ” 悬梁刺股 ” 精神的朋友,自己看书刻苦钻研也可能会解决所有疑难问题,但那毕竟是极少数,多数人是象我这样的普通人。

来而不往非礼也。在网上得到诸多大侠的指点,总感到好像欠了谁什么似的,就想到编一本电子书,把常见的 Excel VBA 学习教程集中到一起,可以帮助初学者快速入门。 2003 年 6 月较空闲,刚好自己对 Html 语法也懂一点,就花了二周的时间,搜集整理了一本电子书,叫《 Microsoft Excel 学习一点通教程》,其中重点内容是 Excel VBA 。把电子书放到 OfficeFans 上供网友下载,极受欢迎。tuenhai为什么编这本电子书呢?真的是比较空闲的缘故?有空去泡 MM 不是很好,何必去做枯燥的文字整理工作,其实是存有 ” 私心 ” 的?

什么 ” 私心 ” ?助人即助己。 ” 佛 ” 渡人其实也是为了渡己啊。tuenhai为了领悟这个道理,诸子百家,佛道儒易医,无所不涉,并在生活中曲折浮沉,这样还是用了 ”30 年 ” 时间(太夸张了,一出生就 …… ?呵呵),各位比我聪明,应该早就明白此理。

为什么助人即助己?
在学术上帮助别人,指点别人,就要站在别人的角度考虑,思考别人的思考,打破了小我的思维局限。

从信息角度讲,个人自修,知识的附加信息量较小,而在帮助别人过程中,存在人与人的信息交流,在信息交流中,知识信息得到强化。举一个例子,小孩子生活在英语环境中, 3 岁即口语流利,而我们的学校教育,大学毕业,英语学了十多年,还是哑巴英语的大有人在,为什么?小孩子记一个单词或句子,是在和外界信息交流中记忆的,确切地说,小孩子记住了当时信息交流的情境,通过情境的自然记忆实现单词或句子的自然记忆。学习口语如此,学习编程何尝不如此呢?你在某个问题上指点过别人,你的记忆印象可能就特别深,如果是个人看书自学,对于某个问题当时虽然理解,但附助记忆的情境信息量很小,时间长了就容易遗忘。所以,在学习编程的过程中,多和别人交流,多向高手虚心求教,多指点初学者,是在人为创造学习情境,在情境中强化记忆,强化理解。李阳提倡 ” 疯狂英语 ” 学习法,我则提倡 ” 疯狂编程 ” 学习法,也就是创造一切机会和别人交流编程经验,从交流中进行强化训练和学习。但也要注意,交流是手段不是目的。

交流编程经验的途径有很多:如论坛交流,媒体投稿, QQ 、 ICQ 等通讯软件交流。个人觉得 CSDN 为我们提供的 ”blog 专栏 ” 非常好,您可以一边学习编程,一边记下心得,通过个人专栏和大家交流。

VBA 是 VB 的应用分支,tuenhai在工作中应用 VBA ,并自然地对 VBA的概念、理论有了初步了解,这时再去看 VB 的教程,就感到分外亲切。因为 VBA 和 VB 在本质上是没有区别的。tuenhai终于可以跨入 VB 编程之门了。



三.从应用入手,从解决实际问题出发,在完成项目的过程中,逐步掌握程序设计理论与技巧



程序语言种类很多, Pconline 的 工具平台 就列有 VB/VB.NET 、 VC/C# 、 Delphi 、 Java 、 C++Builder 等。到底学什么语言好呢?在 Google 输入语言 比较,查到一篇文章《编程语言的宗教狂热和十字军东征》,第一段就是:

业余程序员最喜欢做的一件事就是对不同的语言进行比较。 Java 是否比 C ++好? C #是否会成为终极语言?凡此种种。从专业程序员的角度看来,这是最低级无趣的游戏。其一,在项目诸元确定之后,通常并没有选择语言的余地;其二,语言的生存本身就是一个达尔文主义的问题:设若两种语言有明确的可比较性,其中较劣的那一种必定早已被淘汰出局,又何来比较的必要?

我基于两个原则选择程序设计语言:其一,适合自己的就是最好的。
其二,如果不知道什么适用自己,那么优先选择 Microsoft 的程序设计语言。我选的是 VB (每个人的具体情况不,我的选择不一定适合你),目前只考虑开发普通 Windows 应用软件,并希望 Windows 应用软件的开发和 MicroSoft VBA 的应用互相促进,说穿了,是精力有限,最好是一种语言,到处应用。于是在网上 Down 了 N 多的电子书,收藏夹里 VB 网站一大堆。发现,除了 CSDN , VB 社区论坛的人气大多不旺。第一次接触 VB ,没有基础,业余自学,如何快速掌握 VB 程序设计?
如有足够的时间(业余自学,时间显然不足),有足够的耐心(恰恰本人是耐心不那么足的人),可以按照教程一个一个控件学习、练习,这个过程无疑是有益的,但对我来说显然是过于枯燥的。或许如此下去,半年以后, VB 基础比较好了,但可能不到半年,早就放弃习了。这就要另辟蹊径。设想是,一开始就定下一个软件项目,带着目的去学,以一个控件为核心,在完成项目的过程中,逐步掌握 VB 控件的使用和编程基本理论。项目基本完成的时候, VB 编程也就入门了。由于是带着项目去学,目的明确,学习过程就不会枯燥。如果你做共享软件,你的项目创意又比较好,你 VB 编程入之门之日,也许你的软件也就可以为你带来 Money 了,呵呵!

开发一个什么样的软件呢? SUN 提出了激动人心的口号 :” 网络就是计算机 ” 。计算机的应用主要在于网络,于是定位于开发网络应用软件。tuenhai经常到网络社区论坛交流,注册时要一项项填写信息,发言时也要一项项填写信息,感觉很费时间,打算自己编程来实现自动注册,自动发言。  

2003 年 5 月学 VBA 时想用 VBA 实现在论坛自动注册和发言,实现起来有难度,就在网上找替代软件,找到了 ” 按键精灵 ” ( http://www.vrbrothers.com/) ,按键精灵是一个模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替您的双手,自动执行一系列鼠标键盘的动作。 觉得很不错,就编写了一个脚本,用按键精灵自动实现如下功能:打开 Internet Explorer ,输入并打开网址,移动鼠标到指定座标,输入字符,然后按回车完成注册 a 或发言。比起手工输入,用按键精灵省力不少,但是不同网站,输入框的座标不同,要手动抓取,有没有更方便的软件呢? 按键精灵社区 里有人讲到 EzScript ( http://ezscript.seed.cx/ ) 功能更多,试用后发现在 Windows XP 里反应不灵敏,再在 Google 狂搜,找到了 PCWorker ( http://www.pcworker.net ) 。 PCWorker 配合网络填表软件 FORMGHOST ,可实现双击注册或发言,需要的话,还可在标题加上随机数,而且 PCWorker 代码的可读性较强,且作者能及时听取网友意见对软件加以改进。PCWorker 虽然好用,但要实现从网络中获取信息并作出判断(比如提取超链接),这是 PCWorker 类软件不能胜任的。(20060519tuenhai附注:2005年又发现了模拟精灵,可能是目前同类软件中最好的。这是后话了。)

于是决定用 VB6 来实现自己的想法。 2003 年 10 月开始学习 VB6 ,到 11月,项目基本完成。tuenhai是怎么做的呢?

首先浏览各 VB 网站有关文章,发现用 WebBrowser 控件能实现tuenhai所要求的功能。其次,大量搜集 WebBrowser 控件相关文章和代码。
用 Google 搜寻。如用 ”WebBrowser” 为关键词搜索,共有 7 , 260 , 000 项查询结果 。
CSDN 论坛 搜索。
导航到 http://expert.csdn.net/Expert/Forum.asp ,登陆论坛,点击 ” 搜索 ” ,选 ” 全部社区 ” ,用 ”WebBrowser” 为关键词,然后点击 ” 对选择的大类进行搜索 ” ,哇,有 300 篇有关 ”WebBrowser” 的帖子。CSDN 文档 搜索,导航到 http://www.csdn.net/search.asp ,搜索框中输入 ”WebBrowser” ,选择 ” 文档 ” ,再单击 ” 搜索 ” 按钮,找到 57 篇 ”WebBrowser” 相关文档。在实际编程中遇到困难,还可以到 CSDN 论坛 提问,寻求帮助。tuenhai就曾在 CSDN 论坛 问了不下十个有关 WebBrowser 有关问题,并都得到了解答。由于善于运用以上三步, 1 个半月时间,tuenhai的软件基本出炉, VB 编程也已基本入门。

在学习 VB6 的同时自然接触到 Microsoft Visual Studio .NET (简称 VS.NET )。
在十年之前, Visual Basic 1.0 成为数以百万计的开发人员的革命性的应用程序开发语言。现在, Visual Studio .NET 为未来的十年做好了准备(有点象为 Microsoft 打广告,你说呢), VS.NE 是用于创建下一代应用程序的理想而又现实的开发工具,是一个从一开始就是为 XML Web 服务创建的开发环境。通过允许应用程序通过 Internet 沟通和共享数据, XML Web 服务使业务能够从 Internet 转换为用于集成和传送它们的核心商业价值的真正平台。 Visual Studio .NET 和 XML Web 服务提供简单、灵活、基于标准的模型,允许开发人员从新的和现有的代码汇编应用程序,而与平台、编程语言或对象模型无关。
VS.NET 2003 中主要有包含以下几种开发工具:
Visual Basic .NET 2003
Visual C# .NET 2003
Visual C++ .NET 2003
Visual J# .NET 2003
有人说, ” 学习要面向未来 ” , 2003 年 12 月,tuenhi的主要开发工具从 VB6 转为 VB.NET , 2004 年 1 月 1 日 ,tuenhai把新开发的软件从 VB6 升级为 VB.NET ,并正式命名为“论坛发帖软件工具下载版”(又叫“论坛自动发贴软件”,“论坛自动发帖器”,“论坛批量发帖软件”,“论坛自动发贴工具”,“论坛快速发帖器”,“论坛发贴机”,“论坛快速发帖器”)

在转向 VB.NET 的时候,tuenhai考虑:

第一. VS.NET 的本质是什么?

VS.NET 是从一开始就是为 XML Web 服务创建的开发环境。通过允许应用程序通过 Internet 沟通和共享数据, XML Web 服务使业务能够从 Internet 转换为用于集成和传送它们的核心商业价值的真正平台。学习要面向未来,就要学习最新的技术,现在的学习为将来的应用作铺垫。

tuenhai的软件要突出两点,一是基于 Internet 的应用,二是要应用 XML 技术。这样,就可以在应用中尽快掌握新技术,否则,只是为学习而学习,无疑会是比较枯燥,也容易遗忘。

第二.原来用 VB6 写的”论坛发帖软件工具下载版”,主要用到 WebBrowser 控件,网页加载速度慢,会下载图片, Flash 等许多不需要的东西,在 VS.NET 中可考虑用其他方法实现同样功能。

在 CSDN 诸位朋友的帮助下,并参考许多资料,tuenhai的“论坛自动发贴机”已基本具备 .NET 特征。
代码举例:1. “论坛自动发贴机器”应用了 XML 技术VB6 中, INI 文件通常用来保存系统信息、配置信息,读写 INI 文件要用到 API 函数,使用起来不是很方便。在 VS.NET 中,已经没有必要用 INI 文件来保存和读取一些信息了,可以改用 VS.NET 中的读写 XML 文件的类。而且,在 VS.NET 2003 的后续版本中,处理 XML 有关功能将得到进一步增强。
读取 XML 到 DataGrid 代码:

Public MyXMLDataSet As New DataSet(“XMLDataSet”)
' DataSet 是数据的一种内存驻留表示形式,无论它包含的数据 ' 来自什么数据源,它都会提供一致的关系编程模型。
MyXMLDataSet.ReadXml(“regid.xml”) ' 读入 XML 文件
form1.DefInstance.DataGrid1.DataSource = MyXMLDataSet 'DefInstance 是 form1 的共享属性
strName = MyXMLDataSet.Tables(0).Rows(0).Item(“name”).ToString '    从 DataGrid 中读取用户名信息。

从 DataGrid 更新信息到 XML 文件代码:

Dim MyXmlDataSet As DataSet
MyXmlDataSet = CType(DataGrid1.DataSource , DataSet) ' 类型转换
MyXmlDataSet.WriteXml(“regid.xml”) ' 把信息写入 XML 文件


如果不用 DataGrid 控件,读写 XML 文件中特定信息可以更简单:

Dim xmlInfo As New XmlDocument
xmlInfo.Load(“info.xml”) ' 载入 XML 文件
Dim str As string=xmlInfo.Item(“RegInfo”).Item(“name”).InnerText ' 用 ”Item” 可以逐级往下读数据
xmlInfo.Item(“RegInfo”).Item(“pass”).InnerText=“MyPass”
xmlInfo.Save(“info.xml”) ' 保存信息到 xml 文件

tuenhai原来打算用 INI 格式来保存“论坛自动发帖机”的注册信息和发言信息,但是,一则读写 INI 不是很方便,二则 XML 在软件开发中越趋重要,于是一开始就用 XML 文件来保存有关信息。在刚接触 VS.NET 时本不知 XML 为何物,现在可自如在“论坛发贴软件工具”读写 XML ,是否有点 ” 高手 ” 的感觉呢?(陶醉一下先)

2. 用 HttpWebResponse 相关类 GET 和 POST 信息用 GET 方式读取网页源代码:

Dim httpReq As System.Net.HttpWebRequest 'HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
Dim httpResp As System.Net.HttpWebResponse
Dim url as String=“ http://www.Tuenhai.com  'tuenhai的小站
Dim httpURL As New System.Uri(url)   
httpReq = CType(WebRequest.Create(httpURL) , HttpWebRequest)
httpReq.Method = “GET”
httpResp = CType(httpReq.GetResponse() , HttpWebResponse)
Dim reader As StreamReader = _
New StreamReader(httpResp.GetResponseStream , System.Text.Encoding.GetEncoding(“GB2312”)) ' 如是中文,要设置编码格式为 ”GB 2312” 。
Dim respHTML As String = reader.ReadToEnd() 'respHTML 就是网页源代码
httpResp.Close()

向服务器 POST 信息:

Dim httpUrl2 As New System.Uri(“ http://www.Tuenhai.com ? ” & “name=1&pass= 6” ) ' “&” 号后面是 ' 注册信息,改成你自己的
Dim req As HttpWebRequest
req = CType(WebRequest.Create(httpUrl2) , HttpWebRequest)
req.Method = “POST”
req.ContentType = “application/x-www-form-urlencoded”
Dim bytesData() As Byte = System.Text.Encoding.ASCII.GetBytes(“name=1&pass= 6” )
req.ContentLength = bytesData.Length
Dim postStream As Stream = req.GetRequestStream()
postStream.Write(bytesData , 0 , bytesData.Length) ' 以上为向网络服务器 POST 信息

Dim res As HttpWebResponse = CType(req.GetResponse() , HttpWebResponse)
Dim reader As StreamReader = _
New StreamReader(res.GetResponseStream , System.Text.Encoding.GetEncoding(“GB2312”))
Dim respHTML As String = reader.ReadToEnd() 'respHTML 为 POST 后网络服务器返回的信息
MsgBox(respHTML) ' 可用 MsgBox 查看返回的信息
res.Close()


3. 用正则表达式从网页源代码中提取网址
得到网页源代后,我们可以对源代码进行处理,比如提取其中的链接, Email 地址,图片地址, Flash 等等,这在论坛自动发贴软件工具中很有用。

Dim r As System.Text.RegularExpressions.Regex
Dim m As System.Text.RegularExpressions.MatchCollection
Dim respHtml As String = “http://www.NETsh.Net/subdomains/f_s_o.php?leibie=shangmao” ' 以这个地址举例
strRegex = “http://([\w]+\.)+[\w]+(/[\w.?]+)+leibie[=]{1}[\w]+” ' 用这个正则表达式可以提取上面地址。通用 ' 的提取链接正则表达式为 ”http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?” 。  
r = New System.Text.RegularExpressions.Regex(strRegex , System.Text.RegularExpressions.RegexOptions.IgnoreCase)
m = r.Matches(respHTML)
Dim i As Integer
For i = 0 To m.Count - 1
MsgBox(m(i).Value)
Next i


四.掌握并利用大量网络资源来辅助 VS.NET 的学习,你将事半功倍。



现在tuenhai的“论坛自动发贴器下载版”已经用 .NET 全面改写,并用上继承,重载,多线程等,所有这些在 VB6 中能否实现,从 VB6 转到 .NET 是否明智?

从 2003 年 10 月开始学习 VB6 编程, 11 月半用 VB6 完成第 1 个软件——“自动发帖工具下载版”,到 2004 年 1 月 17 日 用 VB.NET 技术改写“论坛发贴工具下载版”。可算基本入门。原来没有一点编程基础,全部用的业余时间,没有当面请教一个老师。如果学得还算顺利的话,很大部分要归功于掌握并利用大量网络资源。下面列出tuenhai所掌握的 VS.NET 网络学习资源,有什么遗漏希望大家能指出。

1.  微软技术支持在你学习 VS.NET 的过程中,有疑问首先要向 Microsoft 求助。
如果你不懂得利用 Microsoft 提供的庞大的学习资源,我要告诉你,你舍近求远了。
( 1 )首先,你要安装 MSDN ,他比市面上所有的 VS.NET 书籍详细。tuenhai为了装 MSDN ,可是牺牲了 98 和 XP 双启动,改成 Windows XP 单系统。装了 MSDN 后,你要学习正则表达式, VS.NET 2003 中点击 ” 帮助 ” ,再点击 ” 搜索 ” ,然后输入 ” 正则 ” ,一回车,哇,找到 470 个主题,这下你慢慢研究吧。实在研究不透,也不用急,还有 Google 和 CSDN 呢。
( 2 )在线 Microsoft .NET 框架 SDK 快速入门教程,可配合 MSDN 使用。http://chs.gotdotnet.com/QuickStart。
( 3 ) 微软中国社区http://www.mscommunity.com
( 4 )在线 中文 MSDNhttp://www.microsoft.com/china/MSDN/
在线英文 MSDN, 考考你的 E 文,不过有金山词霸在,tuenhai都不怕,你还用怕什么呢http://msdn.microsoft.com/

为什么选择 VS.NET ,为什么看好 VS.NET ,看看 Microsoft 的 Help 文档有多详尽就知道了。如果你不去利用 Microsoft 提供的庞大的 Help资源,是不是有点对不起盖茨呢!

2. CSDN http://www.csdn.net/CSDN 号称中国最大的开发者网络,确实不假。tuenhai最常去的是 CSDN 的文档 http://www.csdn.net/develop/论坛 http://community.csdn.net/

只要你善于利用搜索功能,你在开发中遇到的许多问题可在 文档 和 论坛 中找到答案。如果你在开发过程中遇到疑难,而你又认为 Bill Gates 帮不上你的忙,那么,你就上 CSDN 吧,一定会让你满意的。教你两个绝招,
第一招,是 ” 搜索大法 ” 。遇到问题,首先是在 CSDN 的 文档 和 论坛 进行搜索,看有无类似答案。如不行,再下一招。
第二招, ” 提问大法 ” ,只要有礼貌有诚意地在论坛提问,一定有许多人乐于回答你的问题。

3.  其他相关网站、专栏有不少网站开辟 VS.NET 专栏,常去看看,必有收获。
太平洋开发特区 http://www.pconline.com.cn/pcedu/empolder/net/
赛迪的 NET 专区 http://tech.ccidnet.com/col/1135/1135.htmlCSDN 上 Latitude 的 VS.NET 专栏 http://www.csdn.net/develop/author/netauthor/Latitude/
孟宪会之精彩世界( http://dotnet.aspx.cc/)
博客园( http://www.cnblogs.com/ )
博客堂( http://blog.joycode.com/ )
北京希望电子出版社图书素材资料下载 http://www.b-xr.com/
清华大学出版社 VS.NET 源码下载 http://www.wenyuan.com.cn/zxtsxz.asp还有tuenhai的小站(做个广告) http://www.Tuenhai.com

4.  国外编学习资源如果你的 E 文不错,不妨上 E 文网站去取经。  http://www.startvbdotnet.com
http://www.vbdotnetheaven.com
http://www.vbaccelerator.com
http://www.vbcity.com/
http://searchvb.techtarget.com/
http://www.vbwire.com/
http://builder.com.com
http://www.developer.com
http://www.codeproject.com
http://www.dotnetjunkies.com
http://www.planet-source-code.com/
http://www.a1vbcode.com/
http://www.freevbcode.com/
http://www.vbcode.com/
http://sourceforge.net/
http://www.syncfusion.com/FAQ/WinForms/
http://www.123aspx.com
http://panopticoncentral.net/
http://www.regexplib.com/
http://www.harding.edu/USER/fmccown/WWW/vbnet_csharp_comparison.html
http://www.only4gurus.com/v2
http://www.gotdotnet.com
http://www.programmersheaven.com/
http://www.aspnetpro.com
http://www.dotnetgenius.com/
http://www.devx.com/dotnet
http://www.devhood.com
http://www.devshed.com/
http://www.devarticles.com/
http://www.c-sharpcorner.com/
http://www.csharphelp.com/
http://authors.aspalliance.com/aldotnet/examples/translate.aspx
http://www.developerfusion.com/
http://www.dotnet247.com
http://www.codestudy.com

当然,还有一个地球人都知道的,全球最大的知识仓库,tuenhai不说,你也早就应该知道的,那不是 http://www.google.com 又是什么!
(更多文章请访问www.tuenhai.com 20041212)  

                     

- 作者: tuenhai 2006年05月25日, 星期四 17:00  回复(0) |  引用(0) 加入博采