SUGA's profileIMHOPhotosBlogListsMore Tools Help
感谢访问!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
SUGAwrote:
听法听法,走法走法,看法看法~
June 14



Click for Shanghai, Virginia Forecast



您是第Web Counter位访客

IMHO

工作学习见闻 技术分享
May 31

大学里小偷最爱偷的十样东西

在大学里,总是有很多东西,原来是属于你的,然后莫名其妙就再也找不着了,据国家小偷协会不完全统计。在大学里,他们最愿意偷的东西有以下几种。
第十位:被子
可能有很多人不理解为什么被子能入选,我给大家解释一下,首先要从学校说起。一般来说,大学一进校,学校就会经我们准备好被子等生活用品,当然是得自己出钱的,想要学校白送,除了把你遣送回家以外,是不会白送的。再说被子的事情,被子因为是学校统一发的,所以花式是一样的,偷了也没人会知道,你怎么查也是查不到的。然后说怎么个偷法,一般来说,学校的寝室不会都是阳面,在阴面的同学就会把被子拿到天台上去晒,然后也不会陪着被子在上面晒。别的同学呢,看好机会,上去把被子拿了,你说这事儿,你怎么查?
失主需要度:10
偷窃难度:3
第九位:洗发水
其实这个到没什么好说的,大多数都不是别人蓄意要偷。一般来说,有两种情况会被偷,第一,自己去洗澡,忘到冲凉房了,过了一天还想起来。这样的洗发水,要是不被偷,那才怪了,有一次,我的牙刷没拿回来,都不见了,这事儿没地儿说理去。第二,哥们打球回来,然后自己的洗发水用完了,一身汗也不想出去,自己寝室找不到,就去别的寝室打一瓶,用谁的不是用啊。但是回来之后,怎么也想不起,到底是拿的谁的,然后就用了。这你也不好怪别人,点儿被不能怪社会啊。
失主需要度:8
偷窃难度:2
第八位:书
窃书,也是偷书的一种。最好是把书偷去了你能自己看看,要是自己不看,直接去旧书市场,一块一本给卖了,那真的很不地道。现在的书大家都知道,你抄我,我抄你的,还老贵,买10本同一专业的书,你总结一下,最多有5本是自己创新的,还有5本,都是把这5本的书,这找一段,那找一段合在一起的,和我们写论文是一样的。在教室,一不小心书就没了,这很正常。
失主需要度:10
偷窃难度:5
第七位:钱包
钱包这东西吧,也不好说,也不能说是大学里容易被偷,这玩艺儿到哪儿都容易被偷,我可不是说的瞎话。偷钱包是个高级工种,一般人还真不会偷就是了,传说中,还得食指和中指一样长。这可不是朝夕之功啊,台上一分钟,台下十年功,要是被捉到,别提多惨了。现在都不把小偷当人,都往死里打。
失主需要度:9
偷窃难度:8
第六位:饭卡
这个,你只要在食堂小心一点儿就好了,在别的地方,也没什么。关键是你在食堂的时候,不能把饭卡挂在胸前。我见到一个最狠的哥们,可能是开玩笑啊,不过大家还是引以为鉴的好。一个同学刚打好饭,在那个搞饭盒呢,把饭人多,挤嘛,第二个打饭的同学上去,打了饭,随手从第一个同学胸前拿了卡就刷了。如果是认识还好,要是不认识,这也太狠了。所以饭卡这个东西啊,不但要防被偷,还得防盗用。
失主需要度:7
偷窃难度:7
第五位:手机
看看《天下无贼》吧,那是对手机被偷最完美的诠释。现在一般大学生身上最值钱的也就是手机了,偷别的也不值几个钱,所是手机是很容易丢的。
失主需要度:9
偷窃难度:6
第四位:电子辞典
上自习的时候,谁不打个盹儿啊,泱泱中国都还有打盹儿的时候。这一睡东西就给丢了,很正常。上回哪儿看了个校园的短片就是这样的,上自习,别的也没什么值钱的东西,也就电子辞典了。我不是有意说家景不好的同学,不过,他们是经常干这种事情,因为小偷是不会去自习室的。
失主需要度:5
偷窃难度:6
第三位:自行车
不管多少人给你看车,该丢还得丢。大学城里的自行车,偷来买去,总数从来没变过,在变的只有车的主人。如果你看见一辆自行车很像你的,但是颜色不对,那你上去用钥匙刮一下,没准儿就能刮出个你熟悉的颜色。
失主需要度:4
偷窃难度:7
第二位:足球
经常踢球的朋友可能都有过丢球的经历,当然也包括篮球了。一个人,抱个球去踢,想加到别人一伙里,别人同意了,但是别人有球,就把自己的球放到边上。一阵拼杀之后,夕阳西下,一找自己带来的球,没了!就是这么回事儿,你别说,现在的球还挺贵,我记得我在高中踢15块的足球,我们班,一个周踢坏一个,现在到大学来,踢150的足球,一学期不见3个。
失主需要度:6
偷窃难度:4
第一位:女朋友
大学男生,什么都是公用的,拖鞋,床,电脑,烟,当然也有女朋友。女朋友这个吧今天还是你的,明天就不知道她在和谁在一起了。大学男生基本上都是要丢一把女朋友的,就算毕业还没来得及丢,毕业后也过不了多久就会丢的。不过也没什么,这个吧,容易丢也容易找,不过找回来的不是自己的,但是都是女朋友啊,无差别。我想这个不用我再多做阐述了吧?
失主需要度:10
偷窃难度:0

30 million Chinese currently suffer from depression

Just 10 percent of the 30 million Chinese currently suffering from depression are getting proper medical care due to a lack of psychiatrists and social prejudice against mental illness, experts have said.

At a meeting in Shanghai last week, mental health professionals said that China has just 17,000 registered psychiatrists, or one for every 76,000 people.

Most Western countries have a 10-times better ratio.

Hao Wei, vice-director of the Chinese Psychiatrists' Association, said that more than 60 percent of those currently suffering from depression could greatly benefit from proper medication or professional psychiatric help.

"But there are just too few doctors available," Hao said, adding that investment in mental healthcare was also insufficient.

Hao said that about 25 percent of depression cases are first diagnosed by physicians.

"We need to help our physician colleagues recognize the early signs of depression, so that they can refer those patients to psychiatric professionals," Hao said.

However, the greatest problem, Hao said, comes from society, in the shape of the widespread prejudice people have toward those with mental health problems.

Because of public prejudice, many patients are reluctant to visit hospitals specializing in mental care, he said. As a result, 75 percent of all anti-depressants are prescribed by physicians.

Some patients are reluctant to take such pills, as they are concerned about the side effects, Hao said.

The economic cost of depression, in terms of medical bills and lost manpower, is about 60 billion yuan a year, experts said.

A survey conducted recently in Zhejiang and Hebei provinces found that depression was more prevalent in rural communities. Women were also more likely to suffer from it than men, the survey said.

girl of consideration

If you kiss her, you are not a gentleman 吻她吧,不君子

If you don't, you are not a man 不吻吧,不象

If you praise her, she thinks you are lying 夸她吧,你欺

If you don't, you are good for nothing 不夸吧,你笨蛋

If you agree to all her likes, she is abusing 她吧,你气管炎

If you don't, you are not understanding 吧,不善解人

If you make romance, you are an 'experienced man' 太浪漫,疑你老

If you don't you are half a man 矩,魅力不足

If you visit her too often, she thinks it is boring 常看她,招她厌烦

If you don't, she accuses you of double crossing 少去点,怨你猎艳

If you are well dressed, she says you are a playboy 穿得好,你花心

If you don't, you are a dull boy 邋遢些,缺个心眼

If you are jealous, she says it's bad 吃醋吧,你太狭隘

If you don't , she thinks you do not love her 大度点,你不

If you attempt a romance, she says you didn't respect her 吧,不尊重

If you don't, she thinks you do not like her 安分吧,不够爱宠

If you are a minute late, she complains it's hard to wait 了,她等得

If she is late, she says that's a girl's way 了,女孩特

 

May 23

Laughter is Good for the Heart

Laughter is good for the heart because it prolongs life while depression increases the risk of an early death, according to two new studies. 

  A good bout of laughter every day provides similar cardiovascular benefits as exercise because it stimulates the blood flow, said Michael Miller, who headed one research team at the University of Maryland. 

  On the other hand, depression -- or the lack of laughter -- is often linked to unhealthy habits such as smoking and drug addiction and increases the risk of death by 44 percent, said Wein Jiang, who led a study of 1,000 heart patients for the University of North Carolina. 

  Miller said laughter produced a "magnitude of change ... in the endothelium ... similar to the benefit we might see with aerobic activity, but without the aches, pains and muscle tension associated with exercise" 

  While laughter should not replace exercise, he said, "We do recommend that you try to laugh on a regular basis. Thirty minutes of exercise three times a week, and 15 minutes of laughter on a daily basis is probably good for the vascular system." 

  参考译文:

  美国科学家的两项最新研究结果显示,笑能使人精神愉悦,同时还对心脏大有好处;相反,心情沮丧则不利于身体健康,甚至会增加早死的危险。
 
   其中一项研究的负责人、美国马里兰大学的迈克尔·米勒表示,笑给心血管带来的好处就像锻炼可以给心血管带来好处一样,因为笑可以促使血液流通。而北卡罗 莱纳大学的另一项研究则表明,心情沮丧或缺少笑容却常常与诸如抽烟、吸毒等不健康的生活习惯联系在一起,同时还会将死亡的危险增加44%。 

  对此,米勒表示,笑会在心内膜内引起某种变化,其效果和做有氧运动时差不多,但笑可以使我们远离由运动带来的伤痛和肌肉紧张等不良影响。 

  但他同时也表示,笑也不可能取代体育锻炼,两者应该有规律地同时进行。他说:“我们建议人们一周进行3次体育锻炼,每次30分钟;另外,每天要笑15分钟,这样会对人们的脉管体统大有裨益。”

The New Generation in Japan


日本的新一代

IN THIS ARTICLE: Japanese students seem to be losing patience with work ... (and) prefer easy jobs without heavy responsibility.

本文简介:日本学生似乎正对工作失去耐心(而且)更喜欢无需负重大责任的轻松工作。


[1]Japan's post-World War II value system of diligence, cooperation, and hard work is changing. Recent surveys show that Japanese youth have become a "Me Generation" that rejects traditional values.

[2] "Around 1980 many Japanese, especially young people, abandoned the values of economic success and began searching for new sets of values to bring them happiness," writes sociologist Yasuhiro Yoshizaki in Comparative Civilizations Review. Japanese youth are placing more importance on the individual's pursuit of happiness and less on the values of work, family, and society.

[3] Japanese students seem to be losing patience with work, unlike their counterparts in the United States and Korea. In a 1993 survey of college students in the three countries, only 10% of the Japanese regarded work as a primary value, compared with 47% of their Korean counterparts and 27% of American students. A greater proportion of Japanese aged 18 to 24 also preferred easy jobs without heavy responsibility.

[1]日本二战以后形成的勤奋、合作和努力工作的价值体系正在发生变化。最近的调查显示,日本青年已变成了拒绝传统价值观的自我一代

[2]“1980年前后,许多日本人,特别是年轻人,摒弃了经济上成功的价值基准,开始寻找能给他们带来幸福快乐的新的价值准则,社会学家吉崎康宏在《文明比较评论》一书中这样写道。日本青年人现在越来越重视追求个人幸福而越来越少关注工作、家庭和社会的价值基准。

[3]日本学生似乎正对工作失去耐心,而美国和韩国学生却不是这样。在一项1993年的对这三个国家的高校学生进行的调查中,只有10%的日本人认为工作是一个主要的价值体现物,而韩国人和美国人分别是47%和27%。年龄在1824岁的大多数日本人还更喜欢无需负重大责任的轻松工作。

[4] Concern for family values is waning among younger Japanese as they pursue an inner world of private satisfaction. Data collected by the Japanese government in 1993 shows that only 2304 of Japanese youth are thinking about supporting their aged parents, in contrast to 63% of young Americans. It appears that many younger-generation Japanese are losing both respect for their parents and a sense of responsibility to the family. Author Yoshizaki attributes the change to Japanese parents' over-indulgence(过分溺爱) of their children, material affluence, and growing concern for private matters.

[5] The shift toward individualism among Japanese is most pronounced among the very young. According to 1991 data from the Seimei Hoken Bunka Center of Japan, 50% of Japanese youth aged 16 to 19 can be labeled "self-centered(以自我为中心)", compared with 33% among those aged 25 to 29 To earn the self-centered label, the young people responded positively to such ideas as "I would like to make decisions without considering traditional values" and "I don't want to do anything I can't enjoy doing".

[6] Diminishing social responsibility, according to Yoshizaki, is tied to the growing interest in pleasure and personal satisfaction. A study comparing society-conscious youth from 1977 to 1990 found that the Japanese had slipped far behind(落后) American and Australian students. Only 11 % of Japanese aged 18 to 24 said they get personal satisfaction in doing something on behalf of(代表) society, according to 1993 data from the Japanese government, while four limes as many Americans said 50.

[7] Yoshizaki concludes that the entire value system of Japanese youth is undergoing major transformation, but the younger generation has not yet found a new organized value system to replace the old.

[4]日本小青年中对家庭价值基准的关心在逐渐衰退,取而代之的是追求个人内心世界的满足。日本政府于1993年搜集的数据表明,只有23%的日本青年想着要供养年迈的父母,与美国青年的63%形成鲜明对比。这显示出很多年轻一代的日本人正丧失对父母的重视和对家庭的负任感。作者吉崎康宏将这种变化归咎于父母对对孩子的纵容溺爱、物质的富有和对个人事物关注程度的增强。

[5]日本人向个人主义的转变在青少年中最为显著。根据日本生命保险文化中心1991年的数据,50%的1619岁的日本青年可被列为以自我为中心,则比之下在2529岁的青年中这一数字仅为33%。对诸如我作决定时无意考虑传统价值观我不想做我无法喜欢做的任何事情这样的想法持肯定态度为青年人赢得了以自我为中心的标签。

[6]吉崎康宏认为,社会责任感的削弱与个人满足和享乐的兴趣增长密切相关。一项从1977年到1990年对有社会意识的青年进行对比的研究发现,日本人远远落后于美国和澳大利亚学生。1824岁的日本人中,只有11%说他们从为社会做事中得到个人满足,根据1993年日本政府的数据,这么说的美国人是日本人的四倍之多。

[7]吉崎康宏得出结论:日本青年整个价值体系正在发生重大变化,但年轻的一代尚未找到一个新的有组织的价值体系来取代旧的。

巧用自言自语法提高英语口头表达能力

      本文讲述了“自言自语法”在提高学生英语口语能力中的重要性及如何巧用“自言自语法”,并在调查分析的基础上进一步提出了“自言自语法”确是一种能有效提高学生英语口语力且普遍运用的英语口语训练方法。
    大学英语课程的教学目的之一是培养学生的知识能力和用英语进行口头交流的能力。作为一种教学手段,口语训练是培养阅读和写作能力、学习语音、语法和词汇的 重要方法。一般来说,衡量一个人英语口头表达能力主要看以下几个方面:(1)语言的准确性(accuracy)和得体性 (appropriateness);(2)语音(pronunciation)、语调(intonation)是否正确,口齿是否清楚;(3)话语组织 (discourse management)是否合理;(4)口语表达的流利程度(fluency);(5)语法(grammar)是否正确,用词是否恰当,语言是否符合英语 表达习惯。这些是衡量英语会话能力的主要标准,针对这些标准,要提高英语口头表达能力,就要采取相应的训练方法,方法恰当了,就能起到事半功倍的效果。

   一、何谓“自言自语法”?

   “自言自语法”,即以自己跟自己交流的方式,促成英语口语能力提高之方法。它不受时间及其他交流因素的限制,只要有一个属于你的空间,自己对着自己用英语讲就可以了,此方法是正常课堂英语口语训练的有益补充。

   二、如何巧用“自言自语法”进行英语口

   1、自主创造语言环境

    “自言自语法”练习中,你可以随心所欲地创造语言环境。在自己的房间里,没有人会笑话你,尽可以大胆他说。你可以在散步时说给风儿,说给花草树木;你可以 在欣赏影片时跟着主人公倾诉喜怒哀乐;你可以在睡前或一觉醒来时说说自己的憧憬,描绘自己的梦境。总之,你可以在任何时候、任何地方采取适当的语速和音 调,随心所欲他说。

   2、善于模仿


  采用“自言自语法”提高自己的英语口语能力要学会模仿。模仿的原则: 一要大声模仿。这一点很重要,模仿时要大大方方,清清楚楚,一板一眼,口型要到位,不能扭扭捏捏、小声小气地在嗓子眼里嘟嚷。二要仔细模仿。优美的语音、 语调不是短期模仿所能达到的,对于有英国英语基础的人学说美国英语也是如此,对于习惯于说汉语的人学说英语则更是如此。此外,模仿时还要有耐心,有信心, 有恒心,不能有任何松劲畏难情绪,要相信自己完全有能力模仿得更好。

  3、及时复述

  复述方法有二:一是阅读后复 述。阅读后复述就是在阅读完一段文章或一篇文章后,用自己的语言采用“自言自语”的方式来表达文中的内容。你可以在复述时使用文中的某些内容,但应尽量避 免完全背诵;你也可以在复述时使用文中出现的关键词或部分句型,作为复述的线索,帮助自己较完整地复述所读材料。二是听磁带或看影片后复述。这种方法既练 听力,又练口语表达能力,采用此种方法训练时,最好使用磁带或影片中的原话来复述,这样可以较准确地矫正自己的语音和语调,体味地道的英语口语。在说的过 程中,应尽量避免出现语法错误。刚开始练习时,因语言表达能力、技巧等方面的原因,往往复述接近于背诵,但在基础逐渐打牢后,就会慢慢放开,由“死”到 “活”,在保证语言正确的前提下,复述可有越来越大的灵活性,如改变句子结构,转换表达方法,用自己在课堂上新学的词汇和句型来替换一些不常使用或难于理 解的东西,对于自己读音掌握不准的词汇可以不用,等复述完后再通过查词典或听录音进行正音。

  4、 有目的地去选择说的材料

   开始练习“自言自语法”时,笔者建议你认真选择所说材料。开始时,你可以练习复述小故事,语言应尽量生动、简练,有明确的情节,这样可以帮助你更好地把 握语言的连贯性。你可以选你所熟悉或喜欢的内容说,你可以复述课堂上学习的内容,你可以说说你自己的向往。在选择说的内容时,亦应力求练习内容全面,你可 以说一封信,一张便条,一个建议,一份说明书,一篇演讲稿,一篇小议论,
一段求职信或感谢信等。你可以说说你的工作,你的家庭,你的业余爱好,以及你为什么学英语等等。有了一定基础后,可练习口译。看中文电影,用英语翻译主人公的话语。

   5、狠抓句型训练

  句子是说话的应用单位,所以培养口语能力就要狠抓句型操练。采用“自言自语”法训练英语口语亦要求如此。你可以使用自己在课堂上所学的句型练习“自言自语”,这样可以加深对所学知识的理解和运用,达到学用结合。

     6、说话时要带手势、动作、表情
    语言是人类交流思想的工具,但它不是唯一的工具。手势、动作、表情等都是交流思想的工具或辅助工具。在日常会话中,这几种思想交流的工具往往是同时使用 的。说话时绘声绘色,可以大大增强语言的生动性和感染力。自言自语时带手势、动作、表情,可以帮助你记忆和自然地使用英语。

  7、注意说的质量

   说的能力是一种技巧,是在大量的口语练习中培养起来的。学习说英语,由说得不好到说得比较好,是一个发展过程。练习过程中,要住意精泛结合,有的练习里 的错误不要纠正,不要过分注重准确性,以着重培养说话的流利程度;有的练习里的错误要纠正,以提高说话的质量。最好从一开始就注意说的质量,即保持说的正 常速度,流利自然。在开始练习“自言自语”时,不要过分放慢语速。一旦习惯于慢速度,听到正常的语速,也会感到吃力。在开始接近正常语速时,若感到困难, 宁肯多练几遍,也不可放慢语速。开始的时候接近正常,以后跟着快下去,就不存在困难。这里所说的速度,是指接近或比较接近英、美人说话的一般语速。

   笔者在2001年初对徐州师范大学工学院2000级共354名学生做过“自言自语法”自我评估问卷调查。数据显示:在354名参加调查的学生中,有 232人选择了喜欢“自言自语法”,占总人数的65%;有98位学生选择了比较喜欢“自言自语法”,占总人数的28%;只有24位学生选择了不喜欢“自言 自语法”,仅占总人数的7%。调查数据表明,采用“自言自语法”来提高英语口语表达能力受到学生的普遍欢迎。有不少学生在坚持“自言自语法”一段时间后反 映良好,这充分说明“自言自语法”确是一种提高学生英语口头表达能力且行之有效的方法。
中国人较内向,在公开场合羞于开口,尤其是当对自己要说的不够自信的时候。而“自言自语法”是克服害羞心理,提高英语口语交流能力的一个很好的途径。要创造练习口语的机会,逐步建立起言语自信,最终达到流利表达的目的,建议你不妨试一试“自言自语法”。
May 22

爱要怎么说出口

If only we’d never gone there, thought Alan. They were scrambling up the mountainside in the late afternoon heat. Alice was so tanned that she looked as if she had lived on the Mediterranean for months, while he, being fair, had turned a blotchy, peeling.

阿兰心里想道:要是我们从未到过那个地方该多好啊。在下午后半晌的炎热中,他们向山坡上爬去。爱丽丝被晒得黑黝黝的,看上去就像在地中海上住过几个月似的;而阿兰原本细皮嫩肉,这时身上已经变得红一块白一块,脱了一层皮。

He looked up at the mountainside, the path twisting upwards towards the cairn cross, the white heat bleaching the rock. Why on earth couldn’t they talk about it? Why couldn’t he even accuse her?

他抬头向山坡望去,只见小路盘旋而上通向那个圆锥形十字石碑,炽热的阳光将岩石晒得发白。他们究竟为什么不能谈那件事?他为什么连责骂她都不能呢?

He had thought it was going to be all right. But it was as if the heat had drained their love.

他原以为一切都会好的,但好像酷热已经将他们的爱抽干。

At home they had been so blissfully happy that he now realized it couldn’t have lasted. She comes to his school from the Midlands because her family had split up. An only child, living with her father, trying to look after him, lonely, depressed, anxious, she had come to Alan to be healed. At least, that’s what he liked to think. Had he healed her? No. Tom had, even though Alan loved her with all the passion. Now his hatred for both of them was as strong as his love.

在家时,他们曾是多么幸福。现在他意识到那不会再继续下去了。由于家庭破裂,她从内陆来到他的学校。作为独生女,她和她的父亲住在一起,尽力去照顾他。她孤独无依、无精打采、愁眉苦脸,经常到阿兰那里去排除忧伤。至少他喜欢这样认为。他为她解忧了吗?没有。是汤姆,即使阿兰曾付出所有的激情爱着她。如今他对他们俩的爱就像他的恨一样强烈。 “Come on!”Alice had turned back to him, waving impatiently.

跟上!爱丽丝转身向他喊,不耐烦地挥着手。

“Coming,”Alan looked at his watch. Five, The crickets would start singing soon. He walked on, the sweat pouring into his eyes. Knowing she had opened the bottle of mineral water. Would she let him catch up with her? An even greater misery seized him. It reminded him of the night he made himself drunk on the rough local wine his parents bought in the village. His heart had ached then, too, and his sense of loss had increased as he relived each minute of a day when Tom and Alice had seemed to draw closer and closer together.

来了。阿兰看了看手表。已经5点了。蛐蛐儿马上就要开始鸣唱了。他继续向上走,汗水源源不断地流到了眼里。他知道她已经打开那瓶矿泉水。她会让他跟上她吗?一种更大的痛苦折磨着他。这使他想起那天晚上他用父母亲从村里买的粗制的当地酒将自己灌醉的情景,那时他的心也在发痛。每当他想起爱丽丝和汤姆越来越亲近的时候,他的失落感就会与日俱增。

He walked faster. Here, a few miles away on the bare mountainside, there was arid space, and the olive groves, clustered in the stone-cluttered valleys below.

他走得越来越快。他为山顶上那些中世纪的城堡而欢呼雀跃。放眼望去,离那座山几里远的地方有一块空地,在山谷的乱石丛中生长着一小片橄榄林。 “Come on!”

跟上!

“Coming.”

来了。

Alan strode doggedly on, looking down at his red, peeling legs, thinking of Tom’s strong, straight, brown ones.

阿兰仍顽强地大步前行,他低头看了一眼自己被晒红的、脱了皮的两腿,想起了汤姆强健挺拔的棕色的双腿。

Suddenly he had turned the corner by the stone shelter. He could see her waiting for him. If Tom were here, they would be together, mocking him, looking at each other, leaving him alone. As he strode self-consciously on Alan focused his mind on her.

突然,他拐到石头后面一块隐蔽的地方。他看到她正在等他。如果汤姆也在这里的话,他们一定会站在一起嘲笑他,相互凝望着,把他丢在一边。当他拘谨地向前走的时候,他将注意力都集中在她的身上。

“Where’re we going to camp?”She was sitting on an outcrop, her slim body supple and salt-caked. Her legs were swinging and he longed to run his hands over them. Instead he imagined Tom doing that and hot, angry tears filled his eyes.

我们到哪里去宿营?她坐在一块突出的岩石上。她的苗条的身材丰满,咸咸的。她的腿在那里晃来晃去。他真想将自己的手在那上面滑动。而他却想象着汤姆那样做的情景。顿时,愤怒的泪水充满了他的眼睛。

“Santa Caterina.”

圣卡塔林纳。

“What’s that?”

那是什么?

“It’s a deserted monastery, down in the valley. Amongst the fir trees. Over there—look, you can see it.”

是一座破庙,在山谷下面,杉树丛中。在那里——看,你可以看到的。

“Oh yes.”She turned her head. When he did look he was shocked to see how beautiful she was, like a goddess.

噢,是的。她转过头。当他真正拿眼去看她的时候,她看上去是那样美,像一尊女神。

“Won’t that be spooky?”she asked in the slightly broken voice that he had always found so sexy.

那不可怕吧?她用略微沙哑的声音说。他发现她的嗓音竟是那样性感。

God, how he loved her. Why couldn’t he just take her in his arms now? That could solve everything. But there seemed to be an impenetrable barrier around her—as if she was sealed away by Tom.

上帝啊,他是多么爱她,现在他为什么不可以把她揽在怀里呢?这样,一切问题都会迎刃而解的。但是,好像她周围有一种难以逾越的障碍——就像被汤姆密封了起来。

“The valley’s dangerous,”said Alan, hoping to frighten her, to provoke reaction.“If the clouds come down there’s no way out. Sometimes for days.”

这个山谷很危险,阿兰说,希望吓住她,引起她一种反应。如果乌云压下来就会无路可走了。有时会持续好几天。

“Is there anywhere else to camp,”asked Alice.

还有其它地方可以宿营吗?爱丽丝问道。

“Not really.”Alan was certain she’d rather be with Tom. Yesterday he had seen them sitting on a wall together outside the villa. Their ankles had been entwined. He had wanted to grab Tom’s legs and pull him off. He would hurt his brother—and Alice would be sorry . It would be her fault.

说不准,阿兰敢肯定她一定会宁愿和汤姆在一起。昨天他曾见他们一起坐在别墅外的一堵墙上,他们的脚踝曾缠绕在一起,他曾想拽着汤姆的腿把他拉下来。他会伤害自己的弟弟。爱丽斯会感到内疚。那是她的过错。

“Let’s go,”said Alan quickly.

我们走吧,阿兰飞快地说。

“How far is it?”she asked.“I’m whacked.”

还有多远?她问,我一点劲儿也没有了。

“Half an hour.”

半小时。

“Can we eat them?”Her voice was a little plaintive. Alan noticed with satisfaction that she was becoming dependent on him again. But he knew that once they were off the mountain she would be with Tom. For a crazy moment he imagined Alice with himself living in the mountain valley together. Always. Trapped perhaps by some magical force that wouldn’t let them leave.

我们能吃点东西吗?她的声音有点儿伤感。阿兰心满意足,注意到她正在再次依靠他。但他知道一旦他们离开这座大山,她就会和汤姆泡在一起。一时间,他竟荒唐地想象着爱丽丝和自己一起居住在这个山谷,直到永远。或许是被某种魔力困在这里,不让他们离开。

The monastery was square-roofed, austerewith barrack windows. There were fish tanks at the back and a terrace on which the monks would have walked.

那座庙是方顶、木窗,十分简朴。庙后面有一些鱼缸,还有一个平台,和尚可以在上面随意走动。

Their feet on the stones made the only sound. Santa Caterina was utterly still. A swift rose soundlessly over the slate roof and the heat shimmered on the roughcast walls. They lay down, their rucksack still on their backs, passing the water bottle, almost dozing.

四周只有他们踏在石头上所发出的声响,圣卡塔林纳万籁俱寂。一朵怒放的玫瑰在石板屋顶无声无息,亮光在粗糙的墙壁上闪烁。他们躺下来,递过水瓶,旅行包仍背在背后。他们几乎昏昏欲睡。

Suddenly she sat up and looked him with surprising tenderness. Alan’s black mood eased slightly.

突然,她坐起来,用令人吃惊的温柔目光凝视着他。阿兰的难受情绪稍微得到了缓解。

Have they all gone then?”asked Alice.

他们都已经走了吗?爱丽丝问道。

“Yes. I don’t know when. A long time ago.”

是的。我不知道是什么时候走的。好长时间了吧。

She was lying back, her eyes closed. He could talk to her now. They could both talk the problem and solve it. They would reach each other. But he couldn’t make the move.

她仰面躺着,双目紧闭。他现在可以和她谈了。他们俩谈谈那个问题,然后就迎刃而解了。他们彼此都能探到对方,但他不能动。

“It would be terrible if it is pulled down,”Alice said idly, her eyes still closed.

如果庙被推倒,那将是多么可怕,爱丽丝懒懒地说,眼睛仍然闭着。

“It won’t be.”

不会的。

“How do you know that?”

你怎么知道?

“They patch it up from time to time.”

他们总是不断地修缮它。

“Why don’t they live here?”

他们为什么不住在这里呢?

“Don’t know. Maybe it’s too remote.”

不知道,或许这里太偏远了吧。

The desire to punish her had gone. But he daren’t touch her. He daren’t break the enchantment.

渐渐地,想惩罚她的欲望消失了,但他不敢触摸她,不敢轻易打破这令人着迷的时刻。

“The heat in the day. The cool evenings. It would be good to live like that.”

白天热,夜里凉。住在这种地方会很不错的。

“Live here?”

住在这里?

“Could we ever get permission?”

我们会被允许吗?

“I don’t know.”

我不知道。

“Just to see what it was like. I mean—”She half sat up.“Can we get inside?”She ran a finger gently down his peeling cheek.

先看看这里怎么样,我是说——” 她半坐了起来。我们能进去吗?她将一根手指轻轻地放在他脱皮的脸颊上。

Alan was taken aback but then he became aware that the crickets had started. How long had they been singing? He wondered.“Let go and see.”

他吃了一惊,随后意识到蛐蛐儿的鸣叫声已经响起。他不知道它们已经鸣唱了多长时间。让我们去看看吧。

They tramped round but as Alan already knew, there was no way in. In the end they came back and he lit a fire at the side of a small stone building. Other campers had obviously used the space and there were black marks on the walls.

他们绕过去,但正如阿兰早就知道的那样,无路可进。最后,他们又原路返回,在一座小型石头建筑旁生了一堆火。显然,其他野营的人也曾使用过这个地方,墙壁上还留有黑色的痕迹。

He cooked supper, using half a precious bottle of water to make it. The intimacy was still there but the talking was at an end. Alan could hardly contain his rising excitement. They had night together. Anything could happen.

他晚饭用去了半瓶珍贵的水,亲密关系依旧存在,但他们已经无话可说。阿兰几乎难以按捺那正在膨胀的冲动。他们一起拥有这个夜晚,任何事情都可能会发生。

Alan suddenly realized what he had to do. After supper, in the glow of the scented mountain twilight, he made coffee and they sat in silence. Darkness came slowly; the volume of the crickets seemed to increase. Still he had made no move.

阿兰突然意识到他必须得做些什么了。晚饭后,在芳香弥漫的大山的幽光中,他煮了咖啡,他们默默地坐在一起。夜幕慢慢地降临;蛐蛐儿的音量好像升高了。他仍没有行动。

She was lying in front of the fire, her body almost glowing. Alan reached out a hand and temporarily she took it. Then Alice yawned and stretched.“I’m turning in now,”she said.

她躺在火堆前,身上闪闪发光。阿兰伸出一只手,她暂时握住了他的手。接着,爱丽丝打哈欠,伸展身体。我现在要睡觉了,她说。

“More coffee?”asked Alan miserably.

再来点咖啡?阿兰痛苦地问道。

She kissed him on the forehead. “No thanks”

她在他的前额上吻了吻。不,谢谢。

Had he ever loved his brother Tom? He must have done sometime. Certainly he had always been jealous of him as a child. He the introvertTom the extrovert. Alan thought about his introverted personality. He could see quite clearly how he had failed so dismally with Alice and how Tom had taken over so easily. Tom was what she wanted. She didn’t want what he had.

他爱他的弟弟汤姆吗?有时他肯定爱,当然他总是忌妒弟弟,像一个小孩子。对他们俩来说,他性格内向,汤姆性格外向。阿兰想着自己内向的性格。他十分清楚自己如何在爱丽丝身上败得这么惨,而汤姆又是如何轻而易举便得到了她。汤姆正是她需要的那号人,她并不需要他这种人。 Gloomily, Alan climbed into the sleeping bag and drifted off to sleep. Beside him Alice slept, her breathing seeming to keep in time with the insistent beat of crickets.

阿兰闷闷不乐地钻进自己的睡袋,渐渐地进入了梦乡。躺在他身旁的爱丽丝也睡着了,她的呼吸声似乎和蛐蛐儿的鸣叫声保持同步。

Alan dreamt. The crickets had stopped. There was a slight breeze and the luminous hand of his watch registered just after two. Her sleeping bag was empty; Alice had gone. For a while he just couldn’t believe it. He sat up and felt the dark walls of Santa Caterina close in on him.

阿兰做了一个梦。蛐蛐声都停止了。一阵微风拂过。他的手表上的夜光针刚过了两点。爱丽丝的睡袋空了;她已经走了。好一阵子,他都无法相信这个事实。他坐起来,感到圣卡塔林纳的黑黢黢的墙壁将他团团围住了。

Then he was on the mountainside, stumbling blindly up the mountain path, hearing their laughter. Softly he crept up on them until he could see their bodies entwined. Alan’s anger rose to fever pitch and he rushed towards them. They fell apart. He sobbed as he had never sobbed since he was a child.

随后,他来到山边,踉踉跄跄地沿着山路盲目前行。听见他们的朗朗笑声,他轻轻地爬过去,看到两个身体紧紧地贴在一块。他感到痛苦万分,怒不可遏地冲向他们。他们猛地分开了。他低声啜泣,尽管他从孩提时起就从来没有哭过。

 She woke him anxiously shaking at his sunburnt shoulders.

她焦急地摇着他被太阳晒黑的肩膀,唤醒了他。

“What’s the matter”she kept asking over and over again“Alan, what’s wrong?”

发生了什么事?她一遍又一遍地问,阿兰,怎么了?

He stared up at her, blinking in the glow of the dying camp fire.

他抬眼盯着她,在篝火的余光中眨着眼睛。

“Nothing,”he said automatically.“Nothing really.”

没什么,他不由自主地说。真的没什么。

“But—”

可是——”

“Just a bad dream, that’s all.”

只是做了一个恶梦,仅此而已。

“You were crying.”Her voice was soft, tender, just like she used to be.

你刚才在哭,她的声音像过去那样温柔和气。

Alan turned over in his sleeping bag. “I’m fine.”he said.“Let’s get some sleep.”

阿兰在睡袋里翻了一下身,背对着她说:我很好,我们再睡一会儿吧!

Alan woke with the early-morning sun gently warming his face. He sat up, his head muzzy with the dream, his cheeks salty, tear-stained.“You were crying.”Her voice came back to him and he winced. Alice had felt sorry for him and he instantly smothered, patronized. He broke into a sweat of agony and apprehension. How could he ever open up a discussion with her now?

阿兰醒来时,晨阳暖暖地照在他的脸上。他满脸泪痕,咸咸的。他坐起来,脑海里还懵懵懂懂地萦绕着那个梦。你刚才在哭,她的声音又传了过来。他退缩了一下。爱丽丝已经感到对不起他了。他立即感到很压抑。由于巨大的悲痛和忧伤,猛地出了一身冷汗。现在他将怎样和她展开一场讨论呢?

He looked cautiously round her sleeping bag. It was empty and Alan froze. Then, gradually, he relaxed. It was just after eight and she had probably gone to find a place to go to the loo. He waited, calmly, gloomily, and then anxiously as she did not appear. Hurriedly Alan struggled out of his sleeping bag and began to search the grounds of the monastery. But there was no sign of her at all.

他小心翼翼地看了看她的睡袋,睡袋已经空了。阿兰一下子僵住了。随后,渐渐地,他又放松了。现在刚过8点,她也许是找地方方便去了。他平静地、忧郁地等待着,尔后还是不见她回来,就心急火燎起来。阿兰慌忙从睡袋里挣扎出来,开始在寺院里四处寻找。但踪迹皆无。

Panic set in as Alan scoured the grounds again and drew a blank for the second time. It was becoming increasingly obvious that she had walked out on him and was probably climbing down to Tom. But rather than feeling anger, Alan simply felt desolate. She hadn’t even left him a note. He went over and touched the inside of her sleeping bag. It felt cold.

当阿兰再次惊慌失措四处寻找仍然一无所获的时候,显然她已经不辞而别,很可能是下山找汤姆去了。阿兰感到的与其说是生气,倒不如说孤独。她甚至连一张纸也没有给他留下。他走过去将手伸进她的睡袋,里面冷冰冰的。

Surely she wouldn’t find her way back alone. Alan began to search again, this time through the tangled thickets of what might have been a herb garden. Something caught his eye. Lying on the ground was a small, shiny object. It was Alice’s bracelet.

她肯定无法独自找到回路。阿兰又开始找起来。这一次通过杂草丛生的灌木丛。某个东西引起了他的注意。躺在地上的是一个小小的、光亮的东西。那是爱丽丝的手镯。

Suddenly real fear clutched at him. Someone had come and abducted her. Or had Tom come to find her? But the bracelet?

突然,一种真正的恐惧袭上他的心头,一定是有人拐走了她,或者是汤姆来找她的?可是,手镯又怎么讲呢?

“Please God,”Alan muttered. “Let her be safe.”“Why hadn’t he looked after her? Why hadn’t he been able to reassure her? Alan now realized how he had locked himself into his own shell of rejection and jealousy. Tom no longer seemed a threat. All Alan wanted was Alice, and if only he could find her they would talk and talk and talk.”

求求你,上帝,阿兰喃喃道,保佑她平安。为什么他没有照顾她?为什么他没有安慰她?现在阿兰才意识到他以前是如何将自己锁进一个妒忌和沮丧的空壳里?汤姆看起来似乎不再是一种威胁。阿兰所想的全都是爱丽丝,只要能找到她,他们就会倾心长谈。

For the fourth time he began to search the grounds, the bracelet in his hands. Then , in a crevice on the broken stones of the terrace, he saw something bright and beady. Alice’s ring. And he knew how tight on her finger it was. Sweat ran down Alan’s face.

他开始第四次在地上寻找,千里拿着那只手镯,随后在一排房屋堆砌的石头缝里,他看见一件东西在发光——是爱丽丝的戒指,而且他知道那是紧紧地戴在她的手上的呀。阿兰的汗从脸上流了下来。

 “Alice,”he cried out. “Alice!?” No response. Alan began to run.

爱丽丝,他喊道,爱丽丝!没有回音。阿兰开始跑了起来。

It was only when he was back at the front door of the monastery that he realized there was one place he had not been to. His heart thumping and his throat dry, he went down the steps.

正当他惊恐地返回到那座庙的前门时,他意识到还有一个地方他没有去找。他的心砰砰直跳,嗓子发干。他走下台阶。

Now he ran eagerly forward, pushing his way through the foliage. He gave a gasp of relief. She was there, lying on the pine needles.

他急不可待地跑上前,推开树叶,看到她在那里,躺在松叶上,心里松了一口气。

“Alice.”

爱丽丝。

She woke slowly, sleepily, stretching in the sun. “Sorry—I fell asleep.”

她慢慢地醒来了,睡眼朦朦地在太阳下伸伸懒腰。对不起——我睡着了。

“Where the hell have you been?”

你究竟到哪里去了?

“I went for a walk.”

我出去走了走。

He held up the bracelet and the ring.“I found these.”He was angry, positive. She looked away.“Come on .Why did you do it?”I’ve been searching for you. I thought—I thought you’d been kidnapped or something. Been hurt?

他举起手镯和戒指。我找到了这些东西。他很生气,这一点是肯定的。她转移了视线。得了吧,你为什么这样做?我一直在找你,我还以为——我还以为你被绑架或者别的什么了呢。受到了什么伤害了吗?

“I’m sorry.”

对不起。

“That’s not enough.”

对不起就够了。

“I laid a trail.”

我留有痕迹。

“You did what?”He was outraged.

你到底做了什么呀?他怒气冲冲的。

“I wanted you to find me.”

我想让你找我。

“I was terrified—I thought—”

我当时很害怕——我还以为——”

“I’m sorry.” She stood up. “I suppose I wanted to frighten you.”

对不起,她站起来。我想我原来只想吓唬吓唬你。

“Why ?” he barked at her.

为什么?他大声问道。

She looked away again. “I didn’t think you wanted me any more.”

她又一次转移了目光。我还以为你不会再要我了呢。

“Wanted you?”

要你?

“You haven’t spoken to me. You seemed so cold. Indifferent somehow.”

你没有对我说过,你似乎很冷淡,在某种程度上无动于衷。

“But it’s you who were indifferent. ”

可无动于衷的是你。

She looked genuinely amazed.“I don’t know what you’re talking about.”

她看上去真的很吃惊。我真不知道你在说什么。

“I thought you wanted Tom. Didn’t want to be with me.”His voice broke.

我还以为你想要汤姆,不想和我在一块哩。他的声音沙哑。

“I thought you found him—more fun.”

我还以为你找他——开心去了呢。

“Him? Oh, he’s a baby. I was lonely, I suppose. You seemed so fed up with me. I didn’t realized it would —oh , Alan.” She got up and drew him to her , kissing him so hard on the lips.“You are such a bloody fool.” I love you—don’t you know?

他?噢,他还是一个小毛孩子。我很孤独,我想,你好像很烦我,我没有意识到那么——噢,阿兰。她站起来,将他拉向自己,深深地吻起了他的嘴唇。你真是个大傻瓜。我爱你——难道你不知道吗?

“Why did you come here?”he asked.

你怎么来到这了?”他问道。

“I was wandering about. I couldn’t sleep. Look—”She knelt down and stared at the Latin inscription on the two solitary graves.“Who are they?”she asked.

我是随便走走。我睡不着。瞧——”她跪下来,盯着前面的两座孤坟的拉丁碑文问道:他们是什么人?

“I don’t know. I’ve often wondered. Dom Carols Fuenta —he’s definitely a monk. But the odd thing is that he’s buried alongside a woman.” He paused and then went on.“Maria Degardes. He was buried in 1892. She was in 1894.”

我不知道。我也总是想知道。多姆·卡罗斯·福恩塔——他肯定是一个和尚,但奇怪的是,他和一个女人葬在一起。他暂停了一下,然后接着说道:玛丽姬·德加斯。他葬于1892年,而她葬于1894年。

“Were they lovers?”

他们是情人吗?

“I used to make up stories that they were.”

我过去经常想给他们编编故事。

“I was just thinking. A silly thought. I expect you’ll laugh.”

我刚才在想。是一个愚蠢的想法,我想你会笑我的。

“Try me.”

说说看。

“Suppose we lived here for the rest of our lives and when we died we were buried here. But in one grave. Together.”

假如我们今后生活在这里,我们死后就埋在这里,但要在一块。合葬。

Alan took Alice’s face in his hands and kissed her on the lips.

阿兰双手捧起爱丽丝的脸,在她的嘴唇上亲吻起来。

April 26

什么是企业家精神

        “一概念由法国经济学家-巴蒂斯特在1800年首次提出,即:企家使经济资源的效率由低高;家精神是企家特殊技能(包括精神 和技巧)的集合。或者家精神指企组织建立和经营管理企合才能的表述方式,它是一重要而特殊的无形生要素。例如,大的企家、 索尼公司始人盛田昭夫和井深大,他们创造的最大的不是收机,也不是条彩色像管,而是索尼公司和它所代表的一切;沃迪斯尼最大的 造不是《木偶奇遇,也不是《白雪公主》,甚至不是迪斯尼,而是沃迪斯尼公司及其使众快的超凡能力;尔顿大的造不是 之以恒的天天平价而是沃尔玛公司——一个能以最出色的方式把零售要领变成行组织

北京婚宴 PK 上海婚宴

洞房,闹还是不?主桌,坐父母是坐朋友?北京上海两座城市的婚礼俗居然好多都是截然相反的——北京人婚很少洞房,父母长辈领导坐主桌;上海人洞房会去豪酒店,主桌上坐的是没有婚的小青年。

最根深蒂固的差异,如果从视觉上来体会,那就是酒足饭饱走出酒店后,你是能继续看到太阳,是只能看到月亮?如果从时间上来比,那就是凌晨的候,新人始上紧发条,是准洗洗睡了

条不成文的矩:正午吉,新人入席,客人,立把北京新娘分。第一忍型:起得比高玉宝要早,凌晨就始化,翻着白眼人画 线睫毛;第二,撒型:本姑娘今不睡了,和姐妹搓麻将打牌,用完身最后一秒,反正今天上腺素分泌旺盛。熬夜、缺、欣喜、焦,皮得遭 多大的罪!所以我一直纳闷,那些面膜广告挖空心思弄意的人,怎没想北京新娘个角度来故事。

上海新娘就定多了,睡到台早新闻开播,再起来梳打扮也不。由于一般都是上五六点才席,一下子就比北京新娘多了五六个小,中午接了新娘到新房后,吃顿简单的午餐,小夫妻们还时间师摄一起出去拍外景,随后才哉游哉地到酒店。

上海人来,喜酒在中午,如果是西式自助餐,那是学洋派,能理解,要是把中式喜酒放在了中午,很多人的第一反肯定是家人非常拎不清(上海 不懂矩的意思)。这种对劲的感于北京人也是一,要是婚礼不是在正午,潜台词说出来就更不吉利,因那暗二婚

今年是婚旺年,良辰吉日,老矩也被迫放尺寸了,察一下两地有婚宴的新,正好相映成趣。

京制造的舆论调调——先吓,后安慰:比如,白天行婚宴的人太多太多,一旦婚只能从天津来,一旦天津司机在某桥处迷路了,一旦错过正午把新娘 贬为二婚负责不如,大家一起来打破婚赶早不赶传统观念,某某数据表明,上喝喜酒正在北京掀起一婚新

设计舆论攻略是——先安慰,后吓:比如,上海又增加了相当数量适合举办婚宴的星酒店和高境更好了,服更好了,菜品更好了。但是面子有 了,未必票子挺得住,4年前,上海人次婚只要花5万元人民,而如今平均每对上海新人婚的花已接近19万,全国最高,比第二名广州人多出5万! 所以你不妨考虑选择婚宴桌可以享受多少折扣,可以附送ABCD甲乙丙丁。精打算,量力而行,某某数据表明,中午喝喜酒正在上海掀起一 婚新

是否尚,可以翻来倒去地,不,中国新人婚到了一金的地,却是不争的事。上海婚花19万(包括新居装修但不包括房价)更是人看得心惊肉跳,和全国水平相比,超前消年数达到7年。

然,晚饭比午饭贵是一个理由,不有一个出血点在于:喜把婚礼折得越来越的,多半是女人,一旦表出像《老友》里Monica的婚礼 梦想迫症和婚礼策划偏狂,非得有个男人凉水,乱反正,让这群上海小姐们继续在空中漂着美着——很明,上海男人不具有这样资质,所以婚 礼的账单就只能一路上

到婚礼算的防死守,北京男人就比现实的根基,关键时候不心,况且老祖宗早就知道晚饭比午饭贵,大模作,赶早,反正包照收;小范上再搓一,人情翻番——头脑清新,眼光长远,在点上,北京男人反而比上海男人更精明了。
April 20

常识

除了书本上的知识之外,我们更要明白“常识”的重要。只有学问而无常识,与人谈话时,会缺少轻松平易的话题。有你在座,空气即会紧张严肃,你就成为不受欢迎的人物。所谓常识,包罗万象,一切都该去留神知道,才可使你活泼风趣,谈起话来左右逢源。

四川话字典

一、部位称谓

 头:脑壳; 后脑勺:后脑啄;鼻子:鼻孔;脸面:脸包儿;胳脯:手杆;手肘: 倒拐子;背部:背壳壳;臀部:勾子;骨头:kao老二;脚腕:颈颈儿;络腮胡:挂儿胡,窜脸胡;拳头:砣子,锭砣老二;膝盖:克膝头,克膝波踝;小腿:;连二杆,连巴肚子。

 二、天象称谓

 星:天星子 正午:对火晌午;冰雹:雪弹子;冰:凝冰。

 三、事物称呼

 被子:铺;蚊帐:罩子;雨伞:撑花;铁罐:鼎罐;斧头:开山;撮箕:鸳箕;肉:嘎嘎;上面:高头;底下:那个透脚;山那边:埂那边;吃饭:契饭;这个:正个、众个的;那个:罗个,那歪。

 四、畜禽称呼

 鸡:牲口;小鸡:鸡崽崽:母猪:窝猪;公牛:牯牛;母牛;公狗:伢狗;母狗:草狗;蚯蚓:曲鳝;蟑螂:偷没婆;晴蜓:洋丁丁;蜘蛛:波丝;蛤蟆:癞格宝;青蛙:喀马;鲢鱼:鲢巴郎;鸡蛋:饽饽;蝇:饭蚊子。

 五、一般称呼

  我:老子;妻子:婆娘;爸爸:老汗;妈妈:老娘子;妻子的哥哥嫂嫂:舅老官、舅母子;妻子的姐姐:姨妹;岳父:丈老汗;岳母:丈母娘;妹妹:妹儿、幺妹; 完结:煞割;吵架:割孽;打架:打捶;试一试:告一告;开玩笑:测坛子;谢谢:劳慰;吹牛:冲壳子;骗子:麻子;项用:关火;软和:粑和;价廉:香因;怎 么办:啷个弄;一会儿:一哈哈;纠缠不休:罗连人;倒霉:背时;丢脸:少皮;大方:舍得;别客气:莫架势;经常:扯常;如何:啷个、啷门的;何事:啥子; 粑场合:卵的;很甜:抿甜;清甜;邋遢:挖抓、派乃、楼净;玩一会:耍哈嘛;装怪相:你娃儿妖燕;自行车:洋马儿。喜欢抄人作品的,跟老子听倒,用了老子 的作品,还是要跟老子说一下哟,不然老子收拾你龟儿!嘿嘿

送情(送礼物)。烧锅(做饭),嘿嘿。。。。。。。。。懂不懂哇。嘿嘿

November 10

JAVA相关的名词解释 -转-

-A-
AJAX: [Asynchronous JavaScript and XML
,异JavaScriptXML]
annotation:
注解
AOP: [aspect-oriented programming,
面向方面]
argument:
参数
-B-
B2B: [Business-to-Business,
业务对业务]
BAM: [Business Activity Monitoring,
业务动监测]
BMP: [bean-managed persistence, Bean
管理的持久化]
BPEL: [Business Process Excution Language,
业务流程]
BPM: [Business Process Modeling,
业务流程建模]
build:
建立;编译
-C-
C2B: [Consumer-to-Business,
户对业务]
CAD: [Computer Aided Design,
算机设计]
CAM: [Computer Aided Modeling,
算机助建模]
case-insensitive:
大小写不敏感
case-sensitive:
大小写敏感
container:
容器
cluster:
集群
CMP: [container-managed persistence,
容器管理的持久化]
component:
件,部件
configuration:
配置
context:
上下文,
control:
控件
convention:

CORBA: [Common Object Request Broker Architecture
,公共求代理体系]
COS: [Common Object Services
,公共象服]
couple:
耦合
CRUD:
指数据操作create, read, update, delete
-D-
Daemon: [Internet
中用于件收的后台程序]
DAO: [Data Access Object,
数据访问对]
data:
数据
DBMS: [Database Management System,
数据管理系]
DDL: [Data Definition Language,
数据定义语]
Declarative Programming:
声明式
delegate:
委托
Dependency Injection:
注入
deploy:
部署
deserialize:
反序列化(也可译为反串行化),即取出
dialect: (
)术语
directive:
指令
DIT: [Directory Information Tree,
信息]
DML: [Data Manipulation Language,
数据操作]
DNS: [Internet Domain Name System,
因特网域名系]
domain:

DSL: [Domain-Specific Languages,
特定]
DTOs: [data transfer objects,
数据传输对]
-E-
EAI: [Enterprise Application Integration:
业应用集成]
ECC: [error correcting codes:
错误纠正代]
EIS: [Enterprise Information System:
信息系]
EJB: [Enterprise JavaBean,
JavaBean]
encapsulate:
封装
ESB: [Enterprise Service Bus,
务总线]
-F-
FAQs: [Frequently Asked Questions,
常提问题]
FIFO:
先出 [First in, First out]
fire:

firewall:
防火
framework:
框架
function:
函数
-G-
GoF: "
四人帮"名著Design Patterns-Elements of Reusable Object-Oriented Software的四名作者的""称。[Gang of Four]
granularity:
粒性,粒度
GUI: [Graphic User Interface:
形用接口]
GUID: [Globally Unique Identifier:
全球唯一标识]
-H-
hard-coding:
碥码
Hibernate: [
种为应用程序提供持久化服的框架]
-I-
IDE:
集成开发环 [Integrated Development Environment]
implement:
实现
internet:
因特网 (也可以不,原因:在中文境下已得到充分理解及)
intranet:
内部网
IoC: [Inversion of Control,
控制反]
-J-
JavaBean:
JCP: [Java Community Process, Java
社区研究]
JDBC: [Java DataBase Connectivity, Java
数据库连]
JDO: [Java Data Objects, Java
数据]
JES:
[Java Enterprise System, Java]
JFC: [JavaTM Foundation Classes, JAVA基础类集合了GUI组件以及其他能简化开发和展开桌面和Internet/Intranet应用的服务]
JOnAS: [ Java Open Application Server, Java用服]
JNI
: [ Java Native Interface , Java本地化接口]
JNDI: [Java Naming and Directory Interface, Java命名与目接口]
JTA: [Java Transaction API: Java
API]
JVM: [Java Virtual Machine: Java
]
JXTA: [
一个用于P2P开发的网络计算平台]
-L-
Laszlo: [
一个大量用于internet用程序的基于XML平台的]
LDAP: [Lightweight Directory Access Protocol,
量目录访问协议]
leverage:
均衡
-M-
MEPs: [message exchange patterns
,消息交模式]
meta:

metadata:
元数据
method signature:
方法
middleware:

mock:

modal dialog:
态对话
modular:
是模module的集合,它由多个独立的模构成。
modular organization: 组结
module:

MOM: [message-oriented middleware
,面向消息的中]
MVC: [Model-View-Control
,模型-视图-控制]
-N-
NDS: [Novell Directory Service
Novell]
NIS: [Network Information Service
,网信息服]
node:

-O-
ODMG: [Object Data Management Group,
象数据管理组织]
OGNL: [Object Graph Navigation Language,
图导]
OODBMS: [Object-Oriented Database Management System,
面向象数据管理系]
ORM: [object-relational (O-R) mapping,
系映射]
-P-
persistence:
持久化(使用SQL句在系数据中存数据)
POJO: [Plain Old Java Objects
简单初始Java]
POJI: [Plain Old Java Interface
简单初始Java接口]
procedural:
程的
profiling:
配置
prototype:
原型
-R-
RAD: [Rapid application development
,快速开发]
RCS: [Revision Control System
,修控制系]
RMI: [Remote Method Invocation:
程方法]
retrieve:

RIAs:
丰富的Internet用程序 [Rich Internet Applications]
RPC: [remote procedure calls
]
-S-
schema:
划,设计,方案
serialize:
序列化(也可译为串行化),即保存
session:

SOA: [Service-Oriented Architecture:
面向服体系]
SOAP: [Simple Object Access Protocol
简单对访问协议]
SPI: [Service Provider Interface
,服提供接口]
Spring:
SQL: [Structured Query Language
构化查询语]
Struts: [
基于MVC模式的Web用程序框架]
surrogate keys:
替代
-T-
tag:
标签
TDD: [Test Driven Development
测试驱动开发]
third-party:
第三方,泛指其他开发商,生商等
transaction:

Tomcat: [
一个非常有名的Java Web容器]
-U-
UDT: [user-defined column types:
字段]
use case:
用例
UI:
界面 (User Interface)
-W-
wizard:

Web service: (
可以不,原因:有名) [Web]
WS-addressing: [web service
]
WSDL: [Web Service Description Language: Web
描述]
WYSIWYG:
即所得 [What You See is What You Get]

November 08

TestNG version 5.3 has been released

TestNG version 5.3 has been released

Posted by: Ronald Mathies on 11? 02, 2006 DIGG
TestNG 5.3 has been released. TestNG is a unit test framework which can be used in combination with Java 1.5 annotations or javadoc annotations if you are still using Java 1.4.

One of the more interesting new features is the introduction of Annotation Transformers.

Annotation Transformers can be used to modify the content of the annotations while running tests. This is useful if the annotations in the source code are correct most of the time, but there are situations where you'd like to override their attribute values.

To get a clearer idea about the Annotation Transformers lets take a look at the the following example:
public class MyTest {
@Test(invocationCount = 2)
public void testMethodA() {
}

@Test(invocationCount = 3)
public void testMethodB() {
}
}
This test case contains two methods, in which both @Test annotations have the invocationCount attribute. Now, if you would want to change the number of times a given method is invoked, you normally would have to change the source code. By using an Annotation tranformer you can do this programmatically:
public class MyTransformer implements IAnnotationTransformer {
public void transform(ITest annotation, Class testClass,
Constructor testConstructor, Method testMethod) {
if (testMethod != null) {
String methodName = testMethod.getName();
if ("testMethodA".equals(methodName) {
annotation.setInvocationCount(10);
} else if ("testMethodB".equals(methodName) {
annotation.setInvocationCount(20);
}
}
}
}
Now, when the testcase is run the transformer will 'intercept' the call to the two test methods and it will first call the transform method on the MyTransformer class. This method will first check if the method name is equal to "testMethodA"; if this is the case then the invocationCount is changed from two to ten, which would have the effect that the test method is invoked ten times instead of two times.

To register the custom transformer it is sufficient to add a command line option:
java org.testng.TestNG -listener MyTransformer testng.xml
or programmatically:
TestNG ng = new TestNG();
ng.setAnnotationTransformer(new MyTransformer());
More information about the Annotation Transformer or other features take a look at the documentation for TestNG.

Message was edited by: joeo@enigmastation.com
November 03

HSQL入门及使用指南 转

HSQL 数据库引擎

HSQL 数据库引擎
开 放源码的数据库引擎―HSQL是基于Thomas Mueller的Hypersonic SQL项目。它完全是由Java是编写的同时也是一种广泛用于 嵌入式的数据库。它被包含在许多J2EE应用服务器中。在移动设备上,HSQL运行在PersonalJava和FP/PP平台上。HSQL是完全免费 的。你能自由地将它重新部署到你的应用程序中,这对移动应用程序来说是容易的。
HSQL提供一个支持%95JDBC接口和所有JDBC数据类型的 JDBC驱程。它支持事务,外键甚至Java存储过程。在HSQL中的表能寄存在内存中和保存在磁盘文件中。HSQL只有少于160-KB的存储器足迹 footprint。它也为PersonalJava设备发布了一个数据库管理控制台(经过Sharp Zaurus上的测试)
然而,HSQL缺少一些商业移动数据库上所需的高级性能和安全功能。更重要的是,HSQL不能提供任何同步解决方案。它也缺少一个为MIDP设备的解决方案。




1. hsql 学习
1.1. 学习目的
本文档是针对hSQL 数据库方面的基础学习,为了使项目组成员能够达到使用hSQL 数据库的目的。
1.2. 培训对象
开发人员
1.3. 常用词及符号说明
常用词:
hsql:一种免费的跨平台的数据库系统
E:\hsqldb:表示是在dos 命令窗口下面
1.4. 参考信息
doc\guide\guide.pdf

2. HSQL
2.1. HSQL 运行工具
java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManager
注意hsqldb.jar 文件的文件路径,最好能放到classpath 里面,或者放到当前路径下.
java -cp hsqldb.jar org.hsqldb.util.DatabaseManager

2.2. 运行数据库
启动方式: Server Modes and
In-Process Mode (also called Standalone Mode).

一个test 数据库会包含如下文件:
? test.properties
? test.script
? test.log
? test.data
? test.backup
test.properties 文件包含关于数据库的一般设置.
test.script 文件包含表和其它数据库,插入没有缓存表的数据.
test.log 文件包含当前数据库的变更.
test.data 文件包含缓存表的数据
test.backup 文件是最近持久化状态的表的数据文件的压缩备份文件
所有以上这个文件都是必要的,不能被删除.如果数据库没有缓存表,test.data 和test.backup 文件将不会存在.另外,除了以上文件HSQLDB 数据库可以链接到任何文本文件,比如cvs 文件.

当操作test 数据库的时候, test.log 用于保存数据的变更. 当正常SHUTDOWN,这个文件将被删除. 否则(不是正常shutdown),这个文件将用于再次启动的时候,重做这些变更.test.lck 文件也用于记录打开的数据库的事实, 正常SHUTDOWN,文件也被删除.在一些情况下,test.data.old 文件会被创建,并删除以前的.






2.3. Server Mode
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb

命令行方式:


启动数据,数据库文件mydb,数据库名称xdb

也可以在 server.properties 文件中定义启动的数据库,最多10个
例如: server.properties:
server.database.0=file:E:/hsqldb/data/mydb
server.dbname.0=xdb

server.database.1=file:E:/hsqldb/data/testdb
server.dbname.1=testdb

server.database.2=mem:adatabase
server.dbname.2=quickdb
启动命令: java -cp ../lib/hsqldb.jar org.hsqldb.Server
运行结果如下



java 测试程序:
package test;
import junit.framework.TestCase;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestConnect extends TestCase {
Connection connection;
protected void setUp()
{
try {
Class.forName("org.hsqldb.jdbcDriver" );
connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb","sa","");


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void testselect()
{
Statement stmt=null;
ResultSet rs=null;
try {
stmt = connection.createStatement();
String sql ="select * from test";
rs=stmt.executeQuery( sql);
while(rs.next() )
{
System.out.println("id="+rs.getString("id"));
System.out.println("name="+rs.getString("name"));
}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
rs.close() ;
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
protected void tearDown()
{
try {
connection.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
以上在eclipse 中测试通过.

2.4.In-Process (Standalone) Mode
不需要启动server
connection = DriverManager.getConnection("jdbc:hsqldb:file:E:/hsqldb/data/mydb","sa","");
这样就可以连接数据库。
只能在一个jvm 中使用,不能在多个jvm 中使用。
这种模式是在相同的jvm 下作为你的应用程序的一部分,运行数据库引擎。对大多数应用程序,这种模式运行会相当快,作为数据,不需要转换和网络传输。

主要的缺点就是不可能从外面的应用程序访问到默认数据库,因此当你的应用运行时候,你不能通过别的工具检查数据库内容。在1.8.0 版本中,你可以在相同jvm 中的线程中运行数据库初始化,并提供外面访问你的进程内数据库。
推荐在开发应用中使用这种方式。
连接串:
Windows: DriverManager.getConnection("jdbc:hsqldb:file:E:/hsqldb/data/mydb","sa","");
Unix: DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb","sa","");

2.5.Memory-Only Databases
当随即访问内存,数据库不固定时,可以采用内存的方式运行数据库,由于没有数据写到硬盘上,这种方式使用在应用数据和applets 和特殊应用的内部进程中使用,URL:

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:aname", "sa", "");
2.6.Using Multiple Databases in One JVM
2.7.Different Types of Tables
HSQLDB 支持 TEMP 表和三种类型的持久表(MEMORY 表, CACHED 表,TEXT表)

当使用 CREATE TABLE 命令时,Memory 表时默认类型,它们的数据整体保存在内存当中,但是任何改变它们的结构或者内容,它们会被写到.script 文件中。这个脚本文件在数据库下一次打开的时候被对出,内存表重新被创建内容,根temp 表不同,内存表时持久化的。

CACHED 表通过CREATE CACHED TABLE 命令建立. 只有部分的它们的数据或者索引被保存在内存中,允许大表占用几百兆的内存空间。例外一个优点,在数据库引擎中,启动大量数据的缓存表需要花费少量的时间, 缺点是减慢了运行和使用Hsqldb 的速度。表相对小的时候,不要使用cache 表,在小表中使用内存数据库。

从版本 1.7.0 以后,支持text 表,使用 CSV (Comma Separated Value) 或者其它分隔符文本文件作为它们的数据源。你可以特殊指定一个存在的CSV 文件,例如从其它的数据或者程序中导出文件,作为TXT 表的数据源。 同时,你可以指定一个空文件,通过数据库引擎填充数据。TEXT 表将比cache 表更加效率高。Text 表可以指向不同的数据文件。

* memory-only databases 数据库只支持memory 表和cache 表,不支持text 表。
2.8. 约束和索引
HSQLDB 支持 PRIMARY KEY, NOT NULL, UNIQUE, CHECK and FOREIGN KEY 约束.





3. sql 命令
3.1. sql 支持
select top 1 * from test;
select limit 0 2 * from test;
DROP TABLE test IF EXISTS;
3.2. Constraints and Indexes
主健约束:PRIMARY KEY
唯一约束:
唯一索引:
外健:
CREATE TABLE child(c1 INTEGER, c2 VARCHAR, FOREIGN KEY (c1, c2) REFERENCES parent(p1, p2));

3.3. 索引和查询速度
索引提高查询速度,比提高排序速度。
主健和唯一所列自动创建索引,否则需要自己创建CREATE INDEX command。
索引: 唯一索引和非唯一索引
多列的索引,如果只是使用后面的,不使用第一个,将不会条查询速度。

(TB is a very large table with only a few rows where TB.COL3 = 4)
SELECT * FROM TA JOIN TB ON TA.COL1 = TB.COL2 AND TB.COL3 = 4;
SELECT * FROM TB JOIN TA ON TA.COL1 = TB.COL2 AND TB.COL3 = 4;(faster)

原因是 TB.COL3 可以被快速的估计,如果TB 表放到前面(index on TB.COL3):
一般规则是把缩小条件的列的表放在前面

3.4. 使用where 还是join
使用 WHERE 条件链接表可能会降低运行速度.
下面的例子将会比较慢,即使使用了索引:
SELECT ... FROM TA, TB, TC WHERE TC.COL3 = TA.COL1 AND TC.COL3=TB.COL2 AND TC.COL4 = 1
这个查询隐含TA.COL1 = TB.COL2 ,但是没有直接设定这个条件.如果 TA 和 TB 每个表都包含100 条记录,10000 组合将和 TC 关联,用于TC这个列的条件,尽管有索引在这个列上.使用JOIN 关键字, 在组合TC 之前,TA.COL1 = TB.COL2 条件直接并缩小组合 TA 和 TB 的行数, 在运行大数据量的表的结果是,将会很快:
SELECT ... FROM TA JOIN TB ON TA.COL1 = TB.COL2 JOIN TC ON TB.COL2 = TC.COL3 WHERE TC.COL4 = 1
这个查询可以提高一大步,如果改变表的顺序, 所以 TC.COL1 = 1 将最先使用,这样更小的集合将组合在一起:
SELECT ... FROM TC JOIN TB ON TC.COL3 = TB.COL2 JOIN TA ON TC.COL3 = TA.COL1 WHERE TC.COL4 = 1
以上例子,数据引擎自动应用于TC.COL4 = 1 组合小的集合于其它表关联. Indexes TC.COL4, TB.COL2 TA.COL1 都将使用索引,提高查询速度.
3.5. Subqueries and Joins
使用join 和调整表的顺序提高效率.
例如:, 第二个查询的速度将更快一些(TA.COL1 和TB.COL3都有索引):
Example 2.2. Query comparison
SELECT ... FROM TA WHERE TA.COL1 = (SELECT MAX(TB.COL2) FROM TB WHERE TB.COL3 = 4)

SELECT ... FROM (SELECT MAX(TB.COL2) C1 FROM TB WHERE TB.COL3 = 4) T2 JOIN TA ON TA.COL1 = T2.C1
第二个查询将 MAX(TB.COL2) 与一个单记录表相关联. 并使用TA.COL1索引,这将变得非常快. 第一个查询是将 TA 表中的每一条记录不断地与MAX(TB.COL2)匹配.
3.6. 数据类型
TINYINT, SMALLINT, INTEGER, BIGINT, NUMERIC and DECIMAL (without a decimal point) are supported integral types and map to byte, short, int, long and BigDecimal in Java.

Integral Types:
TINYINT, SMALLINT, INTEGER, BIGINT, NUMERIC and DECIMAL
Other Numeric Types:
REAL, FLOAT or DOUBLE
Bit and Boolean Types:
BOOLEAN: UNDEFINED,TRUE,FALSE
NULL values are treated as undefined.
Storage and Handling of Java Objects
Sequences and Identity

Identity Auto-Increment Columns:
The next IDENTITY value to be used can be set with the
ALTER TABLE ALTER COLUMN RESTART WITH ;
Sequences:
SELECT NEXT VALUE FOR mysequence, col1, col2 FROM mytable WHERE ...

3.7. 事务问题:
SET PROPERTY "sql.tx_no_multi_rewrite" TRUE

4. Connections
通用驱动jdbc:hsqldb: 下列协议标识(mem: file: res: hsql: http: hsqls: https:)
Table 4.1. Hsqldb URL Components
Driver and Protocol Host and Port Database
jdbc:hsqldb:mem:
not available accounts

jdbc:hsqldb:mem:.
jdbc:hsqldb:file:
not available mydb
/opt/db/accounts
C:/data/mydb

数据库路径.
jdbc:hsqldb:res:
not available /adirectory/dbname

jars files are accessed in Java programs. The /adirectory above stands for a directory in one of the jars.
jdbc:hsqldb:hsql:
jdbc:hsqldb:hsqls:
jdbc:hsqldb:http:
jdbc:hsqldb:https:
//localhost
//192.0.0.10:9500
//dbserver.somedomain.com
/an_alias
/enrollments
/quickdb

别名在server.properties or webserver.properties文件中指定
database.0=file:/opt/db/accounts
dbname.0=an_alias

database.1=file:/opt/db/mydb
dbname.1=enrollments

database.2=mem:adatabase
dbname.2=quickdb
In the example below, the database files lists.* in the /home/dbmaster/ directory are associated with the empty alias:
database.3=/home/dbmaster/lists
dbname.3=
4.1.Connection properties
Connection properties are specified either by establishing the connection via the:
DriverManager.getConnection (String url, Properties info);
method call, or the property can be appended to the full Connection URL.
Table 4.2. Connection Properties
get_column_name true column name in ResultSet
This property is used for compatibility with other JDBC driver implementations. When true (the default), ResultSet.getColumnName(int c) returns the underlying column name
When false, the above method returns the same value as ResultSet.getColumnLabel(int column) Example below:
jdbc:hsqldb:hsql://localhost/enrollments;get_column_name=false

When a ResultSet is used inside a user-defined stored procedure, the default, true, is always used for this property.
ifexists false connect only if database already exists
Has an effect only with mem: and file: database. When true, will not create a new database if one does not already exist for the URL.
When false (the default), a new mem: or file: database will be created if it does not exist.
Setting the property to true is useful when troubleshooting as no database is created if the URL is malformed. Example below:
jdbc:hsqldb:file:enrollments;ifexists=true
shutdown false shut down the database when the last connection is closed
This mimics the behaviour of 1.7.1 and older versions. When the last connection to a database is closed, the database is automatically shut down. The property takes effect only when the first connection is made to the database. This means the connection that opens the database. It has no effect if used with subsequent, simultaneous connections.
This command has two uses. One is for test suites, where connections to the database are made from one JVM context, immediately followed by another context. The other use is for applications where it is not easy to configure the environment to shutdown the database. Examples reported by users include web application servers, where the closing of the last connection conisides with the web app being shut down.


4.2. Properties Files
大小写敏感 (e.g. server.silent=FALSE will have no effect, but server.silent=false will work).
属性文件和设定存储如下 :
Table 4.3. Hsqldb Server Properties Files
File Name Location Function
server.properties the directory where the command to run the Server class is issued settings for running HSQLDB as a database server communicating with the HSQL protocol
webserver.properties the directory where the command to run the WebServer class is issued settings for running HSQLDB as a database server communicating with the HTTP protocol
.properties the directory where all the files for a database are located settings for each particular database
Properties files for running the servers are not created automatically. You should create your own files that contain server.property=value pairs for each property.
4.2.1. Server and Web Server Properties
server.properties and webserver.properties 文件支持如下设定:
Table 4.4. Property File Properties
Value Default Description
server.database.0 test the path and file name of the first database file to use
server.dbname.0 "" lowercase server alias for the first database file
server.urlid.0 NONE SqlTool urlid used by UNIX init script. (This property is not used if your are running Server/Webserver on a platform other than UNIX, or of you are not using our UNIX init script).
server.silent true no extensive messages displayed on console
server.trace false JDBC trace messages displayed on console
In 1.8.0, 每个服务器支持同时启动10个不同的数据库. The server.database.0 property defines the filename / path whereas the server.dbname.0 defines the lowercase alias used by clients to connect to that database. The digit 0 is incremented for the second database and so on. Values for the server.database.{0-9} property can use the mem:, file: or res: prefixes and properties as discussed above under CONNECTIONS. For example,
database.0=mem:temp;sql.enforce_strict_size=true;
Values specific to server.properties are:
Table 4.5. Server Property File Properties
Value Default Description
server.port 9001 TCP/IP port used for talking to clients. All databases are served on the same port.
server.no_system_exit true no System.exit() call when the database is closed
Values specific to webserver.properties are:
Table 4.6. WebServer Property File Properties
Value Default Description
server.port 80 TCP/IP port used for talking to clients
server.default_page index.html the default web page for server
server.root ./ the location of served pages
. ? multiple entries such as .html=text/html define the mime types of the static files served by the web server. See the source for WebServer.java for a list.
All the above values can be specified on the command line to start the server by omitting the server. prefix.
5. SqlTool
Mem 数据库:
E:\hsqldb>java -jar ./lib/hsqldb.jar mem
Hsql Server:
(前提是xdb server 已经启动):
(java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb)
java -jar ./hsqldb.jar xdb



执行sql 语句:
1)
Mydb.sql :
CREATE MEMORY TABLE TEST(ID INTEGER,NAME VARCHAR(20));
INSERT INTO TEST VALUES(1,'aaa');
INSERT INTO TEST VALUES(2,'bbb');
E:\hsqldb>java -jar ./lib/hsqldb.jar mem mydb.sql
1 row updated
1 row updated
2)
testuser.sql:
CREATE MEMORY TABLE userTEST(ID INTEGER,NAME VARCHAR(20));
INSERT INTO userTEST VALUES(1,'aaa');
INSERT INTO userTEST VALUES(2,'bbb');
commit; //这样才能提交到数据库
E:\hsqldb>java -jar ./hsqldb.jar xdb testuser.sql > file.txt 2>&1
输出结果到file.txt 文件中.


连接oracle:

E:\hsqldb>java -classpath ./classes12.zip;./hsqldb.jar org.hsqldb.util.SqlTool --driver oracle.jdbc.driver.OracleDriver
orcl

sqltool.rc 文件:
urlid orcl
url jdbc:oracle:thin:@localhost:1521:livedoor
username scott
password tiger
driver oracle.jdbc.OracleDriver
以上driver 在一处写出即可,也可以连接别的数据库

连接mysql
E:\hsqldb>java -classpath ./lib/mysql-connector-java-3.1.10-bin.jar;./hsqldb.jar org.hsqldb.util.SqlTool mysqltest

.rc 文件内容:
urlid mysqltest
url jdbc:mysql://localhost:3306/test
username root
password root
driver com.mysql.jdbc.Driver
6. sql 语法

6.1.1. ALTER INDEX[1]
ALTER INDEX RENAME TO ;
6.1.2. ALTER SEQUENCE[1]
ALTER SEQUENCE RESTART WITH ;
6.1.3. ALTER SCHEMA[1]
ALTER SCHEMA RENAME TO ;
6.1.4. ALTER TABLE[1]
ALTER TABLE ADD [COLUMN] Datatype
[(columnSize[,precision])] [{DEFAULT |
GENERATED BY DEFAULT AS IDENTITY (START WITH [, INCREMENT BY ])}] |
[[NOT] NULL] [IDENTITY] [PRIMARY KEY]
[BEFORE ];

ALTER TABLE DROP [COLUMN] ;
ALTER TABLE ALTER COLUMN RENAME TO
ALTER TABLE ALTER COLUMN SET DEFAULT };
ALTER TABLE ALTER COLUMN SET [NOT] NULL
ALTER TABLE ALTER COLUMN ;
ALTER TABLE ALTER COLUMN
RESTART WITH

ALTER TABLE ADD [CONSTRAINT ]
CHECK ();
ALTER TABLE ADD [CONSTRAINT ] UNIQUE ();
ALTER TABLE ADD [CONSTRAINT ]
PRIMARY KEY ();
ALTER TABLE
ADD [CONSTRAINT ] FOREIGN KEY ()
REFERENCES ()
[ON {DELETE | UPDATE} {CASCADE | SET DEFAULT | SET NULL}];

ALTER TABLE DROP CONSTRAINT ;
ALTER TABLE RENAME TO ;
6.1.5. ALTER USER[1]
ALTER USER SET PASSWORD ;
ALTER USER SET INITIAL SCHEMA ;
6.1.6. CALL
CALL Expression;
See also: Stored Procedures / Functions, SQL Expression.
6.1.7. CHECKPOINT
CHECKPOINT [DEFRAG[1]];
See also: SHUTDOWN, SET LOGSIZE.
6.1.8. COMMIT
COMMIT [WORK];
See also: ROLLBACK, SET AUTOCOMMIT, SET LOGSIZE.
6.1.9. CONNECT
CONNECT USER PASSWORD ;
See also: GRANT, REVOKE.
6.1.10. CREATE ALIAS
CREATE ALIAS FOR ;
See also: CALL, Stored Procedures / Functions.
6.1.11. CREATE INDEX
CREATE [UNIQUE] INDEX ON ( [DESC] [, ...]) [DESC];
6.1.12. CREATE ROLE[1]
CREATE ROLE ;
6.1.13. CREATE SCHEMA[1]
CREATE SCHEMA AUTHORIZATION
[ [] [...];
CREATE SCHEMA ACCOUNTS AUTHORIZATION DBA
CREATE TABLE AB(A INTEGER, ...)
CREATE TABLE CD(C CHAHR, ...)
CREATE VIEW VI AS SELECT ...
GRANT SELECT TO PUBLIC ON AB
GRANT SELECT TO JOE ON CD;
6.1.14. CREATE SEQUENCE[1]
CREATE SEQUENCE [AS {INTEGER | BIGINT}]
[START WITH ] [INCREMENT BY ];
SELECT [...,] NEXT VALUE FOR [, ...] FROM ;

6.1.15. CREATE TABLE
CREATE [MEMORY | CACHED | [GLOBAL] TEMPORARY | TEMP [1] | TEXT[1]] TABLE
( [, ...] [, ...] )
[ON COMMIT {DELETE | PRESERVE} ROWS];
6.1.16. CREATE TRIGGER[1]
CREATE TRIGGER {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON
[FOR EACH ROW] [QUEUE n] [NOWAIT] CALL ;
6.1.17. CREATE USER
CREATE USER PASSWORD [ADMIN];
6.1.18. CREATE VIEW[1]
CREATE VIEW [(,..) AS SELECT ... FROM ... [WHERE Expression]
[ORDER BY orderExpression [, ...]]
[LIMIT [OFFSET ]];
CREATE VIEW mealsjv AS
SELECT m.mid mid, m.name name, t.mealtype mt, a.aid aid,
a.gname + ' ' + a.sname author, m.description description,
m.asof asof
FROM meals m, mealtypes t, authors a
WHERE m.mealtype = t.mealtype
AND m.aid = a.aid;

CREATE VIEW mealswebv AS SELECT name, author FROM mealsjv;

CREATE VIEW aview (new_name, new_author) AS
SELECT name, author
FROM mealsjv
6.1.19. DELETE
DELETE FROM table [WHERE Expression];
6.1.20. DISCONNECT
DISCONNECT;
6.1.21. DROP INDEX
DROP INDEX index [IF EXISTS];
6.1.22. DROP ROLE[1]
DROP ROLE ;
6.1.23. DROP SEQUENCE[1]
DROP SEQUENCE [IF EXISTS] [RESTRICT | CASCADE];
6.1.24. DROP SCHEMA[1]
DROP SCHEMA [RESTRICT | CASCADE];
6.1.25. DROP TABLE
DROP TABLE [IF EXISTS] [RESTRICT | CASCADE];
6.1.26. DROP TRIGGER
DROP TRIGGER ;
6.1.27. DROP USER
DROP USER ;
6.1.28. DROP VIEW[1]
DROP VIEW [IF EXISTS] [RESTRICT | CASCADE];
6.1.29. EXPLAIN PLAN
EXPLAIN PLAN FOR { SELECT ... | DELETE ... | INSERT ... | UPDATE ..};
6.1.30. GRANT
GRANT { SELECT | DELETE | INSERT | UPDATE | ALL } [,...]
ON { table | CLASS "package.class" } TO ;
GRANT [,...] TO [1];
GRANT SELECT ON Test TO GUEST;
GRANT ALL ON CLASS "java.lang.Math.abs" TO PUBLIC;

6.1.31. INSERT
INSERT INTO table [( column [,...] )]
{ VALUES(Expression [,...]) | SelectStatement};
6.1.32. REVOKE
REVOKE { SELECT | DELETE | INSERT | UPDATE | ALL } [,...]
ON { table | CLASS "package.class" } FROM ;
REVOKE [,...] FROM [1];
6.1.33. ROLLBACK
ROLLBACK [TO SAVEPOINT [1] | WORK}];
6.1.34. SAVEPOINT[1]
SAVEPOINT ;
6.1.35. SCRIPT
SCRIPT ['file'];
6.1.36. SELECT[1]
SELECT [{LIMIT | TOP }[1]][ALL | DISTINCT]
{ selectExpression | table.* | * } [, ...]
[INTO [CACHED | TEMP | TEXT][1] newTable]
FROM tableList
[WHERE Expression]
[GROUP BY Expression [, ...]]
[HAVING Expression]
[{ UNION [ALL | DISTINCT] | {MINUS [DISTINCT] | EXCEPT [DISTINCT] } |
INTERSECT [DISTINCT] } selectStatement]
[ORDER BY orderExpression [, ...]]
[LIMIT [OFFSET ]];
tableList
table [{CROSS | INNER | LEFT OUTER | RIGHT OUTER}
JOIN table ON Expression] [, ...]
table
{ (selectStatement) [AS] label | tableName}
selectExpression
{ Expression | COUNT(*) | {
COUNT | MIN | MAX | SUM | AVG | SOME | EVERY |
VAR_POP | VAR_SAMP | STDDEV_POP | STDDEV_SAMP
} ([ALL | DISTINCT][1]] Expression) } [[AS] label]
If CROSS JOIN is specified no ON expression is allowed for the join.
orderExpression
{ columnNr | columnAlias | selectExpression }
[ASC | DESC]
LIMIT n m
LIMIT n m

LIMIT m OFFSET n

TOP m

UNION and other set operations

6.1.37. SET AUTOCOMMIT
SET AUTOCOMMIT { TRUE | FALSE };
6.1.38. SET DATABASE COLLATION[1]
SET DATABASE COLLATION ;
6.1.39. SET CHECKPOINT DEFRAG[1]
SET CHECKPOINT DEFRAG ;
6.1.40. SET IGNORECASE
SET IGNORECASE { TRUE | FALSE };
6.1.41. SET INITIAL SCHEMA [1]
Users may change their base default schema name with the comand
SET INITIAL SCHEMA ;
6.1.42. SET LOGSIZE
SET LOGSIZE ;
6.1.43. SET PASSWORD
SET PASSWORD ;
6.1.44. SET PROPERTY[1]
SET PROPERTY ;
6.1.45. SET REFERENTIAL INTEGRITY
SET REFERENTIAL_INTEGRITY { TRUE | FALSE };
6.1.46. SET SCHEMA[1]
SET SCHEMA ;
6.1.47. SET SCRIPTFORMAT[1]
SET SCRIPTFORMAT {TEXT | BINARY | COMPRESSED};
6.1.48. SET TABLE INDEX
SET TABLE tableName INDEX 'index1rootPos index2rootPos ... ';
6.1.49. SET TABLE READONLY[1]
SET TABLE READONLY {TRUE | FALSE};
6.1.50. SET TABLE SOURCE[1]
SET TABLE SOURCE [DESC];
SET TABLE mytable SOURCE "myfile;fs=|;vs=.;lvs=~"
Supported Properties
quoted = { true | false }
default is true. If false, treats double quotes as normal characters
all_quoted = { true | false }
default is false. If true, adds double quotes around all fields.
encoding =
character encoding for text and character fields, for example, encoding=UTF-8
ignore_first = { true | false }
default is false. If true ignores the first line of the file
cache_scale=
exponent to calculate rows of the text file in cache. Default is 8, equivalent to nearly 800 rows
cache_size_scale = r
exponent to calculate average size of each row in cache. Default is 8, equivalent to 256 bytes per row.
fs =
field separator
vs =
varchar separator
lvs =
long varchar separator
Special indicators for Hsqldb Text Table separators
\semi
semicolon
\quote
quote
\space
space character
\apos
apostrophe
\n
newline - Used as an end anchor (like $ in regular expressions)
\r
carriage return
\t
tab
\\
backslash
\u####
a Unicode character specified in hexadecimal
Only an administrator may do this.

6.1.51. SET WRITE DELAY[1]
SET WRITE_DELAY {{ TRUE | FALSE } | | MILLIS};
6.1.52. SHUTDOWN
SHUTDOWN [IMMEDIATELY | COMPACT | SCRIPT[1]];
6.2. Data Types
Table 9.1. Data Types. The types on the same line are equivalent.
Name Range Java Type
INTEGER | INT as Java type int | java.lang.Integer
DOUBLE [PRECISION] | FLOAT as Java type double | java.lang.Double
VARCHAR as Integer.MAXVALUE java.lang.String
VARCHAR_IGNORECASE as Integer.MAXVALUE java.lang.String
CHAR | CHARACTER as Integer.MAXVALUE java.lang.String
LONGVARCHAR as Integer.MAXVALUE java.lang.String
DATE as Java type java.sql.Date
TIME as Java type java.sql.Time
TIMESTAMP | DATETIME as Java type java.sql.Timestamp
DECIMAL No limit java.math.BigDecimal
NUMERIC No limit java.math.BigDecimal
BOOLEAN | BIT as Java type boolean | java.lang.Boolean
TINYINT as Java type byte | java.lang.Byte
SMALLINT as Java type short | java.lang.Short
BIGINT as Java type long | java.lang.Long
REAL as Java type double | java.lang.Double[1]

BINARY as Integer.MAXVALUE byte[]
VARBINARY as Integer.MAXVALUE byte[]
LONGVARBINARY as Integer.MAXVALUE byte[]
OTHER | OBJECT as Integer.MAXVALUE java.lang.Object
The uppercase names are the data types names defined by the SQL standard or commonly used by RDMS's. The data types in quotes are the Ja

6.2.1. 自动增长:
create table user(id IDENTITY,name varchar(20));
sql> create table dept(id int GENERATED BY DEFAULT AS IDENTITY(start with 10,increment by 5) not null PRIMARY KEY,name v
archar(20));
sql> insert into dept(name) values('asc');
1 row updated
sql> insert into dept(name) values('security');
1 row updated
sql> select * from dept;
ID NAME
-- --------
10 asc
15 security

2 rows

6.3. SQL Comments
-- SQL style line comment
// Java style line comment
/* C style line comment */
7. Hsqldb Test Utility
拷贝 junit.jar 到/lib 目录下
运行: ant hsqldbtest
生成 hsqldbtest.jar
运行: \hsqldb\testrun\hsqldb>runtest TestSelf
October 30

Groovy 转

Groovy 1 语法特性

ray_linn 所撰寫。最後修改者是 ray_linn 在 219 天之前。 已瀏覽 453 次。
[編輯] [附加]

Groovy <1> 语言特性

前言

Groovy 是基于 JRE 的脚本语言( Script ),是由James Strachan 和 Bob McWhirter 这两位天才发明的,(JSR 241 2004 年 3 月)。

和Perl,Python等等Script的设计初衷一样,作者希望Groovy能快速简洁地完成一些工作:如访问数据库以编写报告,编写单元测试用例(Unit Test Case),快速实现产品原型(ProtoType) 等等。

同时为了降低学习曲线,Groovy 的语法和Java 近似,并吸收了 Ruby,Python 和SmallTalk 的一些特点,因此 Groovy 在某些场合可以扮演一种 “咖啡伴侣”的角色。

那么Groovy 和 Java 相比,有什么变化呢? Groovy 和大部分Scripts一样:

  1. 不用编译,通过解释运行。
  2. 允许动态类型。
  3. 合成结构容易。

因此,Groovy 是一种特别容易学习和使用的语言.

我们先借用IBM Groovy教程中的例子,下面的代码利用了Freemarker模板引擎来创建一个Template对象,然后将内容打印到标准输出。例(1)是Java代码,例(2)是Groovy代码。可以看到二者非常的类似。

//简单的 TemplateReader Java 类
import java.io.File;
import java.io.IOException;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class TemplateReader {
public static void main(String[] args){
try{
Configuration cfg = Configuration.getDefaultConfiguration();
cfg.setDirectoryForTemplateLoading(new File("C:/dev/projects/http-tester/src/conf"));
Template temp = cfg.getTemplate("vendor-request.tmpl");
System.out.println(temp.toString());
}
catch(IOException e){
e.printStackTrace();
}
}
}

和例2 中的 Groovy 作为对比.

//用 Groovy 编写的更简单的 TemplateReader
//语法目前基于Groovy 1.0-JSR3
import freemarker.template.Configuration as tconf
import java.io.File
cfg = tconf.getDefaultConfiguration()
cfg.setDirectoryForTemplateLoading( new File("C:/dev/projects/http-tester/src/conf"))
temp = cfg.getTemplate("vendor-request.tmpl")
println temp.toString()

Groovy显然精简得多:

  1. Groovy 代码只需要更少的import 语句。此外,freemarker.template.Configuration 还使用了别名 tconf。
  2. Groovy 允许直接使用类型为Template 的变量 tmpl 而不用声明其类型。
  3. Groovy 不需要class 声明或者main 方法。
  4. Groovy 不关心异常,可以不用导入Java需要的IOException。

对Groovy感兴趣吗?别忘了拜访它的主页 >>http://groovy.codehaus.org/ 并下载最新的Groovy发布包哦。(ray_linn)



Groovy 2 基础语法

ray_linn 所撰寫。最後修改者是 ray_linn 在 408 天之前。 已瀏覽 391 次。
[編輯] [附加]

Groovy的基础语法

Groovy 有很多优点。它很好地融合了 Ruby、Python 和 Smalltalk 的一些最有用的功能,同时保留了基于 Java 语言的核心语法。对于Java 开发人员,Groovy 提供了更简单的替代语言,且几乎不需要学习时间。对于刚接触 Java 平台的开发人员,它可以作为有更复杂语法和要求的 Java 语言的一个容易的入口点。

语法

Groovy的语句和Java类似,但是有一些特殊的地方。例如语句的分号是可选的。如果每行一个语句,就可以省略分号;如果一行上有多个语句,则需要用分号来分隔。

x = [1, 2, 3]
println x
y = 5; x = y + 7
println x
assert x == 12

另外return关键字在方法的最后是可选的;同样,返回类型也是可选(缺省是Object)。

动态类型

像其他Script一样,Groovy 不需要显式声明类型。在 Groovy 中,一个对象的类型是在运行时动态发现的,这极大地减少了要编写的代码数量。在Groovy中,类型对于值(varibles)、属性 (properties)、方法(method)和闭包(closure)参数、返回值都是可有可无的,只有在给定值的时候,才会决定它的类型,(当然声 明了类型的除外)。例如:
//Groovy 动态类型
myStr = "Hello World"

由于使用了动态类型,不需要继承就可以得到多态的全部功能:

class Song{  
@Property length
@Property name
}

class Book{
def public name
def public author
}

def doSomething(thing){
println "going to do something with a thing named = " + thing.name
}

这 里定义了两个Groovy 类,Song 和 Book。这两个类都包含一个 name 属性。函数 doSomething,它以一个 thing 为参数,并试图打印这个对象的 name 属性,但doSomething 函数没有定义其输入参数的类型,所以只要对象包含一个 name 属性,那么它就可以工作。可见, Song 和 Book 的实例都可以作为 doSomething 的输入参数。

mySong = new Song(length:90, name:"Burning Down the House")
myBook = new Book(name:"One Duck Stuck", author:"Phyllis Root")
doSomething(mySong) //prints Burning Down the House
doSomething(myBook) //prints One Duck Stuck
def doSth=this.&doSomething
doSth(mySong)
doSth(myBook)

在例子的最后,我们还创建了doSomething的一个函数指针 doSth,最后的执行结果与调用doSoemthing是一样的。

值 得注意的是:与Groovy Beta不同,在使用新的JSR Groovy类时,类里面的所有的变量都必须加上 def 关键字或者 private、protected 或 public 这样的修饰符。当然,也可以用 @Property 关键字声明成员变量。在Script中则不必。

字符串

Groovy中的字符串允许使用双引号和单引号。

当使用双引号时,可以在字符串内嵌入一些运算式,Groovy允许您使用 与 bash 类似的 ${expression} 语法进行替换。可以在字符串中包含任意的Groovy表达式。

name="James"
println "My name is ${name},'00${6+1}'" //prints My name is James,'007'

Groovy还支持"uXXXX" 引用(其中X是16进制数),用来表示特殊字符,例如 "u0040" 与"@"字符相同。

大块文本

如果有一大块文本(例如 HTML 和 XML)不想编码,你可以使用Here-docs. here-docs 是创建格式化字符串的一种便利机制。它需要类似 Python 的三重引号(""")开头,并以三重引号结尾。

name = "James"
text = """
hello
there ${name} how are you today?
"
""
assert text != null
println(text)

在Groovy-JSR中,不再支持下面这种多行字符串,个人觉得似乎与Here-docs功能重叠:

foo = "hello 
there
how are things?"

println(foo)

对字符串的操作

  1. contains 字符串中是否包含子字符串,'groovy'.contains('oo')将返回true;
  2. count 返回字符串中子字符串出现的次数,'groooovy'.count('oo')将返回3.
  3. tokenize 根据分隔符将字符串分解成子串,'apple^banana^grap'.tokenize('^')返回['apple','banana','grape']。
  4. 减操作 'groovy'-'oo',结果是'grvy'。
  5. 乘操作 'oo'*3,结果是'oooooo'。

Groovy主要结构

接下来将展示Groovy的一些结构,包逻辑分支,类、闭包等等。

逻辑分支

if-else语句

Groovy提供Java相同的if-else语句。

x = false
y = false
if ( !x ) {
x = true
}
assert x == true
if ( x ) {
x = false
} else{
y = true
}
assert x == y

Groovy也支持三元操作符。

y = 5
x = (y > 1) ? "worked" : "failed"
assert x == "worked"

switch语句

Groovy的switch语句兼容Java代码,但是更灵活,Groovy的switch语句能够处理各种类型的switch值,可以做各种类型的匹配:

  1. case值为类名,匹配switch值为类实例
  2. case值为正则表达式,匹配switch值的字符串匹配该正则表达式
  3. case值为集合,匹配switch值包含在集合中,包括ranges

除了上面的,case值与switch值相等才匹配。

x = 1.23
result = ""
switch ( x ) {
case "foo":
result = "found foo"
// lets fall through
case "bar":
result += "bar"
case [4, 5, 6, 'inList']:
result = "list"
break
case 12..30:
result = "range"
break
case Integer:
result = "integer"
break
case Number:
result = "number"
break
default:
result = "default"
}
assert result == "number"

Switch 语句的工作原理:switch语句在做case值匹配时,会调用isCase(switchValue)方法,Groovy提供了各种类型,如类,正则表 达式、集合等等的重载。可以创建自定义的匹配类,增加isCase(switchValue)方法来提供自定义的匹配类型。

循环

while和do 循环

Groovy支持Java相同的while循环,但目前暂不支持do循环

x = 0
y = 5
while ( y-- > 0 ){
x++
}
assert x == 5

for循环

Groovy的for循环更简单,而且能够和各种类型的数组、集合、Map、范围等一起工作,我们稍候会详细介绍这些内容。

// iterate over a range
x = 0
for ( i in 0..9 ) {
x += i
}
assert x == 45

// iterate over a list

x = 0
for ( i in [0, 1, 2, 3, 4] ) {
x += i
}
assert x == 10

// iterate over an array
array = (0..4).toArray()
x = 0
for ( i in array ) {
x += i
}
assert x == 10

// iterate over a map

map = ['abc':1, 'def':2, 'xyz':3]
x = 0
for ( e in map ) {
x += e.value
}
assert x == 6

// iterate over values in a map
x = 0
for ( v in map.values() )
{
x += v
}
assert x == 6

// iterate over the characters in a string
text = "abc"
list = []
for (c in text) {
list.add(c)
}
assert list == ["a", "b", "c"]

运行Groovy脚本

你可以象使用Perl一样编写Groovy脚本,不需要class,不需要Main入口点,也不需要声明变量;此外,你还可以用def语句来定义自己的函数,并在脚本中使用它。

像许多脚本语言一样,Groovy 是 在运行时解释的,无编译的代码在构建-运行周期中可以提供很多好处。运行时编译使 Groovy 成为快速原型设计、构建不同的实用程序和测试框架的理想平台。通过以下代码可以很简单的运行Groovy.

groovy HelloWorld.groovy

除了利用解释器来运行Groovy脚本外,Groovy 提供了两种不同的解释器Shell,使所有有效的 Groovy 表达式可以交互地执行:

  1. 运行groovysh启动命令Shell,可以输入Groovy语句直接执行
  2. 运行groovyConsole启动Swing方式的Groovy控制台,这是一个简单的Groovy编辑器
Groovy 脚本实际上是字节码级别的 Java 类。因此,还可以用 groovyc 编译 Groovy 脚本。可以通过命令行或者 Ant 使用 groovyc 以生成脚本的类文件。这些类可以用普通 java 命令运行,只要 classpath 包括 groovy.jar和asm.jar。


Groovy 3 类和闭包

ray_linn 所撰寫。最後修改者是 ray_linn 在 386 天之前。 已瀏覽 282 次。
[編輯] [附加]
灵活性是更有效地开发代码的主要因素。Groovy语言是建立在总有一天 Java 平台要包括一种敏捷开发语言这一信念上的 (Richard Monson-Haefel),因此Groovy的语法是始终围绕灵活性这个特性进行设计的。 因为 Groovy 除了是种面向过程和面向对象的语言外,它还包含了实现函数式编程一些东西。

函数编程

我们知道例如Lisp、Scheme、Haskell、ML (或其他一些语言)采用了函数式编程。但“到底什么是函数式编程 (FP)?”不幸的是,即使是函数程序员他们自己也很难对 FP 究竟是什么有个一致的认识。

David Mertz 认为函数式编程粗略地描绘为至少具有以下几个特征:

  1. 函数是第一类(对象)。即,可以对“数据”进行的每样操作都可以使用函数本身做到(例如将一个函数传递给另一个函数)。
  2. 将递归用作主要的控制结构。在某些语言中,不存在其它“循环”构造。
  3. 重点集中在列表 LISt 处理(例如,名称 Lisp )。列表经常和子列表的递归一起使用以替代循环。
  4. “纯”函数语言能够避免副作用。这不包括在命令语言中最普遍的模式,即指定第一个,然后将另一个值指定给同一个变量来跟踪程序状态。
  5. FP 不鼓励或根本不允许出现 语句,取而代之是使用表达式求值(换句话说,即函数加上自变量)。在很纯粹的情况下,一个程序就是一个表达式(加上支持的定义)。
  6. FP 关心的是计算 什么而不是 如何计算。
  7. 许多 FP 利用了“更高等级”函数(换句话说,就是函数对一些函数操作,而这些函数又对其它函数操作)。

函数编程的提倡者认为所有这些特征都导致更快速的开发更短以及错误更少的代码。而且,计算机科学、逻辑和数学领域的高级理论学家发现证明函数语言和程序的正式性能比命令语言和程序容易得多。

无独有偶,新发布的C# 3.0 规格书也加入了函数式编程的味道,从某些方面看起来,C# 3.0和Groovy 有点神似。

在字节码水平,Groovy 类是真正的 Java 类。Groovy的类与Java类相似:
  1. 方法可以基于类(static)或实例
  2. 可以为public、protected或private
  3. 支持常用的Java修饰符,如synchronized

请注意,Groovy 1.0-JSR3与Groovy 1.0-Beta3在类定义上语法差别较大:

  1. Groovy JSR 变量前都必须加上 def 关键字或者 private、protected 或 public 这样的修饰符;Groovy Beta3的类定义中的变量相当灵活,不需要任何关键字;(类定义外的变量不受影响。)
  2. 声明属性可以用 @Property 关键字声明成员变量 ;有别于Beta3,这里P是大写的!
  3. 变量默认为Private,方法默认为Public,除非使用了特定的访问修饰符;Groovy Beta3 类中定义的所有内容都默认为 public,除非定义了特定的访问修饰符;

例子 1 显示了在 Groovy 语言中如何声明一个Greeter的类,它有两个public的字段name和age。注意我们是如何为它们赋值的。

//无构造子的Groovy Greeter
class Greeter
{
public name
public age

def SayHello(){
println "Hello,${name},I am Groovy"
println "I am ${age} years old!"
}

def static Introduce(){
println "I am groovy greeter";
}
}

Greeter.Introduce()
Greeter greeter=new Greeter(name:"Toms",age:2)
greeter.SayHello()

上面的例子等价于使用传统构造子的Greeter,但是更灵活。

//使用传统构造子的Groovy Greeter
class Greeter
{
def name
def age
Greeter(name,age){
this.name=name
this.age=age
}

def SayHello(){
println "Hello,${name},I am Groovy"
println "I am ${age} years old!"
}

def static Introduce(){
println "I am groovy greeter";
}
}

Greeter.Introduce()
Greeter greeter=new Greeter("Toms",2)
greeter.SayHello()

接下来是一个复杂点的例子,其中类 Dog 有一个 getFullName 方法,它实际上返回一个表示 Dog 的全名的 String。

class Dog{
public name

def bark(){
println "RUFF! RUFF!"
}

def getFullName(master){
name + " " + master.lname
}

def obeyMaster(){
println "I hear you and will not obey."
}
}

我们可以看到,动态类型可以应用到字段和方法,因此参数类型是可选的(但是指定方法的参数类型和返回类型可以在通常的Java代码中更好的工作)。注意,最后return语句是可选(只要最后一条语句被执行,它的值就会被返回),缺省返回的是Object。

例子 4 是有两个属性 fname 和 lname 和一个方法的类 DogOwner。

class DogOwner{
@Property fname
@Property lname

def trainPet(pet){
pet.obeyMaster()
}
}

方法调用的语法和Java类似,支持静态和实例方法。在例 5 中,我们用 Groovy对Dog和DogOwner的实例设置属性并调用了方法。

//使用 Groovy 类
myDog = new Dog()
myDog.name = "Mollie"
myDog.bark()
myDog.obeyMaster()

me = new DogOwner()
me.fname = "Ralf"
me.lname = "Waldo"
me.trainPet myDog //不需要括号

str = myDog.getFullName(me)
println str // prints Mollie Waldo

我们看到在 Dog 类的 getFullName 方法返回一个 String 对象,在这里它是 “Mollie Waldo”。 在Groovy中方法的调用可以省略括号,只要有参数,并且没有歧义。

传递命名参数 在调用方法时,可以传递命名参数,参数的名字和值用分号分隔(象Map语法),参数名是唯一标识字符串。

bean = new Expando(name:"James", location:"London", id:007)
println "Hey " + bean.name
assert bean.id == 007

注意:当前这种方法传递只实现具有Map的方法调用或JavaBean。

闭包

Groovy 中最令人兴奋和最强大的功能是支持闭包。闭包(Closure)类似于 Java 语言中的匿名内部类。闭包和匿名内部类都是可执行的一段代码,不过这两者之间有一些细微的不同。状态是自动传入传出闭包的。闭包可以有名字。它们可以重复 使用。而且,最重要且对 Groovy 同样成立的是,闭包远比匿名内部类要灵活得多!闭包用以下方法定义:

{[comma-separated-Arguments-list ->] statements }

闭包用“{}”括起,“->”前面是参数,后面是处理语句。下面的例子演示了如何定义并使用一个闭包。第一个闭包演示了在字符串中使用参数的形式:${param};第二个闭包演示了多参数形式:用逗号隔离参数。

closure = { name ->
println("hello ${name}") }
closure.call("world!")
closure = { greeting, name ->
println(greeting + name) }
closure("hello ", "world!")

有趣的是,闭包至少会有一个参数 “it”,它其实是参数表中的第一个参数,所以如果闭包定义中只有一个参数,可以省略不写,而使用缺省的参数“it”。对于没有参数定义的闭包,“it”的值就是 null 。

closure = { println "hello " + it }
closure("world!")

例子 9 展示了闭包的强大功能。新改进的 Dog 类包括一个 train 方法,它实际上执行创建了 Dog 实例的闭包。

class Dog{

def train(action){
action.call()
}
}
sit = { println "Sit, Sit! Sit! Good dog"}

myDog = new Dog()
myDog.train(sit) //prints Sit, Sit! Sit! Good dog
mollie = new Dog()
mollie.train { println "Down! DOWN!" } //prints DOWN! DOWN!

在 上面的例子里,我们还看到,闭包通过 call() 方法被调用。(在底层,call() 方法实现了对闭包隐含的doCall()方法的调用)。Groovy 中的大多数对象具有像 each 和 find 这样的以闭包为参数的方法。用闭包来迭代对象会产生几种令人兴奋的可能性:

[2, 4, 6, 8, 3].find { x |
if (x == 3){
println x
}
}

其实就是:(你也许已经发现,可以用it代替x)

myFinder={ x |
if(x==3)
println x
}

[2,4,6,8,3].find(myFinder)

这里我们使用了一个 Groovy-Beta3 闭包定义,只是为了让您能看懂老版本Groovy的一些例子。在新的Groovy JSR中对闭包的定义略有改动,因为 | 字符同时也是 Java 中的位操作符;Groovy JSR 建议使用 Nice (另外一种JRE语言)样式的 -> 分隔符代替它。

这种以闭包为参数的代码在Groovy里十分普遍:

//each
(1..100).each{ println it}

//times
1000.times{ println it} //values go from 0 to 9999

//upto
1.upto(1000){ println it}

//step
1.step(1001,1){ println it} //values go from 1 to 1000;

更多关于闭包的内容,可以访问 >>http://groovy.codehaus.org/Closures,不过有些内容可能不适用于Groovy JSR3,因为Groovy还在不断发展中。


Groovy 4 集合

ray_linn 所撰寫。最後修改者是 ray_linn 在 218 天之前。 已瀏覽 279 次。
[編輯] [附加]
将对象组织到像列表和映射这样的数据结构中是一项基本的编码任务。像大多数语言一样,Groovy 定义了一个丰富的库以管理这些类型的集合。

列表

创建一个列表与在 Java 语言中创建一个数组很类似。

collect = ['groovy', 29, 'Hello', 'Groovy']

empty=[]
assert empty.size() == 0
//添加元素
empty.add 1
assert empty.size() == 2

在上面的例子里,列表 collect 的第二项自动装箱为一个 Integer 类型。此外“[]”表示一个空列表,这个例子还演示了如何向列表中添加元素。

Groovy 还为集合增加了几个新方法,这些方法使得对列表的一些操作变得更加容易,如统计值出现的次数、将整个列表结合到一起、对列表排序等等。可以在例2 中看到这些集合方法的使用。

collect = [5, 9, 2, 2, 4, 5, 6] 
println collect.join(' - ') // prints 5 - 9 - 2 - 2 - 4 - 5 - 6
println collect.count(2) // prints 2
println collect.sort() // prints [2, 2, 4, 5, 5, 6, 9]

Maps

像列表一样,映射也是一种在 Groovy 中非常容易处理的数据结构。例 3 中的映射包含两个对象,键是 name 和 date。注意可以用不同的方式取得值。 可以用“[:]”创造一个空的映射。

myMap = ["name" : "Groovy", "date" : new Date()]
println myMap["date"]
println myMap.date

Map可以象beans一样操作,但key值(类似属性名)必须为有效的String标识。下面的例子详细演示了Map的用法。

map = ["name":"Gromit", "likes":"cheese", "id":1234]
assert map.name == "Gromit"
assert map.id == 1234
//Create an empty maps
emptyMap = [:]
assert emptyMap.size() == 0
emptyMap.foo = 5
assert emptyMap.size() == 1
assert emptyMap.foo == 5
emptyMap.put("bar",6)
assert emptyMap.get("bar") == 6

players = ['baseball':'Albert Pujols', 'golf':'Tiger Woods']
println players['golf'] // prints Tiger Woods
println players.golf // prints Tiger Woods
for (player in players)
{
println "${player.value} plays ${player.key}"
}
// This has the same result as the previous loop.
players.each {
player |println "${player.value} plays ${player.key}"
}

范围

范围(Range)是Groovy的一大亮点Range允许创建连续值的列表。范围是一个很直观的概念,并且容易理解,利用它可以包含地或者排除地创建一 组有序值。使用“..”的Range是包括两个边界,使用“..<”(Groovy Beta3使用 “...”)的Range只包括开始边界,而不包括结束边界。

而且由于Range扩展java.util.List,所以Range可以作为List使用。

myRange = 29..<32
myInclusiveRange = 2..5
println myRange.size() // prints 3
println myRange[0] // prints 29
println myRange.contains(32) //prints false
println myInclusiveRange.contains(5) //prints true

// an inclusive range and operations
range = 'a'..'d'
assert range.size() == 4
assert range.get(2) == 'c'
assert range instanceof java.util.List
assert range.contains('a')
assert range.contains('d')
assert ! range.contains('e')

迭代器

迭代是各种编程环境中最常见、最有用的技术。迭代器可以让您迅速地访问任何集合或容器中的数据,每次一个数据。Groovy 把迭代器变成隐含的,使用起来更简单,从而改善了 Java 语言的迭代器概念。

我们可以直接在集合上使用类似迭代器的方法。而且, Groovy 的迭代器方法接受闭包,每个迭代中都会调用闭包。

class IteratorExample1{
static void main(args) {
coll = ["JMS", "EJB", "JMX"]
coll.each{ item | println item }
}
}

范围可以用于循环遍历。例如,将 rang 定义为一个排除范围,循环打印 a、b、c 和 d。

aRange = 'a'..<'e'
for (i in aRange){
println i
}

集合的其他功能

如果不熟悉 Python 和其他脚本语言,那么您在 Groovy 集合中发现的一些其他功能会让您印象深刻。例如,创建了集合后,可以用负数在列表中反向计数:

aList = ['python', 'ruby', 'groovy']
println aList[-1] // prints groovy
println aList[-3] // prints python

Groovy 还让您可以用范围分割列表。分割可获得列表的准确子集:

fullName = "Andrew James Glover"
mName = fullName[7..<13]
println "middle name: " + mName // prints James

Ruby的语法

集合类似于 Ruby如果愿意的话,还可以将 Groovy 集合作为 Ruby 集合。可以用类似 Ruby 的语法,以 << 语法附加元素、用 + 串接和用 - 对集合取差,甚至还可以用 * 语法处理集合的重复。 注意,还可以用 == 比较集合。

collec = [1, 2, 3, 4, 5]
collec << 6 //appended 6 to collec

acol = ['a','b','c'] * 3 //acol now has 9 elements
coll = [10, 11]
coll2 = [12, 13]
coll3 = coll + coll2 //10,11,12,13
difCol = [1,2,3] - [1,2] //difCol is 3
assert [1, 2, 3] == [1, 2, 3] //true

集合的索引

可以在字符串、Lists、Maps...中使用下标进行索引

text = "nice cheese gromit!"
x = text[2]
assert x == "c"
assert x.class == String

sub = text[5..10]
assert sub == 'cheese'

map = ["name":"Gromit", "likes":"cheese", "id":1234]
assert map['name'] == "Gromit"

list = [10, 11, 12]
answer = list[2]
assert answer == 12
list = 100..200
sub = list[1, 3, 20..25, 33]
assert sub == [101, 103, 120, 121, 122, 123, 124, 125, 133]

可以使用下标操作符更新项目:

list = ["a", "b", "c"]
list[2] = "d"
list[0] = list[1]
list[3] = 5
assert list == ["b", "b", "d", 5]

可以使用负索引从最后开始计数:

text = "nice cheese gromit!"
x = text[-1]
assert x == "!"
name = text[-7..-2]
assert name == "gromit"

也可以使用向后范围(开始索引大于结束索引),返回的结果是反转的

text = "nice cheese gromit!"
name = text[3..1]
assert name == "eci"



Groovy 5 JDBC编程

ray_linn 所撰寫。最後修改者是 ray_linn 在 214 天之前。 已瀏覽 338 次。
[編輯] [附加]
与Groovy的脚本特性相适应,Groovy JDBC 包含了一个精巧简单的GroovySql API,由于使用闭包和迭代器,GroovySql 把 JDBC 的资源管理职责从开发人员转移到 Groovy 框架内,从而消除了 JDBC 编程的繁琐,使得变成人员可以把注意力放在处理查询结果上。

GroovySql 简介

在 Java 中,我们是这样利用JDBC来打印Music CD的样品:

package cc.ejb.groovy;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class CdList {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/samples","root", "");
stmt = con.createStatement();
rs = stmt.executeQuery("select * from cdbean");
while (rs.next()) {
System.out.println("id:" + rs.getLong(1) + " artist:" + rs.getString(2) + " type:" + rs.getString(3));
}
}catch(SQLException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}finally{
try{
rs.close();
}catch(Exception e){}
try{
stmt.close();
}catch(Exception e){}
try{
con.close();
}catch(Exception e){}
}
}
}

利用迭代器和闭包,我们只需要短短的几行:

import groovy.sql.Sql

sql = Sql.newInstance("jdbc:mysql://localhost:3306/samples", "root","", "com.mysql.jdbc.Driver")
sql.eachRow("select * from cdbean"){
println "id:${it.id} artist:${it.artist} type:${it.type}"
}

在上面这段脚本中,你看不到try...catch,也不用捕获任何exception,甚至你不用关闭 Connection,也不用关闭 ResultSet,或者在 JDBC 编程中可以找到的任何其他熟悉的重要特性。

脚本中eachRow 方法可以当成查询结果上的迭代器。每个迭代都会执行传递进去的闭包,并在闭包中打印出每一次迭代的内容,id,artist,type等等。

为了运行上面的例子,必须将MySql JDBC Driver添加到classpath中。

执行更复杂的查询

Groovy 的 Sql 对象另外提供了 execute 和 executeUpdate 方法用于处理更复杂的数据操作(例如 insert、 update 和 delete )。

在下面的脚本中,您看到一个简单的 insert,它再次以 ${} 语法使用变量替换。这个代码只是向 cdbean 表插入一个新行。

id = 999
title ="Concept"
artist = "Nefarious"
type = "Blues"
sql.execute("insert into cdbean (id, title,artist, type, notes) values(${id},${title}, ${artist}, ${type},NULL)")

Groovy 还提供 execute 方法的一个重载版本,它接收一列值,这些值与查询中发现的 ? 元素对应。下面的例子查询了刚插入 cdbean 表中的数据。在底层,GroovySql 创建了普通 Java 语言 java.sql.PreparedStatement 的一个实例。

val = sql.execute("select * from cdbean where id = ?", [999])

更新的方式基本相同,也使用 executeUpdate 方法。executeUpdate 方法接收一列值,与查询中的 ? 元素对应。

id= 556 
artist = "Nefarious"
sql.executeUpdate("update cdbean set id = ? where artist = ?", [id, artist])

删除实际上与插入相同,当然,语法不同,如例 9 所示。

sql.execute("delete from cdbean where id = ?" , [556])

数据集(DataSet)

构建于 GroovySql 简单性的基础之上,GroovySql 支持 DataSet 类型的概念,这基本上是数据库表的对象表示。使用 DataSet,您可以在行中遍历,也可以添加新行。实际上,用数据集是方便地表示表格的公共数据集合的方式。

但是,目前 GroovySql DataSet 类型的不足之处是它们没有代表关系;它们只是与数据库表的一对一映射。

import groovy.sql.Sql
class CdDataSetExample{
static void main(args) {
def sql = Sql.newInstance("jdbc:mysql://localhost:3306/samples", "root", "", "com.mysql.jdbc.Driver")
def myCD = sql.dataSet("cdbean")
myCD.each{ cd -> println "${cd.id}+ ${cd.title}"}
myCD.add(id:"9999", title:"clerisy", artist:"Mary",type:"POP")
}
}

GroovySql 的 DataSet 类型可以容易地用 each 方法对表的内容进行遍历,容易地用 add 方法添加新行,add 方法接受一个 map 表示需要的数据。

使用存储过程和负索引

存储过程调用和负索引(negative indexing)可能是数据操纵的重要方面。GroovySql 使存储过程调用简单得就像在 Sql 类上使用 call 方法一样。对于负索引, GroovySql 提供了自己增强的 ResultSet 类型,它工作起来非常像 Groovy 中的 collections。例如,如果您想获取结果集中的最后一个项目,您可以像例子 所示的那样做:

sql.eachRow("select * from cdbean where id=556"){ cd ->  println "-1  = " + cd.getAt(-2) 
//prints type
println "2 = " + cd.getAt(3)
//prints type
}

编写一个简单的报告应用程序

我们将利用 GroovySql 编写一个报告所需数据库统计信息的应用程序,您的目标数据库是 MySQL,它恰好支持用查询发现状态信息这一概念。以下是您有兴趣的状态信息:

  1. 运行时间。
  2. 处理的全部查询数量。
  3. 特定查询的比例,例如 insert、update 和 select。
用 GroovySql 从 MySQL 数据库得到这个信息太容易了。
import groovy.sql.Sql
class StatusReport{
static void main(args) {
def uptime,questions,insertnum,selectnum,updatenum
def sql = Sql.newInstance("jdbc:mysql://localhost:3306/samples", "root", "", "com.mysql.jdbc.Driver")
sql.eachRow("show status"){ status ->
if(status.variable_name == "Uptime"){
uptime = status[1]
}else if (status.variable_name == "Questions"){
questions = status[1]
}
}
println "Uptime for Database: " + uptime
println "Number of Queries: " + questions
println "Queries per Minute = " + Integer.valueOf(questions) / Integer.valueOf(uptime)
sql.eachRow("show status like 'Com_%'"){ status ->
if(status.variable_name == "Com_insert"){
insertnum = Integer.valueOf(status[1])
}else if (status.variable_name == "Com_select"){
selectnum = Integer.valueOf(status[1])
}else if (status.variable_name == "Com_update"){
updatenum = Integer.valueOf(status[1])
}
}
println "% Queries Inserts = " + 100 * (insertnum / Integer.valueOf(uptime))
println "% Queries Selects = " + 100 * (selectnum / Integer.valueOf(uptime))
println "% Queries Updates = " + 100 * (updatenum / Integer.valueOf(uptime))
}
}

结束语

GroovySql 这个干净漂亮的 API 把闭包和迭代器与 Groovy 轻松的语法结合在一起,有助于在 Java 平台上进行快速数据库应用程序开发。
October 26

VB 学习日记 10/26

With 语句

在一个单一对象或一个用户定义类型上执行一系列的语句。

语法

With object
[statements]

End With

With 语句的语法具有以下几个部分:

部分 描述
object 必要参数。一个对象或用户自定义类型的名称。
statements 可选参数。要执行在 object 上的一条或多条语句。


说明

With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在 With 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使用 With 语句来给同一个对象的几个属性赋值。

With MyLabel
.Height = 2000
.Width = 2000
.Caption = "This is MyLabel"
End With

注意 当程序一旦进入 With 块,object 就不能改变。因此不能用一个 With 语句来设置多个不同的对象。

可以将一个 With 块放在另一个之中,而产生嵌套的 With 语句。但是,由于外层 With 块成员会在内层的 With 块中被屏蔽住,所以必须在内层的 With 块中,使用完整的对象引用来指出在外层的 With 块中的对象成员。

重点 一般来说,建议您不要跳入或跳出 With 块。如果在 With 块中的语句被执行,但是 With 或 End With 语句并没有执行,则一个包含对该对象引用的临时变量将保留在内存中,直到您退出该过程。


将两行文本放入文本框

对于文本框,在设计窗口不能输入换行符,但可以再程序执行时用代码来换行,即使用ASCII字符的13和10,如下列小程序就可将两行文本放入文本框:

  Sub form_load( )

  NL=chr(13)+chr(10)

  text1.text=“my name is”& NL &“liu qiang”

  End sub

为什么要学 Java?

如果你常玩计算机,你可能知道 Java 是一个运算平台,而非咖啡或印尼的一个岛。在 Java 技术诞生后的这五年,Java 变成了大家朗朗上口的名词,种种的说法中,有些是事实,有也一些夸大不实。你可能会想知道:你该不该去学 Java,我给你的答案是肯定的,请听听我的说法。

Java 是什么?

你必须先了解 Java 究竟是什么?当人们提到「Java」,他们指的可能是:

1.       Java 程序语言:一个类似 C++ Smalltalk 的对象导向程序语言。学习 Java 程序语言类似学人类语言,都有一套规则和文法。

2.       Java 虚拟机器(JVM):用来执行 Java 程序。JVM 有许多平台的版本,比方说 Linux Windows 版。有了 JVMJava 程序就可以在不同的平台上执行,也就是所谓的「写一次,到处都可执行」。

3.       Java APIs(指的是函式库的程序设计接口):是一组预先定义好的类别,可以在你的程序中直接使用。这些东西是免费的,功能包含了像是档案存取,网络读写,图形接口等等。

当人们提到「学习 Java」,通常他们指的是 Java 语言和 API。大家可能对 JVM 所知不多,虽然对 JVM 有基本的认识对 Java 的学习是很有帮助的。


对象导向程序设计

对象导向程序设计已经广为接受,凌驾于传统的程序导向程序设计。对象导向程序设计带来许多额外的威力,但对象导向的学习曲线也较陡。如果你已经懂一套对象导向语言,那么你学 Java 就会容易多了。

如果你不了解对象导向程序设计,你有一个漫长的旅程必须经历。以我自己来说,我花了约四年的光阴,才领悟了对象导向的精髓,不过这四年我的学习是蛮随兴的。如果你正在上好老师的课,或正埋首于一堆好书之中,或许可以缩短到几个月就够了。千万别轻忽对象导向观念的学习,因为 Java 语法好学,但是要写出良好的对象导向程序可不容易。

 

学习 Java 的理由中,有些是技术性的,有些则是非技术性的。我先描述两个程序的特色(垃圾搜集和例外处理),然后我告诉你:为什么在程序设计的领域中,Java 几乎是必备的技能。我也会告诉你 Java 开发工具的信息和它们吸引人的售价。

感谢老天,有「垃圾收集」真好!

使用 C++,你可能一不小心就写出会当机的程序;如果使用 Java,情况就大不相同了。C++ 程序的头号 bug 是内存配置的失误。C++ 的程序员很辛苦,必须直接配置一块内存,这块内存不用时还必须主动归还。这听起来简单,做起来可不容易,所以 C++ 的程序常常会耗尽内存。
Java
就不同了。虽然你仍需要主动配置内存,但此内存一旦不再使用时就会自动释放,这就称为「垃圾收集(garbage collection)」。垃圾收集机制使得写程序时轻松许多,虽然因此执行时效率稍微变差,但影响可能轻微得你根本感觉不到。

例外处理机制让程序更稳固

不管是什么程序语言,都可以轻易地写出很糟糕的程序,但是使用 Java 想写出很糟糕的程序就不容易了。原因之一是垃圾收集,原因之二是「例外处理机制」。良好的程序员写出来的程序应该在一些意外状况发生时程序依然正常。档案无法开启,怎么办?万一读档读到一半时出问题,怎么办?如果你是用 C++ 或 其它语言,你可能会疏于考虑而没进行这些意外状况的处理。你可能会辩白:「我只是在试试看这样写能否行得通,我稍后会回过头来把程序改得更周延」。但结果 通常是:程序执行正常后,你又会忙着写新的程序,这么一拖后来就忘了回头处理还不完整的部分。问题终究还是会爆发出来,你终究还是要面对烂摊子。
Java
强迫你在一遇到有可能出问题的地方就要准备好因应之道。Java method 可以丢出例外,用来通知呼叫者程序出状况了,这是相当好的机制。即使你的程序要开启档案,你都必须在程序中写好例外处理方式。

到处都是 Java

到处都可见到 Java,这是一大好处。如果你靠写程序为生,你可能迟早都会接触到 JavaJava 已经渐渐地渗透到各领域,你可以写出 Java servlet,将其挂在 Apache 或其它网页服务器上,你可以写出 Java applet,在网页浏览器上执行。你甚至可以用 Java 写出数据库的 stored procedure,然后安装到 Oracle 8i 上。
我打赌,你身边使用 Java 的同事也会渐渐多起来。1997 年开始,许多大学已经用 Java 取代 C 当作程序设计教学的语言。如此一来,Java 变成了程序员共通的语言。如果学习 Java 所为你带来的唯一好处是方便和同事沟通,那么也值得。
最后,我要提的是:「写一次,到处都可执行」。Java 早期版本(1.0 1.1)比较无法完全跨平台,但现在就好多了。如果你想散布一个程序到多个平台,又不想改写大部分的程序,那么 Java 是绝佳的选择。Java 2 现在已经可以在 Linux、许多 Unix、和 Windows 上执行了。
MacOS 9
Java 仍在 1.1 时代。然而,Apple 的下一代操作系统 OS X 是以 Unix 为核心,这使得移植软件的过程大大简化了。我不知道 Apple 官方的说法为何,但是在今年三月的时候,我就已经看到 OS X developer release 3 上面执行着 Java 2。我很有自信 Java 2 将可以在 LinuxOS X、和 Windows 上执行,这样已经涵盖了大部分的计算机世界。

Java 免费

Sun 提供 Java 相关的工具,让你可以开发与执行 Java 程序。你无须支付授权费,你也不用花钱买 Java 开发工具。当然,Sun 这么做自有他们的如意算盘,Scott McNealySun 的老板)恨不得能征服世界,但是不管怎样,我们的的确确是不用付钱给任何人就可以享受 Java
而且,Java API 是珍贵的宝藏,让我们可以轻易地写出功能强大的程序。想写网络程序?已经有 API 了!想连接数据库?已经有 API 了!想写 GUI 程序?已经有 API 了!或者是想做数字影像处理、音乐文件处理、字符串剖析、数字签章?通通有 API 了!身为一个程序员,有这么多好用的 API 真的是再高兴不过的事了,这些 Java API 让我们不用「重新发明轮子」,省却不少功夫。Java 有这么广泛、标准、先进的 API,简直是让 C++ 程序员忌妒死了。C++ 程序员常要花时间学一些 C++ 类别库(比方说 MFC),然后到 Linux 上又得归零学另一套(因为 Linux 上没有 MFC)。一旦你学会了某 Java API,到哪儿都一样不会变动,不用重学。
最后,Java 的信息文件都可从网站上免费取得。如果你有网络而且有空,你可以直接透过网络学习对象导向、Java 语言、以及 Java APISun 在网站上放了一大堆很棒的线上教材。如果你习惯看书来学习,市面上有一堆 Java 的书可以参考(比方说,我写的 Learning Java)。

日光浴

Java 比其它语言来得有趣许多。Java 程序语言有许多「防呆装置」让你不会在程序中犯下大错,所以你可以很快地把程序写完,而如果使用其它语言必须要花更多时间。一份有趣的资料显示:用 Java 写程序比用其它语言快了四到十倍。我知道这听起来很不可思议,不过你可以问问周遭懂 Java 的人看看。不用花很多时间找 bug,意味着你可以在海滩上休息更久,意味着你可以接受阳光的日光浴而非「屏幕的日光浴」。用 Java 为你赚进的银两为自己买一副太阳眼镜吧!

本文作者:Jonathan Knudsen(着有「Learning Java」、「Java 2D Graphics」等书)
本文译者:蔡学镛

语言、平台、链接库 转自:蔡学镛《爪哇夜未眠》

语言、平台、链接库,这三者之间有很密切的关系。本文尝试着以链接库为中心,探讨它们之间的现况。

语言与链接库

语言通常会伴随着链接库,没有链接库的语言,差不多什么程序都写不出来。比方说,用 C 语言写出一个印出 Hello 的小程序,你需要用到 stdio 的链接库。用 Python GUI 程序,你需要 Tkinter 链接库。

平台与链接库

平台通常也会伴随着链接库,没有链接库的平台,等于是摆明了不希望别人开发此平台的程序。比方说,你想用 Visual C++ 6 开发 Windows 程序,你需要用到 GDI32 以及 USER32 MFC 等链接库。写 Mac OS 9 的程序,需要 Carbon 链接库。

平台的链接库 vs 语言的链接库

A 平台上用 B 语言开发软件,你会同时面对 A 平台的链接库和 B 语言的链接库,此二链接库因为是不同厂商所提供的,所以可能无法百分之百契合,特别是牵涉到内存管理、资源管理、执行绪等和操作系统有密切关系的主题时。如果你想进行的某功能在 A 平台的链接库和 B 语言的链接库都有提供,那么你应该使用 A 平台链接库的版本,通常比较安全些。比方说,用 C 语言开发 Windows 平台的程序,如果你想配置内存,那么你应该呼叫 Win32 API 的版本(比方说 GlobalAlloc()),而非 C 语言的版本(比方说 malloc())。

跨平台的链接库

你为某平台所开发的程序,为什么不能在别的平台上重新编译之后就能执行?问题就出在平台的链接库上。比方说,你用 C 语言搭配 C 的标准链接库和 Win32 链接库,在 Windows 平台上开发出一个演示文稿软件 WeakPoint 2000;你将 WeakPoint 2000 的原始程序拿到 Linux 上编译,却无法编译成功,问题就出在 Linux 没有 Win32 的链接库。

那么,如果有一个链接库将各个主要平台的链接库萃取(abstract)出一个共通的链接库,不就可以解决这个问题了。例如 Qt 正是这么做,你的 C++ 程序如果只使用标准的 C++ 链接库和 Qt 链接库,你就可以把程序重新编译之后在不同的平台(LinuxUnixWindows)上执行。

语言 + 平台 + 链接库

Java 就更了不起了,不但将链接库统一起来,更将平台统一起来,也就是说程序不用重新编译,就可以直接执行。但是也因此,多了一层 JVM,牺牲了一部分的效率。

跨语言的链接库

Borland VCL 链接库是在 Windows 平台上相当受好评的一套链接库,可以被 C++ Object PascalDelphi)使用。其实「跨语言的链接库」不是一种很好的说法,毕竟许多语言都可以连结外部原生链接库,两者不需要是同一种语言。但是这样的连结是否需要大费周章,则有相当大的差异。而 Delphi C++ Builder 使用 VCL 则是相当方便的。

即将在本月底问世的 Mac OS X,提供了 Cocoa 链接库。Cocoa 链接库可以被 Objective-C Java 语言使用。Objective-C Java 语言版的 Cocoa 链接库相似性在九成以上。Java Mac OS X 的原生程序设计上被简化成一个纯语言,完全不使用 Java API,只使用 Cocoa 链接库,这倒是挺特别的。(当然 Mac OS X 也另外会有 JVM 来支持一般的 J2SE

语言规格 + 平台 + 链接库 = 包山包海 ?

.NET Java 的眼光更高,甚至准备将语言规格也统一起来。.NET 有一个 CLScommon language specification),任何语言只要符合 CLS 这个标准,就可以轻易地整合进 .NET 平台,享用 .NET 平台的资源。这一点就是 Java 比不上的。虽然别的语言一样可以设计出编译器来将程序编译成 Java bytecode,在 JVM 上执行,但 Java 并没有提供直接的支持,所以要移植一个语言到 Java,比移植一个语言到 .NET 来得困难。

.NET
虽然允许各种语言,但是为了因应 CLS,所以各个语言常常需要做出妥协更改语言本身,比方说 Visual Basic 的更改幅度就很大(Visual Basic 7 差不多是一个新的语言了),而 JScript Visual C++ 的语言也都有改变。这种方式的语言中立性,无疑是削足适履。有了 CLS 的规范,这些语言会趋于一致,思维模式如出一辙,只有一些微不足道的小差异。历史会证明,C# 会是 .NET 平台上独大的语言,.NET 上的其它语言都将沦为点缀,这么一来,跨语言的宣示,竟成了一个幌子。虽然我对 .NET 的语言中立性这点颇有疑异,但我倒是挺喜欢 .NET framework 的,我忍不住竖起大拇指称赞 .NET framework 是「歹竹出好笋」。

.NET
的语言规格和链接库都是统一的。命运多舛的 Eiffel .NET 视为救命的浮木,准备将 Eiffel 移植到 .NET,但这么一来,Eiffel 势必得放弃自行开发的 Windows 专用链接库 WELWindows Eiffel Library)与跨平台的链接库(比方说 EiffelVision 等)。难道 Eiffel 没有发现它所以为的浮木,其实是鳄鱼伪装的?

同样的问题也会发生在 Delphi 上,如果 Delphi 准备移植到 .NET,也必须更改一部分的语言特性,并可能要放弃在 .NET 上使用 VCLCLX)。Delphi 这么做一点好处都没有。

最乱的时代,最好的选择

看完这篇文章,你可能已经头昏脑胀了。没关系,你只要记得下面这句话就好了:最乱的时代,最好的选择 ...Java

Java 学习之道 转自:蔡学镛《爪哇夜未眠》

目前 Java 可以说是产业界和学术界最热门的语言,许多读者都很急切想把 Java 学好。除非像电影「骇课任务」(Matrix)一样能够把需要的专业技巧下载到脑海(女主角只花了几秒下载资料,就马上具备飞行员的技巧),或是武侠小说中的运功传送内力的方式,否则花上一段时间苦学是免不了的。花时间,不打紧,就怕方法错误,事倍功半。我认为,学习 Java 包括了下列的范畴:

* 认识 Java 的原理
*
学会 Java 语言
*
对象导向的思维
* API
*
开发工具的用法

下面分别就这几点详细阐述。

学习 Java 的原理

了解 Java 的原理,才有可能真正体会 Java 的一切,学习任何事情,只要能掌握原理,就会比较顺利。我发现许多人使用 Java 已经逾年,却连 Java 最基本的特质都不清楚。

一般来说,信息系毕业的学生,对于信息的新事物学习的速度,会比其它科系来得快,就是因为四年的教育为他们奠定了学习新事物的基础,这也是信息系课程的价值所在。

除非你受过的基础训练够扎实,否则在学习或使用 Java 的过程中,你一定会需要参考到这些信息系学科的知识。我建议各位可以在闲暇之余,把信息系课本的书拿来读一读。这是治本之道,绝非立竿见影的特效药,必须要有耐心。

学习 Java 语言

学习 Java 语言很简单,毕竟 Java 语言也只包含五十多个关键词(keyword)与几十个算符(operator),再加上 Java 语法(syntax)也很简单,所以一般人可以很快就学会 Java 语言。危险的是,很多人认为已经完全掌控 Java 语言,但其实对于内部的运作机制仍不能掌握,这些盲点有时候会让你无法完全掌控 Java 语言。克服这些盲点的方式是看「The Java Language Specification, 2nd Ed.」(没有中文版)来彻底弄懂 Java 程序语言,并看「Inside the Java Virtual Machine, 2nd Ed.」(有中文版,但翻译得@#%$)来彻底掌握 Java 虚拟机器的运作方式。

学习对象导向的思维

学会了语言,并不代表就可以设计出好的对象导向系统架构。想要成为对象导向的专家,往往需要:

* 多看相关的书,特别是 Design Pattern Refactoring 的书。
*
多观摩别人的程序(例如 Java API design implementation
*
多写程序

学习 API

学会 Java 语言之后,还需要学会一些 API 才能写出有用的程序。Java API 非常多,必须规划好一个学习路径,才不会在浩瀚的 API 大海中迷失。必备的 API 包括了:IONew IOCollection FrameworkNetworkRMIJAXP... 等。至于其它的 API,就看你的需求而定,大致上分成:

* GUI 类:JavaBean -> Swing -> JavaHelp -> Java2D -> Image IO -> JAI -> Java 3D ...
* Enterprise
类:JDBC -> JDO -> Servlet -> JSP -> EJB -> JMS -> JTA/JTS...
* J2ME
类(这一类不是我的专长,无法提供学习顺序建议)

学习开发工具的用法

只用 JDK,是很难写出大型程序的,所以通常程序员会使用 JBuilder/VisualAge/ VisualCafe 等工具,这些软件卖这么贵,一定有它的价值,值得花一些时间好好学习这些开发工具的使用方式,你将会发现开发工具所提供的许多功能,可以让你在开发过程中生产力大增。

如何进入程序设计的领域 转自:蔡学镛《爪哇夜未眠》

这一阵子,软件、网络大红,许多人对程序设计开始感兴趣,我收到好一些 Sleepless in Java专栏读者的来信,不少读者共同的问题是:如何进入程序设计的领域?所以我选这 个主题当作 Sleepless in Java 专栏「复刊」的第一篇文章。

写程序是很有趣的事,可以把自己的想法付诸实行。写程序的工具很简单,只要有一部PC,适当的开发环境,就可以上工了。这样有限的工具却可以创造无限的可能,这也正是程序 设计迷人的地方。只要你能力够,你可以将你脑海中的创意写成程序,变成一套软件。

培养程序能力,不是一蹴可及的,下面提供我的一些建议,希望对有志进入程序设计领域的你有所帮助。

培养兴趣

把程序设计当成兴趣可以让你学得更快乐,学习效果自然会更好。在我到一个单位面试时,主管看了我的履历之后问我:「你怎么有这么多时间学会这么多东西、做这么多事?」 我的回答是:「把工作、学习、和娱乐结合在一起,时间就会是别人的三倍。」

我承认我很幸运,可以把程序设计当作赚钱的工作,学习的题材,以及茶余饭后的休闲活动。不是每个人都像我这般幸运,但是我相信至少大家都可以把它当成兴趣。相信我, 调整你的心境,把它当成是兴趣,而非苦差事,你非发现你的「程序功力」与日俱增。

慎选程序语言

慎选程序语言很重要,一开始就学太难的程序语言很容易让你遭遇到挫折而放弃。你可以挑比较容易且有趣的语言下手,建议您可以从下面的语言中择一:

VB:简单,好用,书籍多。
Java:比VB稍难,比C/C++简单,书籍多,用途非常广,相当有前途。可以当作学习C++的跳板。
Python:简单,好用,各个平台都支持(包括WindowsLinuxMacOSBeOS...)。国外很红,国内较少人用。原文书不少, 但中文书目前只有一本(欧莱礼出版)。我预期 Python 会是下一个热门的程序语言。

这三个语言只是我给各位的建议,你也可以多听听别人的意见。在选定一个程序语言之后,就要执着,不可以很快放弃,又改学另一个程序语言,否则永远都只懂皮毛。有句谚语是 这么说的:「A jack of all trades is master of none」。如果你号称会C++Java等十种程序语言,只不过每种程序语言都停留在Say Hello的阶段,相信面谈主管很快就会 对你 Say Goodbye

当你学精某程序语言,然后想再学另一个程序语言,你会发现有了前一个程序语言札实的根基,学任何新的程序语言都很快。

使用适当的开发工具

现在RAD工具软件盛行,Visual BasicDelphiJBuilderVisualAgeVisualCafe都是。有了RAD工具,只要「拉一拉,选一选」程序就完成一半了。许多硬底子的程序员 颇不以为然,认为初学者使用RAD工具不是好习惯,不过我倒不这么认为。我认为RAD工具可以降低初学者学习的门槛,提高兴趣。只是,在你学会「拉一拉,选一选」的简单步骤之后, 应该要找机会精进自己,弄懂内部的机制,不然不仅会有一种不踏实的感觉,甚至有许多程序会写不出来。我再强调一次:RAD可以当初学者入门的工具,但小心不要使它变成让你 停滞不前的借口。

另外也要学会使用开发工具所附的诸多功能(特别是除错功能)。许多人买了昂贵的 Enterprise 版开发工具,却只用到copy-paste功能,那么这套开发工具和 Windows 所附的 记事本就没有两样了。建议您开始使用一套新的开发工具前先花些时间把 User Guide 翻一翻。

现在许多开发工具都有免费版本可以下载,初学者不妨多多利用。

多读好书,少上课

大量阅读好书,是精进自己的不二法门。在这种快餐时代,许多人没耐心读书,反而喜欢到处上课,所以现在到处都是计算机班。如果遇到厉害的好老师,当然上过他(或她)的课 会收获很大,只是目前好老师的比例实在不高(虽然我自己也在开 Java/Enterprise Java/Java Swing 的课,但我还是得这么说)。我曾在网络上看到有人说:「没听过补习班教 出什么程序高手」,这倒也有几分真实性。不过一方面要归咎老师之外,一方面也要归咎学生,因为我发现通常上课的学生会在家里读书和写程序练习的比例不高。

相较于上课动辄花费上万元的高代价,买书只需要区区几百上千,划算多了,更何况书上的内容又比上课来得多且详细。不过「买书容易,看书难」。怕自己偷懒的话,找志同道合 的朋友组织「读书会」,彼此加油打气,还可以互相切磋。最好是像我前面提到的:把它变成兴趣。

加强英文阅读能力

加强英文和崇洋无关,而是有它实际的价值。许多信息都是要直接看英文的资料,因为没有中文版可看。

「可是我的英文很烂!」

这不是理由。没人生下来就能阅读英文,都是一点一点累积起阅读能力的。给自己一个机会,找一本单字文法都比较简单、且页数又少的书籍下手,很快地,你会发现技术书籍的 单字就是哪几个在重复出现,阅读这样的书一点都不难。

请注意:原文书的写作风格也有相当大的差异,有的书的确是不好读。所以,如果你刚开始要尝试阅读原文书,不要挑到像 Bjarne Stroustrup 所写的 The C++ Programming Language 这类难懂的书……尽管它是经典。

问人之前,先问自己

遇到问题,可以到国内外的程序设计相关讨论区去请教别人,如果态度谦逊,且问题叙述清楚,相信许多有经验的前辈会很乐于参与讨论。不过,凡是遇到问题就发问,这不是好事, 因为你会因此越来越依赖别人,而失去了自我解决问题的能力。自己应该尝试着查书、写程序测试、甚至阅读原始码,来找出答案。如此一来,真的没办法而请教别人时,也才能 比较深入地讨论。

多写程序

学程序设计不可以只看书,将随书光盘的程序执行一次,就认为自己已经学会了。应该开始写一些程序,且由小到大,由简单到复杂。找一些有趣的题目(比方说:计算器,踩地雷, 小画家,俄罗斯方块),可以提升写程序的动力。

我看到许多学生大一的程序作业都是copy同学的,失去了练习的机会。等到二年级之后,想开始写程序,却写不出来了。初学程序设计的阶段,应该给自己多一些机会写程序。

向上延伸,向下延伸,向旁延伸

当你发现你已经可以掌握此程序语言之后,你可以选择:

向上延伸:学习对象导向分析设计、Design Patterns、以及软件工程。让自己具有做大型计划的能力。

向下深入:深入了解内部底层的机制,例如操作系统(甚至硬件)内部。

向旁延伸:学习不同的API,例如:多媒体、数据库、企业运算

另外,数据结构、算法等基础也很重要。

结论

一分耕耘,一分收获,用对方法,持之以恒。每半年检阅自己这段期间以来的进步,相信你也会很高兴地说「我做到了」!

网络经典命令行 转- -

Windows 2k/2003 Server
1.最基本,最常用的,测试物理网络的
ping 192.168.10.88 -t ,参数-t是等待用户去中断测试

2.查看DNS、IP、Mac等
A.Win98:winipcfg
B.Win2000以上:Ipconfig/all

C.NSLOOKUP:如查看河北的DNS
C:\>nslookup
Default Server: ns.hesjptt.net.cn
Address: 202.99.160.68
>server 202.99.41.2 则将DNS改为了41.2
> pop.pcpop.com
Server: ns.hesjptt.net.cn
Address: 202.99.160.68

Non-authoritative answer:
Name: pop.pcpop.com
Address: 202.99.160.212

3.网络信使
Net send 计算机名/IP|* (广播) 传送内容,注意不能跨网段
net stop messenger 停止信使服务,也可以在面板-服务修改
net start messenger 开始信使服务

4.探测对方对方计算机名,所在的组、域及当前用户名
ping -a IP -t ,只显示NetBios名
nbtstat -a 192.168.10.146 比较全的

5.netstat -a 显示出你的计算机当前所开放的所有端口
netstat -s -e 比较详细的显示你的网络资料,包括TCP、UDP、ICMP 和 IP的统计等

6.探测arp绑定(动态和静态)列表,显示所有连接了我的计算机,显示对方IP和MAC地址
arp -a

7.在代理服务器端
捆绑IP和MAC地址,解决局域网内盗用IP:
ARP -s 192.168.10.59 00-50-ff-6c-08-75
解除网卡的IP与MAC地址的绑定:
arp -d 网卡IP

8.在网络邻居上隐藏你的计算机
net config server /hidden:yes
net config server /hidden:no 则为开启

9.几个net命令
A.显示当前工作组服务器列表 net view,当不带选项使用本命令时,它就会显示当前域或网络上的计算机上的列表。
比如:查看这个IP上的共享资源,就可以
C:\>net view 192.168.10.8
在 192.168.10.8 的共享资源
资源共享名 类型 用途 注释
--------------------------------------
网站服务 Disk
命令成功完成。

B.查看计算机上的用户帐号列表 net user
C.查看网络链接 net use
例如:net use z: \\192.168.10.8\movie 将这个IP的movie共享目录映射为本地的Z盘

D.记录链接 net session
例如:
C:\>net session
计算机 用户名 客户类型 打开空闲时间
-------------------------------------------------------------------------------
\\192.168.10.110 ROME Windows 2000 2195 0 00:03:12

\\192.168.10.51 ROME Windows 2000 2195 0 00:00:39
命令成功完成。

10.路由跟踪命令
A.tracert pop.pcpop.com
B.pathping pop.pcpop.com 除了显示路由外,还提供325S的分析,计算丢失包的%

11.关于共享安全的几个命令
A.查看你机器的共享资源 net share
B.手工删除共享
net share c$ /d
net share d$ /d
net share ipc$ /d
net share admin$ /d
注意$后有空格。
C.增加一个共享:
c:\net share mymovie=e:\downloads\movie /users:1
mymovie 共享成功。
同时限制链接用户数为1人。

12.在DOS行下设置静态IP
A.设置静态IP
CMD
netsh
netsh>int
interface>ip
interface ip>set add "本地链接" static IP地址 mask gateway
B.查看IP设置
interface ip>show address

Arp
显 示和修改“地址解析协议 (ARP)”缓存中的项目。ARP 缓存中包含一个或多个表,它们用于存储 IP 地址及其经过解析的以太网或令牌环物理地址。计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表。如果在没有参数的情况下使用,则 arp 命令将显示帮助信息。

语法
arp [-a [InetAddr] [-N IfaceAddr] [-g [InetAddr] [-N IfaceAddr] [-d InetAddr [IfaceAddr] [-s InetAddr EtherAddr [IfaceAddr]

参数
-a [InetAddr] [-N IfaceAddr]
显 示所有接口的当前 ARP 缓存表。要显示指定 IP 地址的 ARP 缓存项,请使用带有 InetAddr 参数的 arp -a,此处的 InetAddr 代表指定的 IP 地址。要显示指定接口的 ARP 缓存表,请使用 -N IfaceAddr 参数,此处的 IfaceAddr 代表分配给指定接口的 IP 地址。-N 参数区分大小写。
-g [InetAddr] [-N IfaceAddr]
与 -a 相同。
-d InetAddr [IfaceAddr]
删除指定的 IP 地址项,此处的 InetAddr 代表 IP 地址。对于指定的接口,要删除表中的某项,请使用 IfaceAddr 参数,此处的 IfaceAddr 代表分配给该接口的 IP 地址。要删除所有项,请使用星号 通配符代替 InetAddr。
-s InetAddr EtherAddr [IfaceAddr]
向 ARP 缓存添加可将 IP 地址 InetAddr 解析成物理地址 EtherAddr 的静态项。要向指定接口的表添加静态 ARP 缓存项,请使用 IfaceAddr 参数,此处的 IfaceAddr 代表分配给该接口的 IP 地址。
/?
在命令提示符显示帮助。
注释
InetAddr 和 IfaceAddr 的 IP 地址用带圆点的十进制记数法表示。
物理地址 EtherAddr 由六个字节组成,这些字节用十六进制记数法表示并且用连字符隔开(比如,00-AA-00-4F-2A-9C)。
通过 -s 参数添加的项属于静态项,它们不会 ARP 缓存中超时。如果终止 TCP/IP 协议后再启动,这些项会被删除。要创建永久的静态 ARP 缓存项,请在批处理文件中使用适当的 arp 命令并通过“计划任务程序”在启动时运行该批处理文件。
只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要显示所有接口的 ARP 缓存表,可键入:

arp -a

对于指派的 IP 地址为 10.0.0.99 的接口,要显示其 ARP 缓存表,可键入:

arp -a -N 10.0.0.99

要添加将 IP 地址 10.0.0.80 解析成物理地址 00-AA-00-4F-2A-9C 的静态 ARP 缓存项,可键入:

arp -s 10.0.0.80 00-AA-00-4F-2A-9C

At
计划在指定时间和日期在计算机上运行命令和程序。at 命令只能在“计划”服务运行时使用。如果在没有参数的情况下使用,则 at 列出已计划的命令。

语法
at [\\ComputerName] [{[ID] [/delete]|/delete [/yes]}]

at [\\ComputerName] hours:minutes [/interactive] [{/everyate[,...]|/nextate[,...]}] command]

参数
\\computername
指定远程计算机。如果省略该参数,则 at 计划本地计算机上的命令和程序。
ID
指定指派给已计划命令的识别码。
/delete
取消已计划的命令。如果省略了 ID,则计算机中所有已计划的命令将被取消。
/yes
删除已计划的事件时,对来自系统的所有询问都回答“是”。
hours:minutes
指定命令运行的时间。该时间用 24 小时制(即从 00:00 [午夜] 到 23:59)的 小时: 分钟格式表示。
/interactive
对于在运行 command 时登录的用户,允许 command 与该用户的桌面进行交互。
/every:
在每个星期或月的指定日期(例如,每个星期四,或每月的第三天)运行 command 命令。
date
指定运行命令的日期。可以指定一周的某日或多日(即,键入 M、T、W、Th、F、S、Su)或一个?械哪橙栈蚨嗳眨�矗氪?1 到31 之间的数字)。用逗号分隔多个日期项。如果省略了 date,则 at 使用该月的当前日。
/next:
在下一个指定日期(比如,下一个星期四)到来时运行 command。
command
指 定要运行的 Windows 命令、程序(.exe 或 .com 文件)或批处理程序(.bat 或 .cmd 文件)。当命令需要路径作为参数时,请使用绝对路径,也就是从驱动器号开始的整个路径。如果命令在远程计算机上,请指定服务器和共享名的通用命名协定 (UNC) 符号,而不是远程驱动器号。
/?
在命令提示符显示帮助。
注释
Schtasks 是功能更为强大的超集命令行计划工具,它含有 at 命令行工具中的所有功能。对于所有的命令行计划任务,都可以使用 schtasks 来替代 at。有关 schtasks 的详细信息,请参阅“相关主题”。

使用 at
使用 at 命令时,要求您必须是本地 Administrators 组的成员。

加载 Cmd.exe
在运行命令之前,At 不会自动加载 Cmd.exe (命令解释器)。如果没有运行可执行文件 (.exe),则在命令开头必须使用如下所示的方法专门加载 Cmd.exe:

cmd /c dir > c:\test.out。

查看已计划的命令
当不带命令行选项使用 at 时,计划任务会出现在类似于以下格式的表中:

Status ID Day Time Command Line
OK 1 Each F 4:30 PM net send group leads status due
OK 2 Each M 12:00 AM chkstor > check.file
OK 3 Each F 11:59 PM backup2.bat
包含标识号 (ID)
当在命令提示下使用带有标识号 (ID) 的 at 命令时,单个任务项的信息会显示在类似于下面的格式中:

Task ID: 1

Status:OK

Schedule:Each F

Time of Day:4:30 PM

Command:net send group leads status due当计划带有 at 的命令(尤其是带有命令行选项的命令)后,要通过键入不带命令行选项的 at 来检查该命令语法是否输入正确。如果显示在“命令行”列中的信息不正确,请删除该命令,然后重新键入它。如果还不正确,则可以在重新键入该命令时让它少带 些命令行选项。

查看结果
使用 at 的已经计划的命令作为后台程序运行。运行结果不会显示在计算机上。要将输出重定向到文件,请使用重定向符号 (>。如果将输出重定向到文件,则不论是在命令行还是在批处理文件中使用 at,都需要在重定向符号之前使用转义符 。例如,要重定向输出到 Output.text 文件,则要键入:

at 14:45 c:\test.bat ^>c:\output.txt

执行命令的当前目录为 systemroot 文件夹。

更改系统时间
在使用 at 命令计划了要运行的命令之后,如果更改了计算机的系统时间,则通过键入不带命令行选项的 at 可使 at 计划程序与修改后的系统时间同步。

存储命令
已计划的命令存储在注册表中。这样,如果重新启动“计划”服务,则不会丢失计划任务。

连接到网络驱动器
对于需要访问网络的计划作业,请不要使用已重新定向的驱动器。“计划”服务可能无法访问这些重定向的驱动器,或者,在该计划任务运行时如果有其他用户登录,则这些重定向的驱动器可能不会出现。因此,对于计划作业,请使用 UNC 路径。例如:

at 1:00pm my_backup \\server\share

请不要使用下述语法(其中 x: ?表示由用户建立的连接):

at 1:00pm my_backup x:

如果计划了一个使用驱动器号的 at 命令来连接共享目录,则应包含一个 at 命令以使在完成该驱动器的使用时断开与驱动器的连接。如果不能断开与驱动器的连接,则在命令提示下,所指派的驱动器号将不可用。

范例
要显示 Marketing 服务器上已计划的命令列表,请键入:

at \\marketing
要了解服务器 Corp 上标识号为 3 的命令的详细信息,请键入:

at \\corp 3
要计划在上午 8:00 于 Corp 服务器上运行网络共享命令,并将该列表重定向到 Maintenance 服务器的 Corp.txt 文件(位于 Reports 共享目录下)中,请键入:

at \\corp 08:00 cmd /c "net share reports=d:\marketing\reports >> \\maintenance\reports\corp.txt"
为了在每五天后的午夜将 Marketing 服务器的硬盘驱动器备份到磁带驱动器,首先创建名为 Archive.cmd 的批处理程序(它含有备份命令),然后计划该批处理程序的运行,为此请键入:

at \\marketing 00:00 /every:5,10,15,20,25,30 archive
要取消当前服务器上已计划的所有命令,请按下述方法清除 at 计划信息:

at /delete
如果要运行的命令不是可执行 (.exe) 文件,请按如下所示的方法在该命令之前使用 cmd /c 来加载 Cmd.exe:

cmd /c dir > c:\test.out。
Rsh
在 运行 RSH 服务的远程计算机上运行命令。Windows XP 和 Windows 2000 不提供 RSH 服务。Windows 2000 Server Resource Kit 提供名为 Rshsvc.exe 的 RSH 服务。使用不带参数的 rsh 显示帮助。

语法
rsh [Host] [-l UserName] [-n] [Command]

参数
Host
指定运行 command 的远程计算机。
-l UserName
指定远程计算机上使用的用户名。在省略情况下,使用当前登录用户的名称。
-n
将 rsh 的输入重定向到 NULL 设备。这防止本地计算机命令结果的显示。
Command
指定要运行的命令。
/?
在命令提示符显示帮助。
注释
标准*作
rsh 命令将标准输入复制到远程 command,将远程 command 的标准输出复制到其标准输出,将远程 command 的标准错误复制到其标准错误。Rsh 通常在远程命令终止时终止。

使用重定向符号
为了使重定向在远程计算机上发生,要以引号引住重定向符号(例如 ">>")。如果不使用引号,重定向会在本地计算机发生。例如,以下命令将远程文件“RemoteFile”附加到本地文件“LocalFile”中:

rsh othercomputer cat remotefile >> localfile

以下命令将远程文件 Remotefile 附加到远程文件 otherremotefile 中:

rsh othercomputer cat remotefile ">>" otherremotefile

使用 rsh
在使用已登录到某个域并且运行 Windows XP Professional 的计算机时,该域的主域控制器必须可用于确认用户名或 rsh 命令失败。

.rhosts 文件
.rhosts 文件通常许可 UNIX 系统的网络访问权限。.rhosts 文件列出可以访问远程计算机的计算机名及关联的登录名。在正确配置了 .rhosts 文件的远程计算机上运行 rcp、rexec 或 rsh 命令时,您不必提供远程计算机的登录和密码信息。

.rhosts 文件是一个文本文件,该文件中每一行为一个条目。条目由本地计算机名、本地用户名和有关该条目的所有注释组成。每个条目均由制表符或空格分开,注释用符号 (#) 打头。例如:

host7 #This computer is in room 31A

.rhosts 文件必须在远程计算机的用户主目录中。有关远程计算机 .rhosts 文件特定执行的详细信息,请参阅远程系统的文档。

只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要以名称 admin1 在远程计算机 vax1 上执行 telcon 命令,请键入:

rsh vax1 -l admin1 telcon

Tftp
向运行平凡文件传输协议 (TFTP) 服务或 daemon 的远程计算机(尤其是运行 UNIX 的计算机)传输文件或从运行平凡文件传输协议 (TFTP) 服务或 daemon 的远程计算机(尤其是运行 UNIX 的计算机)传输文件。

语法
tftp [-i] [Host] [{get | put}] [Source] [Destination]

参数
-i
指 定二进制图像传送模式(也称为八进制模式)。在二进制图像模式下,文件以一个字节为单位进行传输。在传送二进制文件时使用该模式。如果省略了 -i,文件将以 ASCII 模式传送。这是默认的传送模式。该模式将行尾 (EOL) 字符转换为指定计算机的适当格式。传送文本文件时使用该模式。如果文件传送成功,将显示数据传输率。
Host
指定本地或远程计算机。
put
将本地计算机上的 Destination 文件传送到远程计算机上的 Source 文件。因为 TFTP 协议不支持用户身份验证,所以用户必须登录到远程计算机,同时文件在远程计算机上必须可写。
get
将远程计算机上的 Destination 文件传送到本地计算机上的 Source 文件。
Source
指定要传送的文件。
Destination
指定将文件传送到的位置。如果省略了 Destination,将假定它与 Source 同名。
/?
在命令提示符显示帮助。
注释
使用 get 参数
如果将本地计算机上的文件 FileTwo 传送到远程计算机上的文件 FileOne,则指定 put。如果将远程计算机上的文件 FileTwo 传送到远程计算机上的文件 FileOne,则指定 get。

Windows XP 或 Windows 2000 不提供一般用途的 TFTP 服务器。Windows 2000 提供的 TFTP 服务器服务只为 Windows XP 和 Windows 2000 客户端计算机提供远程引导功能。
只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要从本地计算机将文件 Users.txt 传送到远程计算机 vax1 上的 Users19.txt,请键入:

tftp vax1 put users.txt users19.txt
Nbtstat
显 示本地计算机和远程计算机的基于 TCP/IP (NetBT) 协议的 NetBIOS 统计资料、NetBIOS 名称表和 NetBIOS 名称缓存。Nbtstat 可以刷新 NetBIOS 名称缓存和注册的 Windows Internet 名称服务 (WINS) 名称。使用不带参数的 nbtstat 显示帮助。

语法
nbtstat [-a RemoteName] [-A IPAddress] [-c] [-n] [-r] [-R] [-RR] [-s] [-S] [Interval]

参数
-a remotename
显示远程计算机的 NetBIOS 名称表,其中,RemoteName 是远程计算机的 NetBIOS 计算机名称。NetBIOS 名称表是运行在该计算机上的应用程序使用的 NetBIOS 名称列表。
-A IPAddress
显示远程计算机的 NetBIOS 名称表,其名称由远程计算机的 IP 地址指定(以小数点分隔)。
-c
显示 NetBIOS 名称缓存内容、NetBIOS 名称表及其解析的各个地址。
-n
显示本地计算机的 NetBIOS 名称表。Registered 中的状态表明该名称是通过广播或 WINS 服务器注册的。
-r
显示 NetBIOS 名称解析统计资料。在配置为使用 WINS 的 Windows XP 计算机上,该参数将返回已通过广播和 WINS 解析和注册的名称号码。
-R
清除 NetBIOS 名称缓存的内容并从 Lmhosts 文件中重新加载带有 #PRE 标记的项目。
-RR
重新释放并刷新通过 WINS 注册的本地计算机的 NetBIOS 名称。
-s
显示 NetBIOS 客户和服务器会话,并试图将目标 IP 地址转化为名称。
-S
显示 NetBIOS 客户和服务器会话,只通过 IP 地址列出远程计算机。
Interval
重新显示选择的统计资料,可以中断每个显示之间的 Interval 中指定的秒数。按 CTRL+C 停止重新显示统计信息。如果省略该参数, netstat 将只显示一次当前的配置信息。
/?
在命令提示符显示帮助。
注释
Nbtstat 命令行参数区分大小写。
下表列出了由 Nbtstat 生成的列标题。 标题 说明
Input 接收的字节数。
Output 发送的字节数。
In/Out 该连接是否从计算机(传出)或者其他计算机到本地计算机(传入)。
Lift 名称表缓存项在被清除之前所存留的时间。
Local Name 本地 NetBIOS 名称与连接相关联。
Remote Host 与远程计算机相关的名称或 IP 地址。
<03> 转化为十六进制的 NetBIOS 名称的最后一个字节。每个 NetBIOS 名称长度均为 16 个字符。由于最后一个字节通常有特殊的意义,因为相同的名称(只有最后一个字节不同)可能在一台计算机上出现几次。例如,<20> 在 ASCII 文本中是一个空格。
Type 名称类型。名称可以是单个名称,也可以是组名称。
Status 远程计算机上是否在运行 NetBIOS 服务(“已注册”),或同一计算机名是否已注册了相同的服务(“冲突”)。
State NetBIOS 连接的状态。

下表列出了可能的 NetBIOS 连接状态。 状态 说明
已连接 会话已建立。
关联 连接的终结点已经被创建并与 IP 地址关联。
正接听 该终结点对内向连接可用。
空闲 该结束点已被打开单不能接收连接。
正在连接 会话处于连接阶段。在此阶段正在解析所选目标的由名称到 IP 地址的映射。
接受 入站会话当前正在被接受,将在短期内连接。
重新连接 会话将试图重新连接(如果第一次连接失败)。
出站 会话正处于连接阶段。此阶段正在创建 TCP 连接。
入站 入站会话在连接期。
正在断开 会话正在断开连接。
已中断连接 本地计算机已断开连接,并正等待远程系统的确认。

只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要显示 NetBIOS 计算机名为 CORP07 的远程计算机的 NetBIOS 名称表,请键入:

nbtstat -a CORP07

要显示所分配 IP 地址为 10.0.0.99 的远程计算机的 NetBIOS 名称表,请键入:

nbtstat -A 10.0.0.99

要显示本地计算机的 NetBIOS 名称表,请键入:

nbtstat -n

要显示本地计算机 NetBIOS 名称缓存的内容,请键入:

nbtstat -c

要清除 NetBIOS 名称缓存并重新装载本地 Lmhosts 文件中带标记 #PRE 的项目,请键入:

nbtstat -R

要释放通过 WINS 服务器注册的 NetBIOS 名称并对其重新注册,请键入:

nbtstat -RR

要每隔 5 秒以 IP 地址显示 NetBIOS 会话统计资料,请键入:

nbtstat -S 5

Netstat
显 示活动的 TCP 连接、计算机侦听的端口、以太网统计信息、IP 路由表、IPv4 统计信息(对于 IP、ICMP、TCP 和 UDP 协议)以及 IPv6 统计信息(对于 IPv6、ICMPv6、通过 IPv6 的 TCP 以及通过 IPv6 的 UDP 协议)。使用时如果不带参数,netstat 显示活动的 TCP 连接。

语法
netstat [-a] [-e] [-n] [-o] [-p Protocol] [-r] [-s] [Interval]

参数
-a
显示所有活动的 TCP 连接以及计算机侦听的 TCP 和 UDP 端口。
-e
显示以太网统计信息,如发送和接收的字节数、数据包数。该参数可以与 -s 结合使用。
-n
显示活动的 TCP 连接,不过,只以数字形式表现地址和端口号,却不尝试确定名称。
-o
显示活动的 TCP 连接并包括每个连接的进程 ID (PID)。可以在 Windows 任务管理器中的“进程”选项卡上找到基于 PID 的应用程序。该参数可以与 -a、-n 和 -p 结合使用。
-p Protocol
显 示 Protocol 所指定的协议的连接。在这种情况下,Protocol 可以是 tcp、udp、tcpv6 或 udpv6。如果该参数与 -s 一起使用按协议显示统计信息,则 Protocol 可以是 tcp、udp、icmp、ip、tcpv6、udpv6、icmpv6 或 ipv6。
-s
按协议显示统计信息。默认情况下,显示 TCP、UDP、ICMP 和 IP 协议的统计信息。如果安装了 Windows XP 的 IPv6 协议,就会显示有关 IPv6 上的 TCP、IPv6 上的 UDP、ICMPv6 和 IPv6 协议的统计信息。可以使用 -p 参数指定协议集。
-r
显示 IP 路由表的内容。该参数与 route print 命令等价。
Interval
每隔 Interval 秒重新显示一次选定的信息。按 CTRL+C 停止重新显示统计信息。如果省略该参数,netstat 将只打印一次选定的信息。
/?
在命令提示符显示帮助。
注释
与该命令一起使用的参数必须以连字符 (-) 而不是以短斜线 (/) 作为前缀。
Netstat 提供下列统计信息:
Proto
协议的名称(TCP 或 UDP)。

Local Address
本地计算机的 IP 地址和正在使用的端口号。如果不指定 -n 参数,就显示与 IP 地址和端口的名称对应的本地计算机名称。如果端口尚未建立,端口以星号(*)显示。

Foreign Address
连接该插槽的远程计算机的 IP 地址和端口号码。如果不指定 -n 参数,就显示与 IP 地址和端口对应的名称。如果端口尚未建立,端口以星号(*)显示。

(state)
表明 TCP 连接的状态。可能的状态如下:

CLOSE_WAIT

CLOSED

ESTABLISHED

FIN_WAIT_1

FIN_WAIT_2

LAST_ACK

LISTEN

SYN_RECEIVED

SYN_SEND

TIMED_WAIT

有关 TCP 连接状态的信息,请参阅 RFC 793。

只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要想显示以太网统计信息和所有协议的统计信息,请键入下列命令:

netstat -e -s

要想仅显示 TCP 和 UDP 协议的统计信息,请键入下列命令:

netstat -s -p tcp udp

要想每 5 秒钟显示一次活动的 TCP 连接和进程 ID,请键入下列命令:

nbtstat -o 5

要想以数字形式显示活动的 TCP 连接和进程 ID,请键入下列命令:

nbtstat -n –o

Runas
允许用户用其他权限运行指定的工具和程序,而不是用户当前登录提供的权限。

语法
runas [{/profile|/noprofile}] [/env] [/netonly] [/smartcard] [/showtrustlevels] [/trustlevel] /user:UserAccountName program

参数
/profile
加载用户的配置文件。/profile 是默认值。
/no profile
/noprofile 指定不加载用户的配置文件。这使应用程序载入的更加快速,但是在一些应用程序中也会引起错误。
/env
指定当前使用的网络环境,而不是用户的本地环境。
/netonly
指明指定的用户信息只用于远程访问。
/smartcard
/smartcard 表示凭据是否是由智能卡提供的。
/showtrustlevels
列出 /trustlevel 开关项。
/trustlevel
指定应用程序运行所在的授权级别。使用 /showtrustlevels 查看可用的信任级别。
/user:UserAccountName
指定在其下运行程序的用户帐户的名称。用户帐户的格式应是 user@domain 或 domain\user。
程序
指定要用在 /user 中指定的帐户运行的程序或命令。
/?
在命令提示符显示帮助。
注释
管理员可以使用一个权限受限制的帐户执行日常、非管理性的任务,只有在执行特定管理任务时,才使用一个权限更大的帐户。要不经过注销再重新登录就完成这样的任务,可以用一般帐户登录,然后使用 runas 命令来运行需要更大权限的工具。
有关 runas 命令的使用范例,请参阅“相关主题”。
尽管 runas 通常由 Administrator 帐户使用,但并非仅限于 Administrator 帐户。任何拥有多个帐户的用户均可以利用备用凭据,使用 runas 运行程序、MMC 控制台或“控制面板”项。
如果要在计算机上使用 Administrator 帐户,对于 /user:,键入下列参数之一:
/user:AdministratorAccountName@ComputerName

/user:ComputerName\AdministratorAccountName

如果想以域管理员身份使用这个命令,键入下列参数之一:
/user:AdministratorAccountName@DomainName

/useromainName\AdministratorAccountName

runas 命令允许您运行程序 (*.exe)、保存的 MMC 控制台 (*.msc)、程序和保存的 MMC 控制台的快捷方式及“控制面板”项。作为另一组(例如“Users”或“Power Users”组)的成员登录到计算机时,可以以管理员的身份运行。
可以使用 runas 命令来启动任何程序、MMC 控制器或“控制面板”项。只要提供适当的用户帐户和密码信息,用户帐户就具有登录到计算机的能力,并且程序、MMC 控制台、“控制面板”项在系统中及对该用户帐户均可用.
runas 命令允许您管理其他域的服务器(运行工具的计算机和要管理的服务器在不同的域中)。
如果尝试使用 runas 从网络位置启动程序、MMC 控制台或“控制面板”项,可能会因为用来连接网络共享的凭据与用来启动程序的凭据不同而失败。后者的凭据可能无法访问同一网络共享。
有些项,例如“打印机”文件夹和桌面项,间接由 Windows 2000 打开,而不能使用 runas 命令启动。
如果 runas 命令失败,则可能是没有运行 RunAs 服务或使用的用户帐户无效。要检查 RunAs 服务的状态,请在“计算机管理”中单击“服务和应用程序”,然后单击“服务”。要测试用户帐户,请尝试使用该帐户登录合适的域。
范例
要在本地计算机上以管理员身份启动 Windows 2000 命令提示行实例,请键入:

runas /user:localmachinename\administrator cmd
系统提示时,键入管理员密码。

要使用名为 companydomain\domainadmin 的域管理员帐户启动“计算机管理”管理单元实例,请键入:

runas /user:companydomain\domainadmin "mmc %windir%\system32\compmgmt.msc"
当提示时,键入帐户密码。

要使用名为 domain.microsoft.com 的域中的域管理员帐户 user 启动“记事本”实例,请键入:

runas /user:user@domain.microsoft.com "notepad my_file.txt"
当提示时,键入帐户密码。

要启动命令提示符行窗口、保存的 MMC 控制台、控制面板项或管理其他地点服务器的程序的一个实例,请键入:

runas /netonly /useromain\username "command"
domain\username 必须是有足够权限管理服务器的用户。当提示时,键入帐户密码。
Route
在本地 IP 路由表中显示和修改条目。使用不带参数的 route 可以显示帮助。

语法
route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric] [if Interface]

参数
-f
清 除所有不是主路由(网掩码为 255.255.255.255 的路由)、环回网络路由(目标为 127.0.0.0,网掩码为 255.255.255.0 的路由)或多播路由(目标为 224.0.0.0,网掩码为 240.0.0.0 的路由)的条目的路由表。如果它与命令之一(例如 add、change 或 delete)结合使用,表会在运行命令之前清除。
-p
与 add 命令共同使用时,指定路由被添加到注册表并在启动 TCP/IP 协议的时候初始化 IP 路由表。默认情况下,启动 TCP/IP 协议时不会保存添加的路由。与 print 命令一起使用时,则显示永久路由列表。所有其它的命令都忽略此参数。永久路由存储在注册表中的位置是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes。
Command
指定要运行的命令。下表列出了有效的命令。 命令 目的
add 添加路由
change 更改现存路由
delete 删除路由
print 打印路由

Destination
指定路由的网络目标地址。目标地址可以是一个 IP 网络地址(其中网络地址的主机地址位设置为 0),对于主机路由是 IP 地址,对于默认路由是 0.0.0.0。
mask subnetmask
指 定与网络目标地址相关联的网掩码(又称之为子网掩码)。子网掩码对于 IP 网络地址可以是一适当的子网掩码,对于主机路由是 255.255.255.255 ,对于默认路由是 0.0.0.0。如果忽略,则使用子网掩码 255.255.255.255。定义路由时由于目标地址和子网掩码之间的关系,目标地址不能比它对应的子网掩码更为详细。换句话说,如果子网掩码的一位 是 0,则目标地址中的对应位就不能设置为 1。
Gateway
指定超过由网络目标和子网掩码定义的可达到的地址集的前一个或下一 个跃点 IP 地址。对于本地连接的子网路由,网关地址是分配给连接子网接口的 IP 地址。对于要经过一个或多个路由器才可用到的远程路由,网关地址是一个分配给相邻路由器的、可直接达到的 IP 地址。
metric Metric
为路由指定所需跃点数的整数值(范围是 1 ~ 9999),它用来在路由表里的多个路由中选择与转发包中的目标地址最为匹配的路由。所选的路由具有最少的跃点数。跃点数能够反映跃点的数量、路径的速度、路径可靠性、路径吞吐量以及管理属性。
if Interface
指定目标可以到达的接口的接口索引。使用 route print 命令可以显示接口及其对应接口索引的列表。对于接口索引可以使用十进制或十六进制的值。对于十六进制值,要在十六进制数的前面加上 0x。忽略 if 参数时,接口由网关地址确定。
/?
在命令提示符显示帮助。
注释
路 由表中 跃点数 一列的值较大是由于允许 TCP/IP 根据每个 LAN 接口的 IP 地址、子网掩码和默认网关的配置自动确定路由表中路由的跃点数造成的。默认启动的自动确定接口跃点数确定了每个接口的速度,调整了每个接口的路由跃点数, 因此最快接口所创建的路由具有最低的跃点数。要删除大跃点数,请在每个 LAN 连接的 TCP/IP 协议的高级属性中禁用自动确定接口跃点数。
如 果在 systemroot\System32\Drivers\Etc 文件夹的本地网络文件中存在适当的条目,名称可以用于 Destination。只要名称可以通过“域名系统” (DNS) 查询这样的标准主机名解析技术分解为 IP 地址,就可以将其用于 Gateway,DNS 查询使用存储在 systemroot\System32\Drivers\Etc 文件夹下的本地主机文件和 NetBIOS 名称解析。
如果是 print 或 delete 命令,可以忽略 Gateway 参数,使用通配符来表示目标和网关。Destination 的值可以是由星号 指定的通配符。如果指定目标含有一个星号 或问号 (?),它被看作是通配符,只打印或删除匹配的目标路由。