in

SDT Community Server

SDT Forums, Blogs, Photos server.

Floating Heart

No description is bad.

June 2007 - Posts

  • 戒嗔的白粥馆1-15

    http://787129669.qzone.qq.com

    戒嗔简单介绍一下自己
    大家好,我是戒嗔,大家别叫我大师,我年纪也不是很大的。
      我十二岁那年剃度的,剃度可不是简单的剃头,首先找一位比丘(也就是大家说的和尚),请他做自己的“依止师”,我的“依止师”叫智缘大师,由他向全寺僧侣说明情由,如果没有意见,才可以收我为弟子,剔除须发,授沙弥戒,这个沙弥戒有十条,也就是“初坛”,是出家的第一步。沙弥戒只能单独受,也就是一次只能有一个沙弥受戒。

      沙弥最小也要7岁,我当时进寺的时候已经12岁了,所以年龄上是符合要求的。
      到了20岁的时候,如果僧侣们同意,那么就可以召集了10位大德长老,一起为沙弥授予比丘戒,也叫具足戒,这个戒比较多,一共有250条。
      只有受了比丘戒才成为真正的比丘,这个叫“二坛”。比丘戒可以三人同时受戒。受比丘戒满5年后,方可离开依止师,自己单独修行。
      我前年授了比丘戒,现在还没有满5年,所以我还跟着智缘大师修行。
      我现在已经是比丘了,不是沙弥。也不是所有的人到了20岁就可以变成沙弥,和我一起进寺的几位师兄,只有我和戒傲两个受过比丘戒,其他几位至少要等到明年才有机会受戒了。
      比丘戒授满5年后,就有机会受“三坛”菩萨戒了。具体我就不说了,这些坛什么的,有点像施主们的职称,其实很复杂,说多了大家可能糊涂了,不过不同的受戒在寺里的待遇是不一样的。
      前段时间上网给施主们说故事,QQ的编辑联系上我,帮戒嗔申请了一个博客,说这样写故事方便点,谢谢他的关照。
      如果施主们有什么问题,可以留下来消息,戒嗔将通过故事回答你们。
      有位施主帮戒嗔画了一张很漂亮的漫画,戒嗔就用它做形象了。

    关于戒嗔的白粥馆
      非常感谢腾讯网站一直在推荐戒嗔的博客,最近几天有很多施主来过这里。
      吃惯了美餐的施主们,偶尔喝到一碗白粥,觉得其味爽口,这种感觉并不是来自于白粥本身,而是来自于施主们的生活。
      戒嗔没有什么高深的学问,所说的也只是小小的生活所得,炎夏的冰水固然可以解渴,但喝多了也会伤胃,欢迎施主们隔上三五天来这里小坐一次。
      施主看戒嗔的博客,有些故事偶有所得偶有所感,也是不错的感觉,但是别执意在故事中寻找你想要的答案,你想知道的因果,那样施主们可能就会失望了。
      这段时间有些以前写的故事,所以故事很多,明天开始博客将恢复正常的速度,大概2-3天一篇。
      戒嗔的白粥馆始终会开下去,有缘得缘最好不过。
      另外有些施主们的回复不见了,可能是系统的缘故,戒嗔不会去删回复的。给戒嗔回复很多,不能一一回复了,只能告诉施主们,戒嗔都记在心中了。 

    [01]莲藕和田螺的故事
    有施主问戒嗔为什么要在上网写故事,那戒嗔就先写一个故事吧。

      我们寺旁边有片池塘,刚进寺的时候经常和师弟师兄一起去玩,不过我和戒傲最好,其他师兄都比我们大不少,这几年又来几个师弟们,戒傲比我进寺早,他是小时候被放在寺门口的,不知道身世,也没有留封信什么的。
      每年天气热的时候,池塘都会有很多的荷花,有蝉叫有蛙鸣,因为是山区,所以即使是夏天,夜晚也是凉爽的。
      池塘的水虽然也有少量的山泉汇集,不过大部分还是靠雨水,所以并不是很干净,季节到的时候也有一些莲藕,我们会去池塘里捞一些莲藕。
      无论池塘的水多么的混浊,这些莲藕只要用小溪里的清水稍微冲洗一下就可以食用了。用小刀去掉薄薄的一层外皮,里面雪白剔透。
      池塘里不仅仅有植物,也生长着一些田螺,田螺有一层坚硬的外壳,还有一个小小盖子,盖住躯壳,它显然莲藕更容易抵挡混浊池塘水带来的侵犯,不过有些施主们告诉我们,他们会把田螺捞回家去,放在清水中,再在清水里放几滴香油,不久之后,清水也会变混浊,因为田螺把它们内心的脏东西吐了出来。
      所以师傅说,外界的环境对事物是有影响的,但并不是绝对的,比如脆弱的莲藕即使在混浊的池塘水中依然可以游刃有余,被侵蚀的只是外壳,而有着坚硬外壳的田螺,内心的肮脏即使在清水依然无法完全清洗。
      莲藕始终是莲藕,不管在网上和寺里都一样,都不会变成田螺。

    [02]蚊子的故事
    可能是戒嗔的样子还算和善,山里遇到陌生人,往往会向戒嗔问路。有香客求了签,也喜欢让戒嗔来解,其实戒嗔不太会解签,我们寺里解签的是智惠师父。
    也不只是人,动物也一样,戒言在寺里最喜欢的人也是我,戒嗔到哪里它也会跟着跑。
    夏天到了,山上虽然比起镇上要凉爽很多,但蚊虫也明显多了起来。
    戒嗔也很讨蚊子的喜欢,和戒傲住一个屋子,可蚊子偏偏都来叮戒嗔,戒嗔整晚都在挥舞着手,边赶蚊子边写故事,昨天实在受不了了,便去镇上采购了点灭蚊香片,插上电放在屋子里,蚊子到是不来叮戒嗔了,只是把熏晕的蚊子一只只抓起来,放在窗口放生的过程,比较麻烦。但是不放生也不行,说明书上说,熏的时间太长,蚊子便会被熏死。
    原来不管做什么事情,都不会简单顺利,此时占了便宜,总在另一刻偿还。
    次说过蚊子的故事,有施主认为戒嗔说的不对,蚊子是可以杀生的,其实蚊子吸了一点血怎么能杀生呢,有修行人在夏天草地里脱光上衣布施蚊子的,不过有位佛法佛家的居士建议供养蚊子的话,只能喂到7、8分饱就要赶跑他们否则会撑死的。

    [03]水果的故事
    我们山下有个小镇叫淼镇,也有人叫这里庙镇,庙镇这里附近的寺庙有三座,除了我们天明寺,还有一座叫宝光寺,宝光寺是近几年才建的,建在风景区里面,规模也比我们寺大很多,香火也旺,庙里的大师也是佛学院毕业,他们寺的禅房比我们寺大很多也华丽很多,师傅说宝光寺的大师佛法很好,不过我觉得他的佛法未必比我师傅好,禅房的大小和华丽程度可能和修为是无关的。就好像个头很大的山果未必会甜,掉在树边的小果子,其实已经熟透了。只上过三年学的戒嗔也可以在网上写故事和上过大学的施主们交流也许也是一个道理。
    淼镇是我们去的最多的地方,镇上有位姓蔡的施主,他是卖水果的,我们经常去他那里买水果,蔡施主人很好,他每次对我说:“小师傅,我给你的价格已经是最低的了。”不过有几次师弟买的价格比我低。
    有一些施主说蔡施主喜欢扣称,不过他从来不扣我们的称,或者是因为我们没有还价吧。
    蔡施主的水果有两种,一种贴着商标,另一种没有,我们通常只买没有贴商标的那种,因为有几次我们买回了贴着商标的水果后,发现贴商标的地方,都有不同程度的疤痕,寺里的人几乎都知道这个规律,所以不买带商标的水果成为了一个惯例,有一次宝光寺的大师来我们寺,给我们带了一些水果,全是蔡施主店里带着商标的那种。师兄弟们都笑话宝光寺的大师没经验,不过这次揭下商标后,我们才发现这次水果几乎都是完好的。
    师傅说:惯例和例外相伴而行,就好像现在街上有很多自称是佛家弟子的施主,他们也许就是惯例下商标后的疤痕,然而我们真正忧伤的是,当例外来临的时候,我们心里依然可以见到那个商标下并不存在的疤痕。
    今天没买水果的时候,特意没有挑选,也许商标下的疤痕对戒嗔来说,已经不是那么重要了吧。 

    [04]阳光的故事
    我们天明寺不是一个香火很旺的地方,但也会有全国各地的香客过来进香,我有一个很调皮的小师弟叫戒痴,今年只有十一岁,比我进寺的时候还小,他平时很调皮,智缘师傅经常说他不像修行之人。
    前几年附近开发了旅游区以后,开始有外国人来寺里进香,刚开始那些外国人进寺,几个年纪比较小的弟子,比如戒痴,就会像看“如来”一样看他们。
    “如来”是淼镇里蔡施主家养的一个猴子,我们从来不敢告诉师傅,我们叫蔡施主家养的猴子叫“如来”,师傅一定会骂我们不敬的。
    当然敬或不敬并不在口头,有人向鞠躬行礼的时候,未必心里尊敬你,也许只是畏惧。
    这位蔡施主也不是昨天告诉大家的那位卖水果的蔡施主,就好像施主们在寺庙里见到的戒嗔也未必是网上写故事的戒嗔一样。
    也有日本的香客来寺里进香,戒痴不知道从哪里听来的词,居然叫他们倭寇,恰好被智缘师傅听到了,狠狠的骂了他一顿。
    有外国人,不过香客主要还是中国人居多,毕竟我们不是什么名山大寺。
    有位姓李的太太,这几年总是来寺进香,每次都会给不少香火钱,师傅们对她也比对其他香客好,也许这就是在佛堂前走动的修行者和佛堂在端坐的菩萨的差别,出于淤泥的莲藕依然有一层层薄薄的外壳要被染黑。
    李施主有时候也会拉着师傅聊天,我们知道她先生是城市里做官的,总会遭人嫉妒被写匿名信揭发他的种种事端,她每年都来寺里许愿求佛保佑。
    师傅指着寺庙的院子里对李施主说:“愿佛光可以像庭院里的阳光一样普照到施主吧。”
    李施主很满意的走了。
    下午时分,戒嗔走到屋外,发现庭院里的阳光虽然强烈,但总有几处角落无法照射到。
    师傅说,如果想被阳光照耀,就只有站在庭院中间,如果一味的躲在角落里,佛也没有办法。

    [05]李太太的故事
    说说那位李太太的故事。
    李太太和其他香客是有一些不同的,她在寺里待的时间比较长,有时候还会住上一两天。
    有次李太太在佛堂里看到了戒痴,下午她问智缘师父,那个很可怜的小和尚是谁?
    智缘师父很奇怪,为什么李太太觉得戒痴很可怜呢?
    李太太说:“你看,小和尚的衣服都破了。”
    其实,并不是寺里穷的没有钱给戒痴做衣服,而是戒痴太调皮,总是新衣服穿破,所以有时候他就穿着破衣服在寺里乱跑。
    下午去给戒痴换衣服,穿破衣服乱走动总是不好,戒痴问我,上午那位可怜的太太是谁?
    戒嗔也很奇怪,李太太的衣着讲究,她脖子上的比佛像上的金漆还要货真价实,我实在看不出戒痴有什么可以可怜李太太的地方。
    戒痴说,我看她一直眉头紧锁。
    有时候,看一件事情确实很奇怪,即使在同一个角度望过去,目光如果落在李太太眉头就会觉得她很可怜,如果目光落在李太太的衣物或金链子上,或许也会觉得自己可怜。
    师父说,对任何事物我们都不应该盯着它的某一点看,那样会让你滋生无谓的自大和自卑,只有看清了所有,自大和自卑才不会出现。 

    [06]泡茶的故事
      天明寺坐落的山叫茅山,很多香客以为这里一定有道士,其实叫茅山的地方未必有道士,这里只有和尚。
      有山的地方就会有水,天明寺在山南的半山腰,转到山北面,有一个三重瀑布。
    所谓三重瀑布其实是一个瀑布,从山顶上流到山角的时候,被分成了三个。
      有人说,山下的淼镇的“淼”字就是源自这个三重瀑布,是否真有其事,无人考证。但我们称这个三重瀑布为淼瀑
      茅山不高,也不陡峭,淼瀑的水流也不急,那怕在山脚下水花也只是在脚底附近形成细细密密的一层薄雾而已。
      壮观是一种美,涓涓细流是另一种美,淼瀑的水源是山水汇集而成,即使雨水少的的时节也不会干涸。
      有些香客喜欢我们这里山泉水泡的茶,师父有时候会吩咐我们上山顶取水,寺里其实是有自来水的,不过我们的自来水和淼镇居民家用的自来水并不一样,是用水泵从井水中泵上来的。
      用井水或用山泉水给香客们泡茶本质上并没有太大差别,不过香客们如果有特别要求,戒嗔还是会拉上小师弟戒痴、戒尘一起上山顶去取水,从山边小路转到山的背面正好是第二重瀑布的底端。
      我们径直上山取水,上去的是三个人,下来的通常只有戒嗔一个人,戒痴、戒尘这两个小和尚只是假借取水的名义出来玩而已。
      现在的季节正是山花烂漫之时,山间不知名的野花野草很多,也有蝴蝶飞舞,但也不是什么奇异品种,只是普通的白粉蝶。
      无名的山,无名的寺,无名的水,野花,野草,白粉碟,便是小和尚戒嗔的生活之处。
      山顶上的风一般要比山腰大许多,有时候一阵疾风吹过的时候,把很多花瓣吹起,山风不知从何处而来,也不知道要吹向何处,甚至感觉不到吹来的方向,只是觉得风在身畔盘旋,带着花瓣飞舞,花瓣久久不肯下落,良久才落于水流之中,顺流而下。
      昨天取水下山时,看见几名旅客在二重瀑布的底端水潭中嬉闹,有位年青的男施主还把头埋于水中,暴饮甘甜的山泉山。
      戒嗔也不便对他说,刚才戒痴还在瀑布上层小便过,既然是无关之人,何苦扰了他人雅兴,再说童子尿也有一定的药用价值。
      转到山路中段,看见一老者坐于路边山石之上,脸上微有愁容,戒嗔上前询问。
      老人家告诉我,听说淼山有一种奇艳的草,特来寻觅,可是寻遍了整个山都不见踪影,所以心情郁闷。
      师父说,老施主专注寻求奇草,而忽略了山边美景,无得却有失。

    [07]戒言的故事
      每个人都有犯戒的时候,出家人有时候犯戒的次数比在家人还多,因为在家人没有什么需要遵守的戒律。
      用不同标准去衡量一件事情,产生的结论似是而非。
      一个人名字其实和行为是无关的,叫戒嗔的有时候会犯嗔戒,叫戒傲的也有骄傲的时候,叫戒痴则常常痴迷,就是师傅那位叫戒烟的俗家弟子也没有把烟戒掉。
      天明寺唯一不会犯戒的就只有戒言,戒言并不是哑巴,它是智恒师父养的一条土狗,它不会说话只会叫,有时候狗能做到的事情,人确难做到。
      戒言很胖,有香客根据戒言的体型质疑我们寺里人一定偷偷的吃荤,否则狗怎么可能那么胖。其实戒言确确实实是和我们一起吃素长大的,而且偏爱吃胡萝卜。
      其实每个人所不知道的事情很多,用一知半解的思想得出的结论,也未必是正确的
      我们也没有去向香客解释戒言很胖和吃荤并没有必然的联系,因为你去向他解释的时候,他反而又可能去想,你可能是心虚,要不为什么特意来解释呢?
      戒嗔其实还有一个丢东西的毛病,还好寺里地方并不大,翻来翻去总能找到,如果实在找不到就只能请戒言帮忙了。
      戒言虽然也能找到东西,不过行动也不神速,可能吃素长胖的多多少少还是有一些虚胖的。
      闲来无事时候,戒言和戒嗔会在坐寺门边上的山石上,远望山下景色。
      香客临门之时,常常会拉着戒嗔问事,戒言则在脚下转悠。
      有时候长老在侧,香客便会撇下戒言和戒嗔直接向长老问事,戒言和戒嗔依然似无人之时一样,坐于石上。
      有次香客问长老,我如何提高自己的修为?
      长老回答,如果施主眼中并不只有那位看起来身份最尊的人,而是把两人一狗都看在眼里,修为自然提升了。

    [08]参差的故事
      我的小师弟戒痴还是一个孩子,小孩子的天性爱玩,以前他喜欢偷跑到山下和镇里的孩子玩,现在有了电脑,他又开始喜欢在网上打游戏,他特别喜欢玩一种叫对对碰游戏,虽然是出家人,但是戒痴争胜之心却很强,或许是天生,也或许是玩的多,戒痴对对碰的水平很高,几乎从来没有遇到过对手,还有网友发消息说戒痴是在作弊,惹的戒痴多次犯嗔戒。
      虽然对对碰玩的好,但是戒痴其他游戏玩的却很差,几乎是每战必败。
      师傅其实并不喜欢戒痴在网上与人争胜,讲了他几次,戒痴也稍微收敛了一些,师傅也就没有再多苛责了。
      我的另一个小师弟戒尘,和戒痴年纪相仿,喜欢在地上乱划,最近又和智惠师父学了些字,就更喜欢在地上乱写了,有次戒嗔在院子里行走,发现一条长长的粉笔线,可能是戒尘划的,线的两旁还写着不少字,左边写着很多“执著”,右边写着很多“偏激”。戒嗔顺着这条线慢慢走,有时候倾一下,脚步就落在左边,再倾一下,脚步又落在右边。
    原来左右之间,仅有一线相隔,是左是右只在我们小小倾斜之际。
      山上的香客总有几位是常来的,有位女施主,戒嗔有些记不清她的姓了,不过样貌还是熟悉的,有次女施主对戒嗔说,小师父,你的年纪和我儿子差不多大,为什么你的眼神看起来比他要清澈很多?
      戒嗔笑答她,可能是因为戒嗔在蔡施主家里买水果的时候,经常算错帐的原因吧。
      女施主不解,略思,少倾,顿悟。
      师父说,专注做一件事情就可能会有超越年龄的成熟,也可能使其他方面有缺失,每个人的能力都不一定均衡,这也可能是有一双清澈眼神的戒嗔会经常算错帐的原因吧。

    [09]改变的故事
      戒嗔小的时候也有玩具,山里的孩子,玩具很简单,是一个木雕的小人,那是戒嗔小的时候父亲做的,戒嗔的父亲并不是木匠,所以做出的玩具其实很拙劣,如果不告诉别人这个是什么,估计他们也要猜上很久。
      孩子的眼里没有贵贱之分,当然也不会在意玩具的质量好坏,戒嗔很喜欢这个不像小人的小人,整天拿在手中。
      那年进寺里的时候,戒嗔什么东西都没有带,只带上了它。
      很多人走进寺门的那一刹那,都以为自己从此和尘世隔绝了,然而即便是莲藕内心真空之所,也有根根柔丝穿过。
      戒嗔还记得把那个小木人放在枕边的情景,只是不记得,是哪一刻它掉到了床下。
      过了很久,有次扫除,哪个夹杂在戒嗔床下书堆里的小人忽然掉了出来,洗去沉积在小人上厚厚的一层灰尘,这个小木人依然不像个小木人,一切仿佛不曾变过,只是对戒嗔来说,对它的感觉,已经不再是一种喜爱了,变成一种奇怪的感觉,有种追忆,有种思念,脑中不再是儿时终日不离手把玩的情景,记忆仿佛更远,有幅画面从心里走过,是父亲把它交给戒嗔的那瞬间。
      戒嗔曾经以为自己离开过,却不知自己一直在这尘世间。
      它没有变过,可是戒嗔变了。

    [10]结果的故事
      师傅曾经给过我几块彩色玻璃,如果遮着红玻璃看天,天就是红色的,遮着蓝玻璃看天,天就是蓝色的。
      我师傅左手有点残疾,如果你从左边看他,他就是残疾的,如果从右边看他,他就是健康的。  
      很多事情也一样,你想从哪里看,就可以看到什么样的结果。

    [11]元宵灯谜
      每年的元宵节,镇政府都会办一个小型的灯会,每盏灯下都会有一则谜题,猜出答案的人可以得到奖品,大部分人都不知道,很多迷题是出自师父之手。
      智缘师父是一个猜谜高手,有时候我们认为很难解的谜语他可以脱口而出答案,师父的这项本领在镇上也很有名,所以为镇政府组织活动的陈施主在活动开始前定会上山向师父求助,师父便随手在纸上写上二三十个谜题交给他。
      我们知道灯会很热闹,镇政府的人在镇边小清溪旁拉上长长的彩绳,挂满各样的灯笼,镇上的居民更会穿着最漂亮的衣服来参加灯会,很多人都会在小盘子里点上一盏小蜡烛,在小清溪中顺流而飘,也有人在小盘子中放上寄语,送于有缘之人。
      寺里最爱热闹的是戒傲,每年元宵节的时候,便忍不住躁动,想着下山去参加灯会。师父坚决不许,因为元宵节灯会同时也是姻缘之会,如果我们去参与,实在不妥。
      戒傲有些失落,师父看出他有些不快,便对戒傲说,打算给我们单独出一道题,如果在元宵节前,你们解的出,我便允许你们下山,如果解不出,那就乖乖待在寺里,过完节后,我再告诉你们谜底。
      师父给我们每人一张纸,纸上都写着八个字,月夜静思,过犹不及。
      我们面面相觑,师父说,这道谜题一直想给组织灯会的陈施主,只是想到可能无人能猜到这题的答案,便没有给他,这道题谜底就是我们寺中常用的一件事物,你们几个猜出答案后告诉我吧。
      戒嗔拿着纸张细细思索,想不出这是个什么事物,戒障和戒傲则在寺里转悠,挨个寻找排除寺里的东西,也没有找出答案。
      时间一天天过去,谜底一直都没有想出来,我们心中所盼望的已经不再是元宵灯会那天去镇里参加灯会的事情,而是希望元宵早点过去,好从师父那里知道迷题的答案。
      元宵节的第二天,我们一早便到了师父房里,师父笑着说,你们把我给你们的迷题翻过来,然后读一读背后的字。
      我们翻到迷题的背面,发现各有一个字,依次把三张纸背后的字念了出来,几日来的疑惑豁然开朗,简单的谜面,答案也如此简单。
      早在找答案的时候,戒嗔就发现过纸的背面这个字,只是当时没有在意而已。
      有时候,我们苦苦追寻着一个答案,却始终没有意识到答案早已经在我们手中了。

    [12]破裤子的故事
      记得有天寺里来了两位女施主,他们面容相似,看年纪应该是一对母女,可是两人的神情却极不自然,一句话也不多说,目光接触之际也快速回避了,两人默默的在佛堂前一前一后的参拜。
      母亲和智惠师父是认识的,所以拜完佛后,女儿一个人在寺院里闲逛,母亲便向智惠师父请教佛法。
      智惠师父看出了女施主有心事,便向她询问,原来这对母女最近闹了一些别扭,心结来自一条破裤子。
      女施主的女儿今年才刚刚工作,不久前拿到平生的第一份工资,她用这些工资给父母买了一些用品,也替自己买了一条牛仔裤。
      山下的流行很奇怪,戒痴平日穿破衣服乱跑的时候,外来的香客就说这个小和尚挺可怜的,连衣服都没的穿,可是这几年却经常见到很多年轻的施主穿着故意弄上几个破洞的牛仔裤。
      女施主看到女儿的裤子,以为女儿不慎把裤子弄破了,当下也没有表示,晚上的时候,乘女儿睡觉以后,花了整夜时间把裤子补了起来。
      女施主补的极其用心,为了把缝补的痕迹变的少些,特意从女儿以前的旧裤子上抽了不少颜色相似的丝线精心的织补。
      第二天早上,女施主把补好的裤子,得意的交给女儿。母女两人为此吵了一架,女儿责怪母亲没有经过她同意就擅自做了决定,而母亲心痛的是昨夜灯下一针一线缝补的那一份心。
      女施主走了后,智惠师父让戒嗔去请女施主的女儿过来,戒嗔在房门附近擦玻璃,我看见女施主的女儿低着头坐在智惠师父面前,智惠师父则微笑的和她说话,女施主的女儿静静的听着,良久之后,徐徐点头。
      过了一会,戒嗔看到母女两人在寺院后面的石凳上并排而坐,眼睛仿佛都是红红的。
      你心中的正解,并不是别人心底的答案,错对对错,也不分明。
      责怪他人之时,也想想他的错,根源为何?如果没有恶意,没有恶果,又何必苛责?
      争吵之际可否想过,有人还在羡慕你争吵的对象,因为有人连这样的资格都没有。
      那天下午,母女两人手挽着手下山而去,神情亲密,似不再有芥蒂。
      女儿忽然转身向我们挥手告别,戒嗔急忙合什回礼,发现女施主的女儿不知道什么时候换了条牛仔裤,看的出是条缝补过的裤子,原来女施主的手艺并不好,远远看去仍然可看出布料上分明的颜色差别,缝补过的痕迹好似一颗心。

    [13]医生的故事
      和尚也是凡人,也是会生病的,我们有时候有点小感冒什么的,就在寺里吃点药,病的比较严重的时候也要去山下看医生,
      淼镇的卫生院规模不大,只有四名大夫,其中有三个大夫都是女施主,所以我们只能找一位姓沙的男大夫看病。
      沙大夫人很好,医术也很高明,有几次智惠大师病的比较重的时候,他就跑上山来给智惠师父看病。
      寺里的人都喜欢沙大夫,但是戒言很怕他,每次沙大夫靠近戒言的时候,戒言就使劲往后退。
      我们也不知道什么原因,有次戒傲师弟说,会不会是沙大夫的名字让戒言害怕?
      沙大夫曾经向我们解释过他名字的来历,
      他出生在一个清晨,而他儿时的第一声哭泣伴随着破晓时分的一缕晨光而来。
      沙大夫家里三代行医,医生这个职业和普通职业的最大不同在于,工作稍有疏忽就会关乎人命,沙大夫父亲对他的要求及其严格,他希望沙大夫做事可以一丝不苟。
      所以沙大夫的名字叫沙晓苟。
      戒嗔很想向戒言解释,沙晓苟这三个字和杀小狗这三个字只是音同,其实含义是相差很大的,但解释不解释戒言也是听不懂的。
      其实人名字怎么会让狗害怕呢?何况戒言虽然很聪明,但毕竟听不懂人话。
      虽然戒言不喜欢沙大夫,可是沙大夫却特别喜欢逗戒言玩,也许是大部分人都有争胜之心的缘故。沙大夫不管怎么讨好戒言,甚至有次拿出了犯戒的食品给戒言,但是戒言始终都不喜欢他。

      缘分是很奇怪是事物,有人一见如故,有人如何努力也得不到认同。
      得不到的缘分不如放弃,忽略了手中缘分才真正可惜的事。

    [14]智缘师父教你如何放下
      第一次见到曲施主的时候,他在一群香客之中,这一群人打扮有些特别,手中拿着不少摄影器材,他们是一个电影剧组,在附近山里拍电影,中间有些事故,不得不停下几天,闲暇之中无事可做,便上山来寺里游玩。
      曲施主在一群人中显得很特别,他拜佛的时候比同行的人虔诚很多,姿势和动作都没有分毫错误,看的出是对佛学有了解的,而且他和我们一样没有头发,头是光光,智恒师父借机教育我们几个不爱剃头的小和尚,说我们出家之人,反道不如在家人虔诚,平日给你们剃头都东躲西藏的,可是有些施主还自己剃度修行呢。
      智恒师父还是有些担心的,前不久寺里也来过一个自行剃度的修行人,一定要在我们寺里出家,还在为香客准备的禅房里待了很多天,师父们劝说了好些次,才让他打消了念头。
      我们知道影视圈里有不少人都皈依了佛门,智恒师父决定要和曲施主谈一谈,因为寺里的房间实在是不多了,几间备用的房间都是留给留宿的香客的,而且这几间房间也不在寺院里面,不适合修行。
      中午时分,智恒师父听曲施主同行的人说,曲施主是因为前额有点秃,所以,索性把头发全剃光了,之后,智恒师父也就没有再去找曲施主了。
      可能是因为这件事情,所以戒嗔对曲施主有些印象。
      曲施主第二次来寺里是去年春天,戒嗔感觉这次曲施主要沉默很多,仿佛心事重重的样子。
      他坐在智缘师父面前,师父让他说出心中困惑,曲施主说自己是一名导演,但不算很有名的导演,一直想导演一部好电影,一年前忽然有了导演电影的机会,而且一来就是两个,权衡再三,他选择了起先答应的合作方,对方是个女博士,看起来人也不错。
      虽然曲施主推辞了另一个很知名制片人的投资机会,但是他觉得自己选择是正确,这个世界上虽然有很多见利忘义的人,但总有人会坚持自己的原则。
      然而事情发生了一些变化,女博士在签合同的时候,忽然说自己公章忘记带了,过了几天,曲施主再催促对方签约的时候,对方不再接电话,托人打听,原来女博士签约给了别人。
      长久以来的愿望忽然落空了,另一个难得的机会也错过了,那段时间曲施主心情非常低落,有时候卖醉,喝多了便打电话给女博士,对着电话痛骂对方,对方有时候不接,即使接了也不说话。
      曲施主问智缘师父,我们是否应该坚持原则?还想问好人真的有好报吗?
      智缘师父对曲施主说,有些事情,既然无法改变,不如放下吧。
      曲施主对智缘师父说,我试着想放下了,但是始终做不到。
      智缘师父引着曲施主走到屋外,指着茅山的山顶对曲施主,你走上山顶困惑就会迎刃而解。
      曲施主迈步向山顶走去,智缘师父又阻止住他,指着寺院里的香炉对曲施主说,你带上它一起吧。
      那只香炉很大,常年摆在寺院中间,很少有人去挪动它,曲施主一楞,站在香炉前,使劲推动香炉,香炉只是轻轻的动了动,要搬上山几乎是不可能的。曲施主想放弃可是又不服气,坚持了一会终于放弃了。
      智缘师父笑着对曲施主说,其实,你的目标是登上山顶,不带着这个香炉也是可以了。
      那个下午,曲施主站在香炉前很久了,终于笑着叹了口气,拿出手机发了条短信,转身和我们告别下山而去。
      前些时间,戒嗔又见了次曲施主,这次带着帽子,戒嗔不知道帽子底下的头发是否多了,但是能看的出曲施主心情很好,他同行的人告诉戒嗔,曲施主前不久拿了一个很重要的奖项,曲施主也得意的望着戒嗔笑。
      戒嗔忍不住问曲施主,当时在手机上做了什么?
      曲施主告诉戒嗔,当时发了一条短信给那个女博士然后删除她的手机号,曲施主告诉她说:“我不再恨你了,因为我的目标是登上山顶。”
      人生永远有比仇恨更重要的事情要你做。
      曲施主真的不在意那个欺骗他的女施主了吗?戒嗔看并不尽然,因为我听见他还在大声的与他同行的朋友说那件往事,只是神情轻松的像在说一个笑话。

    [15]蓝天下行走
      我的师父收过几个俗家弟子,其中一位叫释戒烟,这个名字是他自己要求起的,听起来有点怪,很多人都说不像佛家弟子的名字,智缘师父说过,听不起不像的东西未必不是真实的,而那些很像很像的,更有可能是刻意而为。
      姓名永远只是一个代号,相同的名字未必是一个人,不同的名字未必不是一个人。
      叫戒烟的人依然可以戒贪、戒痴、戒嗔。
      戒烟师兄在上海生活,他每年都会来寺里几次,戒烟师兄在做房地产方面工作,这几年他每次来都是笑眯眯的。
      智缘师父告诉我们说这就是修行的结果,潜心修行后的领悟,当佛法渗入心灵的时候,可以让人心情舒畅。
      不过镇里的孙老施主说戒烟师兄开心的原因是因为房价涨的很高。
      寺里两位小师弟都很喜欢戒烟师兄,他每次都会带不少好吃好玩的给戒痴和戒尘。
      戒烟师兄喜欢给我们讲一些发生城市里的故事,他说他住的上海是一个很大的地方,比淼镇大十倍都不止,我们也不知道是真是假,人们对未知事物的反应应该就是新奇和疑惑交织而成的吧。
      我和几位师弟去过最远的地方也只是附近的几个镇子,但是还是觉得戒烟师兄说法有点夸大了,在附近几个镇子中间,淼镇是最大的,从镇子上走一圈,最快也要半个小时。
    上海有很多新奇的事情,戒烟师兄说有机会带我们去,可惜师父未必会答应的。
      戒烟师兄非常喜欢天明寺附近的环境,说这里的山水特别让人心动,空气清新,即使快到六月,山里还是很凉爽的,就连天也是蓝蓝的。师弟们听到的时候都很奇怪,难道上海的天不是蓝色的吗?
      师父那次也在旁边,他对戒烟师兄说,回上海的时候不妨抬头看看,然后再告诉我们看到什么?
      过了些日子,师兄从上海打电话过来告诉我们,他回去之后,按师父所说的看了看,才发现原来上海的天也是蓝蓝的。
      师父告诉我们,每个人其实都行走在蓝天之下,如果你没有感觉到,那是因为你没有抬头向上看,而不是它不存在。

    Posted Jun 30 2007, 11:48 PM by wicky with no comments
    Filed under:
  • Sync For SQLServer

    我一直寻思着是否要做一个Simple DB Comparer,最后决定再google一把,然后这个东西就跳出来了。

    沉睡的蚂蚁开发:Sync For SQLServer

  • Comparison and synchronization of SQL Server 2000 and SQL Server 2005 database definition.
  • Dependency checking so objects are scripted in the correct order.
  • Support for schema objects including tables, stored procedures, views, user-defined functions, user-defined data types extended properties, default constraints, checks...
  • Schema differences are visualized intuitively: Schema difference for tables, views, stored procedures and user-defined functions.
  • Workspace for database project administration
  • Table data migration on a pure SQL script basis. It includes an SQL scrpt file list to have an ordered list which Script to execute in which order.
  • 功能上也很不错,虽然还不是十全十美。
    唯一需要注意的,是不要把方向搞错了~~Umbrella

     

    Posted Jun 29 2007, 10:34 AM by wicky with 2 comment(s)
    Filed under:
  • 小狗钱钱

    一般人都希望自己变得富有一些,只是我们中的一些人的这一愿望更为强烈;而有些人却假装自己只想在生活的某些领域里变得富有。事实上,大多数人的最终愿望都是让自己更加幸福、更加成功,也想拥有更多的钱。
    这种愿望是无可非议的,因为富裕是我们与生俱来的权利。假如我们有充足的钱,我们就能生活得更有尊严,也能更好地为自己和他人服务。认为我们必须忍受拮据的生活——或甚至认为这才是高尚的生活——这一想法是人类犯下的最重大的错误之一。

    。。。。。。

    Posted Jun 29 2007, 09:35 AM by wicky with no comments
    Filed under:
  • TargetProcess 概念浅析

    TargetProcess是一个基于ASP.NET 2.0的项目管理软件,支持敏捷开发、极限开发等多种开发方法。

    用它可以管理:项目需求、计划、任务、Bug、时间、测试等。

    一下是里面的一些基本概念:

    Program: 相当于一个大的Project,每个Program可以包含多个Project
    Project: 就是Project咯,可以独立或者属于某个Program

    Feature: 相当于一个大的需求,一个大的功能,或者一个模块
    Release: 发布版本,每个版本可以包括多个Iteration
    Iteration: 开发周期,可以按需要把一个Release分为多个开发周期,比如1周,2周,1个月

    User Story: 相当于一个比较具体的用户需求,可以属于一个Feature
    Task: 一个任务,属于一个User Story,每个User Story可以划分为多个任务
    Bug: 就是Bug啦
    Time: 记录完成User Story, Task, Bug等所需要的实际时间。

    Comment & Attachment: 上面每个记录都可以录入多个注释和附件

    其他还有像Build, Test之类的。

    对于中小项目,基本上日常更新频繁的会有:User Story, Task, Bug, Time。

    对于项目管理者,会有User Story, Task, Bug, Time。
    对于程序员:会有Bug, Time。
    对于测试员:会有Bug, Time。

    TargetProcess 的自定义功能:
    Dashboard: 可以自定义显示的内容,选择Customize dashboard (To Do,Progress Summary, Progress for Iteration 是我的选择)
    Data View: Filter-定义默认的查询条件,Customize-定义显示的列

    Posted Jun 28 2007, 09:49 AM by wicky with 1 comment(s)
    Filed under:
  • 开发终端式短信的原理和方法

    http://blog.csdn.net/gztoby/archive/2004/09/21/112041.aspx

    简介

      没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星。本文介绍了短信的原理和实现方法,重点说明了短信的编码方式、AT指令以及用C#实现串口通讯的方法。

      前言

      目前,主有三种发送短信的方式:

      1、 网关方式:就是向当地的电信部门申请,不需要额外的设备,适用于大型的通信公司,像华为、傲天、中兴、亚信等。

      2、 终端方式:就是借助像GSM MODEM之类的设置(支持AT指令的手机也行),通过数据线连接电脑,来发送短信,用这种方法比较适用于小型及个人。要实现这种方式必须理解串口通信、AT指令、短信编码、解码,这也是本文讨论的重点。

      3、 利用一些网站来实现,方式简单,不过对网站依赖性太高,对网络的要求也比较高,非常不适于进行项目开发

    阅读导航
    终端短信连接示意图
    原理篇 短信编码
    AT指令
    串口通讯
    实践篇
    常见问题
    下载 本文源代码
    编码测试文件

    zmbbs=1;

    终端短信连接示意图



    zmbbs=1; 原理篇

      短信编码

      在收发短信方面,按时间产生先后,共产生了三种模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因我们主要探讨PDU模式的发送。以西门子3508手机为例。

      SMS是由Etsi所制定的一个规范(GSM 03.40 和 GSM 03.38)。当使用7-bits编码时,它可以发送最多160个字符;但用8-bit编码,最多可以发送140个字符,通常无法直接通过手机显示;还有用16-bit编码时,最多70个字符,被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。我们今天讨论的是UCS2编码,也就是说,最多只能发送70个字符,不管英文还是中文。

      现例如我们现在要发送如下信息,向我的手机13715342642发送"你好,Hello!"。在没有发送之前,你要清楚,手机SIM卡所在地的短信中心号,并不是你现在所在地方的短信中心号,像我在深圳,深圳的短信中心号是:8613800755000,即使我现在到外地,短信中心号仍是深圳。从上面我们得到了下面的信息:

      接收的手机号:13715342642
      短信中心号:8613800755000
      短信内容:你好,Hello!

      在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先不管,看看编码后的信息:

    0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021

      看不懂吧,我来解释一下:

      08 - 指的是短信中心号的长度,也就是指(91)+( 683108705500F0)的长度

      91 - 指的是短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加'+'号;此外还有其它数值,但91最常用。

      683108705500F0 - 短信息中心号码。由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。前面的(08)+(91)+( 683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SMSC)。

      11 - 文件头字节

      00 - 信息类型(TP-Message-Reference)

      0D - 被叫号码长度

      91 - 被叫号码类型

      其实在实际处理中,我们通常把11000D91写死在程序中,因为在国内,这些数据都是不会改变的。

      683117352446F2 -被叫号码,经过了位移处理,实际号码为"8613715342642"。上面的(00)+(0D)+(91)+( 683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。

      00 - 协议标识TP-PID,这里一般为00

      08 - 数据编码方案TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码

      00 - 有效期TP-VP(TP-Valid-Period)

      12-长度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的长度 36 / 2 = 18 的十六进 12

      4F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:"你好,Hello!"程序实现,请参考本文章所带源程序的PDUdecoding.cs。


    zmbbs=1; AT指令

      说到AT指令可多了,有厚厚的一本书,不属于我们今天讨论的范围,在这里我仅讨论在发送短信中必须要用的几个AT指令。

      与SMS有关的GSM AT指令(from GSM07.05)如表1所示:

    AT 指令 功 能
    AT+CMGC Send an SMS command(发出一条短消息命令)
    AT+CMGD Delete SMS message(删除SIM卡内存的短消息)
    AT+CMGF Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)
    AT+CMGL List SMS message from preferred store(列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,4/"ALL"-全部的)
    AT+CMGR Read SMS message(读短消息)
    AT+CMGS Send SMS message(发送短消息)
    AT+CMGW Write SMS message to memory(向SIM内存中写入待发的短消息)
    AT+CMSS Send SMS message from storage(从SIN|M内存中发送短消息)
    AT+CNMI New SMS message indications(显示新收到的短消息)
    AT+CPMS Preferred SMS message storage(选择短消息内存)
    AT+CSCA SMS service center address(短消息中心地址)
    AT+CSCB Select cell broadcast messages(选择蜂窝广播消息)
    AT+CSMP Set SMS text mode parameters(设置短消息文本模式参数)
    AT+CSMS Select Message Service(选择短消息服务)
    表一:相关的GSM AT指令

      我现在以实例来说明这些指令的使用方法:

      先用手机数据线将手机连接到电脑串口,并将串口的波特率设置为19200,可以开始了。

      1、首先测试你的连接及手机是否支持AT指令,请在你的串口调试程序中输入:

      AT<回车>

      屏幕上返回"OK"表明计算机与手机连接正常,那样我们就可以进行其它的AT指令测试了

      2、设置短信发送格式

      AT+CMGF=1<回车>

      屏幕上返回"OK"表明现在短信的发送方式为PDU方式,如果是设置为TEXT方式,则,AT+CMGF=0<回车>

      3、 发送短信

      发送内容及手要号仍旧同上面在编码中的一样,编码后,得到要发送的数据如下

    0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021

      我们用如下指令来发送

      AT+CMGS=33<回车>

      如果返回">",就把上面编码数据输入,并以CTRL+Z结尾,稍等一下,你就可以看到返回OK啦。

      说明一下,为什么AT+CMGS=33呢,是这样得来的:

    11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021

      这一段字符串的长度除以2得到的结果,上面的字符串,短信中心号加上短信内容得到的,怎么得到的,请回顾一下解码部份

      在我们前面的讨论中,一条完整的短信发送,只要执行三条AT指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由于篇幅,我只能在这里提到这么多,大家要是想了解更多,可以向各手机厂商索取AT指令白皮书,里面很详细的。

      上面讲到的,只能为我们实际中作准备,我们还必须要一个发送途径,根据我们的需要,我们选择投资最少,实现比较方便的串口通信。注意,串口通过数据线跟手机相连,用AT指令来实现发送短信,在我们选择数据线时,建议购买原厂所配,非原厂所配,在使用过程中,经常出现一些莫明其妙的问题,比如,手机屏幕黑了,手机老是提示电池电量不足之类的。

    zmbbs=1; 串口通信

      在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用MSCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。

      通常,在C#中实现串口通信,我们有四种方法:

      第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。

      第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多资料。

      第三:就是用第三方控件啦,可一般都要付费的,不太合实际,不作考虑

      第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能

      在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。

      在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义:

      打开串口:

      函数原型:public void Open()

      说明:打开事先设置好的端口

      示例:

    using JustinIO;

    static JustinIO.CommPort ss_port = new JustinIO.CommPort();
    ss_port.PortNum = COM1; //端口号
    ss_port.BaudRate = 19200; //串口通信波特率
    ss_port.ByteSize = 8; //数据位
    ss_port.Parity = 0; //奇偶校验
    ss_port.StopBits = 1;//停止位
    ss_port.ReadTimeout = 1000; //读超时
    try
    {
     if (ss_port.Opened)
     {
      ss_port.Close();
      ss_port.Open(); //打开串口
     }
     else
     {
      ss_port.Open();//打开串口
     }
     return true;
    }
    catch(Exception e)
    {
     MessageBox.Show("错误:" + e.Message);
     return false;
    }

      写串口:

      函数原型:public void Write(byte[] WriteBytes)

      WriteBytes 就是你的写入的字节,注意,字符串要转换成字节数组才能进行通信

      示例:

    ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //获取手机品牌

      读串口:

      函数原型:public byte[] Read(int NumBytes)

      NumBytes 读入缓存数,注意读取来的是字节数组,要实际应用中要进行字符转换

      示例:

    string response = Encoding.ASCII.GetString(ss_port.Read(128)); //读取128个字节缓存

      关闭串口:

      函数原型:ss_port.Close()

      示例:

    ss_port.Close();

      由于篇幅,以及串口通信涉及内容广泛,我在这里只讲这些。

      在上面我们已经把终端短信所需的各种原始技术有所了解,是可以小试牛刀的时候了。

    zmbbs=1; 实践篇

      在整个开始的时候,你要准备以下软硬件:

       硬件:西门子3508或C35系列手机一个
       西门子手机通信数据线一条
       软件:VS.NET(C#)
       短信编码类库(PDUdecoding.cs)
       串口通信类库(JustinIO.cs)

      当所要求的软硬件都准备好后,我们就可以正式开始了。下面以我自己的测试用例为大家详细介绍。

       做什么事情都应该有计划,虽然我们的测试用例很简单,但还是画个简单的流程图:



      有了流程图,还只是明白了程序怎么运行,再看看界面,会让你更心动的了。


    图二、短信终端C#版界面图

      再不开始,就有人骂我了。下在我讲的开发环境是在VS.NET(C#)中。COME GO,GO…

      步骤一、打开VS.NET,新建项目->Visual C#项目->Windows应用程序,名称中输入你的工程名就行啦,我的是smsForCsharp

      步骤二、参照上面的界面图,设计你的程序界面,下面是我程序中各控件的主要属性

    控件名称 控件Name属性 说明
    TextBox targetNumber 接收手机号码
    TextBox CenterNumber 短信中心号
    TextBox smsState 发送短信后,返回的信息。注意设置控件为多行
    TextBox smsContent 短信内容,同样,注意设置为多行
    ComboBox ConnectPort 连接手机的端口,例:COM1\COM2
    ComboBox ConnectBaudRate 串口连接的波特率,在串口通信中很重要的
    Button btnSend 发送按钮
    Button btnConnect 连接按钮,主要用于程序的初始化
    Button btnExit 退出按钮

      步骤三、将PDUdecoding.cs与JustinIO.cs拷入刚刚新建工程目录,并打开解决方案资源管理器,右键添加现有项,选中两个文件就行了,这里再打开类视图,里面是不是多了两个类,JustinIO与SMS类啊,如图三,要是没有,那你再试。


    图三,添加类后的类视图

      步骤四、引用命名空间,用代码查看方式打开Form1.cs(这里以我电脑为准,如果你自己更改过,请以你电脑为准),在代码前面加上

    using JustinIO;
    using SMS;
    using System.IO;
    using System.Text;

      步骤五、在smsFormCsharp类中,添加两个字段ss_port、sms,分别为JustinIO及SMS的对象,如下



      步骤六、添加串口初始化代码,如下:

    /// <summary>
    /// 初始化串口
    /// </summary>
    public bool InitCom(string m_port, int m_baudrate)
    {
     ss_port.PortNum = m_port;//串口号
     ss_port.BaudRate = m_baudrate;//波特率
     ss_port.ByteSize = 8;//数据位
     ss_port.Parity = 0;//
     ss_port.StopBits = 1;//停止位
     ss_port.ReadTimeout = 1000;//读超时
     try
     {
      if (ss_port.Opened)
      {
       ss_port.Close();
       ss_port.Open();
      }
      else
      {
       ss_port.Open();//打开串口
      }
      return true;
     }
     catch(Exception e)
     {
      MessageBox.Show("错误:" + e.Message);
      return false;
     }
    }

      将上述代码直接拷入你的程序中,并确保添加在Main主函数的后面,按F5,调试应该没什么问题,不过上面还没有实际任何看得见的功能,仅仅是打开了串口而以。

      步骤七、打开串口后,我们就应该初始化程序,取得手机的名牌,型号,以及短信中心号,双击连接按钮,并把下面代码拷入程序中:

    /// <summary>
    /// 初始化代码,并获取手机相关信息
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnConnect_Click(object sender, System.EventArgs e)
    {
     bool opened = InitCom(ConnectPort.SelectedItem.ToString(),Convert.ToInt32(ConnectBaudRate.SelectedItem.ToString()));//打开并初始化串口
     bool Connected = false;
     if (opened)
     {
      ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //获取手机品牌
      string response = Encoding.ASCII.GetString(ss_port.Read(128));
      if (response.Length > 0)
      {
       ConnectState.Text = response.Substring(10,7);
       Connected = true;
      }
      else
      {
       ConnectState.Text = "与手机连接不成功";
       Connected = false;
      }
      ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMM\r"));//获取手机型号
      response = Encoding.ASCII.GetString(ss_port.Read(128));
      if(response.Length > 0)
      {
       ConnectState.Text =ConnectState.Text+ " " + response.Substring(10,5) + " 连接中......";
       Connected = true;
      }
      else
      {
       ConnectState.Text = "与手机连接不成功";
       Connected = false;
      }
      ss_port.Write(Encoding.ASCII.GetBytes("AT+CSCA?\r"));//获取手机短信中心号
      response = Encoding.ASCII.GetString(ss_port.Read(128));
      if(response.Length > 0)
      {
       CenterNumber.Text = response.Substring(20,13);
       Connected = true;
      }
      else
      {
       Connected = false;
      }
      if (Connected == true)
      {
       btnConnect.Enabled = false;
       btnSend.Enabled = true;
      }
      else
      {
       btnConnect.Enabled = true;
       btnSend.Enabled = false;
      }
     }
    }

      到这里,你可以按F5,编译调试,通过,在确保你的手机与电脑连接正常下,点击连接按钮看看,是不是像我的一样,手机型号及短信中心号者正常显示出来了。


    图四、连接后程序界面

      步骤八、看到上在的结果,是不是感觉到离成功发送短信很近啦,看这么长的文章,费了大家不少时间,再不亮出发短信部份,对不起大家了。

      双击发送按钮,将下面代码拷入程序中。

    /// <summary>
    /// 发送短信
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnSend_Click(object sender, System.EventArgs e)
    {
     string decodedSMS = sms.smsDecodedsms(CenterNumber.Text,targetNumber.Text,smsContent.Text);
     byte[] buf =Encoding.ASCII.GetBytes(String.Format("AT+CMGS={0}\r",sms.nLength));
     ss_port.Write(buf);
     string response = Encoding.ASCII.GetString(ss_port.Read(128));
     string SendState = "";
     if( response.Length > 0 && response.EndsWith("> "))
     {
      ss_port.Write(Encoding.ASCII.GetBytes(String.Format("{0}\x01a",decodedSMS)));
      SendState = "发送成功!";
     }
     else
     {
      SendState = "发送失败";
     }

     string Result = String.Format("{0},{1},{2},\n\r",targetNumber.Text,smsContent.Text,SendState);
     smsState.Text += Result;
    }

      快按F5吧!神啊,快通过吧!不用求神了,已经通过了,现在你就可以发短信了,请确保手机可以正常连接电脑。按连接,然后填入你要的发送的目标手机号,并在内容中添入你要发送的内容,发送吧!成功了!成功了是这样子的!看你的跟我的一样吗?


    图五、发送成功

      还有一些事 不要忘了,记得添加退出代码。双击退出,添加下面代码:

    /// <summary>
    /// 关闭串口,退出程序
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnExit_Click(object sender, System.EventArgs e)
    {
     ss_port.Close();
     Application.Exit();
    }

      到这里都告一个段落了,所有的功能都完成了!不过由于这仅仅是一个演示用例,还有很多没有考虑,像串口通信中的,在实际操作不可这样操作的,应该用多线程来处理,一个专门用来读串口,一个专门用来写串口。还有程序中很多防出错代码没有添加进去,希望有心有朋友添加,并公布出来,这也是我写这篇文章希望看到的结果。请勿将本程序直接用于实际中,真诚提醒你!

      终于写完了,我也放松了许多,本来很早就应该完成了,因为一些个人原因,没有及时写完,向那些曾经问过我相关问题,没有及时回复的朋友,抱歉一声,希望你们继续支持我!

      调试环境

      Windows 2000 Professional、Visual Studio.NET、西门子3508手机、西门子专用数据线。

    zmbbs=1; 常见问题

      第一, 手机品牌,因为不同产商的手机,对AT指令的支持不同,所以请选择适合你手机AT指令,像NOKIA的就只能用TEXT模式的AT指令。

      第二, 数据线,问题出得最多的地方也就是数据,如果接上数据线后,你的手机显示为黑屏,建议你换数据线。

      第三, 手机SIM卡上的短信中心号设置,请确保在你的手机上可以发送短信。

      第四, 请你先用串口调试工具调试手机与电脑的连接,这样对你整个工作都是一个保证。

      作者申明:

      1、本文示例程序,可以任意拷贝、传播,但请保留作者的版权申明,以及第三方类库作者的版权申明。

    Posted Jun 23 2007, 04:30 PM by wicky with no comments
    Filed under:
  • JavaScript, We Hardly new Ya

    http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/

    JavaScript is a prototypal language, but it has a new operator that tries to make it look sort of like a classical language. That tends to confuse programmers, leading to some problematic programming patterns.

    You never need to use new Object() in JavaScript. Use the object literal {} instead. Similarly, don’t use new Array(), use the array literal [] instead. Arrays in JavaScript work nothing like the arrays in Java, and use of the Java-like syntax will confuse you.

    Do not use new Number, new String, or new Boolean. These forms produce unnecessary object wrappers. Just use simple literals instead.

    Do not use new Function to create function values. Use function expressions instead. For example,

    frames[0].onfocus = new Function("document.bgColor='antiquewhite'")

    is better written as

    frames[0].onfocus = function () {document.bgColor = 'antiquewhite';};

    The second form allows the compiler to see the function body sooner, so any errors in it will be detected sooner. Sometimes new Function is used by people who do not understand how inner functions work.

    selObj.onchange = new Function("dynamicOptionListObjects["+
            dol.index+"].change(this)"); 

    If we keep function bodies in strings, the compiler can’t see them. If we keep function bodies as string expressions, we can’t see them either. It is better to not program in ignorance. By making a function that returns a function, we can explicitly pass in the values we want to bind. This allows us to initialize a set of selObj in a loop.

    selObj.onchange = function (i) {
        return function () {
            dynamicOptionListObjectsIdea.change(this);
    
        };
    }(dol.index);

    It is never a good idea to put new directly in front of function. For example, new function provides no advantage in constructing new objects.

    myObj = new function () {
        this.type = 'core';
    };

    It is better to use an object literal. It is smaller, faster.

    myObj = {
        type: 'core'
    };

    If we are making an object containing methods that are bound to private variables and functions, it is still better to leave off the new prefix.

    var foo = new function() {
        function processMessages(message) {
            alert("Message: " + message.content);
        }
        this.init = function() {
            subscribe("/mytopic", this, processMessages);
        }
    }

    By using new to invoke the function, the object holds onto a worthless prototype object. That wastes memory with no offsetting advantage. If we do not use the new, we don’t keep the wasted prototype object in the chain. So instead we will invoke the factory function the right way, using ().

    var foo = function () {
        function processMessages(message) {
            alert("Message: " + message.content);
        }
        return {
            init: function () {
                subscribe("/mytopic", this, processMessages);
            }
        };
    }();
    

    So the rule is simple: The only time we should use the new operator is to invoke a pseudoclassical Constructor function. When calling a Constructor function, the use of new is mandatory.

    There is a time to new, and a time to not.

    41 Comments »

    RSS feed for comments on this post. TrackBack URI

    1. Great post! It would be great to see more posts like this!!!!

      Comment by Eduardo Scoz — November 13, 2006 #

    2. Great article to get people thinking on the same page. Also, a reminder from all the hints at these techniques through other sites on JavaScript.

      Comment by Joel — November 13, 2006 #

    3. The new Function(...) syntax is a bit bizarre, however there’s something to it that may make some sense. Specifically, because it turns a string into a function body, it can be used in place of eval() for parsing JSON (or pseudo-JSON) values. In other words, instead of eval("var myobj = " + JSONString), you can use var myobj = (new Function("return " + JSONString))().

      This syntax isn’t obviously better in any particular way, however it does allow for JSON that is a tiny bit safer by limiting evaluation to the object that’s being returned. It also appears to execute in about half the time as eval in Firefox (haven’t tested others yet). And if you assign the new function itself to a variable (rather than executing and disposing of it immediately), you can easily create multiple copies of the object without repeatedly calling eval(...).

      So, yeah, new Function(...) is generally a silly construct and using it is usually a poor design choice, but it’s got one nice use.

      Comment by Mark Kawakami — November 13, 2006 #

    4. You said:

      Do not use new Number, new String, or new Boolean. These forms produce unnecessary object wrappers. Just use simple literals instead.

      However, I recently read the following advice:

      If your code calls methods of literal values very often, you should consider converting them into objects instead.

      So for a string s, they claim that s.length will be more efficient if s is a String object, vs a string literal, but I haven’t verified.

      Comment by Patrick Fitzgerald — November 13, 2006 #

    5. Most of the advice in http://dev.opera.com/articles/view/48/?page=2 is very good. But avoid new String(). Its current behavior will probably not survive in the Fourth Edition of ECMAScript.

      Comment by Douglas Crockford — November 13, 2006 #

    6. I also read the article, and thought one of the key “light bulbs” was the “Beware of implicit object conversion” topic.

      If your code calls methods of literal values very often, you should consider converting them into objects instead, as in the previous example.

      I guess it’s something to be aware of if you’re writing a heavy/high performance widget or app.

      Mostly, at least for the simpler loops, this can be avoided by moving the objects method call from the middle of the loop to the initialisation stage. e.g. from for( var i = 0; i to for( var i = 0, l = s.length; i

      Comment by Dave Transom — November 13, 2006 #

    7. I think it’s also important to answer the question, “if I’m not supposed to do it, then why am I allowed to?” In the case of String, Number, Boolean, and Function, these constructors are available so that their prototypes can be augmented, not so they can be instantiated. Since these are used to create wrappers on the fly, it’s the only way to add new methods to this type of data.

      Comment by Nicholas C. Zakas — November 13, 2006 #

    8. […] Check out the rest for an interesting back-and-forth. By the way, this isn’t meant to diss the Yahoo! folks, they’re churning out some amazing libraries, patterns and hints given the constraints they need to work in and articles like this one are much appreciated. Its just that every time I dive in there, I find myself having to learn to swim every time, it really feels like its more convoluted than it needs to be. […]

      Pingback by Did JavaScript need to be this confusing? « Leftshore — November 13, 2006 #

    9. “new Function” makes sense in some cases. For example it is possible to create optimized functions with this e.g. executing command1 or command2.


      var s = sometest() ? "command1();" : "command2();";
      var f = new Function(s);

      This is not possible with pure function expressions. In this case you can only do this using if-constructs. But they don’t have the same performance.


      var f = function() {
      sometest() ? command1() : command2();
      }

      IMO “new Function” is also the better choice compared to eval() in many cases, because it allows you to evaluate and execute code without joining it with the current scope. This should perform better.

      Comment by Sebastian Werner — November 13, 2006 #

    10. No, it still doesn’t make sense.

      var f = sometest() ?
      function () {command1()} :
      function () {command2()};

      Comment by Douglas Crockford — November 13, 2006 #

    11. […] JavaScript, We Hardly new Ya » Yahoo! User Interface Blog (tags: javascript optimization) […]

      Pingback by BarelyBlogging » Blog Archive » links for 2006-11-14 — November 13, 2006 #

    12. Nice post with an especially good encouragement to learn the new way of doing things. Having written enough of Javascript 1.2 type scripts I believe that embracing prototypes and JSON is a much nicer way to code (that has plenty of maintainability advantages too).

      One question though (and this is something mainly regarding any of the YUI and other Yahoo! JSON stuff): why aren’t JSON objects properly quoted? There’s an RFC (http://www.ietf.org/rfc/rfc4627.txt) that defines JSON and according to it one should use double-quotes around JSON properties.

      eg Foo.prototype = {
      “init”: function() { … }
      }

      Maybe it’s that the RFC is too new or maybe its that it’s not gotten enough press. Either way I encourage the conformance to it for future-proofing and simplifiying debugging.

      Comment by Josh Peters — November 13, 2006 #

    13. By the way, Dave’s post (http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/#comment-15132) seemed to have an extra code element in it making the rest of the page look bad.

      Comment by Josh Peters — November 13, 2006 #

    14. new…

      Trackback by simon's ramblings — November 13, 2006 #

    15. From Flanagan’s 5th edition

      “A last, very important point about the Function() constructor is that the functions it creates do not use lexical scoping; instead, they are always compiled as if they were top-level functions…”

      I can imagine this might come in handy some time to create a function with a clean scope chain. Could circular event handler memory leaks in IE be avoided by using the constructor function instead of a function literal? Maybe not the most efficient way to do this but it is nice to have options in case some new browser bug comes along that can only be solved by using the function constructor function. One day that might be true for some other constructors like String and Array.

      Comment by Peter Michaux — November 13, 2006 #

    16. […] One of the article is by Douglas Crockford that talks about when to use the new operator and avoiding the use of Number, String intrinsic objects when not necessary. The other article is by Mark Wilton on writing efficient JavaScript. […]

      Pingback by gopalarathnam.com - Some very nice JavaScript posts — November 13, 2006 #

    17. Douglas Crockford said:

      [quote]
      No, it still doesn’t make sense.

      var f = sometest() ?
      function () {command1()} :
      function () {command2()};
      [/quote]

      how about:

      var f = someTest()? command1 : command2;
      f();

      I always wondered why the JS gurus only use new for constructors, I’ve been following that principle for some time - now I know why!


      Fred

      Comment by OzFred — November 13, 2006 #

    18. No, it still doesn’t make sense.

      var f = sometest() ?
      function () {command1()} :
      function () {command2()};

      And we could have an even better code in this case with something like

      var f = sometest() ?
      command1 :
      command2;

      Comment by Masklinn — November 13, 2006 #

    19. JavaScript, We Hardly new Ya…

      When to use, or rather when not to use the new operator in JavaScript…

      Trackback by Arve Bersvendsen — November 14, 2006 #

    20. Pretty good stuff to learn.

      Comment by milo317 — November 14, 2006 #

    21. I’ve hardly programmed in JavaScript, even though I like to program and do so almost every day. Your post is quite helpful for someone like me, who gets the point of your ideas.

      Thanks and nice job.

      Comment by Joao — November 14, 2006 #

    22. […] Douglas Crockford, JavaScript genius, presents an article on the use of "new" when creating objects in JavaScript. Excellent read that will make your code better. I know I’ll use his <select> code somewhere. […]

      Pingback by A Modern Fable (AJM) » Blog Archive » Using &quot;new" JavaScript — November 14, 2006