Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

Posted in Uncategorized | 1 Comment

X200的硬盘接口是SATA 1.5Gb/s还是SATA 3Gb/s

今天升级了驱动。在Intel Matrix Storage Console中看到笔记本(ThinkPad X200)硬盘(Seagate Momentus 5400.4 ST9160827AS) 运行在“SATA第一代” (Generation 1)传输模式,NCQ支持却是Yes。印象中不是只有“SATA第二代”才支持NCQ吗?觉得奇怪,便用其他软件看了看。

  1. HWiNFO32显示Drive Controller为Serial ATA 1.5Gb/s。
  2. EVEREST Corporate Edition显示Device Type为SATA,但ATA Device Physical Info中的Interface却又是SATA-II。

到底是SATA I还是SATA II?Seagate网站明确说明这款硬盘接口为SATA 3.0Gb/s。Product manual PDF文档又说突发传输速率最高是150MB/s,自相矛盾。

干脆拆下硬盘。表签上白底黑字写着1.5 Gb/sec。

我想起Seagate曾经在支持SATA 3Gb/s的硬盘上默认设置跳线,将传输速率限制在1.5Gb/s,以免在不支持3Gb/s的主机不兼容。

这块硬盘上果然也有个跳线。移除跳线后开机。所有软件都显示硬盘运行在SATA II传输模式。

以下是两种传输模式的对比。


HD Tach测试表明,突发传输速率大幅提高,超过了150MB/s。但平均传输速率不变。 

 


HD Tune也显示突发传输速率增大,平均传输速率不变。

背景知识

  1. SATA即串行ATA,是一种通常用来连接主机和硬盘的接口总线。与之对应的是已经被其取代的PATA (并行ATA)。
  2. 相比PATA,SATA提供更高的传输速率,以及其他功能,例如NCQ、热插拔等。
  3. SATA的规范目前很混淆。我们通常说SATA I(第一代)和SATA II(第二代),并认为SATA I的传输速率为1.5 Gb/s或150 MB/s;SATA II 的传输速率为3 Gb/s或300 MB/s,并支持NCQ等其他功能。其实是I、II并非规范,而是误称。负责SATA规范的组织曾经叫SATA II,后来为避免混淆更名为SATA-IO。他们措辞严厉地指出习惯说法是错误的。正确的规范名称是SATA Revision 1.x/2.x/3.x,对应接口名称是SATA 1.5Gb/s, SATA 3Gb/s, SATA 6Gb/s。规范被误解和说法被混淆,连Intel的软件也用Generation 1/2这种错误说法。测试软件中也常出现 SATA I/II。
  4. SATA 1.5 Gb/s的实际最大传输速率为150 MB/s。其中有的换算的方法值得说明。首先1.5Gb/s中的小写b指bit,而大写的B指Byte,1Byte = 8bits。然后,SATA使用的 8b/10b encoding 只有80%的效率,所以1.5Gb/s = 1.5*1000*0.8/8 MB/s = 150MB/s。同理SATA 3Gb/s对应的实际最大传输速率为300MB/s。 
  5. SATA使用 Advanced Host Controller Interface (AHCI) 。需要在BIOS中开启AHCI并在操作系统中装响应的驱动才能使用SATA,否则SATA硬盘会模拟PATA设备运行。

结论:

  1. ST9160827AS符合SATA Revision 2.5规范。支持1.5 Gb/s和3Gb/s两种接口传输速率。出厂默认设置跳线,将速率限制为1.5Gb/s。移除跳线后可工作在3Gb/s。
  2. 由于5400 RPM硬盘内部传输速率限制,外部接口是1.5 Gb/s还是3 Gb/s对性能几乎没有影响。只有突发传输速率不同,然而这个指标对实际使用性能没什么影响。更有意义的指标是持续传输速率和平均寻道时间。Seagate可能正是因为这个在硬盘上标注1.5Gb/s。
  3. NCQ对性能的影响在一般测试中不容易体现出来。但在实际使用中应该是有作用的。

Posted in Computer and Internet | 19 Comments

巴西木、龟背竹、芦荟和浩小飞之花

2009-3-29

巴西木、龟背竹、芦荟和浩小飞之花


棕北国际的浩小飞之花

这是一株完全不受自身处境和理解力局限性困扰的花。因此没有什么可说的。值得一提的是它的主人。

此花的主人与我相当重合。当然这并不是说我也会看了烂片后推荐给别人,然后幸灾乐祸地等着“人声顶肺”。我们的交集大概包括德芙纯黑、麦乐鸡、编程语言、计算机科学、近代物理和一些“玄之又玄”的异端邪说。我们甚至共同期盼着人类末日,并会在LHC开机后失望地对自己说:“what? nothing happened?!” 将量子理论和藏传佛教联系起来的趣味是令人愉快的,不管你是民科还是科民。我们自视小白,各自悄悄地把stumbleupon的programming类别从头stumble到尾。在这样的状态下,写小代码便成了让人极其苦恼的事情。我如同rails上的一辆煤车,灰头土脸地爬来爬去。跟一堆浏览器混战之后又化作firebug,在史前巨兽的牙缝和guts里穿梭。有时我也像moe一样,歇斯底里地擦掉注释中的WTF和F。

这盆突如其来的小花曾几次被我挽救于干旱,却终究没能随我们离开俯瞰城南的阳台,也没能跟随主人去到忙碌繁华上海。

长城锦苑的芦荟

我在芦荟上花了不少精力,却始终不能让它长好。芦荟是一种复杂而有些鲁莽的植物。它过度的伸展会让杆承受不起力矩。它的锯齿会刺伤自己。

皇家花园的龟背竹

一天,一帮手持利器的狂徒冲进一个杂草丛生的园子,见了高过地面一寸的东西就是一阵无限制武术般的旋风斩。当我发现那棵龟背竹的时候,没命地喊:“那不是杂草!那是…”    “啊?不是啊?…” 3根强壮的枝叶应声落地,只留下一簇断面。我蹲下看了看,然后绝望而沮丧地离开。随后是惨绝虫寰的化学武器从天而降。直到3天后,最顽强的长顎蚁还在土里挣扎。那时的惨象令我印象深刻。

万物复苏的季节里,神奇的生命力在龟背竹的残骸里孕成了一卷叶芽,从此她便成了我的特别关照对象。清晨给她浇水,雨后为她捉掉蜗牛,日日日灸时为她撑伞。终于,这卷叶芽摇摇晃晃地展开了新绿的太阳能电池板并召唤了新的叶芽!那时的喜悦令我印象深刻。

龟背竹就在厨房窗外,她一定记得我们每顿饭的气味,尤其是干煸辣椒。宽大的叶片成了懒猫的遮阳伞。懒猫是名符其实的,它会用一种令你羡慕的舒展的姿态躺在地上,即便有菜粉蝶在眼前跃动也舍不得申下爪子。


中华家园的巴西木

巴西木孤零零地站在阳台上,透过落地窗看着对面红色彩砖外墙的漂亮房子。靠下面的叶子都枯黄了,像疯婆子的头发。我总觉得这棵巴西木是沦落到市井的贵族,忧虑而不得脱。它能听到我们每天的晨会,当然从不发言。它很容易进入我的视线,我烦躁时常常讨厌看到这种让人想起干旱和酷热的叶子带锯齿的植物。然而我非常恐惧某一天会看不到它,它是房间里唯一的绿色。

Posted in Life | Leave a comment

我愿做一棵树,或是宇航员

— 记周末加班路上的意识流

我是一个不喜欢在外闯荡的人。我不习惯外面的食宿,总觉得住得不干净、吃得不卫生。我觉得牛肉有臊味儿、羊肉有膻味儿。我讨厌牛奶,因此不会去西藏、蒙古、美国、新西兰、澳大利亚…

我也不喜欢旅游。人头攒动的景区、矫揉造作的景点和无据可依的商品价格让我看到规划开发的愚昧、混乱和贪婪。

我愿意呆在家里,独自思考,一动不动。就像一棵树,一颗在城市里的树。看惯秋月春风、人来人往和车马喧嚣却不为所动 —
事实上树不能动,只有在微风吹来时才和着节拍轻轻颤动,抖落附在叶片上的灰尘。一颗长在灰堆里的树,总是仰望着天空,每每看到一片蓝天就兴奋得忘乎所以。
树不用为生计奔波,只需要天地的灵气就可以生长。树也不必考虑社会责任感,只要活着就在维持大气构成。树有充足的时间思考、思考和思考。

我却又喜欢旅行和探索,厌恶着江湖却向往着大海。那个被称作“这一伟大时刻”的镜头,我也看了 –
杨利伟打开舱门、调整姿态、然后对着镜头招手。那一刻,我仿佛觉自己就是那个航天员,这就是当时占据我头脑的全部思考。然而我又清晰地知道那不是我,因为我一定无暇招手。我看到无法想象的空旷和这个一眼就能认出的透着蓝色光亮的行星。它形成于46亿年前,呈现眼前这般景象也有超过4亿之久。如今,陆地表面的人数比它的年龄还多,他们就像池中的鱼,终日游来游去、忙忙碌碌却又无所事事。人类给地球的改变看起来只是给向阳面减少了一些绿色、给背阳面增加了一点微光。

Posted in Uncategorized | Leave a comment

Mac Mini (Intel) 升级内存

为了试一试 iPhone 开发,我在 Mac Mini (Intel Core Solo 1.5GHz + 512MB RAM) 上装了 Mac OS X 10.5.6 (Leopard) 和 iPhone SDK 2.2.1。 


From Mac Mini

写了个Hello world,发现慢得吓人。一看free memory只有10MB,方知事态严重。


From Mac Mini

有人已经成功给Mac Mini加内存,我准备效仿。工具备齐。


From Mac Mini

请来猛男用刮刀撬开盖子。从底部边缘接缝处插入,然后向上撬。既要小心,也要用力。前面有4个塑料卡扣,侧面各有6个。饭盒盖松开了!


From Mac Mini

小心揭开盖子,首先进入眼帘的是光驱。


From Mac Mini

用细十字螺丝刀依次拧下四个角上的螺丝。注意有一颗螺丝比别的长一些,记住它的位置。


From Mac Mini

有个角的螺丝孔被无线网卡天线挡着,必须把天线先取下来。两指捏下面的塑料片,同时向上顶。

接下来要深入敌后了,先用一字起子挑开前面的风扇电源插头。待会儿安装的时候切忌要接上!!!不然……

从两端挑松塑料扣,然后取下后面的光驱连线。

小心翼翼地揭开上面部分。试着用力,轻轻摇晃,松动后揭开。

内存插槽和一般笔记本电脑一样。本来插着2根256MB的内存。(注:图片更换内存后补的)

原配内存,收起来留作纪念。

换上新买的Kingston 2GB DDR2 800MHz。

装好(再提醒一次不要忘记接风扇),开机,2GB!

 

【完】

Posted in Computers and Internet | 3 Comments

C# 3.0 一行求方差

某python程序员说用C#求方差需要五十行。于是我试了试

python
def variance (*l):
      return sum([(i - sum(l) * 1.0 / len(l)) ** 2 for i in l]) / len(l)

C#

Func<List<double>, double> variance = numbers => 
                (from n in numbers select Math.Pow((n - numbers.Sum() / numbers.Count), 2)).Sum() / numbers.Count;

Console.Write(variance(new List<double> { 1, 2, 5, 6 }));
我很久没干过这么无聊的事情了……

Posted in .NET | Leave a comment

三角形拼图 这怎么可能?

我看了半天没看出破绽,于是用Canvas + jQuery UI做了个网页拼图,拼了半天终于发现了其中的奥妙。

我讨厌剧透,所以贴出代码占位,以免想独立思考的同学意外看到答案。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Missing Square?</title>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript" src="ui.core.js"></script>
        <script type="text/javascript" src="ui.draggable.js"></script>
        <script type="text/javascript" src="missingsquare.js"></script>
    </head>
    <body>
        <div style="float:left"><img src="missingsquare.jpg"/></div>
        <div style="float:left; margin: 10px"><canvas id="canvas-grid" width="150px" height="150px"></canvas></div>
    </body>
</html>

missingsquare.js
 
$(init);
 
var cellWidth = 18.5, cellHeight = 15;
 
function init() {
    drawGrid();
    drawTriangle1();
    drawTriangle2();
    drawPoly1();
    drawPoly2();
    
    $('#canvas-triangle1,#canvas-triangle2,#canvas-poly1,#canvas-poly2').draggable();
}
 
function drawGrid() {
    var cellCountX = 15, cellCountY = 15;
    var c = document.getElementById('canvas-grid');
    c.width = cellWidth * cellCountX + 1;
    c.height = cellHeight * cellCountY + 1;
    var ctx = c.getContext('2d');
    
    ctx.fillStyle = 'white';
    ctx.fillRect(0, 0, c.width, c.height);
    ctx.strokeStyle = 'rgb(127, 127, 127)';
    for (var i = 0; i <= cellCountX; i++) {
        ctx.moveTo(i * cellWidth, 0);
        ctx.lineTo(i * cellWidth, c.height);
        ctx.stroke();
    }
    
    for (var i = 0; i <= cellCountX; i++) {
        ctx.moveTo(0, i * cellHeight);
        ctx.lineTo(c.width, i * cellHeight);
        ctx.stroke();
    }
}
 
function drawTriangle1() {
    var canv = document.createElement('canvas');
    document.body.appendChild(canv);
    canv.id = 'canvas-triangle1';
    canv.width = cellWidth * 5;
    canv.height = cellHeight * 2;
    
    var ctx = canv.getContext('2d');
    ctx.strokeStyle = 'black';
    ctx.fillStyle = 'rgba(4, 145, 110, .5)';
    ctx.beginPath();
    ctx.moveTo(0, canv.height);
    ctx.lineTo(canv.width, canv.height);
    ctx.lineTo(canv.width, 0);
    ctx.fill();
    ctx.closePath();
    ctx.stroke();
}
 
function drawTriangle2() {
    var canv = document.createElement('canvas');
    document.body.appendChild(canv);
    canv.id = 'canvas-triangle2';
    canv.width = cellWidth * 8;
    canv.height = cellHeight * 3;
    
    var ctx = canv.getContext('2d');
    ctx.strokeStyle = 'black';
    ctx.fillStyle = 'rgba(194, 5, 3, .5)';
    ctx.beginPath();
    ctx.moveTo(0, canv.height);
    ctx.lineTo(canv.width, canv.height);
    ctx.lineTo(canv.width, 0);
    ctx.fill();
    ctx.closePath();
    ctx.stroke();
}
 
function drawPoly1() {
    var canv = document.createElement('canvas');
    canv.id = 'canvas-poly1';
    document.body.appendChild(canv);
    canv.width = cellWidth * 5;
    canv.height = cellHeight * 2;
    
    var ctx = canv.getContext('2d');
    ctx.strokeStyle = 'black';
    ctx.fillStyle = 'rgba(224, 152, 49, .5)';
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(canv.width, 0);
    ctx.lineTo(canv.width, cellHeight * 1);
    ctx.lineTo(cellWidth * 2, cellHeight * 1);
    ctx.lineTo(cellWidth * 2, cellHeight * 2);
    ctx.lineTo(0, cellHeight * 2);
    ctx.fill();
    ctx.closePath();
    ctx.stroke();
}
 
function drawPoly2() {
    var canv = document.createElement('canvas');
    canv.id = 'canvas-poly2';
    document.body.appendChild(canv);
    canv.width = cellWidth * 5;
    canv.height = cellHeight * 2;
    
    var ctx = canv.getContext('2d');
    ctx.strokeStyle = 'black';
    ctx.fillStyle = 'rgba(115, 198, 71, .5)';
    ctx.beginPath();
    ctx.moveTo(cellWidth * 2, 0);
    ctx.lineTo(cellWidth * 5, 0);
    ctx.lineTo(cellWidth * 5, cellHeight * 2);
    ctx.lineTo(0, cellHeight * 2);
    ctx.lineTo(0, cellHeight * 1);
    ctx.lineTo(cellWidth * 2, cellHeight * 1);
    ctx.fill();
    ctx.closePath();
    ctx.stroke();
}

 

貌似三角形,并非三角形。

简单起见,假设格子是边长为1的正方形。红绿两三角形直角边比一个是3:8 一个是2:5 ,不相似,锐角也不等,所以接在一起两条斜边实际上是有夹角的,这样便围成了一个狭长的三角形。

下面我们来算算这个狭长三角形的面积。
我们先求狭长三角形的三边长,然后用海伦公式求面积。
(define (triangle-area a b c)
  (let ((s (/ (+ a b c) 2)))
    (sqrt (* s (- s a) (- s b) (- s c)))))

(define (hypo a b)
  (sqrt (+ (* a a) (* b b))))

(triangle-area (hypo 8 3) (hypo 5 2) (hypo 13 5))

;0.4999999999994106 实际上刚好等于0.5。我还在想为什么……

所以上下两个图形的面积差为2 * 0.5 = 1,这就解释了那个空格。

 

总结

这个quiz非常巧妙,故意用扁长的格子,使红绿三角形顶角差异更小,组合图形的“斜边”夹角更加难以察觉,看上去完全就像是一条直线。

人总觉得“眼见为实”,看起来觉得是直角三角形便毫不怀疑,结果陷入困境。

反思一下,解决类似矛盾时,怎么才能避免落入思考的陷阱,明察秋毫呢?

  1. 严密推理。任何想当然的因果关系都必须求证。
  2. 严格确定推理的每个条件都成立。若果结果是错的,要么是推理不正确,要么是条件不成立。在这里,“组合图形是三角形”就不成立,在此基础上去算面积便是错的。
  3. 如果实在是找不到破绽,那就遍历怀疑每一个条件、每一个推理,再小再显而易见的地方都不要放过。
  4. 直觉会欺骗你,但严密的逻辑推理不会。因此当脑子和眼睛意见不统一时,相信脑子。当然,请确认你的脑子很清醒,否则可能会很惨……
Posted in Uncategorized | 3 Comments