免费 HTTPS 证书-从 StartSSL 到 Let's Encrypt

在国内严峻的流量劫持情况下,为了避免网站、APP 中出现莫名其妙的广告,同时也为了保护用户隐私,从 HTTP 切换到 HTTPS 是很多网站不得不做出的选择。

随着技术的进步,还有一个同样重要的原因,那就是 HTTP/2 也建立在 SSL/TLS 基础之上,想充分利用 HTTP/2 的新特性也要求网站切换到 HTTPS。

从去年开始,我的个人站点就切换到了 HTTPS + HTTP/2 协议,通过 Nginx 实现协议切换是非常容易的事情,仅要求一个合法的证书即可完成配置。当时我选择的证书服务商是 StartCom,可以为有限个域名签发免费的有效期一年的 HTTPS 证书。虽然 HTTPS 增加了计算上的开销,但对于个人网站的流量来说,这点儿开销可以忽略不计了。

原来一直都好好的,前几天访问网站的时候,Chrome 忽然提示网站证书不可信任。想起来在公司听到的 Chrome 撤销对 Symantec 签发证书的信任,感觉不好!上网一搜,果然 Chrome 也撤销了对 StartCom 根证书和签发证书的信任:《Distrusting WoSign and StartCom Certificates》,而且快半年了。只是因为我的 Chrome 一直没升级到 56 版本以上,所以没有觉察到。于是没办法,只能寻找新的证书提供商了。

本来都打算花钱买个证书了,后来发现一个很值得信赖的证书提供商:Let’s Encrypt 。虽然是一个免费的服务,但后面有一堆知名组织和公司的支持:ISRG, Mozilla, Cisco, Chrome, Facebook 等,看起来比以前的一些免费证书服务靠谱多了,非常值得一用。

它家的证书有个局限,就是有效期只有 3 个月,然后就需要续签。这也很容易理解,一般免费都是有其它代价的。但是按照它给的安装步骤走下来,才发现它有着一套非常合理的设计。首先在你的服务器上安装一个软件 certbot,用参数指定你的网站根目录。这个证书机器人就会自动在你根目录下添加一个验证文件。远程证书服务器会访问你的网站,通过访问这个验证文件是否在你给定的域名路径下,自动验证你是否拥有域名的所有权。验证成功以后,证书就会自动签发到你服务器上的配置目录,只需要修改 Nginx 的配置,使用签发下来的证书就好了。

那每 3 个月的续签怎么办? certbot 本身就支持更新证书的参数,而且可以配置服务器自动重启的 hook,只需要把更新指令添加到服务器的 crontab,每 3 个月或者每 1 个月运行一次即可,完全不需要人工操作。

最后感叹一下,Apple 和 Google 真是互联网安全的业界良心!虽然看似专制霸道,但有多少 APP、网站是因为 Apple 的 App Transport Security 的要求才全站切 HTTPS 的?有多少证书提供商是因为 Chrome 时不时就吊销证书的行为才控制住了干坏事的冲动?真心希望中国的互联网大公司在此类事情上,不仅独善其身,也能兼济天下。

微信公众帐号体系的BUG

不少互联网公司都有把产品关键路径的用户体验做到很好的能力,但即使如腾讯微信这样的产品,在某些非关键路径上的体验仍然是不如人意。

在微信公众平台发布的早期,只能用QQ号注册公众帐号。很多人的QQ早已绑定微信个人号,于是只好注册一个新的QQ号用于申请微信公众号。通常这个QQ号没有任何好友,也很少登录。

一旦长期不登录公众平台和QQ,用于注册公众号的QQ就会被回收。但公众号没有注销机制,QQ回收以后公众号仍然存在,只是无法再登录。

对于长期不用的公众号,无法登录可能也不是很大的问题。BUG主要出在公众号和个人号的绑定关系上。一旦用公众号助手绑定了个人微信号,必须在公众号平台解绑,在个人微信设置里没有任何解绑选项。无法登录公众号,自然就无法将原来绑定的个人号解绑。

这就是一个授权链:QQ号->公众号->个人号。腾讯很不负责任地回收了QQ号,但对授权链后面两级绑定没有做任何处理。即不自动解除绑定关系,也无法从后向前处理遗留关系。非常遗憾地说,这种设计的确有些丢人。

6年以后的变化

我都忘记曾写过这样一篇文章《Google总让我惊喜》,居然被网友翻出来评论了一把。Google Reader 要关闭这件事,的确让人伤心,因为:

From your 189 subscriptions, over the last 30 days you read 258 itemsclicked 7 itemsstarred 13 items, and emailed 0 items.

Since October 30, 2006 you have read a total of 62,661 items.

其实这心,在 Google Reader 中的 Share 按钮被改成 +1 以后,已经伤了一次了。在我这样一个中国用户眼里,Google Reader 曾是 Google 最好的 SNS 产品,就是因为 Note 和 Share。

不太能理解 Google 放弃 Reader 的决策。基于自己的很多优秀产品(Gmail, Reader, Android, Google+),Google 吸引了很多忠实的注册用户,这一点被其它很多公司羡慕——包括百度,除了腾讯。产品推广的时候,吸引用户注册使用往往是一件很困难的事情,这时就能凸显出用户基数大的好处了。好产品越多,用户的忠诚度肯定越高。如果只有单一的产品,产品没落后用户就会轻易地流失,从这个角度看,我觉得保留 Google Reader 看起来不是一件坏事。

无论如何,Google Reader 是快没了,总要寻找其它的替代品。从目前我的探索来看,Feedly 像是一个比较好的选择,但它的连接不是 https 的,可能会被关键词过滤(或者直接被封掉)。鲜果阅读器看起来也还可以,起码比 QQ 阅读看着更像 Google Reader。豆瓣 9 点就不说了,同步的速度是个渣,也没用心做。

MIUI的贴心功能

预先声明:这不是一篇软文,我真的是出于对 MIUI 系统的喜爱才写的。

我的手机型号是华为 U8800,联通定制机,自带的 ROM 里太多乱七八糟的软件,后来就刷了华为官版的海外 ROM。这个 ROM 是比较干净的版本,但不知道为何老是黑屏重启,基本上每天会重启了一两次。毕竟追求的是性价比,这点儿缺陷我就忍了。

不过基于安卓用户的刷机习惯,后来我还是忍不住刷了修改的 MIUI ROM——因为我的手机型号不在 MIUI 的支持列表里。第一次刷的是 2011 光棍节版,前两天又更新到 2.3.2 版。MIUI 很多贴心改进让我爱不释手,下面我会列举一下。

  1. 菜单键+音量- 执行屏幕截图,下面的图片有些是用这个功能截的。

  2. 拨号键盘使用 T9 拼音直接搜索联系人,支持模糊查询。

    拨号键盘

  3. 通知栏内置很多有用的功能快捷开关。

    通知栏

  4. 系统自带防打扰过滤器功能,可以按照规则过滤垃圾短信和电话。

    防打扰

  5. 可在联系人列表中直接查看到手机号码的归属地,这样当某些朋友有多个手机号码时,容易判断该打哪一个。

    联系人
  6. 陌生人的未接电话可以显示号码归属地和响铃次数,而且第一声响铃静音。这对判断来电是否是垃圾电话非常有帮助。

    陌生人来电
  7. 内置流量监控和防火墙功能,可以为每个应用程序设置网络访问权限。

    流量监控和防火墙
  8. 内置音乐播放器与百度合作,提供在线音乐功能。

    音乐播放器
  9. 内置手电筒功能,且在锁屏时可以长按 Home 键打开手电筒。这个功能实在是太有用了!

    手电筒
  10. 电话功能设置很多贴心小功能:自动录音、接通挂断时振动、来电挂断时提供短信回复、通话记录点击显示联系人信息等等。

    电话设置
  11. 最后值得一提的是,虽然不算个功能,但刷了 MIUI 之后,每天重启的现象居然没了!我完全没想到第三方修改的第三方 ROM 居然比官版 ROM 还稳定,这个出乎了我的意料。

网站被认证

经过各方证实,我确定了这个域名现在(2011年6月10日)已经被“认证”了。目前显示出来的现象是第一次访问大部分可以成功,点击页面链接就可能会被 reset。

不要问为什么会这样,我也不知道。不过我心理早就预期到可能有这一天,因而一切仍然会继续,除了要费点劲儿。不感慨了,引用菜头一句话:

鲜花总会长出来,不在墙这边相见,就在墙外面思念。

关于话题的吸引力

上上个周末我参加了一个培训,一位来自 Intel 的培训师在介绍营销方式的时候,提到了一本叫做《粘住:为什么我们记住了这些,忘掉了那些?》的书。从这本书里,我读到了一些有趣的观点,因而迫不及待地想找个实例验证一下。

下面,就是我找到的实例,一个话题:

刚一哥儿们跟我说,当初他博客开在百度,百度擅自拿了他的文章去发布,被投诉之后先是关了他博客,然后被逼问之后又打开博客然后往上放了一堆黄色图片,说要他负责任,这公司真不一般…
一个话题

关于这个话题发生了什么事情呢?

Retweeted by cyclamen and 28 others
RT

被 retweet 了 28 次,不算多哈。但 Twitter 一般只标记官方 retweet 结果,那么 Google 搜索一下:

找到约 176 条结果 (用时 0.05 秒)
搜索结果

还不错哦,仅仅是三天时间,Google 就能搜索出 176 条结果。虽然比不上“私奔”、“抢盐”的话题,但作为一个没有幕后推手(至少我没看出来)的话题,也算是个不错的成绩了。至少,我不知道自己产出的哪些话题在这么短时间内达到过这样的效果。因此,这是一个不错的分析目标。

《粘住》中说,一个好的创意应该会包含 6 个基本要素:简约(Simple)、意外(Unexpected)、具体(Concrete)、可信(Credible)、情感(Emotional)、故事(Stories) 。来看看上面这个话题,是不是一个好的创意。

  • 简约:这一点应该没有人怀疑,在140个字以内(事实上作者只用了 86 个字),讲活了一个故事,既有转折也有评论点题,不可谓不简约。
  • 意外:这得看对谁来说了。对某些人来说,这可能是又一次验证了他一直以来持有的看法而已;对另外一些人,可能会认为一间大公司跟一个小博主过不去这件事情很意外。
  • 具体:在 86 个字中,作者描述了一个无奈又悲愤的博主,和一个强有力的罪恶大公司,动作和语言活灵活现。仿佛这件事情就发生在自己身边,那个朋友就是自己朋友一般,非常的具体。
  • 可信:单从话题内容来看,并不足够可信,因为细节太少,5W 和 1H 缺失了不少。但是由于 Twitter 的开放性,一些名人的 retweet 倒是可能让读者增加不少可信度。
  • 情感:这个话题描述了一个鸡蛋撞向石墙的画面,你我都知道,不难引起共鸣。对于大众来说,毫无威胁地站在鸡蛋这面是很容易的!伤及切身利益时,才会剩下真的勇士。
  • 故事:这是一个故事吗?

可以看到,除了在“可信”上有一些问题,这个话题还算是一个不错的创意,那么有前面那样的吸引力成绩也不算奇怪了。在《粘住》的开头,还为分析创意是否有黏性提出了一个简单的标准:当你看完故事一小时之后,是否能对别人复述出来?要不你来试试?

新购入姓名拼音域名一枚

昨天看到某同事使用姓名拼音作为域名,于是手贱 whois 了一把,居然发现 yangwenbo.com 被人放弃了,所以我理所当然地拿了下来。现在 yangwenbo.com 直接指向我的博客。

我的旧 .cn 域名本应在 2010 年 10 月 29 日过期,我也没有继续续费的打算。但现在该域名 whois 查询时间延期到 2011 年,显示注册人仍然是我,而且仍然解析到我的网站,我不知道什么样诡异的原因造成了这一现象。但可以确定的是该域名已经不属于我,我也无法对域名进行管理,因此请不要再使用 .cn 域名访问我的网站,我也静待搜索引擎的 .cn 记录过期。

支持多浏览器的网站变灰方法

这篇文章中给出了针对 IE 浏览器的使网站变灰的方法,具体做法是在 CSS 文件的开头添加这样一行:

html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }

但是很遗憾这种方法并不能支持 Firefox 和 Chrome。这篇博客介绍一种支持各种浏览器的网站变灰方法,试验其支持 Firefox、Chrome 和 IE,据说可以支持 Opera(未测试),方法比较简单,就直接介绍步骤了。

1. 到这里下载 grayscale.js 文件到你网站的根目录(或者也可以不下载,直接引入该 js,未测试)。

2. 在网站的 footer 或者 header 等全局的文件中插入以下代码(注意,$() 和 .load handler需要 jquery.js 的支持,不使用 jquery 的同学可以自行搜索解决标签查找和 window onload 事件处理问题,例如这里这里):

<script type="text/javascript" src="/grayscale.js"></script>
<script type="text/javascript">
$(window).load(function () {
  grayscale( $('body') );
});
</script>

该方法的缺点是:

1. 页面加载完后才对整个页面进行变灰操作;
2. 在非 IE 浏览器中不支持来自其它域名的网站图片的变灰;
3. 造成非 IE 浏览器在加载完页面后进行大量 js 计算,该计算负担可以通过仅变灰 img, a 等标签而不是 body 来优化。

注册 Google Voice 的曲折经历

昨天 iron-feet 同学给我讲了不少 Google Voice 的好处,搞得我也心痒痒的(技术男的通病),想去注册一个。但后来发现只有收到邀请才能注册,Google 官方的邀请可能要等很长时间,于是我就在 Twitter 上发推求邀请,非常感谢好心的 @liyong3 同学(blog),马上就给我发了邀请。

前面是好运,下面就是悲剧的开始。在注册之前我也知道注册 Google Voice 的麻烦之处:不允许中国网络访问,要有出国代理或VPN;激活时不允许绑定非美国号码,要申请到一个虚拟的美国号码,并转发电话到自己的聊天软件。我就是在激活上出了问题。

在目前网上流传的几个可以申请美国号码的服务里:ipkall 注册时无论如何都会出现密码错误;Gizmo 已经被 Google 收购,目前不提供注册;Freedigits 早就不提供注册了。所以从我的体验来看,能用的就只剩下:http://www.virtualphoneline.comhttp://www.groovytel.com 了。其实这两家网站的页面风格一模一样,很可能是一个公司的产品。

http://www.virtualphoneline.com 之所以流行跟谷奥那篇介绍注册 Google Voice 的文章有关,但是 virtualphoneline 注册的免费虚拟号码只能试用 24 天,不过能以更多的形式(10 种)转发来电;至少从声明上来看,http://www.groovytel.com 要好一些,免费号码能试用 3 年,但是转发形式少了(6种)些。不过还好他们都支持转发到 Gtalk。

我一开始就注册了这两个服务的号码,也设置了转发到 Gtalk。但在 Google Voice 里尝试打了几十次激活电话,也没收到一个来电。于是我就对网上流传的各种方案进行尝试,包括网上没有的方案。整整尝试了一下午,才收到了那么几次 virtualphoneline+nonoh 的电话,但是很悲剧,nonoh 的拨号盘不能配合 virtualphoneline 输入认证码。于是我只好无奈放弃了。

到了晚上 11 点多我看 Google Reader 的时候,心仍有些不甘。看了一个视频,发现别人 Gtalk 有个联系人叫做 service@gtalk2voip.com,我顺手也加上了。然后将 groovytel 改回转发到 Gtalk,看文章的时候一会儿过去打一下,一会儿过去打一下,没想到还真给我打通了。按照网上的方法,先输一个数字,回车,再输一个数字,回车,就通过了验证。

总结一下下午激活失败的可能原因:

1. 没有加 service@gtalk2voip.com 机器人为联系人。其实我不确定这个有没有用,反正加个机器人也不麻烦。

2. 可能在通话的高峰期打电话。从我看 groovytel 和 virtualphoneline 的通话记录,发现很多通话没应答只持续 5 秒钟。我不知道是不是意味着如果 5 秒钟没有接通 Gtalk 他们就放弃了连接。按说北京的下午在美国是凌晨呀,不应该是高峰的。

反正不管怎样,结果表明还是多尝试好,要有耐心,反正 Google Voice 貌似也没有限制可以尝试多少次,多次尝试打不通就换个时间打。我在 Twitter 上也碰到和我一样没能激活的好友,也许大家可以借鉴一下这里的经验。

使用 Sikuli 实现同时登录两个 Dropbox 帐户

来自 MIT 的用图片编程的 Sikuli 语言最近着实火了一把,看着对岸的程序员 Vgod 开发出如此酷的软件着实令人羡慕。但除了 Demo 之外,能不能拿 Sikuli 来 engineer a better life 呢?显然是可以的,就如 Vgod 这篇文章所说,Sikuli 有无穷的潜力,那我们就来玩儿一把,展示一下 Sikuli 的一个现实应用。

1. Dropbox

Dropbox 是一个在线文件存储系统,可以用来存储和在不同电脑间共享文件,但是一个 Dropbox 用户只有 2G 的存储空间,当我们文件多的时候,就受到限制了。而一般情况下 Dropbox 只能运行一个例程,使用多个用户貌似不可行。但是到底可能吗?

当然可能,只是我们需要多个 Windows 帐户。也就是说,每个 Windows 帐户可以运行一个 Dropbox,如果你系统里有多个帐户,就可以运行多个 Dropbox。注意,受到安全策略的限制,这些帐户必须设置密码。比如我们新建一个"dropbox"帐户,密码也是"dropbox"。

2. 笨的方法

一般情况下使用其它帐户运行程序的方式为:在程序或者快捷方式上点右键,选择“运行方式”,然后选择“下列用户”,输入你期望的用户和密码(dropbox:dropbox)来执行该程序。

3. 聪明的方法

但是这样做太麻烦了,我们可以用批处理脚本做这件事情:

start D:\Program\Dropbox\Dropbox.exe
runas /user:dropbox D:\Program\Dropbox\Dropbox.exe

但这样还要手工输入密码,有很多种方法可以避免手工输入 runas 密码,但很遗憾它们大多在 Windows XP Home Edition 上不可用。

用 Home Edition 的同志还是得交互式的输入密码。能不能不手工输呢?可以,比如 expect 就是专门处理交互的语言。不过,学起来太麻烦了吧,要不来看看 Sikuli 怎么做?

4. 使用 Sikuli

下面这个图就是完成启动两个 Dropbox 的 Sikuli 程序:

使用 Sikuli 同时启动两个 Dropbox

首先switchApp("cmd")启动 Windows 的命令行,然后wait等待那个提示符出现,然后 type() 键入一行 runas 命令,wait 等待提示输入密码,type 输入密码 dropbox 加回车 \n,bingo,出来一个 dropbox 了,最后再 type 一行启动非 runas 的 dropbox,又出来一个 dropbox。

上述程序运行结果如下图所示:

两个 Dropbox 在运行

好玩吧!Sikuli 程序就是那么简单,我从下载 Sikuli 到完成这个程序大约花了四十分钟的时间,这可比去学 expect 快多了。这下 expact 之类的交互语言在简单的场景下可以无视了。

你可以将 Sikuli 程序导出成一个 .skl 文件,据说可以双击运行,不过我尝试未成功,这是一个遗憾,希望后续版本可以解决这个问题。

5. 注册 Dropbox

您如果对 Dropbox 感兴趣的话,可以点击下面我的两个邀请链接注册,这样咱们的空间都可以增加 250M。本人将非常感谢您的支持。(如果您打算再注册一个的话,最好不要用自己的邀请链接,因为同一台电脑上激活的用户不会奖励空间。)

https://www.dropbox.com/referrals/NTE2NjMyMTU5

关于 SOCKS 代理的远端 DNS 解析

经常使用 SOCKS 代理服务器的同志们会发现一种现象,即使 SOCKS 代理服务器设置正确,某些网站仍然无法访问,比如某著名微博网站。其一般原因都是 DNS 污染 (DNS cache poisoning)。

值得庆幸的是 SOCKS 5 可以通过将域名直接提交给 SOCKS 服务器来进行远端 DNS 解析,即 Address Type 0x03。DNS 服务是 Internet 的基础服务,要求 DNS 解析应当尽量地快,所以浏览器默认不会使用远端 DNS 解析。不过当使用自动代理设置脚本(.pac )时,以 SOCKS5 而不是 SOCKS 返回代理地址,可以支持远端 DNS 解析。

网友 forkei 的重要评论

chrome 的 Proxy Switchy 1.4.2 版本插件可以很好的解决这个问题。Firefox 的 FoxyProxy 插件也可以很好的解决 DNS 污染。支持插件扩展功能的浏览器功能就是强大。IE 内核浏览器和 opera 只有通过 polipo 或者 privoxy 将 socks 代理转为 http 代理才行,麻烦。

启用新域名 solrex.org

2017年更新:博客已经切换到 姓名拼音.com 域名,以下内容已经属于历史

各位,即日起本博地址更换为 http://blog.solrex.org,原 solrex.cn 域名将逐渐作废。若有加本站为友链的朋友,麻烦您更新一下地址;使用 feed 地址 http://feed.solrex.cn 订阅本站的朋友,也请将 feed 地址更新为 http://feeds.feedburner.com/solrex 或者 http://feed.feedsky.com/solrex。谢谢!

另外,本站目前已经支持手机直接浏览,用手机浏览器访问 http://blog.solrex.org 直接看到的即是窄屏界面,无需再访问之前的 /wap/ 目录。

恰逢年底,许多人都在总结,屡次的搬迁和被搬迁,我也趁这个机会回忆一下自己博客迁移的历程。

  • 2004 年 9 月 29 日

    南大小百合 BBS 博客写下第一篇日志。可惜,现在连 isince2003 这个 ID 都因生命力太低被清除了。

  • 2005 年 6 月 12 日

    在当时的 MSN Space 开博。因为某些原因,后来被自己封闭了。

  • 2006 年 7 月 13 日

    因为受不了 MSN Space 的经常性被封,在百度空间对外开放时,抢先申请了一个,开始将更新同步在百度空间。三个月后对百度空间失去兴趣,遂废弃。

  • 2006 年 10 月 29 日

    买下了自己的 .cn 独立域名,但是依然没有主机空间,只是定义了几个域名转向。

  • 2007 年 2 月 3 日

    丢弃原 MSN Space,申请了一个新的 Live Space,并同步在 Blogspot 上更新。

  • 2007 年 6 月 18 日

    开始使用 WordPress 博客系统,在 yo2.cn 上安家,并开始使用独立博客地址 http://blog.solrex.cn

  • 2008 年 12 月 24 日

    对 yo2 很满意,因此关闭同步更新的 Blogspot 站,技术文章也不再同步到 Live Space。

  • 2009 年 5 月 16 日

    博客迁出 yo2,主要原因是当机时间太长,频率太高,而且过滤关键词。Eric 师兄两年来一直为我的主页提供托管空间,这次就把博客也迁了过去。

  • 2009 年 9 月 24 日

    Eric 主机空间所在服务器 IP 被封。由于在找工作的关头,希望几年来积累的技术博客能起些作用,于是承蒙信文君收留,博客再次搬迁

  • 2009 年 12 月 14 日

    虽然域名还有一年才到期,看着友链的一些网站变成 Connection reset by peer,某些机构这些让人寒心的行为还是让我下定决心遗弃 .cn 域名,重新在 Godaddy 注册了 solrex.org,并将所有 .cn 的链接 301 永久重定向到 .org。(在我的忽悠下更换域名的还有 Iron-feet 同学)

总的来说,这就是一个折腾的过程,但我从这折腾中获得了很多乐趣——除了某些被折腾的经历外。值得庆幸的是写下的文字都得到了保留,于我而言是一笔宝贵的财富。我以前从不写日记,从开始使用博客才有了记录生活的习惯,现在回头看看,还蛮不错的。

几种不得已时的上网办法

由于小弟最近上网受到诸多限制,在校时帐号爆掉,回家又没有网络可上,所以尝试了各种上网方法,也许对大家有用呢,所以下面分享及记录一下:

1. 手机作为 modem,使用 GPRS 拨号上网

这个一般受到手机版本影响,三星这方面做得非常不错。将手机使用数据线连接到电脑,打开 Samsung PC studio,选择 Network Wizard(网络向导?),创建连接,连接名称随便写,比如“中国移动”,下一步调制解调器选择“Samsun Mobile USB Modem”,下一步国家选择中国,网络供应商选择“China Mobile(Beijing)”(其实选择哪个好像无所谓),用户ID选择“cmnet”,密码也是“cmnet”,创建完成后就可以拨号了。因网络状况或者 GPRS 版本不同,连接速度可能是 153.5 kbps,或者 460 kbps。

GPRS 资费是非常贵的,不在不得已或者包月流量用不完时,最好不要用 GPRS 上网;即使用 GPRS 拨号上网时,也要切记关掉所有自动联网的软件,比如禁用杀毒软件和操作系统的自动更新,禁用浏览器插件等等,这样才能将有限的网速使用在优先的程序上。

2. 使用 201 卡进行古老的 modem 拨号上网

使用 201 卡拨号上网可能会受到运营商的限制。经过我多次咨询 10010 和动手尝试,北京网通(联通)的“阳光心语普通快捷卡”拨号上网方式是这样的:首先将电话线插到笔记本的 modem 口(一般台式机已经没有这个口了)。创建一个新的连接,“连接到 Internet”->“手动设置我的连接”->“用拨号调制解调器连接”->选择笔记本电脑自带的调制解调器(我从来没想过我会有使用它的一天...)->ISP 名称,随便填,比如“201”->电话号码:“2012,语言种类,卡号#,密码#,16911#”,语言种类为打201电话时选择的数字->用户名:169,密码:169。设置完后就可以拨号了,刚开始会听到愉悦的 201 拨号机器回复,最后就要忍受一会儿嘈杂的拨号音了。201 拨号上网的速度大概为 46.6 kpbs...

使用 16911 拨号上网资费大概是 0.07 元一分钟,所以也是相当贵的,只是在 201 卡快过期或者不得已时才能为之。

3. 借用 IPv6 上的 Google App Engine 上网

这个大概只适用于高校使用教育网的学生了。Google,作为一间牛逼闪闪的公司,当其他互联网公司还在 IPv4 上晃悠时,Google 已经将其几乎所有服务部署在 IPv6 互联网上了。作为 IPv6 网络用户,您只需要将所有 Google 相关的域名在 hosts 文件(C:\WINDOWS\system32\drivers\etc, /etc/hosts)中映射到 2001:4860:c004::68 这个 IPv6 地址即可,格式例如:

2001:4860:c004::68 www.google.com mail.google.com clients1.google.com talk.google.com ssl.goo飞gle-analytics.com

就可以使用浏览器访问 IPv6 上的 Google 服务了。目前中国的 IPv6 网络上是没有审查制度的,所以在 Google 搜索时,您可以放心地搜索任意关键词,以及查看网页快照了。

但是目前只解决了访问 Google 的问题,如何访问其它网站呢?就不得不提到我前段时间发布的 Tohr 项目了。Tohr router 可以运行在 Google App Engine 上,所以您只需要将您的 Google App Engine 的域名,比如 example.appspot.com 照上面格式添加到 hosts 文件中,就可以利用 Tohr 结合 GAE 作为一个 IPv4 over IPv6 通道来上网了。当然,GAE 有很多限制,所以有些网站是铁定上不了的。为了实现浏览器自动选择直连 IPv6 的 Google 服务和使用 Tohr 代理访问其他网站,强烈推荐您阅读一下我的这篇博客文章《浏览器自动选择 Proxy 配置案例》。

使用这种方法起码在访问只需要阅读的网站还是 OK 的,Twitter 也可以直接登陆。部分在登录时检查 HTTP 请求 Referer 的网站是无法登录的,比如豆瓣、开心网、Facebook 等,这些时候不要责怪我,因为这是 GAE 的限制,不许用户自定义 Referer;或者 gmail, google reader 等,这也可能是 GAE 限制访问的网站。

但比较遗憾的是,除了第3种方法在 Linux 一样好用以外,前两种方法我都不知道如何在 Linux 上使用。

Tohr - HTTP 层上的洋葱路由器

Tohr (The Onion HTTP Router) 是我上个星期写的一个小的研究项目,它的名字起源于 Tor (The Onion Router)。简单地来说,它就是试图在 HTTP 层上实现类似于 Tor 实现的功能—— HTTP 层上的 HTTP(S) 隧道。

这个 idea 不是我想出来的,而是受到 GAppProxy 的启发(GAppProxy 是一个 great work)。但是 GAppProxy 只是利用 Google 的平台,而且受到 GAE 的很多限制。那么我的贡献呢,就是把这个 idea 通用化,设计一个协议使其支持多平台,解决了 GAppProxy 的一些 bug,完善了 HTTPS 的支持。(哦,忘记了,我还给它起了一个很 fancy 的名字 ^_^)目前 Tohr 的路由器可以是 Google App Engine 上的 Python 网站,也可以是普通的 Apache+PHP 站点。

Tohr 是怎么工作的?

Tohr 的工作原理

Tohr 的工作原理见上图。首先您得拥有一个墙外的主机(免费或者收费的)作为 Tohr 路由器,Tohr目前支持 Google App Engine 和 Apache+PHP 服务器,您将对应的 tohr-router 文件上传到服务器上;然后您在本地运行一个 tohr-daemon 守护程序,设置 tohr-daemon 连接 tohr-router 的 url,tohr-daemon 默认会开启 9090 来提供一个 HTTP(S) 代理服务,您只需要将浏览器的 HTTP 代理设置为 localhost:9090,您的访问请求就会通过 tohr-daemon 转发到 Tohr 路由器上,这样就能通过它来访问被防火墙禁止访问的网站了。

Tohr 是给什么人用的?

目前来讲 Tohr 仍然不很完善,而且还需要加入对其它类型的主机,比如 asp.net、jsp 的支持,还有对多跳和匿名的支持,还没有一个针对普通用户易用性的优化。要求普通用户都有一个墙外主机也是件比较为难的事情(虽然申请一个国外免费 PHP 空间并不困难,比如这里),因此 Tohr 目前还仅适合爱折腾的人使用,尤其是懂 Python 或 PHP 的爱折腾的人,所以在这里是找不到一个一步步的图文教程教普通用户怎么配置的。当然,如果哪位用户愿意做一个,请发送到邮件列表或者提交补丁,我很乐意将它放在项目文档里。

浏览器自动选择 Proxy 配置案例

本文主要讨论的是浏览器代理服务器设置技术,文中出现的人名、公司名或者域名均为化名,如有雷同,纯属巧合。

在某些地方上网时,比如南京大学的校园网中,某些公司的局域网中,我们可能需要用到代理服务器。代理服务器的切换一直是一个让人头痛的话题,IE 浏览器有一个 ProxySwither Lite 软件可以用来切换代理,Firefox 有一批插件可以用来切换代理,但是,很难用它们来解决全局性的问题,使用前的配置也是比较麻烦的事情。那么,有没有一种方法可以一劳永逸地解决这个问题呢?答案是有的,那就是 PAC(Proxy Auto-Config) 文件。

使用 PAC 文件我们可以做到:1. IE、Firefox、Opera...浏览器使用同一个代理配置方案,Windows、Linux多系统使用同一个代理配置方案;2. 针对特定的域名,使用特定的代理;3. 针对特定的 IP 范围,使用特定的代理;4. 针对特定的 URL 模式,使用特定的代理。

下面我们来看一个案例:

假设小明的电脑位于 C 公司的局域网中,C 公司为了某些需要禁止员工访问某些站点,例如: alogspot.com 和 bwitter.com ,但是小明的工作和学习需要经常访问这些站点,公司的网管给小明带来了很大不便。不过小明很聪明,他找到了一个可以访问被禁那些站点的一个代理 127.0.0.1:8000。虽然通过该代理小明可以访问这些站点,但是切换代理和浏览器设置始终是麻烦;特别是在用 doogle.com 搜索到的某些文章位于 alogspot.com 时,一不小心点了搜索结果,到搜索引擎 doogle.com 的连接就会有很大一会儿被重置。因为小明的代理速度比较慢,总不能用代理上所有网站吧?这真是件麻烦事,小明该怎么办呢?

虽然很头痛,但是互联网的开拓者们给我们留下了那么多遗产,怎么能不好好利用呢?小明翻出了一个尘封已久的 Wiki 页面,缓缓回忆起那古老的 Javascript 语言,顿时有了主意,于是他写出了下面这个 PAC 脚本:

// 看看域名是不是本地站点
function isLocalHost(host)
{
  if( dnsDomainIs(host, "localhost") )
    return true;
  return false;
}
// 看看域名是不是禁止访问的站点
function isBlockedHost(host)
{
  if( dnsDomainIs(host, "alogspot.com") ||
      dnsDomainIs(host, "bwitter.com") )
    return true;
  return false;
}
// 看看搜索结果 URL 中是不是包含被禁止访问的关键字
function isBlockedURL(url, host)
{
  if( dnsDomainIs(host, "doogle.com") ) {
    if ( shExpMatch(url, "*alogspot.com*") ||
         shExpMatch(url, "*bwitter.com*") )
      return true;
  }
  return false;
}
// 看看 IP 在不在本地 IP 范围内
function isLocalIP(addr)
{
  if( isInNet(addr,"127.0.0.0","255.0.0.0") ||
      isInNet(addr,"10.0.0.0","255.0.0.0") ||
      isInNet(addr,"192.168.0.0","255.255.0.0") ||
      isInNet(addr,"172.16.0.0","255.255.0.0") )
    return true;
  return false;
}
// 看看 IP 在不在被禁止访问的 IP 范围内
function isBlockedIP(addr)
{
  return false;
}
// 看看 IP 地址是不是 IPv6 地址
function isIPV6(addr)
{
  if( shExpMatch(addr, "*:*") )
    return true;
  return false;
}
// 这是浏览器默认调用的函数接口
function FindProxyForURL(url, host)
{
  var direct      = "DIRECT";
  var httpProxy   = "PROXY localhost:8000";
  var socksProxy  = "SOCKS localhost:9050"// 留着做个参考
 
  if(isLocalHost(host)) {
    // 如果是本地域名,那就直连
    return direct;
  } else if(isBlockedURL(url, host) || isBlockedHost(host)) {
    // 如果是被禁止访问的域名,或者搜索结果 URL 中含有被禁止访问的关键词,那就走代理
    return httpProxy;
  }

  if(!isResolvable(host)) {
    // 如果域名不能解析,那就直连
    return direct;
  }
  // 解析域名到 IP 地址
  var IpAddr = dnsResolve(host);

  if(isLocalIP(IpAddr) || isIPV6(IpAddr)) {
    // 如果是本地 IP 或者 IPv6 地址,那就直连
    return direct;
  } else if(isBlockedIP(IpAddr)) {
    // 如果是被禁止访问的地址,那就走代理
    return httpProxy;
  } else {
    // 剩下的,唉,就直连吧
    return direct;
  }
}

小明将以上内容保存为 C:proxy.pac(~/proxy.pac),然后到

Firefox 中,选择 工具->选项->高级->网络->设置(Edit->Preferences->Advanced->Network->Settings),将 file:///c:/proxy.pac(file:///home/username/proxy.pac)填入“自动代理配置 URL”(Automatic proxy configuration URL)文本框中;

再到

IE 中,选择 工具->Internet 选项->连接->局域网设置,勾选使用自动配置脚本,填入 file://c:/proxy.pac;

再到

Opera 中,选择 Tools->Preferences->Advanced->Network->Proxy Servers,勾选上 Use automatic proxy configuration,填入 file://c:/proxy.pac。

从此,小明就开始了自己幸福的互联网冲浪生活,再也没有看到那曾经熟悉的“到该网站的连接已被重置”消息了。

PS:若要 Firefox 和 Chrome 支持远端 DNS 解析,需使用 SOCKS5 作为代理的前缀。

跨平台音乐播放软件 Songbird

Songbird 是一款开源音乐播放软件,目前可以支持在 Windows, Linux 和 Mac 操作系统上运行。从我的角度来看,它有几大特性:(1)支持 iPod——对我来说没诱惑,我又没有 iPod;(2)类 iTunes 界面,这一点我还是很欣赏的,管理音乐比较方便;(3)内嵌浏览器,用某篇文章的话说就是:“如果iTunes和Firefox来一场甜蜜的网络性爱,他们产下的卵就是Songbird。”虽然形同鸡肋,不过也蛮有趣的;(4)支持类似于 Firefox 的插件功能,这将会是 Songbird 的杀手锏;(5)支持大部分中文歌曲 ID3 标签——这一点使我不得不喜欢它,下面我还会说到;(6)可用插件支持歌词显示。

总的来说,Songbird 吸引我的主要原因是后两条,因为我很难在 Linux 下找到实现这两条的播放软件,但是这后两条特性又貌似不那么完全。本地化、本地化,Linux 的本地化一直是一个问题,再加上像我这样的“事儿妈”喜欢在 en_US.UTF-8 的 LOCALE 下追求中文使用的无障碍,使得问题更糟糕。Linux 下的经典播放软件 xmms, RhythmBox, Amarok,无一例外都被中文 ID3 标签显示问题打败(或者说我不知道如何配置?)。

Songbird 让我看到了一丝希望。我目前歌曲库中所有歌曲都是从 Google Music 下载的,乍一装上 Songbird 运行后,我发现它居然能识别出大部分歌曲的 ID3 信息(Windows 和 Linux 平台下效果是一样的),不过仍然有乱码存在。我想可能是 ID3 标签自身问题,于是到 Windows 下用千千静听编辑了一下这些显示为乱码的歌曲信息。经过多次尝试,发现用千千静听将 ID3 信息先写入为 ID3v1,然后再重新以 UTF-16 格式写入为 ID3v1 & ID3v2 貌似可以解决 Songbird 的乱码问题,至少我的歌曲库已经没有乱码了。

这个乱码解决方案的重要之处在于:Windows Explorer 支持该方案,也意味着大部分 MP3 音乐播放器(随身听)支持该方案。不像通常为使 Linux 下的播放软件(比如 Amarok)支持 ID3 标签,要强行将 mp3 文件的 ID3 标签转换为 UTF-8 编码,这样会造成大部分 mp3 随身听和 Windows Explorer 无法显示歌曲信息。(插一句:在我使用过的 mp3 里,只有魅族 Miniplayer(M6) 支持 UTF-8 格式的 ID3 标签和 UTF-8 格式的 txt 文档,这也是我对魅族这间公司有很大好感的原因之一。)

Songbird 的歌词插件也很奇怪,貌似它只支持内嵌于 ID3 标签中的歌词,而且没有时间轴,还好 Google Music 的歌曲大部分内嵌有歌词。不知道存不存在可以从外部文件读取歌词并且以时间轴显示的插件?

关于 ID3 标签,我还有一些疑问,下面列出来,希望对此有了解的朋友能够指点一二。

1. 网上讨论 Linux ID3 标签编码问题时经常会说 ID3 标签的编码是 GBK, BIG5 所以造成了乱码问题。但 Wikipedia 上说,ID3v1 只支持 ISO-8859-1,ID3v2.1 增加了 UTF-16 支持,ID3v2.4 增加了 UTF-8 支持,貌似 ID3 标签根本没有 GBK 编码这一说。那么乱码问题到底和 GBK 有关系吗?

Li Fanxi 网友的重要评论:ID3v1只支持ISO-8859-1,不过很多传统的软件,比如WinAMP或Tag&Rename,都会用System Code Page去存放非ISO-8859-1中的字符。对于CP936,自然就是GB2312了。一些严格符合标准的软件如果没有考虑到这个问题,就会出现乱码。

2. 这篇疑似 Amarok 开发人员的博客中说:“(我们限制自动检测编码功能仅检测 ID3v1 )基于这样的假设:所有的 ID3v2 使用的是 UTF-8 编码,所有的 ID3v1 使用的是非 UTF-8 编码。”但是要知道大部分中文 MP3 歌曲使用的是 ID3v2.3,根本不支持 UTF-8。那是否能得出这样的结论:Amarok 乱码问题是因为 Amarok 不支持 ID3v2 标准,而不是 Windows Explorer 和其他 mp3 播放器厂家不支持标准?那么我想,有了 Songbird,是放弃 Amarok 的时候了。

Li Fanxi 网友的重要评论:ID3v2.3不支持UTF-8,如果用UTF-8存ID3v2.3 Tag可以看成是软件的Bug,我不太确定有多少软件会这么做。

3. 为什么某些同样是 ID3v2.3 编码的 MP3,Windows Explorer 和千千静听能读取正确,Songbird 中却有可能显示为乱码呢?

Li Fanxi 网友的重要评论:这个问题还是要具体问题再具体分析,可以用软件分析一下这个文件中倒底存了多少种Tag,一个文件中可以同时存在几种版本的Tag,比如ID3v1、ID3v2、APE,不同的软件可能对不同的Tag的识别优先级不一样,导致显示结果不一样。

虽然我天天在Linux下工作,不过管理Tag我还是wine一个Windows下的Mp3tag来用,因为以前在Windows下用惯了,而且我也在维护这个软件的简体中文语言文件。这个软件Usability不算好,不过功能很强,适合对MP3 Tag管理有比较高要求的朋友用用。http://www.mp3tag.de/en

对于解决乱码MP3的问题,我用Mp3tag的方案是先对用System Code Page存放的Tag做一次Convert Codepage的Action。然后把MP3 Tag清除动作设成清除所有,写入动作设成只写入ID3v2.3 UTF-16,然后对所有的文件做一次Ctrl+X再Ctrl+V。世界就清静了。

PS: 一定要试试 Songbird 的 MashTape 插件,很好很强大!

Google 音乐搜索

/* 这不是一篇商业软文——虽然我希望可以有钱赚 :) */

Google 音乐搜索

今天无意中溜到和菜头的博客,看到他对谷歌音乐搜索的评论。然后试了一把,您还别说,真不错。

虽然这个音乐搜索并不像一个搜索网站而更像一个常见的音乐站,但是界面足够清爽,而且链接不会失效。我平时访问某些音乐站时最讨厌的就是页面上一堆链接,而且很多音乐是从别的网站盗链过来,经常失效。

最赞的是那个音乐播放器,列表功能很强大,而且还可以同步显示歌词。而且经过测试发现网速足够快,一首歌缓冲个两三秒就下载完了,完全可以在线听。我觉得以后没有必要在电脑中保存音乐了,这样一来,使用 Linux 播放 mp3 的 ID3 标签问题也解决了,而且 Linux 下也一直没有找到可以同步显示歌词的软件。

但是一个问题是播放列表无法保存,为什么不能把播放列表和 Google 帐户联系起来呢?

用 Firefox 插件控制网络沉迷

最近好几个朋友都加入了一个叫做“你为什么不关掉电脑去做爱做的事”的豆瓣小组,当然,我也加入了。

也许是大学时候养成的毛病,也许是因为现在网络是免费的,我虽然不会沉迷于游戏,但却经常在该工作的时候沉迷于网络,其中典型的包括小百合 BBS、Google Reader 等。最近我想控制一下这些浪费时间的行为,就把 bbs.nju.edu.cn, reader.google.com 等这些域名在 /etc/hosts(或 c:\windows\system32\drivers\etc\hosts)文件中写成回环地址 127.0.0.1,这样我一旦访问这些网站,就会转到我本机的服务器。

但直接写系统 hosts 文件会产生一个问题,它不仅影响浏览器,还会影响所有其它软件。某些情况下我是不希望这种事情发生的,而且每次都要手动修改策略,于是我找到了 Firefox 插件 LeechBlock。它的介绍是这样的:

LeechBlock is a simple productivity tool designed to block those time-wasting sites that can suck the life out of your working day. All you need to do is specify which sites to block and when to block them.

LeechBlock 可以设置六个策略集,策略集组成主要包括要屏蔽的网站、屏蔽策略和屏蔽时间。最狠+幽默的是可以设置 LeechBlock 为修改设置时要求输入一串随机产生的 64 位验证码,直接搞到你不想随便修改自己定下的策略集,比密码还有效。要是再长点儿,恐怕你就永远不想修改你的设置了。

虽然是否会浪费时间主要取决于自己的毅力,但是有一个软件能稍微起点儿帮助作用也是不错的。我发表完就把 blog.solrex.cn 添加到屏蔽列表中去。

最后再提醒诸君一句,在设置完策略集之前千万不要选择 Require the user to enter a random 64-character access code,切记切记!