January 2008 - Posts
[原文发表地址]MSDN Code Gallery - snippets, samples and resources
[原文发表时间]Monday, January 28, 2008 11:09 AM
我们要帮助客户获得成功,或者,某些情况下甚至是帮助他们起步,唯一要做的就是提供给他们业界一流的开发工具。我们频繁听到的要求之一是,开发人员需要代码段(snippets)、示例、示范应用程序和其他资源。我们通过多种途径从社区中获得这类信息和反馈。我们听取这些反馈的第一个来源,可能也是最广泛被使用的一个,是通过blog,比如ScottGu的blog。
另一个我们最近启用的新资源是MSDN代码图库(MSDN Code Gallery)。
MSDN代码图库是一个提供代码段,示例和其他资源的门户网站,在这里你可以找到描述示例和帮助文档的页面,包括截图和设计文档。另外你还能找到关于这些示例、示范项目或其他资源的讨论。这个网站向整个社区开放,使得整个社区都可以做出贡献。
代码图库的核心是一个简单的、带有社区支持的网站,我们共享面向开发人员的信息和资源,并把他们整合到MSDN中。
然而,代码图库只提供纯粹的存储功能,它并没有项目管理的能力。如果你想要管理动态的代码项目并与其他人在上面协作,请使用CodePlex,这是另一个我们提供给开源项目的网站。要搜寻更重要的内容比如SDK和产品下载,你可以随时访问http://www.microsoft.com/downloads.
希望MSDN代码图库能提供给你另一个宝贵的资源,使你起步并走向成功。
Namaste!
【原文地址】VS 2008 Web Deployment Project Support Released
【原文发表日期】 Monday, January 28, 2008 10:02 PM
上个星期五,我们在网上发布了对VS 2008 Web部署项目的最终版(RTW)支持。你可以在这里免费下载以及了解有关详情。
Web部署项目可以用于内置于VS 2008中的“ASP.NET 网站项目(ASP.NET Web Site)”或 “ASP.NET Web 应用项目(ASP.NET Web Application Project)”选项,提供了可为你所用的其他的编译,包装和部署选项。你可以在这里阅读一篇我以前的教程贴子以进一步了解有关详情。
VS 2008 Web 部署项目版本支持VS 2005 web部署项目提供的所有现有特性,它还添加了如下的其他支持:
- 从 VS 2005 Web部署项目轻松移植到VS 2008 Web部署项目
- 只在web部署项目编译成功时才替换输出
- IIS7支持
这个(发布在网上的)RTW版本修补了发现的缺陷,添加了大家对我们上个月发布的12月CTP版本所要求的一些小特性。请确认在你安装这个最终版本前,运行安装程序,卸载你安装了的任何VS 2008 部署项目支持的老的版本。VS 2008 Web 部署项目可以与VS 2005 Web 部署项目并行安装,所以没必要卸载VS 2005的版本,如果你还在老的项目中使用它的话。
更多的部署特性
在我上次的链接篇里,我提到了IIS开发团队发布的新的Web部署工具。这个工具可用于IIS6和IIS7,允许你向web服务器进行自动化的拷贝部署,文件同步,和应用移植。如果你在寻找一种好的方式往远程服务器上自动化部署你的ASP.NET 应用的话,那么这个工具绝对值得看一下。
你可以在你的build环境中将VS 2008 Web部署项目作为build后的一步来设置最后的部署配置,然后使用IIS Web 部署工具将它们拷贝到远程服务器上去。或者,你也可以直接使用IIS Web 部署工具将原本的“ASP.NET 网站项目(ASP.NET Web Site)”或 “ASP.NET Web 应用项目(ASP.NET Web Application Project)”拷贝到远程机器上去(不需要VS 2008 Web 部署项目)。
想进一步了解关于新的 IIS Web部署工具的话,请阅读这个网页底部的walkthroughs文档(特别是“Introduction to MS Deploy”一篇)。我也会在以后的博客中进一步讨论如果用它来自动化你的web服务器部署。
希望本文对你有所帮助,
Scott
今日偶然阅读了Understanding Single Sign-On in ASP.NET 2.0 这篇关于单点登录的文章,仔细阅读,发现还是有些不尽完整之处。
文中对于单点登录的介绍,忽略了一个重要问题——就是站点的域的问题。在深入讨论这个问题之前,先简单介绍一下网站域的概念,举个例子,假如我们有三个站点:
A: blog.joycode.com; B: beta.joycode.com; C: www.openlab.net.cn 。那么A站点的域是"blog.joycode.com",它的主域是"joycode.com";B站点的域是"beta.joycode.com",它的主域是"joycode.com";C站点的域是"www.openlab.net.cn" ,它的主域是"openlab.net.cn"。对于A和B来说,他们是不同的网站域,但是主域是相同的,都是"joycode.com",对于A和C来说,不管是域还是主域,都不相同。一般我们所说的单点登录,都是指A,B,C这三类站点可以在一点登录,实现所有的站点都不需要再次登录,甚至于不仅限于网站之间,也可能是从其他客户端到网站。一般比较大的系统都需要这样的单点登录系统,例如著名的微软的Passport,还有飞信的SSO。
回过头来看这篇单点登录文章,按照这种方案,仅能实现同一域下各虚拟目录的单点登录,离真正的单点登录还差得远,当然,文章的思路,对于同一域下的虚拟目录,或者同一主域的不同站点,还有有意义的。
前面说到了文章中的方案还只能实现同一域下的不同虚拟目录的单点登录,还不能实现同一主域的单点登录,那么怎么样才能在这个方案基础上实现同一主域的不同站点的单点登录呢?
文章的核心部分在于让每个站点的MachineKey保持一致,采用Form验证,这样可以保证每台服务器Cookie加密解密的结果是一致的。Form验证将登录后的授权凭证加密后保存在Cookie中,由于同一域下面的虚拟目录,Cookie是可以共享的,因此可以同一域内直接实现单点登录,而对于不同域,Cookie是不能直接共享的,所以对于不同域而同一主域的情况,我们还需要将Cookie的domain设为主域。那么还以前文的A、B站点为例,要实现单点,我们只要在web.config中,配置authentication \forms节点下domain值为主域,如下:
<authentication mode="Forms"> <forms loginUrl="login.aspx" name=".ASPXAUTH" domain="joycode.com"/> </authentication>
即可实现同一主域不同子域站点之间共享登录了。
而对于不同主域的站点,实现方案相对就复杂多了。
本文假设您已阅读了本系列中此前发表的文章:
从SQL 到 LINQ, Part 1: 基础(Bill Horst)
从SQL 到 LINQ, Part 2: FROM 和 SELECT(Bill Horst)
Converting SQL to LINQ, Part 3: DISTINCT, WHERE, ORDER BY and Operators
Converting SQL to LINQ, Part 4: Functions
Converting SQL to LINQ, Part 5: GROUP BY and HAVING
Converting SQL to LINQ, Part 6: Joins
本文中我们将讨论一下合并, TOP 和子查询. 下个星期, 我打算更深入地介绍一下LEFT, RIGHT 和 FULL OUTER JOIN. 如果你想了解关于转换SQL到LINQ的其他问题, 请回复本文.
本文假设您已阅读了本系列中此前发表的文章:
从SQL 到 LINQ, Part 1: 基础(Bill Horst)
从SQL 到 LINQ, Part 2: FROM 和 SELECT(Bill Horst)
Converting SQL to LINQ, Part 3: DISTINCT, WHERE, ORDER BY and Operators
Converting SQL to LINQ, Part 4: Functions
Converting SQL to LINQ, Part 5: GROUP BY and HAVING
本文将讨论一下交叉联接Cross Join, 内联接Inner Join, 自然联接Natural Join 和外(左/右)联接 Outer (Left/Right) Join.
本文假定您已阅读过本系列中此前发表的文章:
从SQL 到 LINQ, Part 1: 基础(Bill Horst)
从SQL 到 LINQ, Part 2: FROM 和 SELECT(Bill Horst)
Converting SQL to LINQ, Part 3: DISTINCT, WHERE, ORDER BY and Operators
Converting SQL to LINQ, Part 4: Functions
本文将讨论GROUP BY和HAVING子句.
【原文地址】Jan 24th Links: ASP.NET, ASP.NET AJAX, Visual Studio, .NET, IIS
【原文发表日期】 Thursday, January 24, 2008 11:08 PM
才从亚洲回来,决定发一链接系列之新贴以示庆祝(因为我还没适应时差,无法入眠)。也请参阅我的ASP.NET 技巧,诀窍和教程网页里我以前写的众多很受欢迎的文章的链接。
ASP.NET
ASP.NET AJAX
Visual Studio
.NET
IIS
希望本文对你有所帮助,
Scott
[原文地址] Nurturing Incubations
[发表时间] Tuesday, January 22, 2008 1:28 PM
怎样在我的团队中培养一种文化来鼓励、授权、奖励并认可大家在孵化项目中付出的努力是我经常考虑的事情之一。我把任何处于初期的科技创新,或是还未必有很好定义的处于早期阶段的研发工作统称为孵化。并非所有的孵化工作都能成为长期领先的创新科技。甚至有些时候某些项目所作的努力会被完全颠覆。
我个人并不相信每个人都有合适的心态、激情、素质和能力全天候的参与孵化项目,并随时与日常的业务目标相互切换。让合适的人参与到孵化项目中,给他们良好的环境让他们的想法可以得到培养,不要给团队过多的约束,这些都是提供一个培养环境的决定性因素。
作为一个开发机构,保证团队中的有部分人致力于孵化,或参与到能在随后的产品周期中打入市场的“长期领先的”创新工作中去,是非常重要的。这就意味以下三类资源必须在业务资源分配计划中考虑到:
· 让现有的客户成功(维护)
· 致力于下一个版本的产品
· 孵化
为孵化项目分配资源必须是计划的一部分,否则所有的资源都会被日常紧要事务所占用,这是自然的趋势。
开发工具部门已经有许多成功的孵化项目,我也将会是第一个告诉你们开发工具部门也有许多项目并没成功的人。这正是孵化项目的特点。如果有人告诉我说他们孵化项目的成功率高达100%,那我敢说他们并没有做足够的孵化工作。
其他业务主管和公司对怎样塑造孵化项目有不同的观点。以上只是我发现对我的团队来说最有效的方法。然而,创新和敏捷需携手并进;拥有一个鼓励并授权人们去从事孵化项目的文化是任何一个企业保持持续不断创新的必要条件。
Namaste!
虽然是小事情,不过也在这里说一下.
最近因为工作的问题,新买了一台SONY的笔记本.
现在的笔记本都是安装VISTA的, 想安装XP吧, 还找不到硬盘.
而且因为没有软驱, 所以安装时也弄不了硬盘驱动.
这个问题只好以后有空的时候解决了.
现在用VISTA安装了VS2003后, 出现了一个很严重的问题.
使用FIND IN FILES功能时, VS2003会停止响应.
上网找相关信息, 有人已经报告这个问题了.
不过MS说不管VS2003了.
后来发现了另外一台VISTA的电脑不存在这个问题.
以对比原来是WINDOWS THEMES的问题.
只要把WINDOWS外观, 改成比较难看的标准模式,(就像WIN2000那样..)
就能把问题解决掉了.
希望这个记录对VISTA下用VS2003的同行有帮助.
[原文发表地址]Visual C++ 2008 Feature Pack Beta
[原文发表时间] Tuesday, January 08, 2008 12:56 PM
几个月前,我在blog上写了我们对Native代码投资的计划。今天,我们在此方向又向前迈进了一步。
我很高兴地宣布Visual C++ 2008 功能包的beta版本已可供下载。这个版本提供了MFC库的较大更新,以及TR1 库的实现。
使用新的MFC库,开发人员将能够创建“看起来和用起来”都很像微软最受欢迎的产品的应用程序 – 包括Office,Internet Explorer 和Visual Studio 。而拥有了TR1 库,开发人员将能够使用一系列重要的功能例如智能指针(smart pointers),正则表达式的分析器(regular expression parsing),以及新的Container 类 (Container classes).
想了解更多信息,请查看C++ team blog。
Namaste!
昨天,由Sisley Lin 处得知,我将被推荐成了“十大杰出开发技术英雄”候选人之一,有点激动。推荐的理由是我为CSDN 这个最大的中文技术社区的成长所贡献的这些年。当我回首看自己在CSDN经历时,发现自己已为CSDN公司工作了7年半,在CSDN 论坛活动了8年。蓦然回首,八年光阴已匆匆而过,心中真是感慨万千呀。
记得那是在99年底,2000年初时,我从大学毕业刚半年,跟随一个我的铁哥们跳槽到一家新成立的电子商务的网站(http://www.ego88.com/, 不过这个网站现在已经无法访问了)。由于之前我是在一家使用Delphi开发ERP,医院信息系统的公司,我对Delphi非常感兴趣,当时最常去的就是大富翁论坛(http://www.delphibbs.com/)。经这次跳槽后,由于转行做网站,就开始学习ASP技术。在大富翁论坛时,听说新开了一个程序员的论坛CSDN,而CSDN有个板块在讨论ASP,于是乎,就整天泡CSDN论坛的ASP版,边学习,边帮别人解答问题。慢慢的,自己的ASP水平也提高起来了,后来就成了ASP版的最早一任版主。那时候,也达到了自己在CSDN专家榜的最高排名——CSDN总专家榜排名13。
2000年6月时,由于我在EGO88网站经常跟技术经理发生技术争执,被开除了。痛定思痛之后,我决定离开杭州,来北京发展,没想到这次离开成了我人生的转折点。恰巧当时CSDN网站刚刚被百联集团收购,准备扩展业务,正在不断招纳新人,于是我便和曾登高联系了一下, 7月15日就来到了北京,从此就开始了我为CSDN网站工作的历程。
还记得当时CSDN公司在亚运村,就是现在鸟巢的位置,而我就租住在旁边的惠忠北里小区。每天早上,我都从小区出来,向北跑步,就是现在的大屯路一带,全是麦田和菜地。不想经过这五六年的发展,现在这一片的房价均价已达到一万元以上…….
我在CSDN负责的第一个项目是文档中心(http://dev.csdn.net/ 现在这里已经不归我负责了,也不是我当初做的那个风格了),就是现在博客的前身,不知道还有多少人记得这个产品。当时为了测试和运作文档中心,我从2000年7月开始,疯狂转贴了很多文章。而文档中心文章在升级成博客后,全部迁移到博客中了,这还一度造成我的博客发文数是第一。
随后,在从事了其他一些小的工作后,我就接手了CSDN论坛,当时那一版本的论坛仍然是ASP开发的,采用了双缓存机制,同时静态帖子采用了XML+XSL技术。说起来你可能不相信,那一个版本的论坛是完全由我一个人开发完成的。 那可是单枪匹马闯五关的时代呀,由于我最早使用XML技术,最初时有些技术难题没能解决,一度被Boss批判说,不要使用不成熟的技术。2003年时,就是我创建的这个版本的论坛达到了历史最高在线人数,同时发帖量,回复量都相当高。要知道,当时的论坛只是两台服务器,一台WEB,一台数据库。当时服务器的配置也只是2G内存+双CPU,志强2.4G,能做到那个成绩实属不易。
04年是非常郁闷的一年,现在看来,04年忙忙碌碌的开发了很多项目,但是这些项目都荒废了,不再看得到了。03年下半年开始,我开发的项目都转到ASP.net 技术了,虽然这些项目最终由于运维等原因,流产了,但是至少也算是从那时候开始对.net 技术有了较深的了解吧。
05年的时候,已经开始基于.net技术开发新版论坛了。但是,由于不受公司重视,开发到一半竟被中止,把人员抽调到其他项目,使得无法继续。直到06年的时候,由于论坛在03年9月达到高峰后,一直走下坡路,公司终于决定在论坛方面增大力度。而新的论坛开发已经不再是单枪匹马就可以搞定的了,需要团队协作,而组建的团队又问题多多,磕磕碰碰后,终于在06年底发布了群组。群组使用的是跟论坛一样的底层架构。之后采用里程碑增量开发模式,终于在07年9月28日,把所有老论坛升级到了新版论坛。之后,就是一系列功能的补充完善,优化。随着公司投入力量的加强,我预计,也希望08年论坛又会象03年一样,达到一个新的高峰。
回首过去这八年,我很感谢CSDN为我提供了一片成长的平台。CSDN伴着我成熟,我也见证了CSDN的成长。随着CSDN的不断改进,我自己也从菜鸟成长起来。我的角色也从最初的程序员变成高级程序员,再变成开发经理。(我在CSDN注册时的ID是4807,也就是我之前CSDN用户只有 不到5000个,而截至2007年底,CSDN注册用户已经达到250万多了。)这些成长都是通过自己的努力来实现的。一分耕耘,一分收获,我在CSDN实现了我的第一个“孩子之梦”……
CSDN 论坛有很多有意思的故事。比如:女英雄无为;彭大力追旋玑;拉萨mm挖EDYang的故事等等,而这一个个故事都发生在自己一手搭建的论坛平台上,其中的成就感不言而喻。这也是我能在CSDN这家公司工作7年多的根本原因,我已经把它当成了我生活的一部分,无法割舍。
八年时光,弹指即过,人生能有几个八年?八年时间我做了不少事情,但仅凭一手搭建了CSDN论坛这个平台,此八年不算虚度。希望未来的八年,我的程序员人生将更加精彩。
仅以本文来怀念我患得患失的八年。
郭红俊
2008年1月10日 星期四 于北京
附,微软开发技术英雄,IT技术英雄的投票地址在 http://www.microsoft.com/zh/cn/default.aspx 的最大的那个flash 广告。 具体地址就是:http://www.hhhchina.net/ 。 需要在中国地图上找到某个人才可以投票,郁闷的是,竟然地图上把我丢到内蒙了。
拉票了,大家都来投我一票啦!^&^
我们书写查询语句的时候,Join 参数之前可以是下面三个 { LOOP | MERGE | HASH } JOIN 。 如果不使用,则系统自己分析那种方式快,使用那种方式。
这其实是SQL Server 联结时候使用的三种算法。尽管每种算法都并不是很复杂,但考虑到性能优化,在产品级的优化器实现时往往使用的是改进过的变种算法。譬如SQL Server 支持block nested loops、index nexted loops、sort-merge、hash join以及hash team。我们在这里只对上述三种基本算法的原型做一个简单的介绍。
知识点:
Tables join总是两个两个进行的。所以下面的算法都是两个表的联结。
- Hash Join (哈希联结)
- 下图是 SQL Server 标示这种联结的图标,从图标我们就可以看到这个查询的逻辑。
-
- 逻辑步骤,如下图:
- 以数据少的数据表的 Join 字段建立 Hash 值。
- 对应的数据表计算 Join 字段的 Hash ,再与前一个数据表做比对。

- 特点:
- 处理大量、未排序、无索引的数据
- 一般来说,查询优化器会首先考虑Nested Loop和Sort-Merge,但如果两个集合量都不小且没有合适的索引时,才会考虑使用Hash Join。
- Hash Join也用于许多集合比较操作,inner join、left/right/full outer join、intersect、difference等等,当然了,需要保证都是等值联结。
- Hash Join一个较大限制是它只能应用于等值联结(equality join),这主要是由于哈希函数及其桶的确定性及无序性所导致的。
- Nested Loop Join (嵌套循环联结)
- 下图是 SQL Server 标示这种联结的图标,从图标我们就可以看到这个查询的逻辑。
-
- 逻辑步骤,如下图:
- 从外层的数据表取出一笔记录
- 使用这个记录扫描内层的数据表
- 再回到外层的数据表,重复上述的步骤。

- 特点:
- 适用于一个集合大而另一个集合小的情况(将小集合做为外循环),I/O性能不错。
- 当外循环输入相当小而内循环非常大且有索引建立在JOIN字段上时,I/O性能相当不错。
- 当两个集合中只有一个在JOIN字段上建立索引时,一定要将该集合作为内循环。
- 对于一对一的匹配关系(两个具有唯一约束字段的联结),可以在找到匹配元组后跳过该次内循环的剩余部分(类似于编程语言循环语句中的continue)。
- 可以不是等值联结
- Merge Join (合并联结)
- 下图是 SQL Server 标示这种联结的图标,从图标我们就可以看到这个查询的逻辑。
-
- 逻辑步骤。如下图:
- 使用两个数据表用来 Join 的字段既有的索引
- 两边的数据表以光标由小到大比较,一边移动到比另一个数据表大时,换移另一个数据表。

- 特点:
- 可以不是等值联结
- MERGE JOIN 必须等待两个单独的SORT JOIN完成(如果使用索引作为数据源,可以跳过SORT JOIN这个步骤), 如果两个表的规模相差很大, 会很影响查询的性能。
- 当查询的两个表都很大或者都很小的时候, 则应该只用MERGE JOIN,如果两个表都很小,则表扫描和分类将进行的很快;
分别使用这三种 Join 的例子:
create table t1 ( i int not null )
create table t2 ( i int not null )
go
set showplan_text on
go
-- Hash Match(Inner Join, HASH:([ghj_Demo].[dbo].[t2].
)=([ghj_Demo].[dbo].[t1].
))
select * from t1 join t2 on t1.i = t2.i
go
set showplan_text off
go
alter table t1 add primary key ( i )
alter table t2 add primary key ( i )
go
set showplan_text on
go
-- |--Nested Loops(Inner Join, OUTER REFERENCES:([ghj_Demo].[dbo].[t1].
))
select * from t1 join t2 on t1.i = t2.i
go
set showplan_text off
go
set showplan_text on
go
-- Merge Join(Inner Join, MERGE:([ghj_Demo].[dbo].[t1].
)=([ghj_Demo].[dbo].[t2].
),
-- RESIDUAL:([ghj_Demo].[dbo].[t2].
=[ghj_Demo].[dbo].[t1].
))
select * from t1 join t2 on t1.i = t2.i option(merge join)
go
set showplan_text off
go
drop table t1, t2
参考资料:
浅谈查询优化器中的JOIN算法
http://blog.csdn.net/hdy007/archive/2007/02/28/1516467.aspx
Example of merge ,hash and nested join
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=498748&SiteId=1
Inside SQL Server Joins
http://blog.csdn.net/happydreamer/archive/2007/05/16/1611523.aspx
在SQL Server 2000的时候,我们要想做Performance Tuning的时候,多半都必须用到Profiler或者SQL Tracer来跟踪,这东西一是结果分析起来麻烦,二是对系统资源消耗太大。在SQL Server 2005中,提供了动态管理视图和函数(Dynamic Management Views and Dynamic Management Functions),大大的方便了我们对系统运行情况的监控,故障诊断和性能优化。现在除了Debug以外,已经很少再对生产系统使用Profiler。顺便说一下,SQL Server 2008有一个更好,更强大的Data Collector,可以收集系统信息放入数据仓库,再进行分析的,那时候DBA就更方便了。
下面我会Step by step的介绍,如何使用DMV和DMF来诊断系统情况,介绍到的全部知识都来自于联机丛书(Books Online)。
Issue:在新上线一个系统后,我发现数据库服务器的CPU有所升高,达到20-30%,Peak time的时候甚至会达到50%。于是我打开性能监视器,发现SQL Logins/sec平均超过2000。那么,我希望知道,是哪些SQL语句调用次数如此频繁,找到了这些SQL语句之后,就可以进行有针对的优化。
全文地址:http://blog.myspace.cn/luke/archive/2008/01/22/400261243.aspx
总所周知,在Microsoft Office 2007中,微软引入了一种全新的文档格式:Open XML。由于Open XML是一种开放的文档格式(基于两种开放技术:XML、Zip),所以解决了过去Microsoft Office所使用的二进制文档难以交互、难以被第三方应用程序访问的问题。
但是自从微软决定将Open XML提交给ISO之后,从业界的反馈来看,很多人仍然非常关心过去的二进制文档格式(.doc, .xls, .ppt),并希望能得到其相关的技术细节文档。
经过慎重的考虑,微软决定再将Microsoft Office所使用的二进制文档格式公开。任何人和企业,在不违反相关协议的前提下,都可以免费得到其技术规范文件。现在,无论是全新的Open XML格式文档,还是过去的二进制格式文档,都不会再有人,或者企业,抱怨微软“藏着掖着”了吧。:)
如何获取二进制文档格式规范,请参看此篇KB中的“Royalty-Free File Format Programs”一节。
一个类(或者一个结构)封装了一些相关的属性和方法。在使用这些属性和方法的时候,设计指导要求从不会得到NullReferenceException。这至少包含两个方面的意思:
- 代码中决不要显性地 throw new NullReferenceException
- 代码中要有充分的错误检查,避免由CLR抛出NullReferenceException.
如果某个函数的一个参数不能为null,函数代码需要检查输入是否合法。如果输入是null,代码需要抛出的是ArgumentNullException。
即便是来自微软.NET框架库中的代码也未能100%遵守设计指导,将如下一篇Blog所示。
More Posts
Next page »