Filed under: 技术体会
弄了一个CTP(Customer Tech Preview)版本的Orcas玩玩,切身体会了一下DotNet3.0,感觉的确很酷!
Visual Studio 2005的codename是一座岛(Whildbey), 现在下一版本延续了这个传统,Orcas还是一座岛。
Orcas的LINQ(Language Integrated Query)把所有对数据的访问方式都统一了,对访问数据库和XML实在方便多了,但是要用来访问纯文本文件,就有点牛刀杀鸡的感觉。
举个杀鸡的例子,假如我有log文件里每行都类似下面的格式,分隔符是TAB
20:23:23 http://www.live.com 20:23:24 http://www.youtube.com ......
现在我要所有URL的列表,用下面的code:
using System; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Collections.Generic; using System.Text; namespace OrcasConsole { static class Util //extension method can only reside in static class { public static void Output(this IEnumerable e) { foreach (string item in e) { Console.WriteLine(item); } } public static IEnumerable Lines(this StreamReader reader) { if (reader == null) { throw new ArgumentException("reader is null"); } string line = null; while ( (line = reader.ReadLine()) != null) { yield return line; } } } class Program { static void Main(string[] args) { string logFile = @"my.log"; StreamReader reader = new StreamReader(logFile); IEnumerable urls = from line in reader.Lines() let items = line.Split('t') select items[1]; urls.Output(); //play extension method } } }
同样的功能,用Perl非常的简洁,当然,Perl天生就是用来处理log文件的:)
die "<usage> $0 log_file" if $#ARGV < 1; while (<>) { my @tokens = split /t/; print $tokens[1], "n"; }
Filed under: 电影电视
添加新的Blog虽然界面是中文的,但是提交之后,就是乱码。一开始还以为是我使用Firefox的原因,但是在IE中写一篇也是一样。也许是因为测试版的Control编码没有做好,也许是因为我的账号是从myspace.com申请的,但是我也懒得去debug这玩艺,就是觉得这样的网站制作也太不专业了,在中国地区上线,怎么说也要让中国人写的汉字显示出来吧。
我很失望,以后还是继续使用东家的Live Space吧。
Filed under: 工作心情
今天早上一看,版面除了汉化了之外,风格和myspace.com差不多,但是内容少得可怜。罗川强调myspace.cn是一家本土公司,不是myspace.com得分支,账号注册的时候也有相关文字强调这一点,说在myspace.cn需要遵守中国法律,但是至少现在,很多内容都是用的myspace.com。myspace.com在美国的teenagers中很火,但是因为火所以鱼龙混杂,时有小孩上myspace.com交友不慎出事的案件,现在我国又在严打网络色情,不知道myspace.cn将如何应对。
我用myspace.com的账号也可以登陆myspace.cn,明显用的是一个账号系统,登陆的时候有一页会确认是不是真的要上myspace.cn,上myspace.cn就要遵守中国法律,这一页的charset设置有问题,我用Firefox显示出的是乱码,这一页编码是utf8,但是没有网页没有标注,这就显得不太专业了:)
Filed under: 八卦杂谈
今天,风闻李开复要再次“follow my heart”离开Google,有鉴于最近几次的小道消息都比较准确,估计确有其事。
今天,Myspace.cn宣布测试版将在明日(27号)凌晨发布,诸多海外互联网运营商都在中国折了,不知道MySpace会不会是下一个受害者,但是我至少会尝试一下,LiveSpace自发布以来没什么起色,都是Space,差别咋就这么大涅?如果MySpace尚可,可以考虑把Blog搬到Myspace上了。
还有1小时40分钟,叮咚咚,叮咚咚,叮咚咚……
Filed under: 技术体会
delegate既用来定一个delegate type,在这里似乎关键字如果是delegatetype更好,因为这里MyDelegateType只是一个“代理类型”,并不是一个“代理”。
public delegate void MyDelegateType(int foo); //can be anywhere, including outside a class definiton
在C#2.0之后,delegate这个keyword又担当了anonymous method的重任,anonymous method是个好东西,处理事件的响应函数往往就在一个地方被调用,为了这点东西再去做一个memeber function实在不值得,写成inline的形式比较酷。
MyDelegateType d += delegate(int foo){Console.WriteLine(foo);};
这样delegate这个keyword就用在两种环境下,一个是定义“代理类型”,一个是定义“匿名代理实例”,虽然都和“代理”有关系,但是用一个keyword来处理,感觉怪怪的,容易让人混淆。
在C#3.0中,将会出现Lamda Expression,可以替换anonymous method。看上面anonymous method的例子,首先delegate这个关键字就比较奇怪,还有就是“int foo”这句参数申明就是废话,既然能够赋值给左边的d,参数当然应该是int类型的了,用C#3.0的lamda expression,这样写,这才叫酷!
MyDelegateType d += foo => Console.WriteLine(foo);
据Jeff说,C#组在开发3.0的时候,深悔在2.0里面弄了anonymous method这样的物体,没有lamda expression这么简洁,而现在他们不得不维护两套一样功能的东西了。
Filed under: 八卦杂谈
Filed under: 技术体会
首先是软件需求没有清晰的定义,当时提出Skin这个需求的UI设计部门(在美国)也许是了解了一下CSS,提出Skin要象CSS一样好配置,但是要比CSS更加“精妙”,Bla~Bla~Bla~说了一通,我们说OK,下一次开电话会议,他们又提出一个更加“精妙”的idea,我们也勉强同意,再开会,他们的想法更加fancy了,我们有点受不了,不过manager有旨,美国的要求我们应该尽量满足于是email一封过去请他们写一份文档来描述需求,岂不了美国佬reply回来说,他们的需求会上已经说了,文档,应该由我们来写 当时我们觉得很莫名其妙,需求都没有描述清楚怎么让我们开工,现在看来,客户真的不会愿意写需求文档这玩意,还是要工程组的人写,在MS有PM(Program Manager)这样一个职位就是干这个的,PM的作用相当重要,是客户和developers的桥梁,在motorola也有Program Manager这个职位,但是这个PM就真的是Manager了 客观上,engineering没有明确的分工,主观上,我们也没有发挥主动性和UI部门反复讨论确定需求。顺便说一下在中国外企研发的普遍现象,干的活大部分(不敢说全部)是内部或者外部的外包项目,寄人篱下就要看人眼色,所以很容易倾向于美国佬说什么,我们就干什么,其实这样不光丧失尊严,而且会把事情做坏。
我们好歹写出了需求文档,但是客户的需求每次电话会议都在改变,boss不满足于只有spec,觉得这样弄清出需求得等到猴年马月,这样没有code丝毫看不出achievements,开始coding吧,于是我们上路了,开始了一段我后来描述为“自杀式的”软件开发。有一些我们觉得不切实际的需求,我们就先不做,阶段性的满足需求,也许到时候客户也会意识到他们的错误,这样的做法现在我也觉得是正道。整个程序结构还算可以,API也很友好,也努力优化了性能,经历了几个internal release,终于在有一次release的时候被file了一个severity和priority都为0的大bug,有人检测了一下系统中我们模块的对象个数,发现有几千个对象,觉得很不正常,所以file了这个大bug,我就在紧急用flyweight模式将对象个输减少到几百个,好歹把severity和priorty降到了2和3,但是UI部门的需求凸现出效率问题,现在只是一个很简单的skin都有这么多对象,一个复杂的skin那会怎么样?
当时我抽空看了一下Windows XP的theme,人家也没有那么复杂,一样可以出那么炫的效果,不禁问,真的需要UI部门要求的那么复杂的配置效果吗? 但是已经不可能回头了,上面的指示是,UI部门发现效率不高,可以不用那些功能,但是他们要的功能一定要有,于是继续前进吧。UI部门从我们的工作中消失了一阵子,似乎是有别的事情忙活,我们也不知道他们有没有看到我们阶段性的成果,现在想,应该有一个固定的渠道让客户看到我们阶段性的反馈,可惜当时没有做到,或者说我们也不想做,躲着UI部门都来不及呢,就怕和他们接触又提出一个更加fancy的想法。
就这样,最后一方面要面对UI设计部门不断增长的需求,另一方面要面对其他team严苛的性能要求,我们痛苦地坚持,终于熬到Director宣布收工的那一天,就在当天下午,我们的Team Lead突然接到UI部门地美国佬的一个电话:“嘿,伙计,我们有个一个新的想法,我们之前有三层垂直的属性继承关系,可不可以加上平行的继承关系……”,Team Lead很冷静的告诉他,我们的平台已经被取消了,以后不能再为你们作甚么了,再见。
Filed under: 工作心情
我谈不上支持开源,但是也觉得开源这种方式也不错,写出来的东西有众多眼睛盯着,程序员写code理论上应该认真一些,不然多不好意思啊,这样code质量应该会比较高。至于顺带的“自由”我是不以为然,劳动分工是社会发展的趋势,让一部分写code就行了,为什么要弄得所有的人都要拿到源代码才算自由呢?就我的观察,有的对开源的宣传就是在妖魔化非开源的公司组织,宣称出售二进制可执行程序不顺便带上源代码就是霸权主义行为,不知道这样的人是不是去吃麦当劳拿了麦辣鸡翅还赖着不走,一定要麦当劳把麦辣鸡翅的配方告诉他才算满足了他的“自由”感。
一个公司的源代码是这个公司的财产,他愿意开源就开源,不愿意开源就不开源,自己的财产轮不上别人来说三道四如何分配,今天这位闹事的仁兄就有点搞不清所谓,也许是搞得清所谓但是自我炒作一把。
顺便说一下,古往今来,打着“自由”的旗号做坏事的枭雄比比皆是,现在做开源的公司有几个的行为谈得上“高尚”或者说是“为了造福人类”呢?
Filed under: 山河好大
附近的山头还有一段长城。
从山顶看下面的山路,蜿蜒曲折。
这段长城的基座都是大石头,所以保存还算比较完好,但是墙上用砖砌的垛口就损毁得差不多了,凡是比较险峻的地方又保留很完整,看样子主要是人为破坏造成的。
我们没有破坏长城的一砖一石哦:)
Filed under: 技术体会
ASP.Net 2.0中,code behind的代码的类都是partial了,这是为了把一个类的source code分割到不同的原文件中,C#2.0的新功能(现在3.0快release了,这时候说其实不算新)。Jeff Richter上次培训的时候说这个feature开来的好处是可以让一个team里多个人同时不受影响的在一个类上工作,每人修改自己的那一块partial源文件,但是我觉得这样看似每个人之间没有冲突,但是一个类就应该有cohensive的特性,让多个人同时编辑就很不合适,而且实际工作中也没见过为了让两个人同时工作在一个类上而把这个类弄成partial的情况。我觉得partial做实用的用法,就是把class分为两部分,一部分由code generator控制,另一部分由programmer控制,这样可以防止programmer的修改把自动生成的代码弄乱,以至于code generator也没法维护这些code了。在VS2005中用WinForm,就自动把form分成两个partial,如果做ASP.Net页面,那就更进一步,只能看见一个partial,另外一个partial的源代码都看不见,这样看着很干净,看不见Label1、TextBox1这些member的定义语句,他们都在另外一个看不见的由ASP.NET自动生成的partial里面呢,有VS2005的强大编辑功能,用起来也一点也不别扭。
partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
if (Page.IsPostBack)
{
Label1.Text = "You Entered " + TextBox1.Text + sender.GetType();
}
else
{
Label1.Text = "Please input somthing";
}
}
protected void Button1_Click(object sender, System.EventArgs e)
{
TextBox1.Text = "You clicked button 1" + sender.ToString();
}
protected void Button2_Click(object sender, System.EventArgs e)
{
TextBox1.Text = "You clicked button 2";
}
}