收到德生寄来的支撑板

07年暑假买的德生 R-9700DX 收音机,前阵子打开支撑板收听的时候不小心把手放上去按了一下,结果“啪”地一声支撑板就断掉了。后来在 BBS 的 Radio 版上求助,又跑到德生论坛骚扰用户服务部门的经理候传,终于在今天收到了德生寄过来的 R-9700DX 收音机支撑板,顺利安上,正常使用如初。(就是图中的那个支撑板此篇文章为博客迁移后导入,图君已经壮烈牺牲。)

如今收音机已经是比较小众的产品了,除了会在地震灾难的时候向灾区投放一点,平时有使用习惯的人不多(当然,堵车倒是普及了交通广播的收听率)。德生在这方面一贯坚持“享受广播 enjoy broadcasting” 的理念,不光在产品上不断地推陈出新,同时也依靠完善的售后服务巩固了用户对于德生品牌的信心,必须赞一下。

QQ域名邮箱原来只是个别名

前几天从 cnBeta 上看到 QQ 发布域名邮箱的消息,于是去试用了一下。

域名邮箱页面是 domain.mail.qq.com,首先需要在 QQ 邮箱的体验室里启用,然后按要求设置域名、验证 CNAME 记录,添加管理员账号以后,便完成设置。这些步骤腾讯一直有提示,对于不熟悉的人来说也能很快依照提示来完成。

登录以后才发现,这个邮箱其实就是给你原有的 QQ 邮箱加了一个别名。它们的邮箱存储是完全共享的,对方发一封邮件给你,无论从哪个邮箱登录,都能看到。而且在页面上方显示邮件地址的区域更有一个明显的切换菜单,可以在不同的别名之间切换。

利用管理员账号可以向 QQ 域名邮箱中添加成员,但有一个明显的障碍就是:你必须提供此人的 QQ 号,还得保证此人的QQ 邮箱是开通状态。不清楚这是技术上的原因还是产品策略导致的,我觉得这种别名策略会让相当多的人失望而归。

我满心以为 QQ 的域名邮箱能够像 Google Apps 中的 GMail 那样提供完全独立的邮箱功能。看来这次必然是失望了。腾讯只是玩个了花样,给原来的 QQ 邮箱加个别名,换一套 LOGO 和皮肤便“诞生”了 QQ 域名邮箱。做为一个企业,腾讯还远远做不到 Google 那样的大气和长远,这种浮躁和短浅似乎也是中国很多企业的通病。但愿能在日后慢慢改观。

新买了一对神兽

如题。工位确定以后,桌子上一直是空空的,除了一个显示器,几本规范,什么也没有了。总觉得要添点什么好,忽然想起网上颇为流行的神兽“草泥马”,到淘宝上搜索一番,果然找得到。(但“草泥马”这词已经被淘宝和谐掉,必须以它的原型“羊驼”为名进行搜索才有结果)

网上售卖这个玩意儿的很多,形象大体上是按照卡通化的羊驼来制作的。但我细细地观察一下,觉得某些型号制作得有形无神,两眼漠然,全然看不到那种恶搞风格里透露出来的诙谐的喜气。后来仔细比较斟酌,选定了比较满意的一款,一共要了两只。分别是棕色款和白色款,二者居然还都有名字,叫做“雷雷”和“萌萌”,果然有当今互联网的特色。价格花费比其它商家所售略高,但其形神兼备,令人蔚为满意。

神兽现在依偎着站在我的桌子上,而我的坐位临近过道,同事每每经过便能看到神兽两只作亲密态,大赞可爱。但能识别此为何物者不多,有人误以为骆驼、绵羊一类。问到我,我也不便直接说出“草泥马”这名字,惟恐谐音让人听了发怒,便委婉地告以“神兽”的大名。若有人追问“神兽”者何,便故作神秘,告之来源于网络,请自行搜索;实乃神兽之名只可意会,不可言传也。

给域名解析添加备份

5月19日,国内的免费智能域名解析服务商 DNSPod 遭到大规模的恶意攻击,意外中断服务若干小时。我的博客域名当时也托管在 DNSPod 处,被攻击的时候无法解析域名,幸好自己记得虚拟主机的 IP 地址。当时只好自己在系统中编辑 hosts 文件来手动完成解析服务。

意外发生以后,再考虑到 DNSPod 之前数次被攻击的历史,我决定把域名转移到其它的服务商,更重要的,是给域名添加备份解析服务器。

DNS 作为互联网基础设施,其稳定性是很值得关注的。传统的做法是域名解析服务商(无论是免费解析还是域名注册商提供的解析)提供至少两台服务器用作域名解析服务。比如 DNSPod 就有六台服务器用作免费解析,EveryDNS 有四台服务器。这种设计是为了提高冗余度以增加域名系统的稳定性。对于意外的服务器当机、网络出现故障等问题,这样做是比较保险的。DNSPod 偶尔就有某台服务器要停机维护的情况,但这并不会给正常解析带来什么麻烦,因为有其它的五台服务器正常工作。可是对于恶意攻击,多台服务器的冗余就没有意义了。攻击者在能力足够的情况下(直白的说就是肉机足够多),完全可以利用大流量把所有的服务器同时攻击一遍。而且大部分时候他们都会这么做,要不然只攻击一部分其实没有效果。DNSPod 就这样被大流量攻击打倒,无数的域名便受到牵连。

在台湾网友的博客上看到《如何用xname搭配zoneedit做备援DNS》这篇文章,于是照着做了一下,把自己的域名解析转移到了 ZoneEditEveryDNS。设置上都是大同小异的,简单说一下。

  1. 注册 ZoneEdit 和 EveryDNS 账号,并登录。
  2. 在 ZoneEdit 中添加自己的域名,比如我的就是 xiaoding.org ,然后添加自己的解析记录,包括 A 记录(IP地址)、CNAME 记录(别名)、MX 记录(邮件服务)等等。Nameserver 这个地方,ZoneEdit 会给出自己的两台服务器地址,稍微记一下数字较小的那个服务器的地址。
  3. 域名解析记录添加完之后,选择 ZoneEdit 的 Advanced 页面,打开最下面的“Edit Security Settings”,然后在“Restrict zone transfers to these IP’s”这个编辑框中填入“0.0.0.0/1;128.0.0.0/1;”(不含此处的引号)。注意这个填法将允许所有的区域传送请求,直白的说就是你的域名记录将对所有人公开。这么做是为了方便,因为 EveryDNS 或者 XName 对于他们的区域传送服务器的 IP 说法十分不清楚,而且时间长了也有可能变动。只好图个方便在这里允许所有的人来抓取 DNS 记录。相信一般人在这里也不会藏什么秘密。 😛
  4. 来到 EveryDNS 的设置页面。左边是添加记录的地方,basic 框中填入你的域名,比如 xiaoding.org ,选中下面的“Make domain secondary using”,然后输入刚才 ZoneEdit 的那个服务器的地址,点击“Advanced”按钮,添加就完成了。
  5. 在 ZoneEdit 的 Nameserver 选项中,把 EveryDNS 的四台服务器地址添加进去。分别是 ns1.everydns.net ns2.everydns.net ns3.everydns.net ns4.everydns.net
  6. 设置到此结束。EveryDNS 的服务器会自动地向 ZoneEdit 的 Master nameserver 同步。等几个小时以后可以查询自己的 DNS 记录以便确认是否同步成功。

使用如下命令查询 DNS 的 SOA 记录:

nslookup -q=soa xiaoding.org ns3.zoneedit.com

查询结果示例:

xiaoding.org
        primary name server = ns3.zoneedit.com
        responsible mail addr = soacontact.zoneedit.com
        serial  = 1242714018
        refresh = 14400 (4 hours)
        retry   = 7200 (2 hours)
        expire  = 950400 (11 days)
        default TTL = 3600 (1 hour)

注意把 xiaoding.org 换成自己的域名, ns3.zoneedit.com 换成自己的域名解析服务器(每个人可能不同)。针对每个服务器都查询一次,在返回的 SOA 记录中比较一下记录的序列号是否相同,如果相同即表明备份 DNS 设置成功。这样无论 ZoneEdit 或者 EveryDNS 哪一家有问题,自己受的影响都会小很多。

WordPress 手动提速 – 缓存优化

由于大多数的 wordpress 博客都架设在与他人共享的虚拟主机上,所以速度和优化便成了 blogger 们经久不哀的话题。为了优化,我也看过不少的文章。看来看去,很多人只是老调重弹地讲了 WP Super Cache 插件;以及有些空泛地提出要去除不必要插件、优化 javascript 等,可惜这只说明了方向问题却没有点明该如何朝这个方向去做。只好依自己生平所学,手动地折腾了一把 WordPress 优化。

服务器端缓存机制

虚拟主机用户一般无法更改服务器的配置,我们也就不能在这方面有很大的期望。不过“缓存”这一手段仍然是一种相对可行的底层优化方法。Wordpress 有众多的缓存插件来支持这一行为,包括 WP Cache、WP Super Cache、DB Cache 等。

WP Cache 和 WP Super Cache 这样的插件通过生成 HTML 静态页面来降低服务器负荷,达到提速的目的。我个人却不太喜欢这样的方式。其原因有:一,这样做会丧失动态网站的灵活性。特别是那些根据客户端不同会作出不同响应的功能。比如我的主题中有一个 is_bot() 函数,用来针对搜索引擎的机器人作出一些 SEO 的调整。一旦我启用了静态缓存插件,便丧失了这种灵活性。有人说这些功能可以改成 Javascript 实现,但真要改动起来也比较麻烦,有些得不偿失。二,某些个人博客的瓶颈并不在PHP执行这个环节,而是客户与服务器之间的网络线路。甚至我认为,个人博客没有上万的 PV 完全没有必要采用静态化的策略。

DB Cache 插件我觉得可以试试,因为它的原理是缓存数据库查询,特别是虚拟主机中数据库服务器不是本机(localhost)时,这个插件会提高响应速度。但必须注意的一点是很多虚拟主机对于每用户可占用的内存是有限制的,如果这个值太低,那么这个插件也不太适用。

把缓存交给用户

与其在服务器上费力地设置缓存,更好的办法其实是“把缓存交给用户”。我用 Firebug + Yslow 分析自己博客的时候,发现它提示我的博客没有给静态内容设置缓存。于是用 cURL 连接到网站上通过观察 HTTP Header 来分析了缓存的机制。我的博客上 Apache 会发送“Last-modified”和“E-Tag” Header,这似乎也是大多数博客虚拟主机的配置。这样浏览器在请求的时候会发出“If-modified-since”请求,让服务器判断请求的内容(比如图片)是否在某个时间(通常是浏览器缓存的时间)以后发生变化。如果没有变化,服务器返回 HTTP 304 Not Modified 响应,浏览器则可以放心地使用本地缓存,从而降低了 HTTP 请求开销。

Yslow 建议给静态内容设置一个“永久”的缓存。这个永久通常是设置一年甚至更长的缓存期来实现的。设置缓存以后,服务器在对请求作出响应的时候会附加一个 Expires Header,告诉浏览器这个东西在多长时间内不会过期。这样浏览器就可以放心地使用缓存,甚至连 If-modified-since 请求和一个 HTTP 304 响应也不必要了。这样就大大地节省了在网络上的开销。访问者只是在第一次访问时会请求动态内容,接下来则会直接使用缓存的内容,达到了“把缓存交给用户”的目的。

实现方法

要做到这个也是件很容易的事情,对于 Apache 服务器来说,使用 mod_expire 就能轻松地设置缓存期。在 .htaccess 文件中加入以下内容:


# 启用缓存机制
ExpiresActive On

# 图片缓存时间为 1 年
ExpiresByType image/gif "now plus 1 year"
ExpiresByType image/jpeg "now plus 1 year"
ExpiresByType image/x-icon "now plus 1 year"
ExpiresByType image/png "now plus 1 year"

# Javascript, CSS 缓存时间为 12 小时
ExpiresByType text/css "now plus 12 hours"
ExpiresByType text/javascript "now plus 12 hours"
ExpiresByType application/javascript "now plus 12 hours"

有人要说,如果我的内容改变了怎么办呢?因为这样设置以后浏览器并不会向服务器询问是否有新的内容,而是老老实实地相信自己的缓存内容了。
如果你的改动是少数的几个图片,那么只需要在图片的 URL 后面自己加上一个任意的 query string 即可。比如说原来的图片 URL 是

http://blog.xiaoding.org/wordpress/wp-includes/images/smilies/icon_smile.gif

现在只需要在原地址后面加上一个 query 参数即可,此参数对于静态内容可以任意构造,我此处写的是 AnyQueryString

http://blog.xiaoding.org/wordpress/wp-includes/images/smilies/icon_smile.gif?AnyQueryString

这样浏览器会认为此时的图片与原来的不同,将再一次下载它。于是我们就达到了更新的目的。