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]

开源的面貌变化

最近读到专栏作家Andrew Binstock在《软件开发时报》上发表的题为《开源的改头换面(The Changing Face of Open Source)》的评论员文章,感觉有点意思,大概摘译如下:

今天的开源编程几乎是商业性的,大部分的编码是由全职开发人员编写的,因为他们的雇主有兴趣对某个项目提供支持。譬如,今天JBoss的编码,只有百分之一不到的编码来自独立的开发人员,而Eclipse则更少。(饶有风趣的是,Eclipse Foundation的Mike Milinkovich说,独立的开发人员作为beta测试人员还是非常棒的)。

究其原因,首先是现在的项目复杂性越来越大,在庞大的编码库里找到能有所贡献之处,所做贡献又确有价值的过程越来越困难。即使象听上去很容易的事,譬如提供文档,所需要的工作量也是非志愿性社区所能及。

第二个也是重要的,开源项目商业化的原因,就是因为项目主管更愿意对开发人员有控制权,这样他们就能计划特定的功能以及发行日期,而不必等待志愿者提供所需编码了。

当然,商业化的效果有目共睹,譬如,与功能不全的AbiWord相比,你得到的是功能齐全的OpenOffice,与以前一些混杂的线程支持方法相比,你得到的是Linux kernel中企业级的线程支持。

但商业化也带来了其他一些的问题,其中很重要的问题是,在今天,大型的,草根级的开源项目怎样,或者是否还能,生存下去。研究表明,在目前,这并不乐观。在过去的几年内,大部分新的开源编码是商业公司贡献的现有编码。虽有类似Firefox 和Spring这样的项目日益红火,但相比之下,这些项目很小。

开源的商业化也解释了为什么一个公司当初希望通过开源化来改变产品效益不好的初衷并没有效果,因为他们所做的就是公开源代码而已 。

开源的商业化也意味着对产品而言,开源不再是个卖点,而价格,功能以及来自发行商处的支持才更具重要性。但想一下,这些东西不就是评估闭源的商业软件的同样标准么?

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

可用于数据挖掘的公共数据库

微软SQL Server 2005中的分析服务(SSAS)提供了企业级的数据挖掘功能,可用于对购物篮,客户流失,市场/营销活动,预测,网站用户行为等问题的分析之用,来帮助企业提高生产力、增加利润和减少支出等,看来数据挖掘大众化已经是非常现实了。随SSAS来的是个基于一个虚构的公司Adventure Works的数据库,但网上还有不少公开的数据库,可供学习之用,kdnuggets网站有个详细的列单

Datasets for Data Mining

匿名代码块

读到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)中的方法

猜想:Web Server 是否是个鸡肋?

先不要被标题吓着,呵呵。

在 Windows/.NET 的Web应用架构中,基本上没有什么Web服务器与应用服务器(App Server)之分,都是 IIS 来共同负责,当然在 Windows 2003 的 IIS 6.0 的内部实现上,似乎也还是有点区分的,如 HTTP.Sys、HTTP SSL 及 ASP.NET 等,没有深究过,但整体上感觉还都是属于 IIS 一个整体。

在基于 Java 的 Web 应用架构中(PS:为什么不说是 J2EE 呢?个人觉得 J2EE 这个名词被滥用和用烂了,有些人拿 JSP 随便写个东西就说是 J2EE 应用,还分辩说大海里的水不叫水?其意是既然 J2EE 规范中有 JSP ,那用了 JSP 就可以名正言顺的叫 J2EE 应用了,我的意见是:大海里的水是叫水,但不能拿一滴水出来就说自已是大海吧?),一般是将 Web Server 和 App Server 明确划分开的,负责静态页面的 Web Server 一般由 Apache 来负责,负责 JSP/Servlet/EJB 的 App Server 由各厂商不同的产品负责,如 WebSphere、WebLogic 等,表面上看,也算不算的搭配,Web Server 接收所有的 HTTP 请求,如果发现是 JSP/Servlet 请求,再通过 App Server 的插件转给 App Server 来处理,并将结果再返回给客户端。

试想一下,真正 Web 应用有多少是静态页面?以前还真没注意过这个问题,最近接触了一个网上银行的系统,估算了一下,此系统的静态 HTML 页面不超过 50 个,而 JSP 有近 800 个,这样的结果是大约 95% 的请求都要由 Web Server 来转给 App Server 来处理,那么这种两个进程甚至两个机器间的通讯而带来的性能消耗是不是有点太大了?

当然 Web 应用中还有图形/图像文件、JavaScript、CSS 文件等静态内容,但这些内容都是可以缓存在客户端的。

在 Sina、网易或以信息发布为主这样的网站中,静态内容占绝大多数,使用 Web Server 是有道理的,但是如果基于 Java 的 Web 应用架构应用在企业中,静态内容很少,Web Server 是否是个多余的东西?再说了,这些 App Server 产品的厂商自吹自擂的那么好,难道处理一点静态内容就成问题了?