Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

第二次服务器迁移

终于在周日把服务器迁移到 Linode 上去了,这是 is-programmer 上线以来的第二次迁移,第一次是从墙内的托管主机迁移到 Godaddy,第二次就是这次从 Godaddy 迁移到 Linode。

比较意外的是,虽然在 Godaddy 使用的是独立服务器,但是测试后发现还是 Linode 的 VPS 性能要稍好一些,看来那台独立服务器的配置确实是太老了。

价格比 Godaddy 便宜一些,不过要是算上 Godaddy 打折就和原来差不多了。

这样看来,唯一的缺点就是硬盘比原来小了不少,还好并不会有很大影响,而且 VPS 基本都是如此吧。

 

回顾主机类型的变化也很有趣:第一次是自己组装的 1U 服务器,第二次是 Godaddy 的独立服务器,这一次是 Linode 的 VPS。

配置和管理越来越容易,性能越来越好,价格还越来越低。

不得不说现在要想架个网站,服务器方面的门槛是越来越低了,不仅体现在价格上,最主要的还是管理上,再也不用跑机房了。而且有 Linode 这种虚拟化的主机,还可以轻松把服务器架到全球各地去~

回顾迁移的原因,第一次是因为服务器被拔线,这一次是因为间歇被墙,看来都和天朝和谐的网络环境脱不了关系,不过也因此被强迫着学习了不少东西。

 

is-programmer 的迁移的过程相当顺利,只花了 20 分钟,大部分时间花在在两台服务器间传输数据上。不过服务器的准备方面花了两天才搞定,vsftp、postfix、crontab、apache、mysql…… 基本上把那些配置又重新复习了一边,顺便玩了玩 Octpress 给旧的服务器做了个迁移提醒页面

新的服务器没有了被墙的问题(也许是暂时的?),速度也快了不少,Linode 的确如传言所说的那样好使,强烈推荐~

 

 

 

还愿 PS3 :游戏果然还是用主机玩最爽

上一次大规模的玩游戏机还要追溯到大学一年级玩 PS2 的时候,之后就因为各种原因没怎么碰过游戏主机(PSP 除外),虽然说没钱是原因之一,不过最主要的原因还是没时间。

但是我还是对此念念不忘,想当初上学时的一个幻想就是可以天天玩游戏,而且当初学日语的基本动机就是为了玩游戏呢~

于是终于在 PS3 发售的 6 年后将其入手,当初对我遥不可及的 PS3 现在轻而易举的就入手了(价格只相当于半个 iPad),真让人感慨啊~

不过,这一切的起因是:

  • 下个月要外出,所以需要采购一台笔记本电脑。
  • 因为刚买过 iPad 的缘故,剩余的资金不够多,虽然买个低端机很富裕,但是要买个高配机似乎还不够。
  • 纠结于:1. 买个低端机先用着。2. 还是再攒点钱一步到位买个高配机。
  • 开始思考:买个高配机真能带来和多花的那些钱的相配的满足感吗?
  • 结论是似乎不能,有那些钱还不如去买个 PS3 玩的爽快。
  • 于是削减了笔记本的预算,入手了 PS3。

自我感觉这个借口还是比较顺理成章的,于是就这样阔别 n 年之后,终于还了这个愿,再次拿起游戏机的手柄。

于是现在把 PS3 放在桌子下,连在显示器的 HDMI 接口上,现在只要切换一下显示器的 input 就可以随时拿起手柄玩游戏了(这个诱惑好大啊),而且当初换了带 HDMI 音频输出的显示器还真是有远见啊~

作为一个已经落后于时代的人,我就不再仔细形容了,总之终于找回了当初彻夜玩游戏的感觉(现在大拇指很痛…),这种感觉是在电脑上和手机平板上永远也找不到的感觉,游戏还是用主机玩最爽。虽然在这个手机小游戏和网游满天飞的时代,游戏主机越来越没落了……

现在的问题就是时间了,只能严格控制玩游戏的时间为周末凌晨,和每天睡前的两个小时,希望我能忍得住啊 T^T。

 

 

这些游戏够我玩到年底了~

现在非常满意这个决定,因为带来的满足感远远超过一台高性能的笔记本电脑。

Psych、Syck、YAML 和编码

这次 is-programmer 升级碰到了一个很棘手的问题,花了好长时间才把大致的原因搞明白,这里记录一下经过。

背景

在 Ruby 1.9.2 之前,YAML 的解析使用的是 Syck 这个引擎,而从 1.9.3 之后,默认的引擎变成了 Psych。Psych 相比 Syck 有以下优点:

  • 可以正确处理 UTF-8 字符。
  • 基于的底层库是 YAML 标准组所写的 libyaml。
  • 支持 YAML 1.1。
  • Syck 已经不再维护了。

UTF-8 字符串的处理是 Psych 和 Syck 之间最主要的一个区别:

Syck 因为无法直接处理 UTF-8 字符,所以如果导出的值中含有 UTF-8 字符串的话,Syck 会把它 Base64 编码,然后保存为 binary 格式:

# Syck
$ YAML.dump(:title => "标签云")
=>
 ---
 :title: !binary |-
  5qCH562+5LqR

Psych 可以正确序列化 UTF-8 字符,所以 YAML 中保存的就是原始字符:

# Psych 
$ YAML.dump(:title => "标签云")
=>
 ---
 :title: 标签云

当然 Syck 这个引擎在 ruby 1.9.3 里面还是存在的,可以通过设置 YAML:ENGINE 来在程序中切换:

$ YAML::ENGINE.yamler = 'syck'    # 使用 Syck 引擎
$ YAML::ENGINE.yamler = 'psych'   # 使用 Psych 引擎

问题

is-programmer 早在 ruby 1.8.x 的时代就开始使用 YAML 来保存设置,自然 UTF-8 字符串都是 Syck 的 binary 格式,这次升级将 ruby 从 1.9.2 升级到了1.9.3,YAML 的默认引擎也就切换到了 Psych,因为本地测试都是使用全新的数据,因此并没有发现问题。

结果上线之后,发现大量的中文设置出现类似

æ ‡ç­¾äº‘æ ‡ç­¾äº‘æ ‡ç­¾äº‘

的乱码。

不用说,问题肯定出在 Psych 上。

原因

既然出现乱码的都是含有中文字符串的设置,那么问题就比较明朗了,那就是:

Psych 似乎不能正确解析在 Syck 下序列化的 binary 格式的字符串。

我猜测是因为 Psych 不知道 binary 字符串原来的编码,也可能是 Psych 的 bug 或是标准不兼容。总之,如果使用 Psych 来读取 Syck 下保存的 UTF-8 字符串,会出现很诡异的结果:

$ YAML::ENGINE.yamler = 'psych'
$ YAML.load("---\n:title: !binary |-\n5qCH562+5LqR")
=>
 {:title=>"\xE6\xA0\x87\xE7\xAD\xBE\xE4\xBA\x91"}

然后,在网页上显示的就是更加诡异的诸如以下的字符:

æ ‡ç­¾äº‘

解决

本来,要解决这个问题很简单,只需要把 YAML 引擎切换回 Syck 就行了:

 YAML::ENGINE.yamler = 'syck'

这样虽然无法使用新引擎,但是至少显示不会出现问题。

不过,由于上线之后,一些用户又重新保存了设置,问题一下就复杂化了。

把引擎切换回 Syck 已经来不及了,因为 Syck 也不能正确解析 Psych 下保存过得 YAML。

不仅仅是如此,更加郁闷的是,现在 YAML 中不仅有老的 binary 格式字符串,还有被 Psych 保存过的乱码字符串,而且还有保存正确的 Psych 格式的中文 UTF-8 字符串……

这可肿么办呐 

经过一番 之后,决定还是先想想怎么把乱码恢复成正确的中文字符串。

之后又经过了一番 ……终于发现,Psych 似乎在解析了 binary 字符串之后,并没有把字符串标示为 UTF-8,而是标示为 ISO-5589-1(也就是 LATIN-1),之后由于 ruby 内部的编码被设成成了 UTF-8,所以字符串又被按照 ISO-8859-1 的过程转换了一番,于是就得到了网页上显示的那样诡异的字符。

这样的话,如果想把乱码转换回中文,那么就需要:

"xxx乱码xxx".force_encoding("UTF-8")\    # 先强制标示为 UTF-8
            .encode("ISO-8859-1")\      # 再转换成 ISO-8859-1 
            .force_encoding("UTF-8")    # 再强制标示为 UTF-8

这样正确的字符串就回来啦~

不过,YAML 还有已经被 Psych 正确保存的中文字符串,还有一些非中文的英文设置,怎么把乱码和这些正确的字符串区分呢?

幸运的是,如果是英文字符串,在这个过程中内容并不会改变(英文没有编码问题就是爽),而如果是已经正确保存的中文字符串,那么在 encode("ISO-8859-1") 的时候,会 raise 一个 Encoding::UndefinedConversionError 异常,这样只要捕捉这个异常并保留原值就行了。

于是,如果想把混乱的 old_hash 修复的话,就要:

    def fix_yaml_hash(old_hash)
        new_hash = {}
        old_hash.each do |key, value|
            if value.is_a?(String)
                begin
                    new_value = value.clone.force_encoding("UTF-8").encode("ISO-8859-1").force_encoding("UTF-8")
                rescue
                    new_value = value
                end
            else
                new_value = value
            end
            new_hash[key] = new_value
        end
        return new_hash
    end

这样的话,问题就全面解决了~

结论

  • 如果你已经使用上了 Psych 并且一切正常,那么就用吧,Psych 在今后应该可以成为 ruby 处理 YAML 的标准。
  • 如果你还在使用 Syck,还是先 YAML::ENGINE.yamler = 'syck' 用着吧。
  • 如果还没有开始使用 YAML,那么强烈建议趁着这个机会去转向更加流行的 JSON

还是没忍住

新的 iPad 发布了,虽然没有什么大的更新,但是那块屏幕对于经常看网页和 pdf 的我来说,还是有很大的吸引力。

不过中国大陆还没有发售,虽然香港发售了,但是我心想水货肯定又像 iPad2 那时候被炒到 5、6k 吧。

结果无意间去淘宝上一查,发现价格只有 3k6 (16G Wifi)左右,不知道是因为官方货源充足,还是黄牛们买得太多了,总之这个价格还真是合适,于是一激动就入了 32G 版……

由于黄牛们手上都是现货,再加上给力的顺丰快递,第二天中午就拿到了手。从 16 日全球发售算起,第四天就入手用上了,这还是第一次买电子产品这么激进。

开机激活,之后恢复设置、同步软件,所有的环境和数据就和旧 iPad 完全一致了,完全的平滑迁移~

由于没用过 iPad2,所以 new iPad 对我来说轻薄了不少,这算是额外福利吧。

最爽的还是屏幕了,虽然乍看上去没什么,但是打开 pdf 或者网页就明白了,字体不再是“毛茸茸”的,而是锐利得犹如打印版,效果几乎可以和 Kindle 持平了,仅仅是这点就可以让我满足了 T^T 。

除了 pdf 和网页,漫画的观看效果也提升了一个档次,高质量扫描版的优势立马就体现了出来~

本想弄两张图对比一下屏幕效果,不过用手机拍出来的效果比实际看上去差了十万八千里,只有亲眼看过才能明了。

其余的方面就无所谓了,虽然硬件都升级了,但是在普通程序里面没觉得有什么差异,因为原来也很流畅,只有在一些大型游戏和用手势切换程序的时候,才觉得的确是比原来快了。照相机和摄像头对我来说都比较鸡肋,基本上不会用这个东西去拍照片,也许在某些程序里面会用得到吧。

……

于是这样,新 iPad 顺利接任老版。唯一的遗憾,就是没什么可以折腾的,所以感觉有点失落

 

 

想换服务器了

从国内的服务器换到 Godaddy 已经有两个年头了,可以说 Godaddy 的服务器是非常稳定的,服务也不错,价格相当实惠且支付方便。

不过由于众所周知的原因,Godaddy 的确是被 GFW 做了“特殊关照”,除了最初针对 Godaddy DNS 服务器的屏蔽,现在服务器本身的访问也变得断断续续的了。

最初只是局部地区的状况(尤其以联通的网络为主),不过最近这个“局部地区”的范围似乎是越来越大,所以还是考虑换服务器吧。

初步打算换到 Linode 去,不过因为 Linode 是 VPS 的缘故,性能可能会有一些下降,至少硬盘空间没有原来充裕了,不过如果可以让访问流畅的话,也是值得的。

等 is-programmer.com 的下一版上线之后,就去着手迁移~