Fossil Jue & Young Mu @Shanghai
3年前,Ajax开始火热起来的时候,很多关于Javascript的书都会谈到js中字符串相加的性能优化问题。解决的方法就是使用Array的join方法。这个方法确实很妙,在IE6,IE7下能提升大约5倍的性能。
3年后,偶然发现join比+=高效的说法不再正确了,在某些浏览器里。简单测试了一下,在IE 8,Chrome 4,Opera 10,Safari 4中直接使用字符串相加的方法要优于使用数组join,看来新浏览器都已经对此做了优化——除了Firefox。
有兴趣的同学可以去测试一下,网上的测试代码一大把,都是雷同的。注意测试的先后顺序会影响测试结果:比如先测+=再测join和先测join再测+=的结果有差异;前后两次join的结果也不同。
另外,arr[arr.length] = text 执行起来也比 arr.push(text) 略微快些。
mongoDB是最近比较热的NoSql数据库之一,它保存的是类似json的数据集合。虽然读写效率不及其它key-value数据库,但是也比RDBMS要高很多了。json数据相比key-value更有层次,开发速度应该会更快一些。不过借助一些开发框架,基于kv的开发应该也很简单,我只是胡乱说说。一般程序员都会关心保存是否方便,查询是否简单,这个也是mongoDB的优势。mongoDB有windows版本,而且json比较有爱,可以很方便地输出给前端。
官方号称mongoDB非常适合保存大尺寸,低价值的数据。这个是什么意思?500年都不会有人去翻动的一个企业的规章制度,以及500年前某个领导的慷慨致辞,或者年会录像。这些东西以前是文本,现在是视频,非常适合大尺寸,低价值的标准。有个数据库非常适合保存低价值的数据?这很容易让人联想到SqlServer2008的FileStream类型,它也很适合保存这些东西。是不是我们可以用mongoDB来搞个分布式的文件系统?好像很适合用来当文档管理系统的后台数据库。
不管怎样,先玩玩她再说。 阅读全文
谷歌于美国西部时间11月19日上午10点(北京时间11月20日凌晨2点)在美国总部举行了Chrome操作系统的新闻发布会,谷歌产品副总裁Sundar Pichai和谷歌Chrome操作系统工程总监Matthew Papakipos两位高管对Chrome OS进行现场演示。请看Google官方发布的6段Chrome OS视频: 阅读全文
对于国内存储市场来说,3PAR 是不折不扣的后来者。也是个相对陌生的存储产品,以至于其竞争对手的人员甚至都不知道这家公司已经杀入中国市场。
3PAR 在 1999 年成立,几个创始人主要出自 Sun ,前身叫作 3PARdata , 2008 年上市。要知道在存储技术领域竞争还是比较激烈的,EMC / HDS 等控制着高端存储的主要市场,3PAR 能突破技术壁垒并最后成功上市,没两把刷子那是绝对做不到的。
InSpire 硬件结构
3PAR 背板采用全网状的连接结构,每个控制器节点之间高速直连。因为是全网状的,所以基本上一个链路坏掉只影响直连的两个节点的通信,对其它节点无影响。每个控 制器节点内置一块硬盘,用于操作系统安装。控制器节点最多可以扩展到 8 个,是 3PAR 存储最核心的组件。
相比之下,HDS 架构采用全光线交换方式(Universal Star Network),而 EMC 是采用直连矩阵方式(新一代产品采用虚拟矩阵架构–Virtual Matrix ,其实已经放弃了直连矩阵架构了)。这些连接方式的孰优孰劣历来是厂商攻击竞争对手的着眼点,能否最大限度发挥性能是用户最需要关心的。

3PAR 针对 I/O 指令和数据移动使用不同的计算芯片。I/O 指令(元数据/控制Cache)用 Intel 的芯片,而 数据移动/Cache 则使用专门设计的 ASIC 芯片来完成。

因为有专门的硬件 ASIC 芯片用于 RAID 5 XOR 校验,3PAR 号称有了其第三代 ASIC 芯片,实现的 RAID 5 是业界最快的,甚至 SATA 盘也能有不错的性能表现。(从 Oracle 公司测试的数据来看,和 RAID 10 速度的确相差无几。)
InForm 操作系统软件与虚拟化
3PAR 的操作系统叫 InForm,最初就是面向层次化的设计。与其他存储不同的是,3PAR 所有磁盘被分成 256MB 统一大小的小盘(Chunklet),可以根据需要用多个 Chunklet 组成 RAIDlet(逻辑磁盘)。因为这个独特的设计方式,3PAR 是可以很容易做到不同容量的磁盘混用,同一个 RAID 组里都可以有不同大小、不同转速的磁盘混用,这是其他存储做不到的。而且,所有的磁盘都可以利用,因为Hotspare Chunklet 以更小的单位分散在不同的磁盘上,也不再需要单独留热备盘。空间利用率可以更充分一些。

多说一句,有这个冗余机制,3PAR 更换磁盘也是与众不同:直接抽磁盘盒子(一个盒子可是四块磁盘啊),我当初看到 3PAR 技术人员这么操作真是着实吓了一跳。
因为固定大小的 Chunklet 的存在,可以将 I/O 更为均匀的分散到多个磁盘上。

对于熟悉Oracle 的朋友来说,会发现这和 ASM 的思想非常接近。因而也可以和 Oracle 数据库进行无缝集成:

因为软件做得非常具有易用性,日常管理与维护远远没有其他高端存储那么复杂,新增磁盘这种事情,都是一行命令之后底层自动处理。其实在 Thin Provisioning 方面 3PAR 也是很值得一说的,比一些厂商的伪 Thin Provisioning 具体多了。限于篇幅,不赘述。
3PAR 在美国有很多金融证券行业的客户,也有 Web 2.0 行业的客户–MySpace 。在保证 I/O 响应在 10ms 以内的前提下,3PAR 的 IOPS 能力非常优异(这才是卖点,不难理解其客户多集中在证券、金融领域)。虽然有些厂商号称能得到更高的 IOPS ,但那是在 I/O 响应时间很差的情况下的数据。要说明的是,现在随着一些存储厂商在高端服务器上也支持 SSD ,未来几年如何还要再看。
前两年 3PAR 推行所谓 Utility Storage(功用存储) 理念,现在貌似改成敏捷存储了。说实话,我觉得敏捷存储真的挺适合的,3PAR 命令行批量创建 LUN 真的很让人感觉舒服。当然,也在宣传云存储和绿色存储的理念,那是题外话了。
3PAR 原来只做中高端市场,只有 T 这一个系列,现在也开始关注中低端市场了,推出了 F 系列的产品。软硬件体系基本没变,倒是没仔细看过。
(Note: 相关图片主要来自 3PAR 公开资料.)
禾白的电脑年老体弱,无规律间歇性不能开机,因此周日和禾白一起去百脑汇配了台新电脑。配置如下:
CPU:Intel Core 2 Quad Q9400/盒装 ¥1320
主板:华硕 P5Q Turbo ¥990
显卡:铭瑄 极光9800GT巨无霸 ¥690
内存:金士顿 DDR2 1066 2G骇客神条(KHX8500AD2/2G) 两条共¥400
硬盘:希捷 1TB SATA2 32M(7200.12/ST31000528AS) 两块共¥1300
电源:¥280
机箱:AOC 睿彩6062B ¥160
顺便买了个TP-Link的无线路由:TP-Link TL-WR841N ¥180
总计¥5340,成交价¥5280,另外要了一根DVI的线和一根HDMI的线。
这个配置虽说不算顶级,不过也算不错的了,可以说是相当不错。
CPU
本来打算买Q8400的,只是没货,所以换成Q9400。老板很豪迈地说,这两个CPU价格只差30块钱,我后来网上一查差了300块钱。网上报价要1590,实际上没那么贵。
Q8400和Q9400没有频率上的差别,不过缓存大小差了近一倍:前者L1=4×32K / L2=2×2M,后者L1=4×64K / L2=2×3M。另外,Q9400支持Virtualization(虚拟化)技术。因为基于硬件的虚拟实现能提供更好的性能,应该很适合像我这样要开虚拟机工作的同学们。
再往上,Q9550和Q9400差异貌似只是在倍频上——一个是8.5X,一个是8X,也没什么好考虑的了。
主板
P43和P43芯片组都是intel最后一款基于LGA775的芯片组,它们之间的区别大概就是P45支持Cross Fire技术,而P43不支持。我和禾白都不是游戏玩家,只是我想玩玩磁盘阵列,所以本来选了华硕的P5QL-E 。不过又是没货,后来在老板的哄骗之下买了现在的板子。
不过可耻的是,虽然已经组装好了,系统也装好了,但是到目前为止,还不确定是否成功启用了RAID模式,也没能修改RAID模式。这个板子的南桥是ICH10R,号称支持RAID0、RAID1、RAID5和RAID10。我想切换到RAID10模式。研究了半天,没能成功,暂时放弃了。
显卡
最终买到的也不是当初想好要买的那款,那款又没货了。对显卡不敏感,没什么好说的。9800GT的卡,1G显存,可以启用Vista的Aero特效。上次给禾白装Windows7,妄图在MX440显卡上开Aero,最终屎败。这次再装Win7,应该能成功了吧……
内存
本来禾白想要买金士顿 DDR2 1066 4G骇客神条套装(KHX8500D2K2/4G)的,套装的散热片和漂亮,像两把蓝色的梳子。还是没货,最后换了普通散热片的那种,两者除了散热片不同之外,其它都一样。也罢,反正内存插在机箱里也看不到。
硬盘
去之前在网上看中了联强代理的希捷盒装硬盘,价格¥650。只是老板说只有建达蓝德代理的,只好拿蓝德的盘了。大概是因为它是上海本地代理商的关系。两家的硬盘不一样,联强的是中国产的,蓝德的是泰国产的。价格当然也不一样,蓝德的应该¥600不到,被斩了一笔。
这个硬盘支持NCQ技术(好像SATA II硬盘都支持,囧),如果不是用来做RAID的话,在BIOS的南桥设置中打开AHCI模式(默认是IDE模式),可以很大程度上提升读写性能(7%甚至更高)。南桥芯片ICH6以上应该都支持。关于如何启用NCQ,可以参考这里。
基本上没一个是有货的……
除了CPU和主板比预期要好之外(增加了金钱投入),其它配件品质都有所下降,小有遗憾。
微软在GPLv2协议下向Linux Kernel 2.6.32贡献了3个Linux设备驱动,两万行代码。
微软开源技术中心主管Tom Hanrahan解释了微软作出这个非同寻常举动背后的动因:
我们有必要理解虚拟化的一个关键点。如果操作系统作为虚拟机运行,那么它得清楚这件事,这样就不会将调用直接发给各种外围设备了。在微软的术语中,我们称其为启迪(enlightenment)。Windows Server 2008就被设计成这样,因此它清楚何时作为虚拟机运行,何时在物理硬件上运行。
为了让Linux能在Hyper-V上拥有同样的体验,我们必须将这种启迪赋予给它。要想实现这一点则需要运行Linux设备驱动。
以前这些设备驱动是可以下载并用在Hyper-V的第一版上的,然而Linux社区使微软相信(通过Greg Kroah-Hartman,他是在这个议题上与微软进行交涉的第一人)增加Linux设备驱动的办法就是将其贡献给社区,这样任何商业或非商业发布者都能够随意使用、修改并分发它们了。
微软开源技术中心经理Hank Janssen(他领导的团队为这些驱动编写代码)承诺他们不会半途而废:
我们将继续更新驱动代码以不断增强其协同性,同时也希望社区中的开发者觉得这些代码对他们是有用的,值得为其付出。
451 Group的分析师Jay Lyman就微软的这个举动发表了自己的一些看法。他认为微软会保留这些代码的知识产权:
这些代码的版权属于微软,贡献者的荣誉归功于该工程的领导者Hank Janssen——微软开源技术中心的程序经理。
然而他的理解却是微软并不会声明任何专利权,因此也不会向使用代码的人索取任何费用:
我们不妨做最坏的打算,假设微软这么做是个阴谋:他现在为Linux贡献代码,然后去申请专利。但理论上是否存在这个可能完全取决于我们对GPLv2的理解。
…最终这是一个法律上的问题,或取决于律师的口才(显然这么说带有讽刺意味)。与此同时,我们认为微软通过GPLv2来贡献代码包含了一个承诺:不会对代码的使用收取费用,也不会对代码申请任何专利。
Lyman还解释了微软之所以这么做的原因所在:
Red Hat与Novell发布的Linux已经支持enlighten模式了,这要归功于与微软的合作开发。微软向Kernel贡献代码的一个好处是减少了重复开发工作,同时也降低了支持多种不同Linux实现的代价。一旦Kernel接受了代码,微软将以这些代码为基础进行未来的虚拟化集成开发。
这也意味着Linux的社区发布版也可以使用这些代码,这为微软在主机市场上开创了更多的机会,因为Linux的社区发布版如Ubuntu、Debian 与CentOS都是非常重要的。这也加强了这些社区操作系统挑战Red Hat与Novell的能力,而后者对于Windows来说是更加直接的挑战者。
别搞错了,微软之所以这么做是由其利益驱使的。他必须要满足使用多种操作系统和混合环境的企业用户的各种需求,微软已经从差异化其Hyper-V技术与虚拟化领导者VMware中受益无穷了。我们有理由相信相对于VMware来说,微软对Windows的虚拟化会对Linux提供更加友好的体验。
需要说明的是,Linux无需借助于上面提到的设备驱动就能运行在Hyper-V上,但性能却很差。这是微软首次向Linux Kernel贡献代码,也是首次在GPLv2下发布代码。
查看英文原文:Microsoft Is Contributing 20,000 Lines of Code to the Linux Kernel
Eric Nelson是微软技术的传道者,也是MSDN UK Flash的技术编辑,他编写了一个列表,列出23个UK开发人员推荐的.NET开源项目。微软的一些开源项目如ASP.NET MVC、DLR、IronRuby、IronPython、MEF等则未列入其中。
Eric尝试只包含一个测试框架和一个mock框架,即使有很多其它的项目同样入围。他列出了以下项目:
还有一些提交的项目没有进入列表:
一些使用MS-PL许可证的微软项目:
MS-PL是OSI认可的许可证,GNU也认可它为免费软件许可证,它允许任何人查看源代码、修改源代码并发布修改后的源代码。而且此许可证并不限 制代码只能运行在Windows上,这样就可以将代码移植到其它操作系统,例如Mono(Linux上的.NET)和Monolight(Linux上的 Silverlight)。MonoDevelop有一个插件,可以用来在Linux和Mac OS X上开发ASP.NET MVC程序。
转载自:http://www.infoq.com/cn/news/2009/07/23-.NET-Open-Source-Projects
字符编码检测,大概在网络爬虫中应用比较多。不过网页的编码检测相对比较简单:web服务器一般都会返回EncodingType,实在不行,也可以去http-equiv属性为Content-Type的<meta>标签中去找。如果说要检测txt文本文件,那就难搞了。除了带BOM头的unicode编码的文件之外,其它的文件到底是什么编码,绝对是个未知数。
这么有挑战性的工作,要我来做,那肯定搞不定,只好去找别人的实现了。
略微google了一下,结果还是挺多的。不过大多数实现貌似都源自于Mozilla的universalchardet。大概的思路就是根据字符分布的概率来判断,有兴趣的同学可以参考这里:A composite approach to language/encoding detection。另外还有同学翻译了中文版:一种语言/编码检测的复合方法。
不过这些都不是可以直接拿来用的东东,还好有几个同学已经根据这个方法和Mozilla的C++代码自己实现了.NET的版本:
最后我用了nuniversalchardet,代码调用比NCharDet简单很多,又准确。点击这里下载源代码,里面有测试项目,可以在那里看调用代码怎么写。
在严格的XHTML文档模型中,a元素是没有target属性的。如果出现target=”_blank”, target=”_top”这样的属性的话,都将导致不能通过W3C的校验。transitional则没有这样的限制。虽然打开很多窗口会让任务栏变得很混乱(Firefox下可能会打开很多标签页),但是仅仅根据W3C标准就判定不应该使用target=”_blank”显然太过草率。根据我们的经验,太过绝对说法往往不怎么正确。
对于资深网虫来说,他们更喜欢所有的链接都在同一个窗口中打开,而由他们自己来决定是不是要在新窗口中打开。在Firefox里,可以按住Ctrl点链接,以强制在新标签页中打开一个链接。当他们在点到一个在新窗口中打开的连接的时候,感觉就像是踩到了一砣大便。有趣的是,在有些时候,比如看新闻,我个人更习惯在新窗口中打开一个页面。因为按Ctrl+W比按Backspace方便得多。这样看来,并非所有在新窗口中打开链接的做法都不可取,下面略微列举一下。
建议在新窗口中打开。如果打开一个链接会中断用户当前的操作的话,最好还是在新窗口中打开。比如:
不应该在新窗口中打开:
另外一些场景则比较自由。比如跨站链接,可以在新窗口中打开,因为目标页中可能并没有返回到原始页面的链接。
PS:独立博客的好处就是你想写什么都没人管的着(老婆和老大哥除外),这样的文章要是放到博客园首页的话,很多人就会大叫“博主还是把文章移到新手区吧”。但是谁不是从新手晋级到高手的呢,真是奇怪。
如果网站上有比较多的客户端资源(如js和css)的话,启用gzip是一个很有效的提高网站访问速度的做法。
1. 在IIS“网站属性”对话框的“服务”标签页中,钩选“压缩静态文件”的复选框。

2. 在命令行中输入“iisreset -stop”,停止IIS服务。
3. 因为默认只压缩htm/html/txt文件,所以要修改 %windir%/system32/inetsrv/MetaBase.xml 配置文件中的 IIsCompressionScheme 节点。(可以搜索“/gzip”来快速定位)
修改“HcFileExtensions”属性,添加css和js。
另外一个属性比较有意思,那就是HcDynamicCompressionLevel属性。网上很多人都说这个是设置压缩比的,0表示不压缩,10表示最高压缩比。实际上这个属性对静态文件压缩没有任何影响,可以忽略掉。
4. iisreset -start,启动IIS。可以用firebug的网络功能来看一下js文件的体积是不是减小了。
PS:另外几个提高访问速度做法是
记录一下备忘。
无标题文档,这是南方周末的十大热门之一…… 阅读全文
原先写的.net程序在切换到64位操作系统下之后出错了。
一个错误出现在.net调用一个32位COM程序时,提示如下错误信息:
Retrieving the COM class factory for component with CLSID {GUID} failed due to the following error: 80040154.
另一个是加载一个包装win32 dll的.net dll出现的,提示:
Could not load file or assembly ‘NamespaceName.ClassName’ or one of its dependencies. An attempt was made to load a program with an incorrect format.
Google“64位 80040154”,没有什么有用的结果。后来搜索“64bit 80040154”,在第一个结果里就找到了答案。看来老外又一次走在了我们前面。不多说了,按照这位MVP的说法,是因为64位程序不能在同一地址空间内加载32位程序。也就是说,64位程序无法调用32位的win32 dll,以及in-process形式的32位COM。解决的办法,要么编译一个64位的dll,要么把COM改造成independent progress形式。
找到了原因,接下来的事情就简单了。把程序编译了一个64位的版本,测试,可以正常运行了。
在试用了89天Windows 7后,我重装了系统。这次是Windows Server 2003 x64 Edition,在VeryCD上下载到的英文版。为什么这么清楚地记得我用了89天Windows 7呢?因为Visual Studio 2008 90天试用版还有1天就要过期了……为什么要装2003 x64版呢?因为我还没玩过任何x64版的系统……
x64系统会有各种软件和驱动兼容性问题,虽然已经有心理准备了,但是问题不断还是让人有点不爽。
由于是英文版,安装很多非unicode的中文应用程序都是乱码,首当其冲的就是winrar。不过这个问题我有经验,在控制面板的“区域和语言选项(Regional and Language Options)”的高级选项卡中把语言设置成简体中文就可以了。不过当我选语言的时候,傻眼了,根本没有简体中文这一项。猜测是系统安装的时候默认没有安装中文语言。于是打开IE,选择View菜单->Encoding->Chinese,果然提示没有安装这个语言,询问我是不是要安装。于是很轻松的,装上了中文语言。再回到区域和语言选项,把语言和区域都设置成“Chinese(RPC)”,位置设成“China”,搞定。
阅读全文
安装64位操作系统不是编译64位程序的必要条件,关键是要装64位程序的编译器。虽然标题写着如何在VS2008中编译,但其实2005也是类似。
1. 选择“Build” – “Configuration Manager”菜单,打开配置管理器。点击新建解决方案平台。