We do not always find visible happiness in proportion to visible virtue

梦幻白桦林

SHARE

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 58 Stories :: 62 Comments :: 0 Trackbacks

公告

常用链接

留言簿(5)

搜索

  •  

最新随笔

最新评论

阅读排行榜

2009年4月25日 #

    .net 中Unit已经标记了Serializable了
  [Serializable]
    [TypeConverter(
typeof(UnitConverter))]
    
public struct Unit
    {
}

我定义了个类,其中有个width属性

        Unit width;

        [DefaultValue(
typeof(Unit), "")]
        [Bindable(
true)]
        [Description(
"列宽")]
        
public Unit Width
        {
            
get { return width; }
            
set { width = value; }
        }
序列化后为<Width/>
posted @ 2009-04-25 17:00 colys 阅读(1224) | 评论 (3)编辑 收藏

从字符串中取出包含的函数名和所有参数你这样:[method("arg1",arg2,...n个)]

要求:

以[开头,]结尾

method 为 sum , count ,page, eval  其中的一个

可以没有括号,比如[page]

参数可以有引号,也可以没有引号,参数不限个数,比如:
[sum("Money")]    要能取出 sum, Money
[count(0)]   要能取出 count, 0
[eval("aa",1)] 要能取出 eval aa,1

posted @ 2009-04-25 15:56 colys 阅读(1634) | 评论 (6)编辑 收藏

2007年11月21日 #

福鼎白茶
白茶属微发酵茶,是我国六大类茶叶中的一颗璀璨明珠,中国是白茶的惟一产地。白茶的品质特征为:成茶披满白毫,十分素雅,汤色清淡,味鲜醇、清甜、有毫香。基本加工工艺流程是萎调、晒干或低温烘干。因采用鲜叶原料不同,故可分为:白毫银针、白牡丹、贡眉、寿眉及新工艺白茶五种。生产白茶对品种和加工工芤要求十分严格,适制白茶的茶树品种为:福鼎大白茶、福鼎大毫茶、政和大白茶和闽北水仙等。白茶是我国历史名茶,其主产区在福建省福鼎市、政和县,建阳、建瓯等县市也有少量生产。据茶叶史料记载,白茶首创于福建省福鼎县,又据福建省地方志编委会出版的《福建地方志》和现代茶叶著名专家张天福教授的《福建白茶的调查研究》及清代明人周亮工《闽小记》的记载,清喜庆初年(公元1796年),福鼎人用菜茶(有性群体种)的壮芽为原料,创制白毫银针。在1857年,福鼎大白茶茶树品种从太姥山移植到福鼎县点头、柏柳等地选育成功,由于福鼎大白茶芽壮、毫显、香高,所制白毫银针外型品质远远优于“菜茶”。于是福鼎茶人改用福鼎大白茶的壮芽为原料制造“白毫银针”,出口价高于原菜茶加工的银针(后来称土针)10多倍。约在1860年,“土针”逐渐退出“白毫银针”的历史舞台。据《福建地方志》记载,政和县1880年选育繁殖成功“政和大白茶”品种,1889年开始产制银针。两地生产银针时间相距约80多年。总之,白茶类中是先有“银针”,后才有白牡丹、贡眉、寿眉,至于新工艺白牡丹,是二十世纪70年代由原福鼎茶厂白琳分厂研制的一个新的白茶产品。所以说,白茶之所以能自成一类,是因其具有独特的产地(区域)、独特的品种和独特的加工工艺,离开其中任何一个因素都生产不出好茶。同时,生产白茶具有很大的风险性,表面上看加工工艺二十简单,但其内在的技术要领二十不易掌握。

天山绿茶

天山绿茶是福建省的历史名茶,为闽东烘青绿茶的极品。品质特优,尤其是里、中、外天山所产的绿茶品质更佳,称之“正天山绿茶”。
据《宁德县志》记载,天山绿茶曾经历一段变革演化过程。宋代生产团茶、饼茶,也生产乳茶、龙团茶。到了元、明代生产“茶饼”,供作礼品和祭祀品。公元1781年前后,天山所产的芽茶已被列为贡品。明、清以后,以生产炒青条形茶为主。几经变革,到了1979年,才改制为烘青型绿茶,成为高档花茶的优质原料。历史上,天山绿茶花色品种丰富多彩,而今,除少数花色品种失传外,大多数传统花色品种,如天山雀舌、凤眉、明前、清明等均得到恢复,并创制了新的品种,如清水绿、天山毛峰、天山银毫、四季春、毛尖等。这些绿茶以锋苗挺秀、香高、味浓、色翠、耐泡五大特点赢得了荣誉。从1979年恢复生产以来,曾多次在地、省及全国名茶评选会上获奖,名列前茅。天山银毫茉莉花茶在全国内销花茶评比会上,名列第一。1982年、1986年二次被评为全国名茶,商业部授于全国名茶荣誉证书。
天山位于东海之滨,天山主峰——屏南天湖山,屹立在福建省屏南、宁德、古田三县交界的屏南黛溪乡。除天湖山外,还有天峰山、仙峰山、大坪山等山脉,是天山绿茶的原产地。这里山峰险峻,海拔1300米左右,林木参天,云海翻滚,气候温和,年均气温15℃左右,年降雨量1900毫米左右,土壤肥沃湿润,多为结构疏松的砂质壤土。茶树多生长在岩间和山坡上,树壮芽肥,是适制天山绿茶的理想原料。难怪诗人赞道:“深山奇石嵯峨立,峡谷悬崖味茶香”。
天山绿茶采用的原料因花色品种不同而异。如雀舌和凤眉等传统珍品,选用叶质肥厚、持嫩性强的天山菜茶品种的芽叶为原料。采摘标准为一芽一叶和一芽二叶初展。制500克干茶约需3万个左右芽叶。新创制的名茶如清水绿等,则选取大、中叶种的芽叶为原料,采摘标准以一芽二叶初展为主,制500克干茶需7000个左右芽叶。
天山绿茶实现了机械化生产。主要设备有连续滚筒电热恒温杀青机,40型或45型揉捻机,自动百叶烘干机等。加工工艺有凉青、杀青、揉捻、烘干(毛火和足火)四道工序。杀青掌握“高温、控热、少量、短时”的方法。筒温240~260℃,电热控制,前高后低。起锅摊凉散热后再行揉捻。揉捻时采用“小机、适量、轻压、短揉”的技术措施,达到条索紧结、色泽翠绿、香味清鲜的目的。40型揉捻机投叶量7.5~10公斤,45型揉捻机投叶量10~12.5公斤。转速55转C分。烘干毛火掌握“薄摊、高温、快烘”的原则。足火掌握低温慢烘,达到干度内外均匀一致,香高而鲜爽的目的。毛火烘温115℃左右,含水量15~20%。足火烘湿90~95℃,含水量6%左右。
天山绿茶具有“三绿”特色,即色泽翠绿,汤色碧绿,叶底嫩绿,且外形条索嫩匀、锋苗挺秀、茸毫显露,香似珠兰花香,芬芳鲜爽,滋味浓厚回甘,犹如新鲜橄榄,汤色清澈明亮,经泡耐饮,冲泡3~4次,茶味犹存。饮之幽香四溢,齿颊留芳,令人心旷神怡

福鼎白琳工夫茶
"白琳工夫茶"充分发挥福鼎大白茶的特点,精选细嫩芽叶,制成工夫茶,外形条索紧结纤秀,含有大量的橙黄白毫,具有鲜爽愉快的毫香,汤色、叶底艳丽红亮,取名为「桔红」,意为桔子般红艳的工夫,风格独特,在国际市场上很受欢迎。
"白琳工夫茶"系小叶种红茶,当地种植的小叶群体种具有茸毛多、萌芽早、产量高的特点,一般的白琳工夫,外形条索细长弯曲,茸毫多呈颗粒绒球状,色泽黄黑,内质汤色浅亮,香气鲜纯有毫香,味清鲜甜和,叶底鲜红带黄。
"白琳工夫"为三大闽红工夫之一,以其独特风格和品质盛兴百年而不衰。白琳功夫茶采用福鼎大白茶代替原有的小叶种,成为加工白琳功夫的主要原料,使其质量有了显著的提高。它的品质特征,几乎代表白琳功夫高级茶的独特风格,在国际市场上很受欢迎。主要特点是:条索紧结,茶毫显露金黄色,干茶色泽乌润油亮,汤色红艳明亮,叶底红亮,滋味鲜浓醇爽,香气清高,有特殊的花香,耐冲泡,既适合清饮,又适合掺和砂糖、牛奶。

福鼎莲心茶
莲心茶形似莲子瓣心而得名,为我国传统名茶。产于福建省太姥山麓的福鼎百琳和霞浦水门。太姥山景色秀丽,崖林之间茶树丛主。相传,早在光绪年间,太姥山麓的白琳一带,茶树已广为种植。到了本世纪30年代,莲心茶以茶中珍品闻名海内外。用莲心茶窨制成茉莉娥眉、茉莉秀眉,为花茶中的佼佼者,深受东南亚侨胞的喜爱。

莲心茶采取福鼎大白茶的一芽二叶为原料。经萎凋、杀青、揉捻、干燥等四道工序加工而成。

萎凋:目的在于蒸发部分水分,促使芽叶内含物发生适度的变化,消除成品的苦涩味。当地的经验是萎凋应掌握适当的限度,萎凋程度过轻达不到萎凋的目的;萎凋程度过重,即失水过多,内含物质变化过大,均不利莲心茶品质的形成。通常,芽叶减重率控制在18%左右,时间6~8小时。当叶色转为暗绿,叶的侧脉折而不断,折梗尚能脆断,叶质柔软,即为适度。

杀青:手工杀青,全用抖炒。做到抖得散,翻得匀。杀青锅温180℃左右,投叶量1500克左右,当叶子松散不粘手,清香透露即为适度。

揉捻:杀青叶经摊凉冷却后进行揉捻。达到茶索挺直紧结的目的。

干燥分毛火和足火两个过程。毛火在烘笼上进行,烘温90~100℃,每笼投叶量1500克左右,烘至七、八成干为适度。足火在炒锅内进行,锅温80℃左右,炒至足干,色略显灰为适。

莲心茶的品质特点是,外形细紧纤秀,锋苗显露,色泽绿中带黄,有似莲子蕊色,香气清幽,含绿豆清香,味醇鲜爽,汤色橙绿清澈,叶底嫩匀成朵。泡在杯中,两叶相对而开,中间竖一芽心,犹如莲子瓣心,颇有情趣。

福安坦洋工夫红茶
  坦洋工夫分布较广,主产福安、柘荣、寿宁、周宁、霞浦及屏南北部等地。坦洋工夫源于福安境内白云山麓的坦洋村,相传清咸丰、同治年间(公元1851 --1874年),坦洋村有胡福四(又名胡进四)者,试制红茶成功,经广州运销西欧。很受欢迎,此后茶商纷纷入山求市,接踵而来并设洋行,周围各县茶叶亦渐云集坦洋.坦洋工夫名声也就不胫而走,自光绪六年 至民国二十五年(公元1881—1936年)的50余年, 坦洋工夫每年出口均上万担,其中1898年出口3万余组。

  坦洋街长一公里,设茶行达36家,雇工3000余人,产量2万余担。收条范围上至政和县的新村,下至霞浦县的赤岭,方圆数百里,境跨七、八个县,成为福安的主要红茶产区。运销荷兰、英国、日本、东南亚等二十余个国家与地区,每年收外汇茶银百余万元。当时民谚云:“国家大兴,茶换黄金,船泊龙凤桥, 白银用斗量。”后因抗日战争爆发,销路受阻,生产亦遭严重破坏,坦洋工夫产量锐减。

  50年代中期,为了恢复和提高坦洋工夫红茶的产量和品质,先后建立了国营坦洋、水门红茶初制厂和福安茶厂,实行机械化制茶,引进并繁殖福鼎大白茶、福安大白茶、福云等优良茶树品种,1960年产量增加到5万担,创历史最高水平。后因茶类布局的变更,由“红”改“绿”,坦洋工夫尚存无几。近年来,经有关部门的努力,坦洋工夫又有所恢复和发展,1988年产量达8000余担。

  坦洋工夫外形细长匀整,带白毫,色泽乌黑有光,内质香味清鲜甜和,汤鲜艳呈金黄色,叶底红匀光滑。其中坦洋、寿宁、周宁山区所产工夫茶,香味醇厚,条索较为肥壮,东南临海的霞浦一带所产工夫茶 色鲜亮,条形秀丽。
posted @ 2007-11-21 21:47 colys 阅读(1143) | 评论 (1)编辑 收藏

2007年10月8日 #

#1  Web 2.0 编程思想:16条法则

原文:Thinking in Web 2.0: Sixteen Ways
作者:Dion Hinchcliffe
URL:http://sd.csdn.net/n/20060518/90603.html

1、在你开始之前,先定一个简单的目标。无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标。就像“我需要保存一个书签”或者“我准备帮助人们创建可编辑的、共享的页面”这样的目标,让你保持最基础的需求。很多Web 2.0应用的最初吸引之处就是它的简单,避免并隐藏了那些多余的复杂性。站在创建者的立场,可以想象Google的几乎没有内容的主页,还有del.icio.us的简单的线条。从最终用户的角度来看,与之齐名的就是Diggdot.us所提供的初始化页面。你能够并且希望加入更多功能,但是先做好最开始的。在一个时候只做一个特性,完成一个目标。这听起来很太过于单纯化了,但它将使你更加专注,而且你也会明白我的意思。

2、链接是最基础的思想。这就是我们称之为Web的一个理由。链接是把Web中各种实体连接起来的最基本的元素。你的信息、你的关系、你的导航,甚至是能够被写成URL的任何内容。这里有一个链接应该遵循的规则(其实你也不必严格的遵守):

??? 1. Web上的任何东西都是可以被URI或者是URL所连接的。
??? 2. 把所有的链接都保存为他的原始出处,这样可以让你与任何人、在任何地方、任何时候都能分享它。
??? 3. 第二条中任何时候的前提是链接必须是持久的,它不会在没有任何缘由的情况下被改变或者是消失。
??? 4. 链接应该是人类可读的、稳定的、并且能够自我诠释的。

3、数据应该属于创建它的人。是的,你听我的。任何用户创建的、贡献的或分享的都是他们自己的,除非他们很明显的放弃这个权力来让你自由处置。他们贡献到Web上的任何信息都应该是可编辑的、能被删除的、并且能够取消共享,无论在任何时候,只要用户愿意。这也包含了那些间接的数据,像他们所关心的记录、日志、浏览历史、网站访问信息,或者是任何可以被跟踪的信息。所有的网站必须清晰简单的陈诉那些信息是用户创建的,并且提供他们停止创建的方法,甚至是清除的方法。

4、数据优先,体验与功能其次。无论它是文本、图片、音频还是视频,Web最终还是把这些解析为数据。换句话说,你无法脱离数据去呈现内容。所有这些数据都通过那些易于发现的URL来定位(参见第2条)。通过另一种形式来看待这些,Web最终是名词优先,动词其次,虽然最近正在向动词偏移。来看看名词的例子:日历的条目、家庭照片、股票价格。还有一些动词的例子:定一个约会、共享一张图片、买一份股票。

5、做好积极分享一切的准备。尽可能的分享一切,你所拥有的所有数据,你所提供的所有服务。鼓励不遵循原有意图的使用,提倡贡献,不要那些需要分享的内容坚持设置为私有的。在分享与发现之后,提供易于使用的浏览方式是显而易见的需求。为什么呢:话说回来,你会从别人的共享之中受益匪浅。注意:这里没有许可让你去侵犯版权保护的法律,你不能够去分享你刻录的DVD或者是拥有商业版权音乐,因为你已经同意不会去分享这些东西。但是你可以发现并分享那些完全开放的媒体内容。一个小小的建议,你可以学习一下Creative Commons license(共创协议).

6、Web是一个平台;要让它成长。当然,我们还有很多其他的平台(Windows、Linux、Mac),但是那些已经不是重点了。换句话说,Web是无法脱离的平台,不会中断的平台,你可以通过各种方式去扩展的平台。你在Web上提供的数据与服务将会成为Web一部分,最终你会在Web平台的某一处扮演你的角色。扮演好你的角色并照顾好后来者。

7、理解与信奉“阶梯性”。现在的Web越来越大,几乎蔓延到了全世界的所有国家,并且已经拥有了10亿用户。我的观点是Web的各个组成部分存在着细微的区别和不同,就像不同地方的用户那样。例如Web的设计部分:易用性永远优先于速度、可靠性、重用性与可集成性。你也应该提供同样的体验给你的用户。它已经被一次又一次的被人们在文档中强调,忠诚的用户很快会成为专业的用户,他们期待更快的速度还有更多。退一步支持他们。同样,也有很多很多的用户会进入这个阶梯的底端,如你所期待的那样。他们可能不会说你的语言,不熟悉你的文化,甚至不知道是如何到这里的。所以你需要向他们表达清楚。

8、任何东西都是可编辑的。或者是它应该被编织的更好。要确定的是,只有很少的东西是不能被编辑的,剩下的都可以,这是一个可写的Web。这并不意味着原始内容的丢失,而通常被理解为用户能够很容易的对内容加以评论,或者评注内容是在那里发现的。如果你对此应用的好,他们能够比你所想象的做的更多(把内容串起来并且给予原始内容来创建自己的,等等)。

9、Web上的身份是神圣的。不幸的是,这并不意味着你能够得到更多的隐私(这完全是上个世纪的想法)。但对身份的验证是必要的,你应该感谢那些只需一个邮件地址就能确定你身份的服务。这意味只要你对你的用户承诺了,你就必须保证他们的隐私安全。必要的时候,在这个世界的某处你还得为你的用户挺身而出,向当地的权威挑战。如果你没有打算那样做,你就得把实际情况告诉你的用户。另一方面,如果身份是必须的,不要试图伪装它,不然在某一天我们将会在Web上放弃我们的最后一点点隐私的权利。

10、了解流行的标准并且使用他们。从一个消费者或者是创作者的立场来看,数据将会以不同的格式与任何一个人交换。同时这样的数据也会反过来促进标准的完善与采纳。这通常意味像RSS、 OPML、XHTML、Simple XML、JSON等简单标准的流行,而避免SOAP、XSD,还有RDF、ATOM也一样,使用它们会给我的内心带来痛苦。请你也为你所钟爱的标准投上一票来支持它们。

11、遵循无意使用的规律。如果你把非常有趣的数据和服务用广泛使用的格式开放和共享出去,你将会得到你所应得的,其他人也将会基于你的那一块Web平台来构建。或许还会从别人那里得到更多,所以为这个做一下准备比较好。我已记不清有多少次我看到一个播客(podcasting)服务因为流行过渡而导致服务垮掉,就是因为他们被 Slashdot和del.icio.us给收录了。这一点要知道:网络上的大量化意味着如果一个内容非常有趣,即使是一个很小的角落也会得到惊人的访问量。鼓励使用这种方式,它还是非常有价值的,前提是你要有所准备。

12、粒化你的数据与服务。我们应该在很早以前就明白这些,大规模集成的数据仅仅适用于无需管理的下载与批量操作。分解你的数据,让他们独立成可描述的URL地址,对你的服务也一样。反过来说,你不要创建一些巨大的、复杂的、像圣诞树那样的数据结构和服务。保持简单,要非常的简单。让这些分离的片断能够容易的被重组和发现。

13、提供用户能够单独受益的数据和服务。渐渐依赖于这种社会化参与是存在风险的,你需要让你的用户有一点点动机来贡献时间、热情和信息,除非他们能够直接受益。社会化分享比个体行为的利益大很多,除非你能够激发用户的个人动机,否这你将无法享受这份厚礼。

14、让用户组织并过滤信息。不一定是必须的,但却是非常重要的。让用户以他们自己的方式来标注和组织数据,因为你自己是永远无法及时的处理他们的。用户会按照他们自己理解的最佳方式来处理并构建。要保证你的Web服务能够按照用户所需所想的方式来工作。这也是标签(tagging)和通俗分类(folksonomies )的方式如此成功的主要因素。

15、提供丰富的用户体验。Web一直都在和本地的应用程序进行着激烈的竞争。为什么?因为本地程序还是感觉上好一些,速度也快一些。但是这不会长久的(确信在5年或者15年后,这种竞争就不存在了)。是的,我在谈论Rich Internet Applications, Ajax, 还有那些不可思议的交互应用。他们让Web成为了一个真正的“无平台”的平台,如果你知道我是怎么想的。

16、信奉并支持快速改进和反馈。这个通常意味着加快步伐,但也意味着使用轻量级的工具、技术和不要做出那些适得其反的痛苦决定(例如使用一个被层层环绕的Ajax框架来代替可以通过混合来实现的,或者用C++来构建所有的东西,其实使用Ruby会更好一些)。这同时也意味着需要一个非常快速的方式来处理错误报告,修复Bug,释放新版本。从一个用户的角度来看,报告你所发现的任何问题,还有那些你经常抱怨的地方,甚至那些都不是一个Bug。

当然,Web 2.0是一个极其广泛和深奥的话题,没有一个人能够列举出它的所有重点和特征。如果你对此充满了兴趣,请花一点时间来补充我没有提到的地方。我想这就是Web 2.0的参与性吧! 
posted @ 2007-10-08 11:43 colys 阅读(233) | 评论 (0)编辑 收藏

2007年8月24日 #

http://www.cnblogs.com/hardrock/archive/2006/08/18/480668.html
posted @ 2007-08-24 10:29 colys 阅读(357) | 评论 (0)编辑 收藏

2007年7月3日 #

VS2005进行Web调试的浏览器选择
不幸,安装了firefox后,安装VS2005,VS进行web调试时就用了firefox而不是ie,这应该是默认浏览器搞的

更改方法:

打开 C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\VisualStudio\8.0\browsers.xml

 
<?xml version="1.0" ?> 
<BrowserInfo>
<Browser>
  
<Name>firefox.exe</Name> 
  
<Path>"F:\PROGRA~1\MOZILL~1\FIREFOX.EXE"</Path> 
  
<Resolution>0</Resolution> 
  
<IsDefault>False</IsDefault> 
  
</Browser>
<Browser>
  
<Name>Microsoft Internet Explorer</Name> 
  
<Path>"C:\Program Files\Internet Explorer\iexplore.exe"</Path> 
  
<Resolution>0</Resolution> 
  
<IsDefault>True</IsDefault> 
<DDE>
  
<Service>IExplore</Service> 
  
<TopicOpenURL>WWW_OpenURL</TopicOpenURL> 
  
<ItemOpenURL>"%s",,0xffffffff,3,,,,</ItemOpenURL> 
  
<TopicActivate>WWW_Activate</TopicActivate> 
  
<ItemActivate>0xffffffff,0</ItemActivate> 
  
</DDE>
  
</Browser>
<InternalBrowser>
  
<Resolution>0</Resolution> 
  
<IsDefault>False</IsDefault> 
  
</InternalBrowser>
  
</BrowserInfo>
将第一个<Browser>结点,也就是firefox的<IsDefault>改为 False ,将 IExplore 的一个改为True
或者直接删除此文件
posted @ 2007-07-03 22:25 colys 阅读(1145) | 评论 (0)编辑 收藏

2007年7月1日 #

一、异步IO
        对于应用程序而言,有两种类型的IO调用:即同步IO 与异步IO。其本质的区别是:同步IO会block当前的调用线程,而异步IO则允许发起IO请求的调用线程继续执行,等到IO请求被处理后,会通知调用 线程。在windows平台上,应用程序可以调用CreateFile API, 并通过设置FILE_FLAG_OVERLAPPED标志来决定是否发起异步IO请求。
        对于异步的IO请求,其最大的好处是:慢速的IO请求相对于应用程序而言是异步执行,这样可以极大提高应用程序的处理吞吐量。发起IO请求的应用程序需要关心的是IO执行完成的结果,而不必忙等IO请求执行的过程。
       事实上,无论对于同步IO,还是异步IO,当IO请求发送到device driver后,device driver的执行总是异步的,当它接到IO请求之后,总会马上返回给IO System。而IO System是否立即返回给调用线程,则取决于FILE_FLAG_OVERLAPPED标志的设置,如下图:


二、异步IO的同步问题。
        我们使用异步IO,是为了提高应用程序的处理吞吐量。但是,当异步IO不再异步时(无论你是否设置FILE_FLAG_OVERLAPPED标志),应用 程序的性能会受到极大的影响。根据Microsoft Knowledge Base 156932, 在下列几种情况下,异步IO会失去它的异步性,而表现出同步的性质:
1)如果文件使用了NTFS compression压缩,则system driver不会异步地存取这样的文件。
2)扩展文件长度的IO操作不会是异步操作。
3)Cache机制。如果IO操作使用了file system cache,则这样的IO操作会被当成同步IO,而非异步IO。
即使你使用了FILE_FLAG_OVERLAPPED标志。在这种情况下,
a.如果需要读取的数据已经在Cache里,那么I/O drivers会认为这样的IO请求可以被立即处理,其结果是ReadFile 或者WriteFile调用返回TRUE,表示是:同步处理完成。
b. 如果需要读取的数据不在Cache里,windows NT的file system是使用page-faulting机制来实现cache管理,而page-faulting总是被同步处理, Windows NT没有提供异步的page-faulting机制。的确, file system driver使用了线程池来缓解这一问题,但是,当应用程序发起的IO请求足够多时,线程池还是不能应付的。
        在我们开发基于异步IO应用程序时,应该避免上述问题的出现,因为它们会使程序的性能大打折扣。
那么,对于Cache,我们如何避免呢?答案是:请使用FILE_FLAG_NO_BUFFERING标志。这个标志会使异步IO真实地异步执行。
三、性能的测试数据(仅供参考)。
      我在我的机器上,简单地对使用FILE_FLAG_NO_BUFFERING标志的异步IO,与不使用FILE_FLAG_NO_BUFFERING标志的异步IO进行了对比。
操作:顺序读取1G的文件。
x轴表示:每次读取的字节数(单位:K/每次)
Y轴表示:读取完成所需要的时间。(单位:millisecond)
注意:每次测试读取的内容总数是相等的(1000M)。
例如:如果每次读取128k,则需要读取8000次(128k*8000 = 1000M)。
如果每次读取256k,则需要读取4000次(256k*4000 = 1000M)。
粉红色的线没有使用FILE_FLAG_NO_BUFFERING标志,而黄色的线使用了FILE_FLAG_NO_BUFFERING标志。

从以上的数据,我们可以得出以下结论:
1) 当使用FILE_FLAG_NO_BUFFERING标志,应用程序的性能会极大提高,大概有50%的提高。
2) 在使用异步IO的时候,还有一个注意的问题是:当你每次读取的字节数增大的时候,性能也会提高。尤其在小于1024k时,当增大次读取的字节数,性能都有 明显的提高。在混合了网络传输等复杂因素的应用程序开发过程中,建议将该值设置为可配置的参数,通过调整该参数,使你的应用达到最好的性能。

参考资料:

1) Microsoft Knowledge Base 156932

2)  Microsoft Windows Internals, Fourth Edition.

posted @ 2007-07-01 21:23 colys 阅读(553) | 评论 (0)编辑 收藏

2007年6月3日 #


有5户人家A,B,C,D,E,每户人家都养了5只鸽子,一共25只。

这5户人家想从一共这25只鸽子中挑出飞的最快的前5只鸽子。

大家选定了一个出发点和到达点,每次只能放飞5只鸽子,在这样情况下可以看到每次从出发地到目的地5只鸽子到达的先后顺序,但是没有计时器来计算时间。

注:题目中不要考虑鸽子体能,是否匀速,是否直线飞行等等情况,可以理想设定速度均匀而且稳速。
==============================================

请问:
A)在确保能挑出25只鸽子中飞的最快的5只的前提下,最少需要多少次比赛(每次只能5只)能保证能挑出最快的5只。

B)怎样比赛?
posted @ 2007-06-03 16:34 colys 阅读(1580) | 评论 (15)编辑 收藏

2007年5月27日 #

  在运行vs2003安装时老提示我是要更新还是删除,我都还没装怎么会有这个项呢!后来仔细看了看这个提示是属于我装的一个极点输入法的! 卸载掉后安装正常!

  事情可不是都那么顺,安装后运行一切正常,欣喜.....花了我好多时间!
但不过多久,在下一次开机后,它罢工了! 提示DI.DLL找不到! 多次运行还是如此! 想都不想,重装! 又是一阵等待...
再运行,oh,shit "找不到.dll 文件"

  无语..难道这就是microsoft的东东吗? 为什么以前安装和使用就没遇到这问题吗? 突然一个思想在我脑海里浮现,既然安装和输入法会有关,但运行会不会也如此!但极点五笔不是被我卸载掉了吗? 难道是五笔加加的问题?(我装有两个五笔输入法~~) 于是乎卸载掉五笔加加!再装吧...等待...

终于.....正常了...感慨ing.....................

posted @ 2007-05-27 23:50 colys 阅读(303) | 评论 (0)编辑 收藏

2007年5月18日 #

本文讨论:

• 用于编写单元测试的 NUnit
 
• 用于创建代码文档资料的 NDoc
 
• 用于生成解决方案的 NAnt
 
• 用于生成代码的 CodeSmith
 
• 用于监视代码的 FxCop
 
• 用于编译少量代码的 Snippet Compiler
 
• 两种不同的转换器工具:ASP.NET 版本转换器和 Visual Studio .NET 项目转换器
 
• 用于生成正则表达式的 Regulator
 
• 用于分析程序集的 .NET Reflector
 

本文使用了下列技术:

.NET、C# 或 Visual Basic .NET、Visual Studio .NET

除非您使用能够获得的最佳工具,否则您无法期望生成一流的应用程序。除了像 Visual Studio®.NET 这样的著名工具以外,还可以从 .NET 社区获得许多小型的、不太为人所知的工具。在本文中,我将向您介绍一些目前可以获得的、面向 .NET 开发的最佳免费工具。我将引导您完成一个有关如何使用其中每种工具的快速教程 — 一些工具在许多时候可以使您节约一分钟,而另一些工具则可能彻底改变您编写代码的方式。因为我要在本篇文章中介绍如此之多的不同工具,所以我无法详尽讨论其中每种工具,但您应该了解到有关每种工具的足够信息,以便判断哪些工具对您的项目有用。


本页内容
 Snippet Compiler 
 Regulator 
 CodeSmith 
 生成自定义模板 
 NUnit 
 编写 NUnit 测试 
 FxCop 
 Lutz Roeder 的 .NET Reflector 
 NDoc 
 NAnt 
 实际运行的 NAnt 
 转换工具 
 小结 

Snippet Compiler
Snippet Compiler 是一个基于 Windows® 的小型应用程序,您可以通过它来编写、编译和运行代码。如果您具有较小的代码段,并且您不希望为其创建完整的 Visual Studio .NET 项目(以及伴随该项目的所有文件),则该工具将很有用。

例如,假设我希望向您说明如何从 Microsoft?.NET 框架中启动另一个应用程序。在 Snippet Compiler 中,我将通过新建一个能够创建小型控制台应用程序的文件开始。可以在该控制台应用程序的 Main 方法内部创建代码片段,而这正是我要在这里做的事情。下面的代码片段演示了如何从 .NET 框架中创建记事本实例: 

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName= "notepad.exe";
proc.Start();
proc.WaitForExit();

当然该代码片段本身无法编译,而这正是 Snippet Compiler 的用武之地。图 1 显示了 Snippet Compiler 中的这一代码示例。


按此在新窗口打开图片
图 1 Snippet Compiler


要测试该代码片段,只须按 play(运行)按钮(绿色三角形),它就会在调试模式下运行。该代码片段将生成一个弹出式控制台应用程序,并且将显示记事本。当您关闭记事本时,该控制台应用程序也将关闭。

就我个人而言,我是在尝试为某位向我求助的人士创建一个小型示例时,才发现 Snippet Compiler 是如此宝贵的 — 如果不使用该工具,则我通常必须新建一个项目,确保每个部分都能编译通过,然后将代码片段发送给求助者,并删除该项目。Snippet Compiler 使得这一过程变得更加容易、更加愉快。

Snippet Compiler 由 Jeff Key 编写,并且可以从 http://www.sliver.com/dotnet/SnippetCompiler 下载。

返回页首
Regulator
Regulator 是最后一个添加到我的头等工具清单中的。它是一种很有特色的工具,能够使生成和测试正则表达式变得很容易。人们对正则表达式重新产生了兴趣,因为它们在 .NET 框架中受到很好的支持。正则表达式用来基于字符、频率和字符顺序定义字符串中的模式。它们最常见的用途是作为验证用户输入有效性的手段或者作为在较大字符串中查找字符串的方法 — 例如,在 Web 页上查找 URL 或电子邮件地址。

Regulator 使您可以输入一个正则表达式以及一些针对其运行该表达式的输入内容。这样,在应用程序中实现该正则表达式之前,您可以了解它将产生什么效果以及它将返回哪些种类的匹配项。图 2 显示了带有简单正则表达式的 Regulator。

文档中包含该正则表达式 — 在该示例中,它是 [0-9]*,应该匹配一行中任意数量的数字。右下侧的框中含有针对该正则表达式的输入,而左下侧的框显示了该正则表达式在输入内容中找到的匹配项。在这样的单独应用程序中编写和测试正则表达式,要比尝试在您的应用程序中处理它们容易得多。

Regulator 中的最佳功能之一是能够在 regexlib.com 搜索联机正则表达式库。例如,如果您在搜索框中输入字符串“phone”,您将找到 20 种以上能够匹配各种电话号码的不同的正则表达式,包括用于英国、澳大利亚的表达式以及其他许多电话号码。Regulator 由 Roy Osherove 编写,并且可以在 http://royo.is-a-geek.com/regulator 下载。

返回页首
CodeSmith
CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的任何东西。

当您生成应用程序时,您经常需要重复完成某些特定的任务,例如编写数据访问代码或者生成自定义集合。CodeSmith 在这些时候特别有用,因为您可以编写模板自动完成这些任务,从而不仅提高您的工作效率,而且能够自动完成那些最为乏味的任务。CodeSmith 附带了许多模板,包括对应于所有 .NET 集合类型的模板以及用于生成存储过程的模板,但该工具的真正威力在于能够创建自定义模板。为了使您能够入门,我将快速介绍一下如何生成自定义模板。

返回页首
生成自定义模板
CodeSmith 模板只是一些可以在任意文本编辑器中创建的文本文件。它们的唯一要求是用 .cst 文件扩展名来保存它们。我将要生成的示例模板将接受一个字符串,然后基于该字符串生成一个类。创建模板的第一步是添加模板头,它可声明模板的语言、目标语言以及简要模板说明: 

<%@ CodeTemplate Language="C#"    
   TargetLanguage="C#" 
   Description="Car Template" %>

模板的下一部分是属性声明,在这里可声明将在模板每次运行时指定的属性。就该模板而言,我要使用的唯一属性只是一个字符串,因此属性声明如下所示: 

<%@ Property Name="ClassName" Type="String" Category="Context" 
    Description="Class Name" %>

该属性声明将使 ClassName 属性出现在 CodeSmith 属性窗口中,以便可以在模板运行时指定它。下一步是实际生成模板主体,它非常类似于用 ASP.NET 进行编码。您可以在图 3 中查看该模板的主体。[编辑更新 — 6/16/2004:图 3 中的代码已被更新,以便对多线程操作保持安全。]

正如您所见,该模板接受字符串输入并使用该类名生成单独的类。在模板主体中,使用与 ASP.NET 中相同的起始和结束标记。在该模板中,我只是插入属性值,但您还可以在这些标记内部使用任意类型的 .NET 代码。在该模板完成之后,您就可以通过双击它或者从 CodeSmith 应用程序中打开它将其加载到 CodeSmith 中。图 4 显示了已经加载到 CodeSmith 中的该模板。

您可以看到左侧的属性正是我在该模板中声明的属性。如果我输入“SingletonClass”作为类名,并单击 Generate 按钮,则将生成图 3 的底部显示的类。

CodeSmith 使用起来相当容易,如果能够正确应用,则可以产生一些令人难以置信的结果。面向代码生成的应用程序中最常见的部分之一是数据访问层。CodeSmith 包括一个名为 SchemaExplorer 的特殊的程序集,可用来从表、存储过程或几乎任何其他 SQL Server? 对象生成模板。

CodeSmith 由 Eric J. Smith 编写,并且可以在 http://www.ericjsmith.net/codesmith 下载。

返回页首
NUnit
NUnit 是为 .NET 框架生成的开放源代码单元测试框架。NUnit 使您可以用您喜欢的语言编写测试,从而测试应用程序的特定功能。当您首次编写代码时,单元测试是一种测试代码功能的很好方法,它还提供了一种对应用程序进行回归测试的方法。NUnit 应用程序提供了一个用于编写单元测试的框架,以及一个运行这些测试和查看结果的图形界面。

返回页首
编写 NUnit 测试
作为示例,我将测试 .NET 框架中 Hashtable 类的功能,以确定是否可以添加两个对象并且随后检索这些对象。我的第一步是添加对 NUnit.Framework 程序集的引用,该程序集将赋予我对 NUnit 框架的属性和方法的访问权。接下来,我将创建一个类并用 TestFixture 属性标记它。该属性使 NUnit 可以知道该类包含 NUnit 测试: 

using System;
using System.Collections;
using NUnit.Framework;

namespace NUnitExample
{
    [TestFixture]
    public class HashtableTest {
        public HashtableTest() {
            
        }
    }
}

下一步,我将创建一个方法并用 [Test] 属性标记它,以便 NUnit 知道该方法是一个测试。然后,我将建立一个 Hashtable 并向其添加两个值,再使用 Assert.AreEqual 方法查看我是否可以检索到与我添加到 Hashtable 的值相同的值,如下面的代码所示: 

[Test]
public void HashtableAddTest()
{
    Hashtable ht = new Hashtable();
            
    ht.Add("Key1", "Value1");
    ht.Add("Key2", "Value2");

    Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!");
    Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!");
}

这将确认我可以首先向 Hashtable 中添加值并随后检索相应的值 — 这是一个很简单的测试,但能够表现 NUnit 的功能。存在许多测试类型以及各种 Assert 方法,可使用它们来测试代码的每个部分。

要运行该测试,我需要生成项目,在 NUnit 应用程序中打开生成的程序集,然后单击 Run 按钮。图 5 显示了结果。当我看到那个大的绿色条纹时,我有一种兴奋和头晕的感觉,因为它让我知道测试已经通过了。这个简单的示例表明 NUnit 和单元测试是多么方便和强大。由于能够编写可以保存的单元测试,并且每当您更改代码时都可以重新运行该单元测试,您不仅可以更容易地检测到代码中的缺陷,而且最终能够交付更好的应用程序。


按此在新窗口打开图片
图 5 NUnit


NUnit 是一个开放源代码项目,并且可以从 http://www.nunit.org 下载。还有一个优秀的 NUnit Visual Studio .NET 外接程序,它使您可以直接从 Visual Studio 中运行单元测试。您可以在 http://sourceforge.net/projects/nunitaddin 找到它。有关 NUnit 及其在测试驱动开发中的地位的详细信息,请参阅文章“Test-Driven C#: Improve the Design and Flexibility of Your Project with Extreme Programming Techniques”(MSDN ®Magazine 2004 年 4 月刊)。

返回页首
FxCop
.NET 框架非常强大,这意味着存在创建优秀应用程序的极大可能,但是也同样存在创建劣质程序的可能。FxCop 是有助于创建更好的应用程序的工具之一,它所采用的方法是:使您能够分析程序集,并使用一些不同的规则来检查它是否符合这些规则。FxCop 随附了由 Microsoft 创建的固定数量的规则,但您也可以创建并包括您自己的规则。例如,如果您决定所有的类都应该具有一个不带任何参数的默认构造函数,则可以编写一条规则,以确保程序集的每个类上都具有一个构造函数。这样,无论是谁编写该代码,您都将获得一定程度的一致性。如果您需要有关创建自定义规则的详细信息,请参阅 John Robbins 的有关该主题的 Bugslayer 专栏文章(MSDN ® Magazine 2004 年 6 月刊)。

那么,让我们观察一下实际运行的 FxCop,并且看一下它在我一直在处理的 NUnitExample 程序集中找到哪些错误。当您打开 FxCop 时,您首先需要创建一个 FxCop 项目,然后向其添加您要测试的程序集。在将该程序集添加到项目以后,就可以按 Analyze,FxCop 将分析该程序集。图 6 中显示了在该程序集中找到的错误和警告。

FxCop 在我的程序集中找到了几个问题。您可以双击某个错误以查看详细信息,包括规则说明以及在哪里可以找到更多信息。(您可以做的一件有趣的事情是在框架程序集上运行 FxCop 并查看发生了什么事情。)

FxCop 可以帮助您创建更好的、更一致的代码,但它无法补偿低劣的应用程序设计或非常简单拙劣的编程。FxCop 也不能替代对等代码检查,但是因为它可以在进行代码检查之前捕获大量错误,所以您可以花费更多时间来解决严重的问题,而不必担心命名约定。FxCop 由 Microsoft 开发,并且可以从 http://www.gotdotnet.com/team/fxcop 下载。

返回页首
Lutz Roeder 的 .NET Reflector
下一个必不可少的工具称为 .NET Reflector,它是一个类浏览器和反编译器,可以分析程序集并向您展示它的所有秘密。.NET 框架向全世界引入了可用来分析任何基于 .NET 的代码(无论它是单个类还是完整的程序集)的反射概念。反射还可以用来检索有关特定程序集中包含的各种类、方法和属性的信息。使用 .NET Reflector,您可以浏览程序集的类和方法,可以分析由这些类和方法生成的 Microsoft 中间语言 (MSIL),并且可以反编译这些类和方法并查看 C# 或 Visual Basic ®.NET 中的等价类和方法。

为了演示 .NET Reflector 的工作方式,我将加载和分析前面已经显示的 NUnitExample 程序集。图 7 显示了 .NET Reflector 中加载的该程序集。


按此在新窗口打开图片
图 7 NUnitExample 程序集


在 .NET Reflector 内部,有各种可用来进一步分析该程序集的工具。要查看构成某个方法的 MSIL,请单击该方法并从菜单中选择 Disassembler。

除了能够查看 MSIL 以外,您还可以通过选择 Tools 菜单下的 Decompiler 来查看该方法的 C# 形式。通过在 Languages 菜单下更改您的选择,您还可以查看该方法被反编译到 Visual Basic .NET 或 Delphi 以后的形式。以下为 .NET Reflector 生成的代码: 

public void HashtableAddTest()

    Hashtable hashtable1;
    hashtable1 = new Hashtable();
    hashtable1.Add("Key1", "Value1");
    hashtable1.Add("Key2", "Value2");
    Assert.AreEqual("Value1", hashtable1["Key