代码改变世界

随笔档案-2009年12月

2009年末,多少进行一些总结和展望吧

2009-12-31 00:11 by Jeffrey Zhao, 13275 阅读, 收藏, 编辑
摘要: 时间就这样悄无声息地到了2009年的最后一天,回首我这过去的一整年,可以用一句废话来总结,那就是“既有遗憾,也有收获”。不管怎么样,多少也应该总结一下吧——尤其是此时此刻,对我来说可谓是一个新的起点。自然,在技术博客上,终究还是围绕着“事业”谈谈吧。 阅读全文

使用Fiddler辅助观看InfoQ的视频

2009-12-29 12:04 by Jeffrey Zhao, 10243 阅读, 收藏, 编辑
摘要: InfoQ是一个好地方,而我认为其中最有价值的资源,便是其中的演讲视频。InfoQ在这方面有个特点:在演讲视频下方提供了清晰的幻灯片,而在播放的同时,还会根据进度进行切换。这观看体验自然比单纯的演讲录像要高出许多。可惜的是,时不时有朋友会向我反馈说,InfoQ实在是太慢,几乎无法流畅地观看视频。由于一时半会儿InfoQ也不会在中国放CDN,因此视频加载速度这问题……几乎无法解决。还好,如果我们退而求其次,至少可以使用Fiddler等工具来“缓解”这个问题。 阅读全文

计算机(及其他)书籍赠送

2009-12-28 14:45 by Jeffrey Zhao, 14510 阅读, 收藏, 编辑
摘要: 由于即将转移工作阵地,因此要把所有的书都整理清点一遍。整理过程中发现有些书……还是不要让它占用宝贵的存储资源比较好,于是打算处理掉。其中一部分书是别人送的,另一部分是有年头的,还有一部分是一时兴起买的。它们大都价值不大,因此我是“赠送”而不是卖掉。当然还有一些书也并非如此不堪,只不过我不需要而已——这类书也麻烦兄弟们写写书评罢。:) 阅读全文

五十种语言的“圣诞快乐”(下):F#实现

2009-12-28 11:18 by Jeffrey Zhao, 7399 阅读, 收藏, 编辑
摘要: 不知道大家的圣诞节过的如何?有没有玩点啥有趣的东西?上次的文章中我们主要分析了使用Google Translate进行文字翻译的方式,并使用C#写了一个简单的的翻译程序,效果良好。不过,在平时开发过程中,对于此类问题我常用F#来解决这样的问题。那么使用F#来实现此类任务有什么优势吗?不错,我们现在便来看看这个问题。 阅读全文

推荐内容索引

2009-12-27 17:30 by Jeffrey Zhao, 11477 阅读, 收藏, 编辑
摘要: 写了不少文章,其中有不少比较用心的系列。积累了那么久,我在博客上也已经讨论过了各种问题。许多人提问的时候,我会说我写过某某文章,可以搜一下,但得到的反馈经常是找不到。其中一个原因是那些弟兄还不太会用搜索引擎——或是懒,但也有可能是以前的文章的确是“沉没”了。无论是博客园还是独立博客,对于内容的组织和管理还做得不够好,所以在这方面有所突破之前,还是通过手动整理的方式来保留重点内容吧。 阅读全文

五十种语言的“圣诞快乐”(上):分析与实现

2009-12-25 11:17 by Jeffrey Zhao, 8170 阅读, 收藏, 编辑
摘要: 您知道“圣诞快乐”在不同语言中的写法吗?Google Translate知道。不过Google Translate好像并不希望我们可以直接获得这些内容——但这并不能阻止我们这些光荣的程序员来获得这些信息。 阅读全文

老赵谈IL(4):什么时候应该学IL,该怎么学IL

2009-12-25 00:08 by Jeffrey Zhao, 12298 阅读, 收藏, 编辑
摘要: 又是一个拖了半年的系列,可能是前几篇主要以事实为准,举例子的文章总是比较容易写的,因此十分顺畅。而最后一篇打算做一个总结,以讲道理为主——却发现该将的似乎都已经讲完了。不过做事要有始有终,该完成的也必须要完成。那么现在就来谈谈我的一些个人看法:什么时候应该学IL,以及应该怎么学IL。 阅读全文

重谈字符串连接性能(下):分析优化

2009-12-23 14:03 by Jeffrey Zhao, 8674 阅读, 收藏, 编辑
摘要: 经过之间的性能比较,我们得知StringBuilder的性能并非时时最优,再经过实现分析,我们大致了解了StringBuilder的实现方式。虽然在此之前,大家也基本已经了解StringBuilder的实现原理,也有不少朋友指出了它性能缺陷的原因。不过“严谨”起见,寻找性能问题的方式应该是进行Profiling,然后找出性能关键再进行优化——而不是纯粹进行“阅读”这种静态分析方式。 阅读全文

使用Profiler分析程序性能

2009-12-22 11:37 by Jeffrey Zhao, 51228 阅读, 收藏, 编辑
摘要: 三个星期之前我向大家求助说,VS的Profiler分析程序性能时无法跟踪框架内部的方法调用。当时我做了不少尝试,例如下载并配置了.NET Framework的symbol文件和源代码,还尝试使用了ANTS Profiler和CLR Profiler等其他工具,最终还是没有成功。Ivony...老大在评论中告诉我说Sampling方式可以获得比Instrumentation更多的信息,不过我觉得Sampling得到的结果并不像我的目标那样干净,因此还是在寻找Instrumentation的方式。不过最终耗费了一个GTSC的支持点数,才被告知——的确应该使用Sampling。 阅读全文

Q & A专用文章

2009-12-21 18:18 by Jeffrey Zhao, 4033 阅读, 收藏, 编辑
摘要: 有不少朋友反映原来的Q & A专用文章时不时无法显示评论,与博客园联系之后得知这是评论太多,导致容易超时。因此,我现在重新准备一篇文章,如果您有什么问题我们不妨一起讨论一下。当然,您也可以发Email给我,但是尽量不要使用右下方的Web IM和我联系。:)Hello World! 阅读全文

在.NET平台上使用Scala语言(下):分析

2009-12-21 00:30 by Jeffrey Zhao, 7545 阅读, 收藏, 编辑
摘要: 上一篇文章里我们简单尝试了在Scala里编写.NET应用程序。这个过程并不困难,因为似乎Scala官方已经对此已经有较好的支持了。我们要做的只是“获取工具”,“编译成IL”,最后再“生成程序集”即可。那么,这些工具究竟做了些什么,Scala究竟又是如何支持.NET平台的,它的可用性究竟如何,我们还需要进一步的分析及尝试。 阅读全文

在.NET平台上使用Scala语言(上):初尝

2009-12-18 12:47 by Jeffrey Zhao, 11415 阅读, 收藏, 编辑
摘要: Scala是Java平台上的一门新兴起的语言,我也不止一次在博客上提到它。我非常希望它可以取代Java这种劣质语言,让Java平台的生产力上一个台阶。事实上,Scala从一开始——或者说“很早”就对生成.NET程序集提供了支持。只可惜,毕竟还是Java平台的东西,.NET方面的资源少之又少,不过我们还是可以进行一番尝试的。 阅读全文

定制Paste from Visual Studio插件(下)

2009-12-16 14:27 by Jeffrey Zhao, 5707 阅读, 收藏, 编辑
摘要: 上一篇文章里我们进行了简单的实验,验证了通过修改IL生成新插件的可行性,不过我们要做的事情还有很多,因为我们实际要做的事情其实是……插入行号。这需要我们补充新的逻辑,并且对CreateContent进行修改。那么我们又该如何写这大段大段的IL呢?没关系,其实这些事情不懂IL也可以做。 阅读全文

定制Paste from Visual Studio插件(上)

2009-12-16 10:56 by Jeffrey Zhao, 6547 阅读, 收藏, 编辑
摘要: 我在上一篇文章里谈了我常用Paste from Visual Studio(下文称VSPaste)的插件,这大大方便了我写博客时贴代码的工作。不过今天早上有朋友在我博客后面留言说:“VSPaste没法显示行号,不知大家有没有办法解决?”其实这点很容易,写个小程序,把VSPaste生成的HTML再进行一番处理不就可以了嘛。不过最方便的做法还是让VSPaste直接生成带行号的代码块,不是吗?那么,我们就来自己动手丰衣足食解决这个问题吧。 阅读全文

浅谈代码着色(下):服务器端着色

2009-12-15 15:38 by Jeffrey Zhao, 7031 阅读, 收藏, 编辑
摘要: 上篇文章谈了客户端着色,而现在自然就来讨论服务器端着色了。先下个定义:我在这里谈的“服务器端着色”,是指直接从服务器端输出着色效果的做法(与“客户端着色时”输出纯代码文本相对)。至于这个着色效果是如何获得的,例如是由另一个用户直接提供的,还是用户提供纯代码文本,而用服务器端逻辑“着色”,在这里就统称为“服务器端”着色了。不过接下去的讨论,我们还是会作一些区分。 阅读全文

浅谈代码着色(上):客户端着色

2009-12-14 19:53 by Jeffrey Zhao, 7885 阅读, 收藏, 编辑
摘要: 作为程序员,写文章时总免不了插入代码,而对代码进行着色几乎已经成为一个基础,一个事实标准。代码着色的确可以大大加强代码的可读性,因此即便是再不待见IDE的朋友,代码着色永远是必不可少的。不过在网页中进行代码着色的方式有很多,现在我们就来对比一下。记得之前也有朋友写过,但我总觉得不够完整,于是还是自己写一下吧。我们先来看客户端的着色方式。 阅读全文

总结一下F#中运算符的定义规则

2009-12-14 01:46 by Jeffrey Zhao, 6484 阅读, 收藏, 编辑
摘要: F#允许开发人员定义或重载各类运算符,合理利用这一规则可以让编程变得方便,让代码更容易阅读。例如,在使用F#的MailboxProcessor的时候,我会习惯于定义一个运算符来代替显式的Post操作。不过,F#的运算符定义规则较为复杂,要搞清楚编译器的整体处理方式着实花费了一番功夫。比较奇怪的是,即便是《Expert F#》中对于这个话题也没有详细的叙述——更夸张的是MSDN的文档也相当马虎,甚至有代码缺失以及与试验不符情况(因为还没有正式发布?)。于是我连看带试,最终打算总结一番,作为备忘的同时也算是补充互联网资源。 阅读全文

数十行F#打造简易Comet聊天服务

2009-12-11 12:00 by Jeffrey Zhao, 11854 阅读, 收藏, 编辑
摘要: 普通的Web应用程序,都是靠大量HTTP短连接维持的。如实现一个聊天服务时,客户端会不断轮询服务器端索要新消息。这种做法的优势在于简单有效,因此广为目前的聊天服务所采用。不过Comet技术与之不同,简单地说,Comet便是指服务器推(Server-Push)技术。它的实现方式是(这里只讨论基于浏览器的Web平台)在浏览器与服务器之间建立一个长连接,待获得消息之后立即返回。否则持续等待,直至超时。客户端得到消息或超时之后,又会立即建立另一个长连接。Comet技术的最大优势,自然就是很高的即使性。而F#实现一个Comet原型,只要几十行代码。 阅读全文

在项目中使用Google Closure Compiler

2009-12-09 09:13 by Jeffrey Zhao, 30837 阅读, 收藏, 编辑
摘要: 现在的Web项目总是离不开大量JavaScript,而JS文件的体积也越来越大,也越来越影响页面的感知性能(Perceived Performance)。因此,我们会对JS文件进行压缩,一方面是使用Gzip,而另一方面则是去除JS文件里的注释、空白,并且压缩局部变量长度等等。对于一些成熟的类库来说,它们本身都会提供“完整注释”以及“强烈压缩”两个版本。但是,有时候我们需要自己修复类库里的bug,这只能在注释版中修改,对于压缩版自然就无能为力了。此外,自定义的脚本文件一般也值得一压。因此我在项目中时常会备一个脚本压缩工具。 阅读全文

Route组件GetVirtualPath方法性能优化结果

2009-12-08 01:32 by Jeffrey Zhao, 6690 阅读, 收藏, 编辑
摘要: 由于使用Lambda表达式生成URL的方式性能较差,因此我使用Fluent Interface来代替原有的Lambda表达式构建方式。Fluent Interface主要对生成URL的前两个阶段(创建对象及分析对象)进行了优化,分别带来了超过2/3和1/2的性能优化,但因为最后一步,也就是使用Route对象的GetVirtualPath方法构造URL的性能没有提高,因此总体性能只提高了30%。于是我打算重新实现GetVirtualPath方法,希望得到更好的性能。那么优化的结果又如何呢? 阅读全文

真有必要去除HTML中的空白字符吗?

2009-12-07 17:59 by Jeffrey Zhao, 14875 阅读, 收藏, 编辑
摘要: 刚才有朋友在MSN上问我说,他的页面中有许多空白字符,打开源文件一看发现这代码稀疏得很。他觉得很浪费,他说有什么办法可以去除它们。我问他“你的页面使用GZip压缩了吗?”他说用了,于是我回答说“那么就不用去除空白字符了,连续空白字符压缩得很好,去掉后效果不大的”。这时我又不禁想到早上那篇《博客园首页优化心得》中也有一条是“去除HTML中的空格、空行”,于是我便打算尝试一下,去除空白字符到底有多少效果。 阅读全文

使用值类型LazyString分析字符串

2009-12-07 10:09 by Jeffrey Zhao, 7485 阅读, 收藏, 编辑
摘要: .NET里提供了值类型与引用类型可谓是一个非常关键的特性,例如开发人员使用值类型时,可以充分控制内存的布局方式,这对于Interop等操作非常重要。不过,其实值类型最重要,最基本的特性还是内存分配上。现在基本上是个.NET开发人员就会叨念说“值类型”分配在栈上,“引用类型”分配在堆上。但是什么是栈什么堆?分配在栈上和堆上的区别是什么?如果说这两个问题太“理论”,那么来个实际的:您在平时什么情况下会使用,或者说,定义一个值类型呢?其实这才是重要的,否则背再多概念也没有用。只可惜从我面试的经验上来看,基本没有多少兄弟能把这些.NET基础完整说清楚。 阅读全文

求助:如何使用VS的Profiler跟踪框架内部的方法调用?

2009-12-05 19:16 by Jeffrey Zhao, 6968 阅读, 收藏, 编辑
摘要: 解决性能问题必须使用Profiler,无论是自己写的实验代码还是一些高级工具,没有数据,而是凭感觉来解决性能问题在绝大部分情况是不靠谱的。VSTS包含了Profiler,也经常见一些博客上用Profiler得到的数据进行性能分析,其中最著名的莫过于Rico Mariani的Performance Quiz系列了。使用VSTS的Profiler可以收集程序运行过程中每个方法的调用次数,所消耗的总时间等等,一目了然,但是我在使用过程中却出现了问题。 阅读全文

jQuery Validation插件remote验证方式的Bug

2009-12-04 14:29 by Jeffrey Zhao, 26426 阅读, 收藏, 编辑
摘要: jQuery插件很多,其中一个重要的插件便是jQuery Validation,它的作用是对表单进行验证,还上了jQuery官网。不过奇怪的是,最近用下来感觉有些古怪,因为好像有些死板,已有功能的应变能力还不强,甚至还有个奇怪的Bug。任何项目有Bug其实也正常,但这个Bug其实是一个文档上已经记载了,却没有实现的功能,这就有些说不过去了。这个问题便出在remote验证方式上,还好修改起来非常容易,在此记录一下,也方便以后的参考。 阅读全文

做个游戏:设计代码生成特定的调用堆栈

2009-12-04 00:30 by Jeffrey Zhao, 5068 阅读, 收藏, 编辑
摘要: 前篇文章里我谈了谈String.Concat与StringBuilder的实现,于是后来有个朋友回复到:“我发现StringBuilder里好像也用了String.Concat。在一次异常中,Exception的StackTrace显示是先发生了String.Concat异常,然后再StringBuilder.Append。”不过经过一些简单的分析,我们会发现StringBuilder.Append方法的各个重载都没有依赖(即调用)String.Concat方法,那么这样的调用堆栈又是如何形成的呢? 阅读全文

重谈字符串连接性能(中):细节实现

2009-12-03 10:10 by Jeffrey Zhao, 10512 阅读, 收藏, 编辑
摘要: 根据上次的评测结果,我们了解了几种字符串拼接方式的性能高低。从中可以看出,广受追捧的StringBuilder性能似乎并不是最好的,String.Concat方法有时候有时候更适合使用。那么为什么String.Concat方法性能那么高,StringBuilder又为什么落败,而我们又有没有什么可以改进的做法呢?为此,我们不妨动用.NET Reflector这一利器,看一下两者是怎么实现的。 阅读全文

各种数组元素复制方式的性能比较

2009-12-02 10:27 by Jeffrey Zhao, 9337 阅读, 收藏, 编辑
摘要: 原本这只是“字符串”话题的一个分支,不过后来我发现这个问题单独来看也有一定参考价值,也有一些问题值得讨论的地方,其中也有一些问题希望得到高手指点,最终打算把这个话题独立处理。话不多说,现在就来看看。 阅读全文

使用WinDBG + SOS谈对象大小及字符串的结构

2009-12-01 14:57 by Jeffrey Zhao, 6320 阅读, 收藏, 编辑
摘要: 昨天我们使用了一个最最简单的小实验,来检查相同类型的不同对象大小是否相同。当然,我们很轻易地“验证”得出,不同长度的字符串大小是不一样的。不过这种表面现象其实很难说明问题,因此我现在还是用WinDBG + SOS来进行一些检查,希望可以得到一些表面上看不出来的信息。 阅读全文

[已过期] 创业小公司招聘网页前端工程师(1名,上海市长宁区)

2009-12-01 13:31 by Jeffrey Zhao, 5621 阅读, 收藏, 编辑
摘要: 某创业小公司,其实就是老赵呆的创业小公司,又要招聘网页前端工程师了。对于一个网站来说,什么最重要。至少在前期,可能还是网页前端工程师吧。至少我认为,在前期可以没有老赵,但是不能没有前端工程师,否则用户就根本看不到任何东西,再好的设想也难以实现。因此,我们目前急需您的加盟。 阅读全文