August 2008 - Posts
今天IE 8 Beta2发布,第一时间安装到了自己的电脑上。感觉尚好,只是在打开新的Tab,或者关闭某个Tab时,IE8不断的Crash(不过现在IE8终于不再像IE7那样,一个Tab的Crash会搞死整个IE了。)将IE中所有的Add-on都Disable掉,终于好了。
-------- 从爱枣报学来的分割线 -----------
在第一篇文章中,我讲了如何使用Feature Stapling来自定义网站初始化过程,但是Feature Stapling还是有一些限制的。相比之下,虽然创建一个定制的Site Definition要更加复杂一些,但确实可定制性要更强更灵活。如果再配合上Site Provisioning Engine,那简直可以说是强大无比了。
首先澄清一个概念。在一个SharePoint网站的网站设置页面中,使用“将网站另存为模板”链接,管理员可以将整个网站保存为一个扩展名为.stp格式的模板。使用这个stp网站模板,管理员可以重复创建同样结构(和内容)的新网站。那么这种stp格式的网站模板,和我们下文所说的Site Definition有什么区别呢?简单来说,Site Definition是一种通过磁盘上的一系列文件(包括xml、页面模板文件等等)来对一个网站的结构和内容进行描述的一种方式。Site Definition可以对一个网站模板的方方面面进行非常细致的定义,基本上无所不能。而stp网站模板只是一种简单的将一个已存在网站进行转存之后,可以重复使用的网站模板格式。stp网站模板没法直接修改,没太多可控性。下文中说的“网站模板”一次,默认是指Site Definition。
接着来详细说一下Site Definition。在SharePoint服务器的“Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\2052\XML”位置,有一堆以WEBTEMP开头,扩展名是.xml的文件。这些WEBTEMP*.xml文件,就是SharePoint中用来标明Site Definition的文件。
我们在SharePoint中创建一个新网站时,有一个“工作组网站”的网站模板可以让我们选择。打开“WEBTEMP.xml”文件,就能看到这个“工作组网站”的Site Definition。
在WEBTEMP*.xml文件中,“<Template>”节点表示一种Site Definition,它的“Name”属性指明了这个Site Definition保存在“Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates”中的哪个子目录中。一个Template可以包含多个子Configration。一个Configuration对应到一个用户所理解的网站模板。如果我们需要多个网站模板,它们大致相同,只有一些微小的地方有区别,那么我们就可以只定义一个Site Definition,然后用这个Site Definition的多个Configuration来体现这多个网站模板的不同之处。
在上图所示中,我们可以看到,其实“工作组网站”、“空白网站”、“文档工作区”这三个网站模板,都是同属于“STS”这个Site Definition的三个Configuration。“STS” Site Definition位于“C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates\sts”目录中。
当然,WEBTEMP*.xml只是让SharePoint知道有哪些Site Definition,以及每个Site Definition中有哪些网站模板(也就是Configuration)可用。但是具体每个模板中包含的内容,包括列表、文档库、页面、页面上的web part等等等等,都是定义在Site Definition中的ONET.XML文件中。比如,下图就是“STS” Site Definition的ONET.XML文件。
ONET.XML几乎定义了一个网站模板的方方面面。比如,为什么使用“工作组网站”模板创建的新网站的default.aspx页面,在页面右侧会显示一个SharePoint的Logo图片?这是因为在ONET.XML里面有下面的内容。
于是我们就看到了
现在你应该已经明白了Site Definition是怎么回事,以及它是如何起作用的。了解这些之后,我们就可以根据自己的需求,来创建自己所需要的Site Definitiion了。你一定要记住一点:永远不要修改SharePoint自带的Site Definition。这是因为微软可能在某些后续的Service Pack或Hotfix中,用更新的文件覆盖旧的Site Definition文件。
创建新的Site Definition的基本步骤是:
1、找一个磁盘上已有的,用来起步的Site Definition,将这个Site Definition目录复制一份;
2、创建新的WEBTEMP*.xml文件,比如WEBTEMP.MySiteTemp.xml,在里面写明新的Site Definition的名称(也就是Site Definition所在的目录名),Configuration等等;
3、修改这个新Site Definition的定义文件直到满足你的需求为止;
4、IISRESET
接着介绍Site Provisioning Engine。什么是Site Provisioning?当你在SharePoint里面,使用某个网站模板,创建了一个新SharePoint网站,这个过程就叫做Site Provisioning。(干嘛不直接叫做Site Creating?嗯,有时候用用时髦词挺Cool的,不是吗?)SharePoint内置了一个Site Provisioning Engine,来完成Site Provisioning过程。这个过程包括给站点应用模板、将所需文件“拷贝”到站点中、根据网站模板类型进行一些其他的必需操作等等。但是,这个Site Provisioning过程也是可以自定制的。
一个Site Provisioning过程,需要由一个继承自Microsoft.SharePoint.SPWebProvisioningProvider的类来完成,具体点说就是由这个类的Provision()方法来完成。所以我们如何自定制这个过程呢?写一个新类,继承自Microsoft.SharePoint.SPWebProvisioningProvider,然后重载Provision()。
我们来用一个实际的示范进行讲解。用户的需求是:“工作组网站”这个网站模板的首页的右侧那个SharePoint Logo图片实在碍眼(没错,就是上面那个截图中的图片),能不能创建网站后,不要那个图片了?当然,我们可以创建一个新的Site Definition,然后修改新Site Definition的ONET.XML文件,去掉这个web part,但是,因为演示的缘故,我故意不用这个简单的方法,而用更“高级”的定制Site Provisioning来完成。
由于“工作组网站”这个模板的其他部分并不需要调整,所以我决定新建一个WEBTEMP.CustomTeamSite.xml文件,并在文件中创建一个新的Configuration。
上图中的名称为“定制工作组网站”的“Cinfiguration”节点有两个属性,“ProvisionAssembly”和“ProvisionClass”,这两个属性指定了这个Configuration使用了一个定制的Site Provisioning过程,而不再使用SharePoint默认的Site Provisioning模式。
接着是上面指定的那个定制Site Provisioning类。
在重载的Provision()中,首先,代码仍然让新网站应用“工作组网站”这个网站模板。“STS#0”的意思是,使用“STS”这个Site Definition的ID为“0”的Configuration,也就是“工作组网站”这个模板。但是,在应用了默认的“工作组网站”模板之后,再调用了InitTeamSite()方法,在这个方法中通过SharePoint API,将网站首页上的那个图片web part去掉了。
将我们的项目部署到服务器上,IISRESET之后,就能在新建网站页面中看到这个新的名为“定制工作组网站”的网站模板。
使用这个网站模板创建一个新网站后,就会发现,这个网站和用“工作组网站”模板创建的网站一模一样,除了首页上再没有那个图片web part。
通过创建定制Site Definition,以及创建定制的Site Provisioning类来接管Site Provisioning过程,我们就能够完全自定义一个SharePoint新网站的创建过程了。:)
最后一个问题,我们应该选择哪种方式呢?Feature Stapling?还是Site Definition + Site Provisioning Engine?我更推荐Feature Stapling。将各种自定义功能封装成(一个或多个)Feature,让网站管理员可以自己选择启用或停止这些Feature,如果需要,使用Feature Stapling使网站自动应用并激活这些Feature,是一种更好、更优雅、更具封装性、更容易迁移的方式。
上面所示的定制Site Provisioning项目源码下载。
我们在调试GAC中部署的程序时候,很可能碰到下面的报告:
---------------------------
Microsoft Visual Studio
---------------------------
The following module was built either with optimizations enabled or without debug information:
C:\Windows\assembly\GAC_MSIL\CSDN.Community.TopicListDataCenter.EnterpriseComponents\2.5.1.23407__cdde601ea7585548\aaa.dll
To debug this module, change its project build configuration to Debug mode. To suppress this message, disable the 'Warn if no user code on launch' debugger option.
---------------------------
确定
---------------------------
这是因为VS开发工具在C:\Windows\assembly\GAC_MSIL\CSDN.Community.TopicListDataCenter.EnterpriseComponents\目录下没有找到aaa.pdb调试符号文件。当然这个目录是GAC的目录,不可能有的。
如何解决,最笨的方法是吧 PDB 文件 Copy 到那个目录去。
我这里要说的解决方法当然不是这样的了。而是如下:
在Visual Studio 的调试属性中去掉 Enable Just My Code(Managed only)

这时候我们再去调试就不会出现上述提示文本了。也不会找不到 PDB文件了。一切都OK了。
我们在Modules窗口也可以看到成功加载了正确位置的pdb文件。

参考资料:
You Don't Need to Copy PDB Files to Debug in the GAC!
http://www.elumenotion.com/Blog/Lists/Posts/Post.aspx?ID=23
这个估计是最常用的.net工具,Lutz Roeder同学终于把它转交给Red Gate Software去开发了……这个东西居然有8年多了。
After more than eight years of working on .NET Reflector, I have decided it is time to move on and explore some new opportunities.
I have reached an agreement to have Red Gate Software continue the development of .NET Reflector. Red Gate has a lot of experience creating development tools for both .NET and SQL Server. They have the resources necessary to work on new features, and Reflector fits nicely with other .NET tools the company offers.
Red Gate will continue to provide the free community version and is looking for your feedback and ideas for future versions.
For news and updates on Reflector, sign up for the .NET Developer’s Newsletter from Red Gate. To find out more about the agreement, see the interview on Simple Talk.
最近有个需求,将不同的内容类型组织到同一个列表(不是文档库)中,希望能够给不同的内容类型显示不同的图标。不过SharePoint内容类型似乎没有关于图标的设置,翻了ContentType的SchemaXml和若干个xml配置文件都没找到相关的办法。
今天突然想到了计算字段,猜测大概能做到这一点,不过计算字段只能显示单行文本、数值、是/否等几种固定类型,不能显示html内容,我觉得可以通过修改默认的计算字段配置文件来达到这一目的。上网搜了一下,果然找到:Enabling HTML and/or Images in a SharePoint List using a calculated field
大致的方法就是控制计算字段在显示的时候的html编码,在FLDTYPES.XML中我们可以看到默认是这个样子的:
1 <Default>
2 <Column HTMLEncode="TRUE" AutoHyperLink="TRUE" AutoNewLine="TRUE"/>
3 </Default>
也就是说对于单行文本的显示方式,都是加上了HTML编码的,自然我们可以改掉这个地方,但是为了不影响其他计算字段的显示,可以用一些特定标记来判断,比如改成这样:
1 <IfSubString>
2 <Expr1><![CDATA[<custom/>]]></Expr1>
3 <Expr2><Column/></Expr2>
4 <Then>
5 <HTML><Column/></HTML>
6 </Then>
7 <Else>
8 <Column HTMLEncode="TRUE" AutoHyperLink="TRUE" AutoNewLine="TRUE"/>
9 </Else>
10 </IfSubString>
这段的意思是:如果计算字段的值包含“<custom/>”(这不是一个html标签,所以页面上不会显示),那么就不编码,否则对内容进行html编码。
于是,就可以在列表中创建一个计算字段栏Icon,它的公式设置成:
1 =IF([内容类型]="类型A",
2 "<custom/><img src='/_layouts/images/img1.gif'/>",
3 "<custom/><img src='/_layouts/images/img2.gif'/>")
要是支持SWITCH就更好了……
(原文 - Christin Boyd:http://blogs.msdn.com/vsto/archive/2008/08/15/visual-studio-2008-service-pack-1-released-now-what-christin-boyd.aspx)
恭喜恭喜!SP1 已经在微软网站上正式发布啦!
接下来呢?让我带大家看看 SP1 有些什么新玩意儿。我强烈建议大家浏览一下 SP1 Readme 文档里面关于 VSTO 的部分。如果你想知道这次的 Service Pack 修复了哪些 Bug,可以查阅这篇知识库文档。希望你曾经遇到的问题也在这次的更新中被修复了。
如果你想知道我们的团队是怎么决定添加哪些新功能到 SP1 里面去的,你可以参阅 VSTO 6月发布的 Blog《VS 2008 SP1 新特性以及 VSTO 团队是如何做出这些决定的》。
MSDN Library 更新了关于 Visual Studio Tools for Office 新功能的文档,包含了 SP1 新增的功能介绍。中文版本的文档也即将更新。
言归正传。
Visual Studio Tools for Office (2008 SP1) 新增特性
Visual Stduio 2008 Service Pack 1 (SP1) 包含了针对 Visual Studio Tools for Office 的更新。这次的更新列表在 Visual Studio 2008 功能特性文档中被分别列出,以便用户能快速查阅。本次更新包含了一些新的功能设计可以帮助开发者完成下列任务:
在加载项(Add-in)工程中添加宿主控件和智能标签
开发人员现在可以在应用程序层面的加载项工程中使用智能标签和宿主控件了。比如向 Word 2007 文档中动态添加内容控件(Content Control),向 Excel 2007 工作簿中动态添加列表对象(List Ojbect)。你可以像使用 Office 本地对象一样使用这些托管宿主控件,更好的是这些宿主控件还提供了事件和数据绑定的功能。
想要了解更多信息,请参阅:在运行时向 Office 文档添加控件、智能标签概览。
使用你的解决方案安装程序部署 Office 主互操作程序集(PIA)
现在,当你使用 ClickOnce 技术来部署 VSTO 解决方案时,Office 2007 主互操作程序集(PIA)会自动被添加为预安装项目。这些程序集会被自动复制到你的解决方案安装程序所在的那个目录里面。
想要了解更多信息,请参阅:如何在最终用户的电脑上部署预安装项目(2007 Office 系统)。
使用 .NET Framework 客户端配置快速部署你的解决方案
现在,你可以指定“.NET 框架客户端配置”作为你的目标 .NET 框架版本。这个精简版本的 .NET 框架不会安装所有的程序集,从而可以大大减少安装所需要的空间。
想要了解更多信息,请参阅:在 Visual Studio 中创建 Office 解决方案。
使用事件查看程序对安装过程进行排错
当你安装、卸载 VSTO 解决方案的时候,VSTO 运行时会将出错信息记录在 Windows 事件日志中,使用日志查看程序阅读这些信息,能有助于安装、部署解决方案过程中进行排错工作。
想要了解更多信息,请参阅:事件日志(2007 Office 系统)。
[原文地址]:.NET Rocks!
[原文发表时间]:Monday, August 25, 2008 3:10 PM
我经常尽量多地寻找机会与开发社区进行直接的对话。这个博客是我通常使用的渠道之一,当然有时候我也会不仅仅依赖键盘,而是通过像Channel9或.NET Rocks!这样的网站将我的声音传递出去。.NET Rocks!每周都有一个针对.NET开发者的网络广播节目,涉猎的范围非常广,从介绍性的内容到更深入的技术话题都有,收视率也很惊人,每期节目都有超过百万的下载量。
在上周的那期广播中,我和Richard Campbell,Carl Franklin聊了一个小时,主要谈到我在Microsoft的职业发展:从早期在OS/2和Windows NT项目中工作,到今天管理整个developer division,以及谈到领导一个大型软件开发组织的基本情况。你可以在这里听到这期节目的录音,和这些人聊天很有趣,我期待着未来还能有这样的机会。
Namaste!
为什么要自定义一个SharePoint新网站的创建过程呢?作用很多。其中之一就是,我们创建了一个新的SharePoint应用组件,然后希望SharePoint管理员在创建一个SharePoint新网站的时候,就可以在那个新网站中使用我们开发的新应用组件。
SharePoint Server 2007本身也利用了这种方式。比如,如果用户希望使用Records Management相关的功能,他可以使用“记录中心”这个网站模板来创建一个新网站。在新网站中,界面和内容会根据Records Management的需求做好了一些定制,用户可以直接基于新网站中的预制内容,开始自己的工作。
要自定义一个SharePoint新网站创建过程有两种方式:
1、Feature Stapling
2、Custom Site Definition + Site Provisioning Engine
SharePoint产品自身大量使用了第二种做法。我们也可以模仿它那样,创建一个定制的Site Definition,然后让用户在上图所示的创建新网站的时候,选择我们创建的Site Definition即可。创建一个定制的Site Definition是一件繁琐的活儿,特别是如果还需要利用SharePoint Provisioning Engine来做一些更“高级”的调整。幸好SharePoint Solution Generator一定程度上减少了创建Site Definition的复杂度。
但我个人更建议你使用第一种方法。:) 所以今天我先介绍Feature Stapling,第二种方法在后续的文章中再介绍。
Feature Stapling,也叫Feature/Site Template Association,它的作用是将某个Feature与某个网站模板关联起来,而不需要这个网站模板定义本身包含这个Feature。比如,在系统中有“工作组网站”这样一个Site Definition,我们希望这个模板能包含我们自己开发的一个“Feature XYZ”,但是又不想直接到磁盘上去改动“工作组网站”这个Site Definition。除了使用上面说的第二个办法(也就是在“工作组网站”的基础上添加一个新的比如“工作组网站 with Feature XYZ”的Site Definition),用Feature Stapling就能将我们的这个“Feature XYZ”与“工作组网站”Site Definition关联起来,就好象“工作组网站”Site Definition已经包含了“Feature XYZ”一样。
要实现Feature Stapling,需要创建至少2个Feature。第1个Feature叫做Feature Stapler,也就是用来将真正完成功能的Feature与网站模板进行关联的一个Feature,第2个也就是用来完成功能的Feature本身了(也就是上文所说的“Feature XYZ”)。
由于Feature有事件处理程序机制,所以,通过给第2个完成实际功能的Feature添加事件处理程序,我们实际上是能利用Feature Stapling完成某些很复杂的事情的。例如,给网站中添加几个List、为网站添加一些预定义的用户。
曾经有人问过我这样一个问题,如何修改所有用户的“我的网站”的样式?比如,在“我的网站”首页中增加自己开发的Web Part,或者干脆将“我的网站”完整的换成自己想要的样子?Feature Stapling就是一个很好的解决之道,我们只需要将一个(或多个)Feature关联到“我的网站”所使用的网站模板,这样,当每个用户第一次访问“我的网站”并为其创建“我的网站”时,关联的Feature就可以通过它的事件处理程序来完成工作,达到我们想要的效果。
接下来是我最喜欢的实例示范环节。:)
Demo场景是,当用户使用SharePoint内置的“工作组网站”这个模板创建一个新网站时,希望在这个新网站内能自动出现一个联系人列表,并且里面已经包含了一些原始数据。
首先,创建Feature Stapler:
feature.xml:
<Feature Id="06dbfca3-a041-4c50-aea3-7dd8561b48f9" Title="STS#0 Feature Stapling" Scope="Farm" Version="1.0.0.0" Hidden="FALSE" DefaultResourceFile="core" xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="STS0FeatureStapling\elements.xml"/>
</ElementManifests>
</Feature>
elements.xml:
<Elements Id="55B76996-827F-4879-B0D1-BADDCCDC8AAC" xmlns="http://schemas.microsoft.com/sharepoint/">
<FeatureSiteTemplateAssociation Id="1d68910c-b227-4cba-bfa7-87896d812dcf" TemplateName="STS#0" />
</Elements>
然后是实际用来完成工作的Feature:
feature.xml:
<Feature Id="1d68910c-b227-4cba-bfa7-87896d812dcf"
Title="Team Site Init"
Scope="Web"
Version="1.0.0.0"
ActivateOnDefault="FALSE"
Hidden="FALSE"
DefaultResourceFile="core"
ReceiverAssembly="FeatureStaplingSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"
ReceiverClass="FeatureStaplingSample.FeatureCode.TeamSiteInitFeatureReceiver"
xmlns="http://schemas.microsoft.com/sharepoint/" />
上面的Feature使用了一个事件处理程序来进行实际的工作,事件处理程序的代码就不贴了。
示范完整源码下载(需要VS2008+VSeWSS 1.2)。
原文地址:Olympics like you've never seen them before!
原文发表时间:Friday, August 15, 2008 1:11 PM
在过去的这个星期里,我享受了极大的乐趣观看那些令人惊叹的运动员们在2008奥林匹克赛场上竞赛。
我尤其喜欢观看Michael Phelps的比赛,因为他已经成为有史以来最伟大的奥运会运动员。Phelps在六场比赛中赢得了六块金牌,如果他能在他的接下来的两场比赛中获胜,他将会打破个人在单届夏季奥运会中赢得金牌数的纪录! 我无比期待他的精彩比赛。Michael,祝你好运。

为了能让数以百万计的用户都能观看到比赛,并能让几十万个用户可以同时观看某些比赛的实况,比如Michael的游泳比赛,NBC建立了一个由Silverlight 2 Beta 2技术支持的精彩网站http://www.NBCOlympics.com。
这里作为相关资料介绍一下这个网站是如何的庞大,在奥运会最开始的四天内,已经有1350万个视频流,1690万个独立用户,和2.911亿次页面浏览。而四年前的整个雅典奥运会,仅有220万个视频流。这真是太神奇了!
下面是这项技术在北京是如何工作的一些背景资料。NBC在北京设置了许多高清摄像机,从多个摄像机和角度记录每项赛事。NBC在北京有控制室和制片人,来做赛况的实时镜头选取。生成的视频被实时编码,并发送到在纽约的NBC总部。几十个分析师(他们都是为了这次比赛直播而从NBC总部的星期六晚间直播节目中临时抽调2周时间来的)实时的添加评论和播放中的解说。然后他们使用 Windows Media Services 2008 服务器将视频以流的形式同时使用350kbits和650kbits两种速率实时输出到网络上。在奥运期间,一共有两个内容传递网络(Content delivery network, CDN)提供商来提供这个网站的服务。
NBC奥运站点的视频播放器是使用Silverlight 2 Beta 2(一个仅有4.6MB的下载)创建的。没有安装过Silverlight的用户要下载并将其安装到他们的系统中,只需要少于10秒钟的时间。奥运Silverlight应用程序本身是在Silverlight提供的.NET Framework子集的基础上,使用托管代码编写的。
这些奥运应用程序展示了大量Silverlight的独特功能。最直接的效果之一就是网络传播视频的能力和质量。这是Silverlight所提供的强大的视频编码解码器,优秀的编码器和编码框架,绝佳的媒体服务器技术,以及集中式优化能在以最大程度上优化视频显示和图形的最好证明。
这就是前所未有奥运会。
Namaste !
分布式 Erlang 系统的实现提供了一个基本的安全策略以拒绝来自另一台机器的未授权的访问。两个不同的 erl 实例要实现交互,那他们必须拥有相同的 magic cookie。要创建 magic cookie 最简单的方法是在需要交互的两个 erl 实例的操作系统家目录中各自创建名为 .erlang.cookie 的文本文件。(Windows 系统的家目录由 $HOME 环境变量设定,Linux 系统的家目录则是在命令行中输入不带参数的 cd 命令后进入的那个目录)两个 erl 实例要实现交互,那么他们的 .erlang.cookie 文件内容必须是一行相同的 atom。在 Linux 中的话,还必须给 .erlang.cookie 文件设置相应的权限(400)才可以。
除了 magic cookie 外,要实现交互的 erl 实例还需要被设置唯一的名字,以区别开彼此。这个要求可以用 erl -sname NAME 命令行实现。在同一台机器上运行的多个 erl 实例也可以被赋予不同的名字,这样 erl 实例们就能区别开彼此,就可以在同一台机器上模拟分布式 erl 程序的运行了。 下面是来自 GSWE 的代码,但它已经足够清楚的演示了 erl 分布式的一些主要的枝节。
0. 代码
1. 在一个命令行终端中注册名为 pong 的 erl 实例(GSWE 中称之为 erl 节点),并启动 start_pong 函数等待消息。可以看到 start_pong 函数启动后只是简单的返回了 true,之后你可以继续在这个 erl 实例中做其他事情(我打印了几个字符以把稍后可能接到的消息分隔开来)。
2. 在另一个终端中注册 ping 实例(我在同一台机器上模拟分布式),并启动 start_ping 函数,入参为刚刚注册的 pong 实例名和机器名(erl 无法识别带 - 字符的机器名,而 ubuntu8.04 的默认机器名是带有 -desktop 后缀的,所以需要先修改机器名,不然此处会报一个错误提示)。
3. 切换回 pong 实例所在的终端,看到接收的从 ping 实例传来的异步消息已经被打印出来了。

原文地址:CodePlex celebrates its 2nd birthday!
原文发表时间:Wednesday, August 06, 2008 9:31 PM
虽然发布时的情景还列列在目,离我们发布CodePlex已经是2年了。我们在2006年的夏天开始启动CodePlex作为我们的开源的服务站点。我们的目标始终如一,将继续为开发者提供在开源项目合作中他们所最熟悉的工具。
自从CodePlex站点启动以来,它一直在稳定地成长。最近,跨过了两个主要的里程碑:第一,每个月有一百万用户访问该网站。第二,已经拥有了五千个开源项目。CodePlex项目吸引了很多的读者,并且包括了AJAX Control Toolkit,Rawr(一个.NET的工具用来开发星球大战),以及IronPython项目等。
让我们对该网站所用的技术一瞥,CodePlex是在Team Foundation Server上建立起来的。具体来说,是七台TFS服务器上一共有5,600个项目,配以12,000个项目的开发人员以及有120,000人次的code check-in.
开源开发者可以免费使用Visual Studio Team Explorer 客户端,跟CodePlex交互来获得完全集成的开发体验。CodePlex同时支持很多其他的源代码管理客户端,比如TortoiseSVN和TeamPrise,给用户提供了更加灵活的跨平台使用方式。
CodePlex成长的关键在于CodePlex团队的以客户为本的指导思想。我们基于现场的客户投票结果,来决定开发哪些新功能。比如,上周的发布诸如Project Stats,Code Syntax Highlighting 以及Rating and Reviews等新功能。

在CodePlex team blog上,可以找到更多有关CodePlex的最新情况。
Namaste!
【原文地址】100+ PDC Sessions Posted
【原文发表日期】04 August 08 07:33
我刚刚看到,我们已经发布了新一轮的PDC的议程……近年来,我还是首次没有直接参与PDC的计划。因此,观看这届会议的展开对我来说会是件有趣的事……
https://sessions.microsoftpdc.com/public/sessions.aspx
如果你还没有注册的话,那么赶在8月15前注册,你还有机会获得折扣。
我想在这里特别强调其中的一部分与我相关的议程,我将乐于倾听您的意见,以及你对今年的PDC的任何其它想法。
在Dev 10中正在进行着一些非常酷的工作,能够以方便得多的方式发布ASP.NET应用到测试环境与运行环境中,以及内部的web farm和更大的host环境中。
把它想象成是面向大众的Surface ;-)
我很喜欢这些deep dive的讲座,尤其是伴随着Silverlight 2的发布,我想很多客户也希望看到他们能够发挥Silverlight最大的功效。你们觉得我们是否应该在同一个讲座中涵盖WPF图像处理的基础知识呢?
我与许多对企业级RIA应用深感兴趣的客户进行了交谈,这次谈话将会展示一些模式以及某些未来的产品方向。你们有什么杀手级的场景可供我们作为示例呢?
我们应该为此找一个更好记的标题,不过我们的目标是告诉各位,我们正考虑在未来的产品中实现从各位那里收到的关于ASP.NET的方向的建议。同时我们希望能够获得你们的反馈意见。
你一定得参加一次MVC的讲座——尤其是这一堂,它将力求向你介绍MVC……你们是否认为我们也需要做些更深入的钻研呢?
.NET最强大之处就在于一种一致的端到端的连续……这堂讲座会展示如何利用Silverlight与WPF之间的兼容性来共享代码与设计,以最大化这两个平台的价值。是否有哪位已经尝试过了?哪些部分运行良好,又有哪些部分是你们需要更多指导的呢?
IE8做了大量的工作,使得ajax的开发者能更高效地工作。
你们是否对了解所有的控件(包括了一些新的控件),以及学会如何最大程度地掌握它们更感兴趣,或者是如何创建你自己的控件呢?
Chris Anderson与Don Box的表演又回来了!纯粹为了娱乐,这也是你一定要看的.
我们已看到了对于.NET上的并行计算的热爱这一"地隆"(groundswell)现象……这堂讲座中将会谈到我们正在Visual Studio与.NET中所做的一些很酷的东西,以简化这方面的编程工作。
虽然我没有深入地参与到这门讲座中,但VS正开始拥抱TDD,重构以及其它的敏捷方法,这真是太棒了!
有谁能错过Anders Hejlsberg呢?上一届的PDC,Anders为我们介绍了Linq……今年又会是什么呢?
公平起见,Paul Vick将会向你展现VB的发展方向……
马上就要找工作了(不知谁会要我...),在我学生时代的最后一个暑假里,看书、做题、写code、看奥运、玩实况足球...一个都不能少。同时,作为一个好奇心旺盛的家伙,加上刚入手个4G Flash版的Zune 2,自然要拿XNA 3.0 CTP来玩玩。
闲话不表,XNA 3.0 CTP开始支持在Zune上开发游戏(可以结合免费的Visual C# 2008 Express来用),可是文档还不齐全,官方只放出了个Alien Game的sample,是一个蛮简单的射击游戏。我花了点时间把它的源码读了一遍,发现它所用到的整体架构和在PC上写游戏时用的XNA Framwork几乎如出一辙,推测是其一个子集而已(比如input不支持keyboard,也完全不支持3D加速等等),实际上,在Zune上写的游戏代码只需要修改一些设备相关的输入处理、文件读写的代码就可以直接移植到PC甚至是xbox360上,Zune和xbox360甚至还共用相同的一个GamePad类接口,只不过做了个键映射,不知道3.0正式release的时候会不会有专门对应Zune Pad的一个输入类。然后我又花了几小时在上面尝试写了个小游戏Pong。Pong是世界上最早的video game之一,但不是第一个(via)。Youtube上还可以找到最早的Atari Pong的游戏视频和广告。
在写这个小游戏时,整体感觉用XNA开发游戏的确是非常简单,程序员的主要工作是实现4个函数,Initialize()用来初始化游戏环境;LoadContent()在游戏开始前用于载入资源;UnloadContent()在游戏结束后释放资源;然后就是两个非常重要的函数Update()和Draw(),顾名思义,Update()函数根据玩家的输入更新游戏的逻辑和屏幕上要绘制对象的各种参数,然后交给Draw()函数一股脑画出来,这两个函数在游戏进行过程中循环被调用,周而复始,驱动整个游戏。
非常值得一提的是Alien Game sample中实现的一个ScreenManager机制,它把游戏中需要绘制的内容抽象成一个个GameScreen对象,每个GameScreen对象都有自己的Update()和Draw()函数,ScreenManager用一个List<GameScreen>来管理它们,最顶层的GameScreen处于List的尾部。每个时间周期,ScreenManager都会从List的尾部到头依次调用GameScreen的Update()函数,这样可以让输入处理的逻辑从位于上层的GameScreen一层层传递下来,实际上在大多数情况下,只有最上层的GameScreen需要处理输入。然后它会从List的头部到尾依次调用GameScreen的Draw()函数,从而自下而上把整个游戏界面绘制出来。
在Deploy到Zune上时,发现会拷入名为mscorlib3_5.dll和System.Xml.dll这样的文件,看来Zune上的XNA运行环境是.NET 3.5的一个子集,难道Zune的操作系统是Windows CE一族派生出来的?从运行情况上看,速度不错,还支持联机debug和设置断点,微软在这一点上一直做得很令人满意:)
美中不足的是,在调试代码时没有像Windows Mobile SDK里的模拟器可以使用的,我索性直接在一个Windows Game项目中把所有代码和逻辑都调试好后再一次性导入到Zune项目中;而且在正常退出一个游戏时,整个Zune会重启,官方上说这是by design,因为这样of course可以把所有资源都释放干净。。。毕竟是小小一个Zune而不是iPhone,勉强接受吧。。。sample中没有涉及使用Zune上的WiFi和其他设备通信的源码,假如正式版中支持使用WiFi通信的话,我想可以做更多更有趣的游戏!
下面上图:
1. 随手设计的游戏图标,板子、小球、一局9分,Pong最鲜明的3个特征:)

在Deploy了XNA之后,Zune就会出现games这个新的菜单项,进入就可以看到已经下载的游戏


2. 游戏主菜单,我采用Zune横放的操作方式,背景和菜单都复用了Alien Game里面的素材

3. 游戏画面,用方向键控制板子(Zune Pad太敏感了,所以我只用按键)

4. 两段实际游戏视频,因为边玩边拍的缘故,玩得都很烂。。。如果戴上耳机的话,小球的反弹和得分失分都有不同的音效,而且还可以一边玩游戏一边听歌的(很流畅),在暂停菜单中还可以更换歌曲(抄袭自Alien Game,这里还有个bug,遇上中文歌名就会crash)。在录像中我尝试用一个很老的电脑音箱把声音放出来,可惜声音还是太小了点。
http://www.youku.com/playlist_show/id_2164628.html
源码释出在:http://iamyuan.cn/downloads/zunegames.rar(大量借鉴自Alien Game sample,写得不好,见笑了,小球反弹用的是最简单的反射。。。)
现在掌机市场基本上被$ony的PSP和任天堂的NDS占领(我有个PSP 2000,可以用第三方逆向工程出来的build chain tool在上头写程序),不知道微软让XNA支持Zune是不是也想涉足掌机这个庞大的消费市场。我认为目前市场上这两个巨头的成功都建立在每个平台上都有非常好玩的独占游戏这一基础上(我就是因为怪物猎人和实况足球这两款游戏而购买了PSP),假如微软能通过一些手段激励开发者在Zune上开发出真正吸引人的大作,这个平台火起来也不是不可能的,当然作为一个游戏机,Zune在硬件上比如屏幕和控制方式也要做相应的改进才行。
欢迎交流
原文地址:Service Pack 1 for VS 2008 and .NET FX 3.5 released!
原文发表时间:Monday, August 11, 2008 10:12 AM
自从去年11月,Visual Studio 2008和.NET Framework 3.5成功发布以来,我们收到了很多正面而积极的反馈。同时,开发人员对如何提高产品的可用性提出了很多新颖的点子和建议。
基于这些点子和建议,我们在Visual Studio 2008和.NET Framework 3.5的原有基础上,进一步研发。今天,我很高兴地宣布,Visual Studio 2008 SP1和.NET Framework 3.5 SP1正式发布了。
在Visual Studio 2008 SP1里,我们主要着力于改进VS 2008的性能和可靠性。这包括,提高用于开发WPF应用程序的设计器(designer)的性能,丰富AJAX应用程序开发工具集以及提升与ADO.NET Entity Framework相关的设计器(designer),使它们能更好的工作在一起。除此之外,还增强了JavaScript开发环境并提升了流水线式的Web站点部署体验。
就.NET Framework而言,SP1除了修复客户报告的问题(bugs)以外,我们还为它添加了一些广受期待的新特性。这包括,.NET Framework Client Profile,通过ADO.NET Entity Framework对数据应用程序开发提供更好的支持,ADO.NET Data Services,和最近才发布的SQL Server 2008的完美集成以及针对ASP.NET的一些改进。这些特性会极大地方便开发人员在最新的平台上进行开发。
当我们和开发人员交谈的时候,他们经常向我们抱怨由于安装.NET Framework耗时而引起的.NET Framework应用程序的部署问题。我们了解到这是个棘手的问题并在SP1里提供了一个不错的解决方案——.NET Framework Client Profile。
.NET Framework Client Profile安装程序仅包括.NET Framework客户端应用程序最常用的一些assemblies