在 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 来的改动,有什么问题一看便知,比自己手动复制粘贴要安全多了。

在 Mac OS 中区分鼠标和触摸板设置

Macbook 上的触摸板很好用,够大,灵敏度也很好,但它有一个小小的问题:触摸板的滚动设置和鼠标是绑定的。这就造成了一个问题,如果外接鼠标不是 Apple 的触摸板,那滚动方向就会是反的。因为触摸板通常设定为“自然”模式,即向下滑动,屏幕向上滚动;而鼠标的用法,则是滑轮向下滚动,屏幕也同时向下滚动。这就造成了,在外接鼠标和触摸板切换的时候,要不停地更改设置,很不方便。

解决办法也是有的,需要装一个软件,Karabiner。安装完成之后,修改它的配置文件,位于 ~/Library/Application Support/Karabiner/private.xml

在文件中添加如下一段:

其中 device_only 表示这项设置只对某一个设备有效。上述的设置是针对我的罗技鼠标,需要根据实际情况修改。具体的值可以在 Karabiner 自带的 EventViewer 中的 Device 一栏中找到。

保存文件之后,回到 Karabiner 主界面(Change Key),点击 Reload XML,之后就可以看到“Logitech Mouse”一项,勾选它就可以了。这样鼠标和触摸板的设置就可以反过来了。

另外 Karabiner 还可以更改键盘的按键绑定,如果你碰巧也有一个外接的 Windows 布局的键盘,那这个小工具会非常有用。

配置 SendMail 通过 SMTP 发送邮件

今天不知怎么的,SendGrid 插件突然抽风了,导致博客后台完全打不开,显示为 503 Service Unavailable。一怒之下就把 SendGrid 插件给删了。

但是不用 SendGrid 插件的话,就要自己配置邮件服务了,没辙,硬着头皮上吧。

先说一下背景,主机环境是 Google Compute Engine,RHEL 7 系统,使用 SendGrid.net 作为 SMTP 服务。Linux 中有个邮件工具叫作 SendMail,它是一个命令行工具,PHP 也是用它来发送邮件的。所以把 SendMail 配置好了,不仅 WordPress / PHP 可以正常发送邮件,其它基于 SendMail 的工具也可以正常工作了,一举两得。以下命令假设已有管理员权限。

首先,安装必须的系统组件,其中的 cyrus-sasl-plain 是一个加密组件,如果没有安装的话,会出现错误“AUTH=client, available mechanisms do not fulfill requirements”:

设置 SMTP 服务器,在 /etc/mail/sendmail.mc 中找到下面的第一行,然后如下添加第 2、3、4 行:

需要注意的是其中端口指定为 2525,这是 Compute Engine 和 SendGrid 的约定,一般的端口是 25 或者 587。

然后在 /etc/mail/access 中添加 SMTP 帐号:

其中 Username 和 Password 要替换成真实的用户名和密码,在 SendGrid 中,用户名/密码和登录时候用的一样。

然后编译相关配置并重启 SendMail 服务:

这样就配置好了,为了检验 SendMail 能正常工作,我们来做一个简单的测试:

先创建一个文本文件,mail.txt:

Subject: SendMail Test
Random Email Content

然后执行命令:

如果能收到测试邮件,就说明配置成功了;如果不能,可以检查 /var/log/maillog 文件看是哪里出错了。

没有商业公司支持的开源软件就是一个笑话

这件事要从几个月之前博客升级到 Apache 2.4 说起。

7月份的一天,我发现 AWS 提供了一种新的机型,比我当时用的要便宜,而且性能更好。由于硬件的变动,AWS 不能提供无缝地迁移,一定要手动操作,于是我就计划着迁移一下。迁移之前我研究了一下所需的各个软件的最新版本,我有个习惯,新装系统的时候,都会装上最新版本的软件,我相信新的版本更安全,性能更好。博客所用的软件主要就是三个,其最新版本分别是:Apache 2.4、PHP 5.5 和 MySQL 5.5。

装软件嘛,没什么复杂的。

我事先调查了一下,最新版本和我当时用的版本之间的差别,主要是 Apache 2.4 和 2.2 的配置文件格式有比较大的差别,还有就是 PHP 5.5 中自带了 PHP-FPM,它其实也和 Apache 有关系。说到底也就是 Apache 的配置有比较大的改动,其它都正常。具体的改动这里不多说,详细的说明请参见《在EC2中安装 Apache 2.4、PHP 5.5 和 MySQL 5.5 并运行 WordPress》一文。

Apache 2.4 和 2.2 的差别(业界称为 breaking change)我就不抱怨了,这和下面要说的东西真是小巫见大巫了。它的差别大到了一个程度,使得目前 2.4 在全球的使用率只占了 Apache 全部的 10% 不到,而 2.4 第一版是在 2012 年 2 月发布的。一个发布了 2 年多的软件只有 10% 的使用率,Windows Vista 见到了也会乐开了怀。

差别很大不要紧,哥搞定了。

之后过了几个月,就是最近,公司给了一些员工福利,Google Cloud 的优惠。为了充分利用这些个优惠,同时也体验一下 Google Cloud,我就把博客整体迁移到了过来。

Google Compute Engine 所支持的 Linux 发行版有:RHEL 7、CentOS 7、SUSE 12、openSUSE 13.1、Debian 7、Ubuntu 1410等。和 AWS 不同的是,AWS 提供了一种称为 AmazonLinux 的系统,虽然它不是出自名门,但看名字是 Amazon 重点支持的对象,毫不犹豫就选了它。而 Compute Engine 没有类似的设定,于是我就把所有的版本都试了一下。接下来就说一下它们之间的异同。

首先是安装包的管理,RHEL 和 CentOS 用的是 yum、SUSE 和 openSUSE 用的是 zypper、Debian 和 Ubuntu 用的是 apt-get。这倒也没什么,虽然名字不一样,指令都大同小异,搜索一下 5 分钟就学会了。

接下来安装三大软件。装软件嘛,没什么复杂的。

之前在 AmazonLinux 上见识过,Apache 的安装包分为 httpd 和 httpd24,因为 2.2 过于流行,httpd 一直都被用于安装 2.2,那 2.4 只好用了另外的名字。回到Compute Engine 这一边,CentOS 的 httpd 直接指向了 2.4,表扬一下;RHEL 和 AmazonLinux 类似,只是 2.4 的名字是 httpd24-httpd,这也好理解,问题不大;而 Ubuntu 中的名字是 apache2,这也没什么;但是,SUSE、openSUSE和Debian 默认都没有带 Apache 2.4 的安装包,这…………。openSUSE 要升到 13.2 才有 2.4 的安装包,两年都没把 2.4 加入官方软件库,这算是几个意思。

于是我只剩下了四个选择,httpd24 和 apache2 各两个,于是我就都安装了一下。虽然它们都是 Apache 2.4,应该都是编译自相同的源文件,但是安装完之后的情况截然不同,httpd 装完是这个样子的(目录结构取自 tree -d,下同):

而 Ubuntu 的 apache2 是这个样子的:

openSUSE 中是这个样子的:

直接吓尿了。

由于 Apache 并不是装完就可以用,还要配置一大堆的东西,比如 vHost、SSL,还有和 PHP-FPM 的通信等等,我相信它们只是目录结构不同,配置方法还是大同小异的,但是我不想再重新走一遍当时 2.2 升 2.4 的时候的各种坑,于是果断选择了 RHEL 或者 CentOS。

另外还有一个问题是 PHP 5.5。由于 PHP-FPM 在 5.5 中才成为官方插件,并且只有 PHP-FPM 才能体现出 Apache 2.4 的 Event MPM 的效率。于是我非常希望在新的系统中继续使用 5.5 或后续版本。而因为这样,最终被迫使用了 RHEL。RHEL 7 是唯一一个满足我所有需求的版本。当然 RHEL 也有坑,就是 SCL,它和传统软件会产生兼容性问题,但想想这种方式长远来看也算不错,毕竟还有 Redhat 在背后支持,于是就用了。

当然,你可能会说这几个软件在第三方软件库中都能找到,那好,我找给你看。比如有个软件库叫“REMI”,貌似用的人还蛮多,但是,CentOS 的官方 wiki 把 REMI 列在了 “Known Problem Repositories”,就是“有问题的软件库”,而另一个软件库,webtatic,在 wiki 中就压根没有提到。CentOS 的 wiki 写得还蛮详细的,其它几个发行版连类似的 wiki 都没有。你说我敢用么。

事情还没有结束。

Compute Engine 提供了一个功能:startup script。意思是写一段 bash 脚本,放在比如 github 上面,然后在创建虚拟机的时候指定运行那段脚本,做一些自动化部署的工作。看上去蛮好用的一个功能,但实际用起来问题一堆。对,又是 Apache 的问题。

Apache 有自己的配置文件格式,扩展名是 .conf,github 上对应的格式是 apacheconf。这是一种纯文本的格式,类似 INI + XML,样例可以看之前的文章。而 Apache 官方并没有提供 API 来修改 .conf 文件,大家都只能用文本编辑器来手动修改。且不说这种方式效率差并且非常容易出错,问题是它没法写在 bash 脚本中啊。比如我要把 /etc/httpd/conf/httpd.conf 中的第xx行从下面这样:

修改成

肯定有人会嘲笑我不会用 Linux 中的工具,比如 sed。sed 是一个很强大的工具,它能以各种花哨的方式来替换文本内容,我看到过 stackoverflow 上各种答案都用它。但是,sed 固然强大,但它无法预知未来啊。现在 ServerName 是写在 httpd.conf 中的,万一它某一天被移到 servername.conf 中了呢?现在它叫 ServerName,万一之后被改成 HostName 了呢?不要笑,这些变动在 Apache 的历史上都发生过,难说之后不会再发生。

PHP 和 MySQL 也没好到哪里去,它们都用纯文本的配置文件,文件名、文件内容都根据 Linux 和自身的版本不同而不同。

虽然我可以花个几个月编写并调试出一份完美的 bash 脚本,但这也并不能保证它在未来的版本中继续可用。于是我就放弃了 startup script,依然手工配置了所有的东西。

各种问题都是小 case,哥都搞定了,博客继续稳定运行。

这段经验不禁让我想起一个视频,视频作者从 Windows 1.0 逐版本一直升级到 Windows 8,在 Windows 95 的时候装了一个游戏 DOOM 2,升到 Windows 8 之后,DOOM 2 还可以继续玩。

上述的各种软件和 Windows 比起来,就是一个笑话。

Adblock Plus 貌似和 Google Analytics 过不去

Adblock Plus 是 Chrome 的一个插件,用于拦截网页中的广告,试用了几天,效果很满意。不过就在刚才,发现了一点点的小问题。Analytics 报了如下错误:

一开始我以为是 Analtics 本身的问题,还想着去汇报这个问题,后来查了一下,有人遇到过同样问题,说是把 Adblock Plus 关了就好了。试了一下,果然如此。

如果你也看到这样的错误信息:“Analytics has encountered an unexpected condition and cannot fulfill your request.”,也可以尝试把广告拦截插件给关了,说不定就好了。

在RHEL 7中安装mod_pagespeed

Redhat 在它的 Linux 发行版 RHEL(Redhat Enterprise Linux)中引入了一个新功能:Software Collections,简称 SCL。SCL 的工作原理和其它的软件部署工具不太一样,SCL 不会把软件装到系统目录中,而是做了一个虚拟的目录结构;而安装的软件默认不启用,需要使用特定命令开启。

拿 PHP 5.5 举例,安装完成之后,PHP 5.5 会出现在 /opt/rh/php55/ 目录下,使用 scl enable php55 可以把它开启。比如查看 PHP 的版本:

使用 PHP 貌似没什么太问题,但是 Apache 和 mod_pagespeed 就有点不和谐了。Apache 2.4 装好之后,在 /opt/rh/httpd24 中。但是安装 mod_pagespeed 的时候,RPM 会抱怨说:

httpd >= 2.2 is needed by mod-pagespeed-beta

而使用了 scl enable httpd24 之后,问题依旧。我还没有仔细看 scl enable 的原理是什么,但基本上它和 RPM 的沟通不太正常。

不过不要紧,RPM 有一个 --nodeps 选项,即不检查所需的依赖库。把原先的命令改成这样即可:

但是呢,还是有一点点的小问题。mod_pagespeed 默认的安装目录是 /etc/httpd,但真正的 httpd 还在 /opt/rh/httpd24 下面,于是我们要么把装好的文件复制过去,要么在安装之前做一个符号链接(Symbolic Link)。我倾向于后者,因为这样可以解决后续的升级问题。制作符号链接的命令如下:

之后再安装 mod_pagespeed 就没有问题了。

解决Windows 8中VLC的字幕乱码

一大早就惊闻人人影视将关闭资源下载栏目,只提供字幕下载,心想这下惨了,又要回到满世界找匹配字幕的时代了。

我一直在人人影视下载压制好的片子,原因有两个,一是人人的字幕做得非常好,不仅有下方的中英文对照,影片中的一些文字,比如海报或者餐馆名称,也会加上中文翻译,非常有助于理解影片;二是 HR-HD 影片的性价比不错,下载时间短,清晰度也可以接受。虽然字幕组的人手有限,对于美剧的覆盖面还不够,但它提供的片源也足以支撑日常的休闲娱乐了。

自从去年开始,国内外媒体集体对影视网站施压,能稳定提供下载的网站越来越少了,有时候找一部高质量的译制电影都要找很久。如果人人再停止提供片源的话,那就雪上加霜了……

当然我不是拒绝正版电影,我愿意为正版电影付费,但前提是商家必须提供中文字幕。前段时间试用过 Netflix,发现几乎没有中文字幕的片子,而且它的播放器不支持外挂字幕。即便 Netflix 的用户体验做得非常好,那也只好对不起了。我可以勉强看看原版的好莱坞脑残英雄主义电影,但其它大部分影片还是依赖中文字幕的。

为了防止下载不到 HR-HD 而造成的不适应,我先演练了一遍 B 计划。目标影片是《忍者神龟:变种时代》,人人影视中显示“由于版权原因本资源已完全关闭”,于是我就去了上述图片所代表的网站(大家都懂的)下到了 720p 的无字幕版。下载工具用的是迅雷极速版,貌似没什么问题。迅雷很人性化地自动搜索了字幕,字幕列表有一排,也不知道哪个好,就下了第一个。

播放工具继续使用 VLC,很不错的播放器,只是……字幕显示成一个个方块。唉,这也是我不喜欢外挂字幕的一个原因。我用的是 VLC 2.1.5(32位)版本,应该是目前最新的了。Windows 8 也升级到最新的更新,中文字体也不缺。另外我还把字幕文件转换成了 UTF-8 格式的。问题依然存在…………

就在我尝试了一大堆设置(和它们的组合)还是没解决快要放弃的时候,突然搜到这么一个贴子,说是:如果中文字体的名称不是拉丁字母开头,VLC 会无法识别这个字体文件,于是就造成乱码。也就是说,使用“微软雅黑”就不行,而“Arial Unicode MS”就是可以的。我的机器上没有装 Office,所以没有 Arial Unicode MS 字体,但有其它字体可选,比如:DFKai-SB, Microsoft JhengHei等。这个问题貌似在 2011 年就存在了,至令没有修好,VLC 的开发效率也蛮让人担心的。

虽然遇到了一点小问题,但 B 计划总体来说还是可行的。当然我也不希望短期内被迫使用B计划。

顺便说一句,VLC 中使用快捷键 G 或 H 可以提前或延后字幕的时间,对于时间不匹配的字幕可以简单处理一下。