安装Team Foundation Server

应老板要求,在一个空白的Windows 2003机器上安装Beta 3 Refresh版。这次的经历比安装Beta 2时要好多了。读著Team Foundation Installation Guide,按步就班地安装,一次成功。就是在安装SQL Server 2005企业版时有点问题,按Guide说,选择了Windows认证模式 ,但安装中出了个奇怪的错,说是无法改动sa的密码,马上终止安装,从头开始,选择了Mixed认证模式后就没问题了。

VB的日益动态化

Ruby和其他动态语言里有个东西叫Duck Typing,按Dave Thomas的话来说,if an object walks like a duck and talks like a duck, then it must be a duck (如果一个对象走起路来象鸭子,叫起来也象鸭子,那么它一定是只鸭子!)

譬如,Ruby里可以这么做

class Duck
 def Quack
   puts “I am a duck, so I quack”
 end
end

class Pig
 def Quack
   puts “I am a pig, I don’t quack, but I am faking…”
 end
end

animals = [Duck.new, Pig.new]
animals.each {|animal| animal.Quack}

即使是只猪,只要它能Quack,在这里它就是只鸭。在Ruby里,the type of an object is defined by what that object can do。

VB里也有这样的动态机制,譬如,通过后期绑定,你可以这么做

Option Explicit On
Option Strict Off ‘this is important

Imports System

Class Duck
 Sub Quack()
   Console.WriteLine(“I am a duck, so I quack”)
 End Sub
End Class

Class Pig
 Sub Quack()
   Console.WriteLine(“I am a pig, I don’t quack, but I am faking…”)
 End Sub
End class

Class TestDuck
  Shared Sub Main
 dim animals() = {New Duck, New Pig}
 for each animal in animals
  animal.Quack()
 next
  End Sub
End Class

还能以动态接口的方式做,

Dynamic Interface IQuack
  Sub Quack
End Interface

dim animals() = {New Duck, New Pig}
for each animal in animals
 dim a as IQuack = animal
 a.Quack()
next

还引进了动态Dynamic Identifiers的概念,文档声称你可以这么做

dim t = Type.GetType(“Duck”)
dim o  = New(t)(new object(){})
o.(“Quack”)() 

可惜编译时出错,

C:\Program Files\VB LINQ Preview\Bin\TestDuck.vb(41) : error BC30182: Type expected.
dim o  = New(t)(new object(){}) 
              
但这么做是可以的,

dim t = Type.GetType(“Duck”)
dim o = Activator.CreateInstance(t, new object(){})
o.(“Quack”)()   ‘通过字符串来调用方法

文档最后说,
“…….This makes Visual Basic 9.0 an excellent choice for modern Agile and test-driven development methodologies.”

这样下去,VB也许会成为大家最喜欢的语言的,

新的VB 9 LINQ CTP 版

该版不是早先发行的PDC版的简单更新,而是包含了新的编码。新的功能包括

1。IDE的LINQ Intellisense支持
2。对DLinq比较多的 支持
3。编译器对编辑XML字符串的支持
4。XML后期绑定,包括XML命名空间的Import写法,IEnumerable的索引器等
5。XML内嵌表达式句法的统一,全部用“<%=       %> ”

参考
The Visual Basic Team blog: NEW VB LINQ CTP: Now live on MSDN!

下载处
Visual Basic 9.0 LINQ Technology Preview

[来源:Don Box]

WinFX 一月份的社区技术预览版(CTP)出来了

[来源: Michael Swanson, Tim Sneath]

同时还提供WCF/WWF的Go-Live licenses,但由于客户端环境的难控制性,目前还没有WPF的Go-Live license

WinFX Runtime Components:
http://www.microsoft.com/downloads/details.aspx?FamilyId=61DD9CA7-1668-42E4-BD37-03716DD83E53&displaylang=en  

Go-Live licenses for WCF and WWF:
http://msdn.microsoft.com/winfx/getthebeta/golive/default.aspx

Windows SDK: 
http://www.microsoft.com/downloads/details.aspx?FamilyId=64750EEF-D4A7-4CC8-92F2-9A201268A231&displaylang=en

Microsoft Visual Studio Code Name “Orcas” Community Technology Preview – Development Tools for WinFX :  
http://www.microsoft.com/downloads/details.aspx?FamilyId=5A0AE4CD-DC79-4B12-8A05-B6195F89FFA2&displaylang=en

VS Extensions for WorkFlow:  
http://www.microsoft.com/downloads/details.aspx?FamilyId=A2151993-991D-4F58-A707-5883FF4C1DC2&displaylang=en

WinFX RC January CTP “Readme”: 
http://msdn.microsoft.com/windowsvista/support/relnotes/winfxjanctp/default.aspx

匿名代码块

读到Ruby里有个东西叫code block,它支持closure。

list = [1,2,3,4,5,6,7,8,9,10]
sum = 0
list.each() {|i| sum = sum + i}

这里,红字的{….}的东西就是code block。在上面,数组调用了它本身的方法,each(),而each()则会通过yield来反复调用code block里的语句。

在C#2.0中,code block相当于匿名方法,类似的实现

int[] list = {1,2,3,4,5,6,7,8,9,10};
int sum = 0;
Array.ForEach<int>(list, delegate(int i) { sum += i; });

但如果使用LINQ的话,类似运算可以简化为

int sum = list.Sum();

注意,这个Sum()方法并不是数组类本身的方法,而是标准查询运算符(Standard Query Operators)中的方法

希望的鲜花从此盛开 — Team System之歌 (韩语)

[来源:Rob Caron,John Lawrence] 这些天在研究Team System,看到这个韩语的录像,虽然听不懂他们在唱什么,但作为开发人员,大概心意都是相通的,把歌词草译如下 (译自John Lawrence blog上的英文歌词)

[Intro]
客户: “这不行啊,我要的是别的东西!”
老板: “如果你时间不够,你为什么不熬夜?你为什么不能按时完成这个项目?”
项目经理: “啊啊,有什么更独特和有趣的东西么?这有点…”
“哎, 受不了啦!!”
[Verse 1]
不停埋怨的客户
咱的脖子象键盘那样发僵
咱的胖脸老板叫我熬夜工作
同事跳槽去了好公司
所以今天的工作是昨天的双倍
项目经理整天唠叨
又一次伤咱的心
苦干的我们,痛苦难忍
即使使劲卖力,拼着命干
同事在问,我们是否有vision
怀疑咱能否幸存
问咱是否有个愿望
想开发出神奇的软件
使得我们的生活如梦似幻
[Verse 2]
如此多的项目咱被迫违愿推迟
原因不外是“编码”困难
加班工作时,饥肠辘辘
昨晚几多编码丢失,快把咱逼疯
而如今,天下大变
捕捉着这极好的机遇使咱的梦想实现
VS 2005 又有新生
是咱开发人员梦想自由的标志
从此别再叫咱为“编码工人”
在更大的舞台上自由驰骋
因为新的架构深入咱心
满怀信心拥抱未来
只为你和我
只为你和我
开发人员独领风骚
希望的鲜花从此盛开
[Bridge x 4]
Visual / Studio / Team / System!!
[Chorus]
武装我们,脱离让人窒息的生活
投入精力,走向新未来
[Outro]
“哎,工作做完没有?去喝杯啤酒吧”
“这项目太棒了;让我们坚持下去,好么?”
“你用的是什么程序?”
Visual / Studio / Team / System!!

 这是韩语页上的英文歌词的翻译草案,为免臆测,尽量做了直译,虽然有时读着有点别扭,

[Intro]
客户:“这不行的,再给我另外一个方案”
雇主: “没时间?今晚就熬一整夜,你本来早就应该完成了,那么,我们该怎么做?”
老板: “你这个方案太平庸了,我们这里需要一些与众不同的东西,一些更有趣,更酷的东西”
“哎, 打住吧,我不想再听啦!!”
[Verse 1]
不停地提要求的客户
我变得跟木头一样僵硬的脖子
不断叫我们整夜不睡干活
老天,说完却自己马上回家的雇主
一个跟我说“我已找到了另一个更好的工作所在”的年少同事
统算起来,我的工作量又加倍了
责备我不理解他说的东西的老板
我又一次遭受沉重打击的心
一直生活在水深火热之中的我们这些开发人员
同事们问我,“每天都这么卖命工作,你可看到什么前途了?”
我不知道自己是否有一天会笑到最后
我的唯一愿望,我的唯一愿望是
到现在,我需要有一个与我创造的软件一样完美的生活
我将武装自己
因为那是结束这无聊生活的唯一之道
我将给自己投资,因为那是
我振作自己,超越他人的唯一之道
[Verse 2]
我很多东西要推迟,我是多么想完成它们
但是,这要命的“编码”把我挡住了
整夜工作遭受的饥饿
发现全部编码工作丢失后的绝望
而现在,时来运转
抓住机会,让我的想法去飞翔
VS 2005 终于重生了
作为软件开发人员梦想自由的标志
看在老天爷的份上,别再叫我“编码工”
因为我们不断努力,想成为大世界的一部分
因为崭新的设计就在我手中
现在我可以用全身拥抱整个未来
只为你和我
只为你和我
我们为自己是给这个世界领头的开发人员而骄傲
我们誓将这希望的花朵生出超越过去的更大的果实
[Bridge x 4]
Visual / Studio / Team / System
我将武装自己,因为那是结束这无聊生活的唯一之道
我将给自己投资,因为那是我振作自己,超越他人的唯一之道
[Outro]
“哎,工作做完没有?去喝杯啤酒吧”
“这看上去太棒了!我们为什么不坚持下去呢?”
“先生,你用的是什么程序?”
Visual / Studio / Team / System 
 
 
  回去再读第一个版本,真有点“Lost in Translation”的感觉,

Ready to rock

Visual Studio 2005,SQL Server 2005, BizTalk Server 2006正式推出!在这里可以看到Steve Ballmer在旧金山产品发布现场做的Keynote Speech

去掉/禁止系统菜单里的MOVE的方法

针对论坛上的问题“如何禁止在标题栏上点右键”,有如下方法:

1。用API去掉Move,

[DllImport(“user32.dll”,EntryPoint=”GetSystemMenu”)]
extern static System.IntPtr GetSystemMenu(System.IntPtr hWnd , System.IntPtr
bRevert);

[DllImport(“user32.dll”,EntryPoint=”RemoveMenu”)]
extern static int RemoveMenu (IntPtr hMenu, int nPos, int flags);

static int MF_BYPOSITION = 0x400;
static int MF_REMOVE = 0x1000;

System.IntPtr hdl= GetSystemMenu(this.Handle,System.IntPtr.Zero);
int nflag =MF_BYPOSITION | MF_REMOVE;
int npos =1;
RemoveMenu(hdl,npos,nflag);

2。去掉系统菜单(不推荐)

private const int WS_SYSMENU = 0x00080000;

protected override CreateParams CreateParams
  {
   get
   {
    CreateParams cp =  base.CreateParams;
    cp.Style = cp.Style & ~WS_SYSMENU;
    return cp;
   }
}

示范代码如下

关于DLINQ的争议

DLINQ宣布后,网上有很多争议,其中以Paul Wilson的意见最有代表性

Linq is Really Cool — But DLinq is a Big Mess

他指出,虽然DLINQ还是早期预览版本,但这已经是微软第三次尝试O/R Mapper了(之前有过ObjectSpaces的2个版本)。没用过O/R Mapper的人也许会认为DLINQ是个很大的进步,但熟悉O/R Mapper的人,却发现DLINQ问题多多,主要包括:
1。这是个基于属性(attribute-based)的方案,比外部映射文件的方法为差,连DLINQ自己文档中说到的non-intrusive的目标都没达到
2。目前只支持SQL Server
3。过分复杂,开发人员要熟练掌握/使用,需要了解的东西很多
4。对存储过程支持不足,现有的支持也要求开发人员写很多编码
5。功能有限,没有服务器端的分页支持,还不支持many-to-many relationship以及inheritance,没有WinFS/OPath集成。。。。