说说 Windows 10

近几天 Windows 10 瞬间成了热门新闻,原因大概是微软历史上第一次以在线更新的方式发布了新版 Windows。Windows 7、 8 和 8.1 的用户不用特地下载或是购买安装盘,只要等待一会即可免费升级到 Windows 10。

尽管随着网络技术的发展,操作系统的地位日渐下降,平台的作用被浏览器和应用取代了。但对于这一款重量级产品,我还是很乐意吐槽一下的。

先来说说 Windows 10 的新特性:

开始菜单回归

鲍尔默做过的最大失误大概就是强推 Metro 界面了,在一个超过 20 寸的非触摸屏上全屏显示 Metro UI 简直美得不敢想象。在一个有着数十亿用户的平台上做出这么恶心的界面改动,足以显示鲍尔默当年是有多么想在移动端扳回一城,然并卵。

新的时代到来之后,开始菜单的回归是一个必然之举。Windows 8 的桌面(Desktop)用户应该会很喜欢这个变化。

Cortana

Cortana 是一个语音助理,和 Apple 的 Siri、Google 的 Google Now 是一类的产品。她可以接收语音指令,做一些智能的操作,比如设置闹钟什么的。Cortana 最初是在 Windows Phone 中发布,而 Windows 10 把她集成了进来。

具体 Cortana 在 Windows 10 能发挥何等的功效,目前还没看到详细的评测。不过由于我的家用影音系统用的是 Windows,我对 Cortana 相当期待,终于可以在一集电影看完对着电视说“Hey Cortana, play the next episode”,而不用使用遥控器。希望这样的功能可以早日实现。

令我印象深刻的功能就这两个,接下来吐槽一些改或没改的东西:

Edge

Microsoft Edge 是 IE 的后继产品,也就是说,Windows 10 中不再有 IE 浏览器了,取而代之的是 Edge。两者的图标很相近,普通用户应该不会感受到多大的差别。

且不说 Edge 比起 IE 来有多么大的进步,微软在产品名称上一直都不怎么出彩。之前 Live 用了十几年,觉得不爽了,改成了 Bing;MSN Messenger 用了十几年,不爽了,改成 Skype;Hotmail 用了十几年,不爽了,改成 Outlook。然而这些产品改名之后,依然不温不火,完全没有达到改名的目的。现在 IE 改成了 Edge,我们也不必指望 Edge 是全新开发的,毕竟 IE 十几年的积累摆在那里,Edge 用三年的时候超越 IE 是不可能的事情,所以 Edge 的内心依然流着 IE 的血液。

App Store

iPhone 成功了这么多年之后,微软依然没有意识到 App Store 之于 iPhone 的重要性,Windows 10 的应用商店依然不支持传统软件的安装。

Windows 最大的竞争力在于它的兼容性和庞大的软件生态环境,十几年前的软件装在最新版的 Windows 中依然可以运行。但软件的繁琐不统一的下载、安装方式一直都没有得到解决。用户不得不从各种不知道安不安全的网站上下载软件,双击之后也不知道安装程序到底干了什么,提心吊胆地使用着各种软件。而 App Store 的优势在于,其中的所有应用都经过了 Apple 的审核,而且安装和更新过程统一,容易上手,不用担心装了一个应用而危害到系统安全。

Windows 目前的策略貌似放弃了传统的软件,要求所有新软件使用新的 API 开发,使用统一的界面风格,才可以在自己的应用商店上架。这样就把自己最大的优势放弃掉,用自身的弱势和 Apple 的优势竞争,结果可想而知。

家庭影院模式

Media Center 被正式放弃,不知道做出这个决定的老板,看到新的 Apple Music 是什么想法。现在各种电视盒子、播放器这么流行,用户渴望以一种简单的方式来看电影、听音乐,而目前各种不同的软件的操作方式多少有所不同,微软却不想着提供一种统一的用户体验。或许由于早期微软过于特立独行被打击地太厉害,导致现在做什么都缩手缩脚的,自己把自己禁锢在所谓的“平台”上,市场全被其它厂商抢走了。

吐槽结束。

至于要不要安装 Windows 10,还是那句老话,软件要用最新的。

HHVM 近期频繁崩溃

近期 HHVM 频繁崩溃,一天数次,导致博客不稳定。尽管我有一个后台程序重启 HHVM,但毕竟有那么几分钟的不能响应时间,多少有点不爽。于是就研究了一下崩溃的原因。

在 /var/log/hhvm/error.log 中能看到类似下面的信息,Core dump 了:

然后再去看 /tmp/stacktrace.1173.log,发现如下信息:

说是要增加 Eval.JitASize 的大小。Google 了一下,这个数值指定了 HHVM Translation Cache 的大小。对 HHVM 不是特别了解,猜测是 HHVM 会把 PHP 翻译成 HH 的代码,并缓存在 Translation Cache 中。这个 Core Dump 的原因大概就是 Translation Cache 用完了。

根据 Issue #2851 的讨论,在 server.ini 中加入如下设定,把 JitASize 提高到 128M:

讨论中也有人说这个设定并不能完全解决问题,顶多就是把每天一次的崩溃延长到几周一次,后续进一步的完善还在 Issue 5233 中讨论。

WWDC vs Google I/O 2015

今年的两个大会距离很近,相隔不到两周,可以算是 Android 和 iOS 的正面冲突了。我抱着很大的好奇心看完了两边的 Keynote,顺便来点评一下。

我个人比较关心的是两家的支付功能,手机支付是生活中一项极好的进步,把厚厚的钱包变成了薄薄的手机。今年宣布的消息中,最讽刺的是 Google 抛弃了 Google Wallet 而转向 Android Pay 平台;而 Apple 则在 Apple Pay 的基础上增加了 Wallet(由 Passbook 演进而来)。Google 的支付系统看上去并没有一个很好的规划,早在 2006 年 Google 就发布了 Google Checkout 支付服务,用于在线支付。Checkout 死了之后进化出 Wallet,依然没什么好转,在 Apple Pay 发布之后,Google 被迫提出了 Tap and Pay,但依然不温不火。这一次又把产品名称改成了 Android Pay,这样改来改去有什么意义呢,人家 Apple 已经进军英国市场了……

Google 另一个落后的地方是照片流。这次 I/O 上发布的 Google Photos 算是一次大步追赶了,新的照片应用、无限空间、智能归类,看上去都是很不错的功能,但有什么用呢,Apple 家这些功能或多或少早就有了,照片分享(照片流)的功能还比 Google Photos 好用……

另外在操作系统层面 Apple 也完胜,虽然 Apple 其实也没什么功能可以多说,大多数时间很沉闷,但 iOS 9 的分屏应用直接给了 Android 一记闷棍。Android 大概已经把平板给放弃了,手机和平板的系统看上去一模一样。iOS 推出分屏应用功能,很有可能是为了 12 寸的大平板做铺垫,iPad Pro 将来可以会和 Chromebook 正面交火。如果用着 i7 芯片、4G 内存的 Chromebook,性能还没有 ARM 芯片的 iPad 好,那 Google 的脸可就要丢大了。

至于发布会上面提到的其它改进,不说也罢,都是一些锦上添花,可有可无的内容。总体而言,今年没什么劲爆的功能值得期待。

Yosemite 中 Spotlight 搜索的快捷键

Mac OS 10.10.3(Yosemite)中,Spotlight 变得更好用的,直接在屏幕的当中显示一个大大的搜索框,并且搜索结果也有很好的展现效果,如下图:

只不过 Spotlight 的按钮在屏幕的右上角,一般不太容易按到。把鼠标慢悠悠地移到右上角,只是为了一个搜索功能,真是麻烦。不过呢,Spotlight 可以用快捷键唤出,这个快捷键呢?是“Command + 空格”。

咦?这不是切换输入法的快捷键么?对,Apple 不小心把两个快捷键设置成一样的了。一旦输入法开启之后,Spotlight 的快捷键就失效了。要更改快捷键设置,可以在“键盘”选项中,找到 Spotlight,然后选择一个没有用过的快捷键,比如我就设置成了 Command + T,如下:

HHVM 崩溃后自动重启

不知为何 HHVM 不具备进程保护的能力,也就是说,HHVM 启动之后,只有一个进程,并且崩溃之后没有自主恢复的机制。大概是因为 Facebook 的服务器中有统一的方式来保护各种服务进程,也就没有在 HHVM 中单独做一份。但对于普通用户来说,HHVM 的稳定性有点弱。

今天一早,有位朋友提醒我博客没法留言了,现象是连接中断。后来我排查了一下发现原因是 HHVM 崩溃了,具体的表现有人在 Github 上已经反映过。好在我之前就有所准备,写了一个 Cron Job 定时检查 HHVM 进程,如果进程不在了,就自动重启 HHVM。这个脚本每两分钟运行一次,看来那位朋友不巧,正好撞在那两分钟的枪口上。

检查的脚本是从 Stackoverflow 上抄来的,代码如下:

虽然两分钟的间隔不算完美,但配合上 WP Super Cache 的纯净态支持,可以极大程度上避免博客下线的窘境。真正完美的方式,是开启两个(或多个)HHVM 进程,然后在 Apache 端做一个负载均衡,这样的话,即使有一个 HHVM 进程挂了,也不会影响到博客的使用。网上有人这样试过,但看上去很麻烦的样子,我还是等 HHVM 更新吧。

话说 Facebook 宣布这个月底有一个重大更新,HHVM 3.6,其中包含了很多稳定性方面的修复,值得期待。

投靠 Ubuntu

经过一番纠结之后,我还是把博客换到了 Ubuntu 之上。

之前提到过,从 AWS 转到 GCE 的时候,被迫选择了 RHEL 7(Redhat Enterprise Linux),因为只是 RHEL 7 是完全兼容 AmazonLinux 的。虽然 RHEL 需要另外付费,但为了平滑过渡,我还是以谨慎为先。

RHEL 有非常完善的商业支持,文档很齐全,有什么问题一查就可以明白。唯一的问题是,它的收费太高了,GCE 上面用一个月需要 50 刀以上,且不像主机一样用的时间长会打折,这样算下来,年费和一个 Radhat 的订阅差不多价格。但是我并不需要什么客户支持,技术问题都可以靠 Stackoverflow 搞定,这个订阅费用就白白浪费了。这也是我转向 Ubuntu 的主要原因。

还有一个原因是 HHVM。HHVM 是 Facebook 的 PHP 引擎实现,完全兼容 PHP 5.5 (及以上)。WordPress 从 3.9 开始,完整兼容 HHVM。

HHVM 的响应时间,据说是 PHP-FPM 的一半,也就是提升了一倍的吞吐量。原生 PHP 要做到这个效果,需要等 PHP 7 发布才行。看着各种发行版对于新软件的保守程度,不知道 PHP 7 要到什么时候才能成为主流。另一方面,Facebook 的研发能力肯定要比 Zend 来得强,等 PHP 7 发布了,HHVM 的性能肯定会更强。于是我就抛弃了原生 PHP,转投 HHVM。

当然,我也可以在 RHEL 上自己编译安装 HHVM。我试过,GCE 的机器编译了一个小时,我都快睡着了才编译完成,但安装(make install)的时候,告诉我某个文件不存在 -_-。我还是老老实实用官方的安装包吧,而 HHVM 官方只提供了 Debian 系列的安装包。

为什么没有选 Debian?Debian 保守到现在还只提供了 Apache 2.2,无语。

那也可以转投 Nginx 呀?我不高兴重写那一堆的 RewriteRule,并且 PageSpeed 在 Nginx 上也需要自己编译安装,不想再重蹈 HHVM 的覆辙。

由于 HHVM 和 PHP-FPM 的用法几乎一模一样,转换过程没出现任何问题,我做的唯一的工作就是重新设置了 Apache。花了几个小时,不过没什么难度,转换过程很顺利。

现在博客已经运行在 Ubuntu 14.04 + Apache 2.4 + HHVM 3.5 + MySQL 5.6 之上,欢迎测试,有问题请留言。

在 Git 中创建一个子目录的分支

前一阵子为了做一个独立的“无限滚动”插件,特地去研究了一下 Git 的用法。这里把结论列出来,希望对有同样需求的同学有帮助。

由于工作的原因,我使用 Git 的项目大概小于 10。毕业之后工作过的两家公司,所使用的版本控制软件都不是 Git,于是我也没怎么好好学这东西。不过它看不去不复杂。

先来说一下要做的事情。Jetpack 是一个 WordPress 的插件,它由一堆的模块(Module)组成,每个模块占用一个子目录。我想对其中一个子目录创建一个分支(Fork),从而可以把它单独提交到 WordPress 的插件库中去。做法是这样的:

1. 先创建一个 Github 的库(Repository),复制(Clone)到本地,并进入这个复本的根目录。

2. 复制 Jetpack 的库,这样会在当前目录下创建一个名为“jetpack”的子目录:

3. 进入 jetpack 目录,并删除所有和 infinite-scroll 模块无关的内容,这样本来在 modules/infinite-scroll/ 的文件,会出现在 jetpack 根目录下:

4. 回到自己的库的根目录,并添加 jetpack 为上游的源(Remote):

5. 从 jetpack 源中把内容复制下来,在此过程中可能需要手动合并(Merge)改动:

6. 把所有更改提交回自己的源:

虽然我们只是“复制”了一个子目录,但这样做的好处是保留了所有的历史改动(Commit),包括从 Jetpack 来的改动,有什么问题一看便知,比自己手动复制粘贴要安全多了。