烧包败家季

先是看小米青春版确实还不错, 于是把自己和喵用了一年多的 Desire 出掉, 这机器现在确实不怎么行, 最后两台一起 1k6 出给了一个水木上一个北邮才毕业的哥们, 谁都没亏吧, 还买这个机器的应该也知道配置如何, 而且机器我保养的确实还不错, 按很多贩子的新旧标准, 算九点九成都行.

然后周五上午抢了两个小米青春版, 等晚上喵回来跟她确认不要任何附件, 两个都是裸机下单, 走支付宝的快捷支付, 能刷信用卡, 这个很赞. 不过看起来发货还遥遥无期, 我就乐观预计下个周末能到吧. 付钱的时候还被疯狗同学骚扰说他信用卡额度不够, 让帮刷 1k5, 果然一问也是买小米青春版的.

某喵同学念叨了好久的 iPad, 貌似都一年多了, 昨天刷淘宝买卡时发现现在 new iPad 价格也还好嘛, 16G 的才 3k2, 果断出手, 顺丰今天下午就送到了, 赞速度.

联通最近几天搞促销, iPhone 和小米合约机都八折, 看起来很赞, 不过 iPhone 还是太贵, 而且 186 的套餐实在用不上, 今天晚上刷小米看是否发机器时, 跟喵又念叨一遍说给她弄个 186 的事, 然后忽悠上联通的合约机贼船, 最低 96 的套餐看了下也还是挺划算的, 选的号也挺好, 某喵很满意, 等明天联通的快递过来吧. 多买的那台小米青春版原价出掉好了, 有人有兴趣么? (本来我搜了下 1024/2048/4096 的尾号都有, 果然这才是 IT 民工的追求啊)

IT 民工烧包的时候还是挺狠的, 前几天囧猫君狗大户了一把, 配了台 9k5 的台式机去玩 D3, 那配置, 真狗大户…

机器学习手记系列 1: Pearson 相关系数

系列说明

按合总指示, 给人人的机器学习小组写点科普性质的东西. 其实自己好像一直都没去系统的学过这些东西, 都是野路子乱搞, 这里把过去学的一点东西写出来, 记录一下, 班门弄斧, 欢迎拍砖.

自己接触到的机器学习, 几乎都是在用历史预估未来某事件发生的概率 (广告点击率, 推荐接受度, 等等).

将这个过程细化一下, 首先都是对历史样本提取特征, 将样本转换成用特征序列来描述, 将同类事件合并, 然后通过某种拟合方式去让特征带上合适的权重, 用于描述事件发生的概率, 最后对还未发生的同类事件, 同样将其转换成特征序列, 用学出来的权重转换成预估概率.

这里有两个关键问题, 一是特征选取, 二是拟合还原方法. 特征选取是为了将样本做合理拆分合并, 同质的才划分到一起, 不然就最后的预估还是随机猜. 拟合还原方法是保证在对数据做了合理拆分后, 能将特征的权重拟合到原数据上且能在预估时还原成概率.

问题

对怎么选特征, 似乎从来都没有好的普适性方法, 但是怎么验证选的特征靠不靠谱, 方法倒是挺多. 先抛开选特征的指导方向不说 (说也说不清), 如果我们选出了一类描述特征, 怎么验证其效果?

特征效果验证

最直接粗暴也是终极方案就是直接拿到线上去应用, 好就是好, 不好就是不好. 这是一句彻底的废话, 也是真理… 不过实际操作中很难真的去这么做, 一是如果要完成整个流程会比较耗时和麻烦, 二是没有那么多线上资源拿来实验, 三是如果实验不好带来的负面影响会非常大, 广告会损失收入, 推荐会严重影响用户体验. 所以如果线下没验证的心里有谱, 没人敢直接拍上去实验的, 老板也不会让乱来, 都是钱和能转换成钱的用户啊.

退回到离线验证上, 终极离线验证也还是拿机器学习的产出 (分类树, LR 模型, 或别的什么) 去评估一部分实验数据, 然后看对实验数据的预估结果是否和实验数据的实际表现一致. 这个还是存在耗时耗资源的问题, 后面再说, 先说简单的.

不管是分类树, 还是 LR 或别的 boosting 什么的, 都是希望能找到有区分度的特征, 能将未来不同的数据尽可能划开. 如果特征是一个 0/1 特征, 那数据就应该能明显被分成不一样的两份. 比如在豆瓣, “历史上关注过计算机类别书目的人” 是一个 0/1 特征, 如果拿这个特征来分拆人群, 并评估 “未来是否关注计算机类别书目”, 评估指标的 1 绝大部分都落在区分特征的 1 中, 那说明这是一个非常正相关的区分 (曾经干过某事的人会继续干另一件事), 效果很好, 反之拿去评估 “未来是否关注女性言情小说类别书目”, 很可能评估指标的 1 绝大部分都落在区分特征的 0 里, 那是非常负相关的区分 (曾经干过某事的人不会再干另一件特定的事), 效果也挺好, 但是如果是评估 “未来是否会关注武侠”, 评估指标的 1 是比较均匀的散布在区分特征的 0/1 里, 那就说明这个特征对该评估指标没有区分度, 还不如没有. (这些例子是随便拍脑袋写的, 不保证其正确性)

如果是一维连续特征, 则最后总特征总可以转换成一个一维向量 (连续值可以离散化成整数区间), 跟 0/1 特征一样, 比较这个特征的自变量取值向量和对应到评估数据上的取值向量的相关度就能判断效果好坏 (正相关或负相关都是好的). 一般最简单的是使用 Pearson (皮尔生) 乘积矩相关系数 r 来做是否线性相关的判断, 英文 wiki 上的条目 Pearson product-moment correlation coefficient 对该系数的含义和计算方法有比较详细的说明, 中文翻译比较杂, 百度百科上的是皮尔森相关系数, 微软的翻译是皮尔生相似度. 简要的说, pearson 相关系数是一个 [-1, 1] 之间的实数, 取值越接近 -1 表示特征值和评估值越负线性相关, 越接近 1 表示越正相关, 越接近 0 表示越不相关 (只是线性, 可能会有其他相关的关系).

还是拿豆瓣的例子说, 比如 “历史上关注过计算机类别书的数量” 作为一个人群划分特征, 那这维特征的自变量向量会是 <0, 1, 2, ...>, 为了取值方便, 将其截断到超过十本的也等于 10, 则向量变为 <0, 1, ..., 10>, 如果去评估 “继续关注计算机类别书的概率”, 这个概率取值可能是 <0.0, 0.1, ..., 1.0>, 则其 Pearson 相似度会是 1. (当然, 这个例子举的太假了点, 先这么着吧)

将问题化简为算特征取值和评估指标的 Pearson 相似度后需要做的工作就会少很多, 直接跑个 Map/Reduce 从 LOG 里提取下数据, 然后看看值的相关性就知道特征是否有区分度了, 没区分度的可以先不考虑 (或者将曲线相关的可能转变成线性关系, 再判断), 有区分度的才继续走更完整的离线验证, 加入分类树或概率模型和其他特征一起作用看效果, 如果还不错就上线实验.

微软的 Excel 里就带了 Pearson 相似度的计算公式, 可以很方便的拿来评估, 说明和用法请见微软帮助页面 PEARSON 函数. 如果要自己计算, 可以参考 wiki 的这个公式:

Pearson 相似度计算公式

C 的实现源码如下 (注意某些情况下可能会有计算精度丢失, 带来结果的不确定性)

double pearson_r(double x[], int x_n, double y[], int y_n) {
  if (x_n != y_n || x_n == 0) {
    return 0;
  }

  double n = (double)(x_n);
  double sum_x = 0;
  double sum_y = 0;
  double sum_x_sq = 0;
  double sum_y_sq = 0;
  double sum_x_by_y = 0;
  
  for (int i = 0; i < x_n; ++i) {
    sum_x += x[i];
    sum_y += y[i];
    sum_x_sq += x[i]*x[i];
    sum_y_sq += y[i]*y[i];
    sum_x_by_y += x[i]*y[i];
  }
  double res = n*sum_x_by_y - sum_x*sum_y;
  res /= sqrt(n*sum_x_sq - sum_x*sum_x);
  res /= sqrt(n*sum_y_sq - sum_y*sum_y);
  return res;
}

紧张起来

五一前调整了一段时间的作息, 本可以每天早上七点以前起来, 做个操活动下筋骨, 每天工作效率也还好. 五一后又变成了早上睡不醒, 更糟糕的是晚上又开始失眠. 印象中真正遭受失眠困扰只有 09 年在香港的某一段时间, 赶 paper, 想 idea, 做实验, 每天过的兢兢战战.

到人人也有半年了, 但是很多事情进展的不如想象的顺利, 有环境的因素, 很多时候也还是自己的推动力不够, 没能找到一种更合适的方法将自己和团队赶到一条能很 high 的狂奔向前的路上. 有时候总会把原因推到外部原因上去, 比如有依赖的什么没有怎样, 又有等合作的数据没有怎样. 有些东西必须自己去推, 有些事情, 虽然说也要放事情下去做, 让下面人成长起来, 这样大家都能过的更舒服, 但是总难找到好的平衡点.

紧张起来, 让自己绷紧点, 同时对别人也 tough 一点, 没有成果, 再 nice 也毫无意义.

Python 的对象模型到底是怎样的?

今天写个小工具, 中间调的欲仙欲死, 直接上图, 大家看看这个程序会输出啥? 环境是 Python 2.7.2, 某 Linux 发行版 (服务器, 我也不知道具体是啥, 可能是 CentOS)

我的理解是如果我的写法有问题, 那应该两个 print m1 的时候的结果都跟 print m2 一样, 要不两个结果应该都不一样, 所以我确认了 model_path 都正确赋值后, 就认为 model_dict 也都被正确赋值了. 但是调试的时候发现两个 model_dict 调用的结果居然一模一样, 然后带的 model_path 还不一致 (当然, 我中间做了很多别的操作, 一开始没验证两个 model_dict 里面的内容). 后面把 model_dict 的内容也打出来就傻眼了, 这俩为啥都一样呢? 就因为一个是字符串一个是 dict? 跑到万能的 PUZZLES 群去问了下, 立马有人说你这个初始化不是应该在 __init__ 里做才对么? 于是将代码改成这样就 OK 了:

后来跟 @runnery@LeeMars 讨论了下, 终于明白是怎么回事了, 先上一张 @runnery 给我的解释图

按这个理解, 我的两次操作都是在操作类属性, 最后的输出应该都是 m2.reload() 后的值. 而实际上第一份代码的里, 两个实例初始化时, model_dictmodel_path 都还是类属性, 而调用 reload() 的过程中, 我做了一个 self.model_path = path 的操作, 而正是这个操作, 让两个实例分别将 model_path 变成了实例属性, 而 model_dict, 对不起, 我从来没修改过他具体的指向, 做的 clear() 操作什么的都还是在原来的 dict 上在操作, 所以一直是类属性.

总结: 这就是一个坑, 对语言不熟的坑

青春正年少

前段时间某喵生日时就唉声叹气的, 25 岁了啊, 好老了. 对于很多事, 跟过去比, 跟其他人比, 确实老了, 比如我爸这么大的时候我不仅会爬会走还会说话了, 比如跟那些天才比现在自己一事无成不学无术一无是处. 另外自己想一下日子过的也好快啊, 五年前的此时还在武大, 觉得不保研就去找工作, 正在找实习, 五年后, 经过了好多好多事情. 衣柜里还有好几件五年前的衣服, 感觉一切都不过是涣然一梦.

不过也好, 才 25 岁, 还是风华正茂的好时候, 有的是折腾的时候.

青春正年少, 未来若荣光.

The Cranberries 的 Never Grow Old:

杂而不精

今晚调模型调郁闷了, 发现没个顺手的工具确实不行, 于是把拖了很久, 本来指派给别人但一直没完成的 debug 工具给完成了大半.

很早写过一个 python 脚本, 在命令行下调用, 但是不方便输入和构造数据, 看起来也不是很方便, 但一直也有别的事情, 觉得这事优先级不高就一直搁着. 后来要做不同数据下的对比, 除了自己还是没人写这个, 于是把 python 脚本完善了下, 支持多输入, 多输出带对比, 还是没去写界面或数据构造. 再后来在做别的事情的时候, 顺便把这个 python 脚本也做了一次简单重构, 使其兼容线上配置, 逻辑也保持完全一致, 并将其作为一个 daemon, 用 php 写了个界面, 一堆参数可以简单的用 html 表单 (选择框, 下拉菜单什么的) 来生成, 默认值也好指定, 输出还是把原 python 输出到命令行的东西原封不动输出到网页, 但是不支持多输入. 最后就是今天实在忍不了土鳖的开两个窗口去调试对比 (顺带吐槽下其实是某从的显示器不够大, 开两个窗口并排放不开), 把那个 daemon 改的支持多输入, 并将输出做了一些简单的格式化, 还是裸文本但是看起来有条理多了, 并且把模型/数据/配置等支持在线重载, 免得换个数据就去 kill daemon 然后重启时又提示端口号还没释放.

晚上回来的时候看到汤永程在写他去参加天天向上的事, 说到语言学习, 就突然想回忆下, 自己到底一天都在用哪些语言, 好像我也会挺多, 但是都杂而不精. (前面那句话里两个语言指代不一样, 显然笨狗只会程序设计语言…) 按接触/学习的时间排序如下, 记录兼娱乐, 其中一些自己觉得好的书和资料给了链接, 希望对别人有帮助. 写完回头看, 怎么看都是一部扭曲的非主流码农成长史, 而且发现这都能当简历了 -.-|

PASCAL
– 第一个正式去学的语言, 高中玩 OI 竞赛时学的, 也仅仅用于竞赛而已
– 可以应对 03 年 NOIp 高中组级别的题, 没做过实用化工作, 竞赛中用过两年多, 现在应该忘的差不多了

C
– 大学入学前跟着去玩 ACM 开始去学, 一直到现在还在学, 大一作为必修课马马虎虎学过去了, 到大三大四时通读 C 程序设计语言 并完成所有例题和习题, 很薄的一本真的认真看完花了好久, 这本书真的非常赞, 后面就在工作中一直作为主力高级语言在用了
– 可以应对一般的 ACM 水题, 能独立完成计算机专业 C 语言大作业, 看过/实现过一些简单库函数, 结合 APUE (Unix 环境高级编程) 将其和 *nix 底层对接学习了下, 学习/实习/工作中将其混着一点点 C++ 用了几年, 参考别人的开源项目完成过一个 Online Judge 的内核, 这些年代码量加起来我猜应该够十万行了, 但是大部分还是在已有框架下写策略细节, 没做过大项目整体框架比较遗憾

C++
– 单独从 C 里列出来是想说明我真的不会 C++… 曾经在玩 ACM 的时候用过一点点 vector 什么的, 但是这种应该不叫去学 C++ 吧, 大四实习时因为工作需要时翻了下 C++ Primer Plus, 翻了几章后发现买错书了, 本来应该是买 C++ Primer 的… 刚好那段时间的实习也都在做偏策略的东西, 一直没去看工程细节, 结果就一直不会工程了
– 能看懂简单的 C++ 代码, 能将简单的 C++ 写成 C, 剩下的, 我真的不会 C++…

HTML
– 忘了啥时候开始学的了, 反正成天看网页, 看人源代码, 抄抄改改, 从学校图书馆借过很土鳖的类似 xx 天入门的书学过下后就再没系统的学习过, 倒是折腾过很多地方, WHUACM 那现在还有不少页面是我写的或是基于我写的改的, 后来做 RA 和工作时发现很多需要可视化的结果还是用 HTML 来的爽, 零零碎碎写过一些在行家眼里看来就是三岁小孩折腾的小站
– 能看懂简单的 HTML 框架, 能写简单的 HTML, 比如 yewen.us 这样的 (blog 是 WordPress, 特此说明)

CSS
– 这算语言么? 经历/水平同 HTML

Java
– 大学的选修课, 也仅仅到大学的选修课, 考试过后就没再写过了, 买过 Thinking in Java 但是从来没看完过
– 能完成几年前 Java 1.4 时代的课程大作业水平, 仅此而已, 我真的也不会 Java (猎头问你是 Java 程序员还是 C++ 程序员的时候是最伤人的时候, 我回答都不会后对面口气立马就变的很鄙夷, 连猎头都 bs… 这码农当的太失败了)

JSP
– 本来是想去接手第一版的 woj 然后做第二版的, 后来还没开始正儿八经学就发现不如推倒换 php 重来
– 不会, 曾经还会在 Eclipse 里开个新工程的, 也仅仅会开个新工程, 现在啥也不会了

Linux Shell
– ACM 比赛会用到, 同时本着 “一个合格的计算机专业学生应该会 Linux” 这样的想法自己去折腾过, 选修课上迷迷糊糊学过, 实习的时候开始天天用, 一直都在抄别人的来改, 到现在还是三脚猫功夫, 一直没去找系统学习的方法, 也懒得去系统的学, 觉得是工具用的时候能捡起来就行了, 目前计划在可预见的未来系统的去学学 Shell 脚本学习指南
– 日常工作使用语言, 能写简单的控制脚本, 有若干脚本还在线上系统应用

awk
– 第一次实习的时候因工作关系开始用, 也是从那个时候开始领悟 Linux 的设计哲学, 就是用一堆合适的工具去干一件超酷的事情, 而不要想着为了做一件大事情而去发明一个万能工具 (所以我不是 Emacs 党么?), 一直也还是抄抄改改, 没去系统去学, 有 sed 与 awk 这本书, 但还是只想当工具书用不想系统去学
– 日常工作使用的简单脚本, 能写比较简单的文件级 awk

sed
– 同 awk, 用的更少, 几乎忘光了, 用的时候查 Google/Baidu/参考书

C#
– 某年为了贪一次微软夏令营的机会答应了别人的坑蒙拐骗去当武大微软技术俱乐部主席 (结果那年居然没办夏令营, 真是… 动机不纯必无善果), 一看自己会都跟微软特色没关系, 还是学点啥吧. 瞄上 C#, 从 MSDN 上下了个视频教程对着写完过, 然后, 然后就没有然后了. 在 MSRA 的时候修改的那个原型到底用的 C# 还是 C++ 都忘记了
– 不会, 但是真心觉得比 Java 优美, 特别是现在还在持续改进中

Python
– 好奇心强显然会对各种东西感兴趣, 从研究生开始将 python 作为主力思考/原型实现语言, 写起来确实快, 而且喜欢用缩进来控制语法, 从根本上杜绝了把代码写的很难看或读到很难看的代码 (当然, 有人炫技也还是可以很变态的…). 从 A Byte of Python (中文版) 入门, 再通过 Dive into Python (中文版) 略提高, 再又是抄抄改改了, 成天拿来做系统原型和算法/策略调研和实现, 压根没做 Web 框架什么的 (Django 什么的继续不会). 手头有一本 Python Cookbook, 无奈此书奇技淫巧过多, 只敢将其当工具书偶尔翻看
– 日常工作使用的主力语言, 若干自己的小系统, 若干系统原型 (还有一些一直懒得改和没人改的在线上用)

PHP
– 既然会 HTML 了总该会门动态语言来做交互吧, JSP 看起来就很重那就玩比较好上手的 PHP 咯, 又是一门通过抄抄改改入门的语言, 到现在还是抄抄改改的水平, 手里常备PHP官方手册做参考, 反正也不是项目必须语言, 做点调试工具什么的还是够了
– 菜鸟入门水平, 有一些小原型和调试工具

JavaScript
– 没学过, 不会, 会抄简单的样例连蒙带猜的改, 还是比如 yewen.us 的导航栏效果, 比如会知道怎么改参数用 HighCharts 的简单功能

Perl
– 一直觉得 Perl 是很神奇很牛逼的语言, 但是由于此语言装逼者众多, 且语言本身设计初衷很大一部分就是为了装逼, 而且本来很多不想装逼的因为语言特性又很容易将代码写的巨扭曲, 所以一直没能像别的那样连蒙带猜拆拆改改的去入门乃至提高. 为了使用和改动迪生大神的某 perl 脚本时下决心去学学, 去年换工作前利用平常和周末不加班省出来的时间完整的学了一遍 Perl 语言入门 (小骆驼书), 感觉确实很精妙很方便, 但一直没实际用过, 有需要的时候大部分时间都顺手用 python 解决了, 现在恐怕又忘光了, 但是要捡起来应该比较快, 但要估计这辈子都不打算达到装逼级的熟悉和精通了, 打酱油的 3P 党就好 (Perl/PHP/Python)
– 系统入门过的语言, 从来没实战过的语言

果然都是杂而不精, 同笨狗一贯性格, 甚至现在都还有兴趣去看看 Go 和 Lua, 前者是因为 Google 和设计者名身在外想看看是不是能从中看出点什么未来趋势, 同时悟点以前没悟出来的本质性东西, 后者是听说游戏领域用的很多 (这个应该是受云风影响), 而且很方便实现 robots 做模拟测试, 想看看以后工作中是不是能用的上 (实在不知道 robots 翻译成什么好, 总感觉用 机器人 这个词怪怪的). 如果闲的蛋疼, 还想去看看 ruby 和 lisp, 一个是经常拿来跟 python 对比的语言, 自己一直用 python, 也想看看他山之石, 另一个好歹也活了这么久, 是跟计算机科学和人工智能一起萌芽发展起来的东西, 膜拜下也好, 而且随着多核架构和并行架构越来越普遍, 据说会更有优势?

不过, 要专注, 要做事, 要带人, 而且参考一贯的光说不练的风格, 估计也就这样了… 偶尔打酱油插科打诨还可以.

有些笔试题的存在意义就是搞笑么?

昨天有个以前一起玩 ACM 的队友跟我说个题, 说是前几天腾讯实习生招聘的笔试题之一, 原文如下

已知a[0],a[1]…a[n-1]
现在要构造b[0],b[1]…b[n-1]
其中 b[i]=a[0]*a[1]*….a[n-1]/a[i]
要求,不能用除法,不能使用其他任何存储变量,除了循环变量i,j之类的
要求O(1)的空间复杂度,O(n)的时间复杂度

关键是不能用除法

看到这题后的第一反应是这特么不会爆类型么? double 也经不起这么搞吧. 然后就冷静下来想怎么解决, 不能用除法就避开那个除法操作咯, 把 b[i] 的推导公式换成 a[0]*…*a[i-1]*a[i+1]*…*a[n-1] 就是了, 一看就像个 DP. 推了下后写了这么个代码 (假设所有数都是 int 且不爆类型大小)

// 先构造一遍, 使得 b[i] = a[0]*...*a[i-1]
b[0] = 1;
for (int i = 1; i < n; ++i) {
  b[i] = b[i-1]*a[i-1];
}

// 逆序, 使得遍历到 b[i] 时, sum = a[i+1]*...*a[n-1]
//这时候 b[i]*sum = a[0]*...*a[n-1]/a[i]
int sum = 1;
for (int i = n-1; i >= 0; --i) {
  b[i] *= sum;
  sum *= a[i];
}

然后被提醒说 sum 这个变量也不能有, 好像原文中是说了不能用其他存储变量… 但是这不还是 O(1) 的空间复杂度么, 腾讯好像经常喜欢搞这种无聊的要求 (卡一两个变量), 于是当场就怒了

叶文/Snoopy阿排 20:41:49
那把他写到循环里好了… -.-|
叶文/Snoopy阿排 20:42:32
老实说, 这个题出的很烂…
叶文/Snoopy阿排 20:42:36
烂的无与伦比
** 20:43:05
哈哈
叶文/Snoopy阿排 20:43:15
首先, 这种奇技淫巧没有任何意义
其次, 连乘更大的问题是爆数据类型…
** 20:44:41
是啊
** 20:44:51
关键一点就是没有任何意义
叶文/Snoopy阿排 20:45:41
而且, 要真抠细节, 他没说不能修改 a 的值, 我在做逆序的时候把 sum 换成 a[] 就行了

果然改 a 数组的值就达到目的了? 好像是? 这样有意思么?

最后, 真心求既不使用多余变量, 且不修改 a 的值的做法.

入手 X200 UltraBase

YY 了多年的 ThinkPad 底座, 终于用一个几乎全新的二手货圆梦.

以前没有本的时候就很好奇底座这个东西, 07 年在 G.sh 实习时第一次实际见识了底座的便捷性, 偷用过几次后发现各种爽, 后面一直没有自己入手, 一是没需求二是太贵 (全新的一千多, 太烧包了). 在淘宝上关注过二手, 但是总觉得二手贩子的货很靠人品, 而且如果不是当面交易, xx 成新总有不同的理解. 前几天某喵说今年你都给买了这么多东西了, 生日我送你点啥吧, 想了半天觉得自己没有急需的必需品, 想烧的东西太多太贵不符合攒老婆本的大方针. 但是某喵一直说还是送我点啥吧免得老觉得欠我的, 最后想起来笔记本底座这么一货, 说也不算贵, 就这吧.

淘宝上搜 “X200 底座”, 最近有成交记录的最便宜的是广州一个卖家, 340 的样子. 收藏夹以前莫名其妙还收藏了一个广州的卖家, 299, 加 25 顺丰, 评价不错, 跟老板聊了下也都是很实诚的人, 问了几个问题后就下手了. 一是为什么搜索搜不到, 解释是 “他家的底座一般都跟二手机打包卖, 所以设定了无法搜索到”, 这个解释倒是挺靠谱的, 不知道淘宝是否真有这个功能; 二是机器成色九六成新, 功能齐全, 没有钥匙但是有光驱位减重模块.

昨天下午卖家在广州发货, 今天下午收到顺丰快递, 拿出来试用了下很赞, 比我想的还要好很多. 超乎想像的一是成色几乎全新, 果然不同人对成色的理解是不一样的, 这次运气爆表; 二是本来说没钥匙的结果带了钥匙. 其他就中规中矩了, 上图: (新浪微博图床)

X200 UltraBase 真机图

X200 UltraBase 真机图

接口
背部: 电源 (ThinkPad 标准 20V 接口), USB 2.0*3, VGA, DisplayPort, 耳麦, RJ45 网孔, 锁孔
右侧: 锁, USB 2.0*1, UltraBay (就是光驱接口, 也可以换第二块硬盘的托架, 数字小键盘什么的, 我这上的是个减重模块, 就是块造型贴切的塑料片, 免得空一块难看, 同时挡住免得进灰)
正面: Dock 接口, 很多定位孔和锁扣, 说明书, 漏水孔
左侧: 第二块电池充电器, 弹出按钮 (笔记本放上来旁边亮红色禁止图标, 按了变绿色三角后猜能扳弹出扳手, 类似弹出 U 盘的操作, 该操作笔记本上也能完成), 弹出扳手 (图上被我掰开了)
前面: 锁定, 开关, 立体声喇叭 (这个很出乎意料, 本以为就是两片孔)

使用小记
真的很方便很方便, 终于从 YY 变成实战了. 笔记本放底座上的时候机身自带的 VGA 接口失效, 必须插底座, 这个, 确实应该也不会脑残到放底座上还插显示器到机身, 而且 X200 估计也就只能支持两路输出 (这个没查资料验证, 印象中是). 笔记本放底座上的时候全部 USB 口都是可用的, 这样就变成了总共 7 个 USB (机身*3, 底座背部*3, 底座右侧*1), 底座上的插根数据线随时连手机倒是挺方便的, 或者长期挂个移动硬盘 (这样好像还不如把 UltraBay 用起来…). 为了验证底座上真的是立体声喇叭而不是两片孔, 用 Windows 声音测试后, 再开豆瓣电台玩, 上来就是许茹芸的日光机场, 飞机起飞的声音让我以为是风扇啸叫了… (一说明这个喇叭的音质改善还是很明显的, 我这种木耳都能听出来, 二是这个底座相对于我以前都在后面架点东西把笔记本底部架空的放置方法确实让散热变差了)

概率题, 另一个孩子是男孩的概率

好久没写日志, 今天看到个有意思的问题, 也能很快说清楚, 记录一下.

问题: 有一对夫妇有两个孩子, 已知其中一个是男孩, 则另一个也是男孩的概率是多少?
候选答案一: 因为生男生女的概率都是 1/2, 每次生育都是独立事件, 所以概率是 1/2
候选答案二: 因为两个孩子的性别总共有四种等概率可能, 分别是 男男, 男女, 女男, 女女, 现在已知其中一个是男孩, 排除掉 女女 这 1/4 的概率, 所以另一个为男孩的概率是 1/3

这个问题引起了很多争论, 两种说法的支持者都很坚定. 今天看了一堆讨论, 最后发现其实是对题意理解不一致导致的, 关键问题就是 “已知其中一个是男孩” 代表了什么意思.

说 1/2 概率的把那句话理解成 “已知大孩子是男孩”, 所以把四种等概率可能排除掉了 女男, 女女 两种可能, 剩下两种可能里, 小孩子是男孩的概率是 1/2.
说 1/3 概率的把那句话理解成 “已知其中有一个孩子是男孩, 但是不知道是大孩子还是小孩子”, 所以只能排除 女女 这一种可能, 剩下三种可能里, 另一个孩子是男孩的概率是 1/3.

感觉我应该把分歧说清楚了. 下次如果有人遇到类似问题的时候, 可以看看问题中的条件是否有 tricky :P

试了下 Win8 Custom Preview

大约半年前试过 Win8 的 Develop Preview, 当时就图个乐看了下, 没什么 metro 的应用, 传统 win 应用也没发现 win8 上用起来比 win7 爽的任何地方, 装好后就再没用过.

等 Win8 Custom Preview 发布, 看了下发布记录都是一片赞扬, 想 DP 算 beta 的话, CP 应该是 RC 了? 之前用 Win7 时, 就是 Beta 还很多小毛病, RC 开始用的非常爽, 果断跟进 Win8 看看.

昨天早上起来开旋风, 加离线任务, 用离线加速先扒到服务器上, 早上在家拖了一个多小时还没拖完, 4M 的网还是不够快, 晚上公司没什么人时下完, 用微软的 Windows 7 USB DVD Download Tool 刻到 U 盘上, 拆出淘汰下来的一个笔记本硬盘, 全新安装.

Win7 USB DVD Tool 官网地址太难找, 给个天空的链接吧 http://www.skycn.com/soft/57523.html
Win8 简体中文 32bit 旋风离线地址 http://url.cn/4C3m9c
Win8 简体中文 64bit 旋风离线地址 http://url.cn/1uTrBq

机器配置: ThinkPad X200, P8700 (2.53G, 2C/2T), 4G, 100G (7200rpm), GM45

感觉不到十分钟就完成了安装过程, 开始配置, 发现没抄序列号, 而且不像 Win7 可以先跳过去, 进系统后再配. 好吧, 拿手机一搜, 直接在搜索摘要里就看到, 所有语言所有版本都一样的: DNJXJ-7XBW8-2378T-X22TX-BKG7J

相比之下配置过程显得更慢, 绑定了 Microsoft Account (就是以前的 Live 帐号), 把头像等个人信息都拖了下来, 机器密码也是那个帐号的了, 并按提示输手机号好找回密码 (这就真是大杀器了). Gmail 内立马就收到两封邮件说绑定了手机号和新的设备名.

随便瞄了下, 和 Develop Preview 没啥变化, 某些细节做的更完善一些, 整体来看变化不大. Metro 下原生的天气, 地图, 股票等几个应用都被提示不在我所在地区的电子市场提供, 你妹的不提供你放桌面上干啥, 而且我去电子市场强制下载后还是跟我提示一样的错误, 明明后面真正的内容都出来了, 错误框挡得住操作挡不住显示啊. 电子市场现在还是没多少东西, 不知道是不是因为我装的中文系统外加把地区选成了中国, 游戏稍微多一点, 社交就只有 WordPress.com, 人人, QQ 三个.

Metro 下很多快捷键和手势果断还是需要有个简单教程的, 微软这个魂淡以为大家都是神仙自然就会了么? 我看了那么多发布会和试用记录, 没几个有手势教程的. 由于笨狗也没学会, 所以就不写教程误导群众了. 只知道 Metro 下按住大概标题栏那个位置, 拖屏幕左边是锁定在左侧, 拖右边是锁定到右侧, 锁定后拉分割线可以恢复全屏, 点右键呼出 Metro 应用的菜单, 按住标题栏往下拖是关闭应用 (不然按 win 键退出时只是把应用挂起), 鼠标停留到左下角可以呼出类似传统开始按钮的一个 Preview 界面, 鼠标停留到左侧可以看到最近打开且挂起在后台的 Metro 应用, 鼠标停留在右下角可以让右侧滑出一个操作面板, 可以进行所有应用搜索, 配置面板什么的.

很多发布会记录上说的流畅度笨狗完全没感觉到, 虽然这个机器配置是挫了点, 但是 CPU 和内存应该都是扛得住的, 只有可能是硬盘在拖后腿 (07 年买的希捷 7200.2 100G 盘, 现在随便一个大点的 5400rpm 盘都能秒杀他, 更别说微软官方演示用的 SSD 了), 而且打开任务管理器, 发现有几个系统服务非常吃 CPU, 平均有 1/3 以上是被系统服务吃掉的.

下了原生的 Cut The Rope (割绳子) 玩, 跟之前发布到 IE9 上的一样, 没什么新意. 系统自带的弹球大炮倒是变成真 3D 了, 只发现左右 Ctrl 是下面的挡板, 没找到发射和其他控制键, 球自己出去的, 而且 3D 太花了看不太清 :( 就跟我看魔兽 3 跟星际 1 的感觉一样. 下了原生的人人和 QQ, 其中人人能登陆进界面, 但是界面非常不友好, 很多留言看不全, 回复只能回楼主不能回具体的人, 等等等等各种不爽, 果断还是换用浏览器上了, QQ 更是连好友列表都刷不全就卡那不动了, 屡试不爽, 从没成功过. 装传统界面的 Chrome, 发现更喜欢 Chrome 渲染出来页面布局字体效果. 自带的输入法经常自作聪明切到中文, 按 shift 切换中英文有点小不习惯, 虽然现在写东西本来就是开着中文输入法也用 shift 切, 装 QQ 拼音纯净版, 很疼的发现很多程序默认就是中文模式的输入法了, 找了半天还找不到怎么改成默认英文.

播放音乐的有传统界面的 Windows Media Player 和 Metro 下的音乐, 这俩居然没法统一, 经常一点就变成了两边一起放. Metro 的音乐 Collection 似乎要联网? 而帐号又提示没登上去, 到底是天朝本身就被无视了, 还是 GFW 干的? Metro 界面的音乐没找到怎么建播放列表, 只能单曲播放, 疼…

晚上折腾完后关机, 之前看过说开机快关机慢, 看半天没灭就直接睡觉了, 结果早上起来还没关掉, 怒啊, 按电源键, 进入休眠了, 唤醒, 解锁, 输完密码后卡死了, 再休眠, 唤醒, 解锁时想了下直接关机吧, 这次倒挺快, 小几秒就熄了. 重新开机关机就很快了, 而且好像系统服务非常吃 CPU 的现象也有所缓解, 你这是要闹那样啊.

早上关了 Win8 后把硬盘拆出来, 插回之前的硬盘, 正常回到 Win7 下来工作, 周末如果有空再折腾看看. 总结: Win8 现在基本还是不可用状态. Metro 下的应用太少, 很多都不能用, 能用的很多也都不靠谱. 如果不用 Metro 界面, 没发现传统界面比 Win7 有多大优势 (资源管理器的 Ribbon 界面有点用, 但是也没有非常有用), 那为啥不直接用 Win7?