Ubuntu Server 14.04 使用 Ruby 2.0

官方源已经提供了 ruby2.0 但是因为 debian 源处理 bug 删除了 ruby-switch 包,就无法使用 update-alternatives 来切换 ruby 版本了。

目前就只有手工切换一下,命令如下:

1
2
3
4
5
6
7
8
9
10
sudo rm /usr/bin/ruby /usr/bin/gem /usr/bin/irb /usr/bin/rdoc /usr/bin/erb
sudo ln -s /usr/bin/ruby2.0 /usr/bin/ruby
sudo ln -s /usr/bin/gem2.0 /usr/bin/gem
sudo ln -s /usr/bin/irb2.0 /usr/bin/irb
sudo ln -s /usr/bin/rdoc2.0 /usr/bin/rdoc
sudo ln -s /usr/bin/erb2.0 /usr/bin/erb
sudo gem sources --remove https://rubygems.org/
sudo gem sources -a https://ruby.taobao.org/
sudo gem update --system
sudo gem pristine --all

嗯,顺便把 rubygems 切换到淘宝镜像。不知道什么时候 packagist 也有国内镜像啊;每次本地 composer update 都是在消耗时间。

为什么要选择 Ubuntu Server?

首先,我所参与的技术团队都是这样的:

  1. 没有自己的底层系统开发/定制团队;比如,自己定制特别的文件系统
  2. 也没有对特定的服务端做修改;嗯,就是维护自己的 nginx、php、mysql 这一套玩意
  3. 对安全有关注,但没有能力去主动寻找和解决安全问题;是的,团队很小
  4. 我们只采用主流的、成熟的新技术;应该说就是最近一两年开始兴起,然后被业内主流所接受的稳定技术
  5. 我们的很多项目会使用一些这样那样的小东西;虽说折腾是一个好习惯、好体验,但谁经不住折腾
  6. 只有兼职的系统维护工程师;很多情况下就是我自己

其实,这差不多就是为什么要采用 Ubuntu Server 的理由了。

对于服务器版本来说,可选的大约就是 FreeBSD、CentOS、Debian、Ubuntu Server、OpenSuse、Fedora 少数几个。除开 FreeBSD,大约就是 CentOS 与 Debian/Ubuntu Server 的选择。

大多数推崇 CentOS(也包括 FreeBSD)的理由就是稳定、可定制、硬件支持广泛,而实际上隐含的是,他们不更新,对系统也没有灾难处置。

是的。大部分人就是选择一个所谓稳定的系统、安装特定的服务端,然后就不再理会了。希望这台服务器可以省事的运行五年甚至七年。

实际上,对于服务器,我们需要:

  1. 及时的安全应对和更新
  2. 较新的服务端应用版本以便实施新技术,而不用自行定制

是的,我只是一个系统维护工程师,不是系统开发工程师。我需要关注的是安全、稳定、可用。但我不是系统开发,我无法独立去自行同时解决服务端应用软件的安全、稳定、可用。

虽然我可以为了解决可用,选择一个较新版本的开源服务端软件自行编译安装。但是,我需要去关注这个开源项目,订阅相关安全通知,并且在第一时间自行解决问题。

同样我也可以为了解决稳定,事先通过测试比较选取相应软件的最稳定版本,然后不再更新任何东西。但是,安全呢。

服务器不是孤立的。粗放的管理方式存在极大的隐患。而解决隐患,要耗费大量的精力,也包括我的能力。我不是系统开发工程师。

如果你不相信 Ubuntu 官方源的系统开发工程师不能为你提供最新、最安全、最稳定的服务端应用,我们还有 PPA 可用。

一般由专业厂商和团队乃至应用开发团队提供的 Personal Package Archives 源比你自行去解决要专业的多。嗯,除非你本身就是应用的开发工程师,那你更专业~

github 版本库分离子目录为只读子版本库

Github 的官方文档有说明如何使用 git 分离一个已存在版本库的子目录到新的版本库。但这玩意就是一次性的。分离之后,父库上的子目录修改没办法自动同步到子库上。

幸好 github 上也有人提供了同步工具 git-subsplit

使用起来很简单。

首先,你得至少有两个版本库。比如在 github 分别是 https://github.com/yourname/foo 和 https://github.com/yourname/foo-bar 其中,foo-bar 对应 foo/bar 目录。foo-bar 最好是空仓库。

然后检出 foo 到本地,创建 foo/bar 目录,增加点内容。

可以在 foo 本地目录,也可以另找一个地方,执行:

1
git subsplit init https://github.com/yourname/foo

设置父版本库。这个只需要一次执行。

等到父版本库有新的 push/pull 后,回到该目录下,执行:

1
git subsplit update

更新(pull)父版本库的变更。

最后,执行:

1
git subsplit publish bar:https://github.com/yourname/foo-bar --heads=master

同步变更到子版本库。子目录可以多层,也可以同步多个。

Golang Die

最近写小脚本越来越多,基本上都是用 Golang 了,也慢慢习惯使用了 https://gist.github.com 来存放一些脚本。
今天突然发现原来 gist 也可以直接 import 的,于是赶紧把常用的 Die Error 共用了。

// Package offers a function that die err message if err not nil.
//
//    import . "gist.github.com/9521299.git"
//    Die(err, something...)
//
package gist9521299

import (
	"fmt"
	"os"
	"path/filepath"
	"runtime"
)

// Die err message if err not nil.
//
func Die(err error, a ...interface{}) {
	if err != nil {
		_, file, line, ok := runtime.Caller(1)
		if ok {
			fmt.Fprintf(os.Stderr, "Die @%s #%d: ", filepath.Base(file), line)
		} else {
			fmt.Fprintf(os.Stderr, "Die unknown location: ")
		}
		a = append(a, err)
		fmt.Fprintln(os.Stderr, a...)
		os.Exit(1)
	}
}
// Package offers a function that dump everything.
//
//    import . "gist.github.com/9521299.git"
//    Dump(something...)
//
package gist9521299

import (
	"fmt"
	"os"
	"path/filepath"
	"runtime"
)

// Dump everything.
//
func Dump(a ...interface{}) {
	_, file, line, ok := runtime.Caller(1)
	if ok {
		fmt.Fprintf(os.Stdout, "Dump @%s #%d: ", filepath.Base(file), line)
	} else {
		fmt.Fprintf(os.Stdout, "Dump unknown location: ")
	}
	fmt.Fprintln(os.Stdout, a...)
}

Godoc.org 直接可以生成文档:Die Doc

Raspberry Pi Coder 使用 StartSSL 证书

Google Creative Lab 为 Raspberry Pi 提供了 Coder 工具,默认是使用 https 访问,用的是自动生成的自签名证书。

我们知道 StartSSL 是免费为个人提供 SSL 证书的,所以可以将 Coder 的自签名证书替换为 StartSSL 的签名证书。

Coder 的证书是放在 /home/coder/coder-dist/coder-base/certs 名称分为为 server.cert 证书和 server.key 私钥。需要注意的是 Coder 目前只支持 PKCS #8 格式的私钥,需要转换。

openssl pkcs8 -topk8 -inform PEM -in startssl.key -outform PEM -nocrypt -out server.key

另外,cert 证书不支持根证书拼接,直接使用 StartSSL 提供的即可。

最后,需要注意两个文件的属主是 coder,key 私钥文件的权限是 600。

更换服务器

终于从废弃的 ubuntu server 11.04 中解脱出来了。
目前这个 VPS 的面板貌似是卖家自行开发的,但服务器位于洛杉矶,访问速度会快很多。
当然,虽然价格便宜了,虚拟机配置倒是大大提升了。

自己架设了一个在线 RSS 阅读器

作为 Google Reader 的重度用户,真的无法接受 Google 关停 Reader 的决定。

对于我来说,90% 的新闻资讯都是来自于 RSS。这其中还有相当分量的技术内容。

GReader 的好处其一是来自 RSS 统一阅读,快速又直接的阅读最新的文章。而且这基本上是我感兴趣的。

其二是历史功能。是的,Google 存储了所有 RSS。使得已经消失的 Atom 继续存在于 Reader 中。只要你曾经订阅过,它就存在。

而现在,它即将消失。

同样在 Reader 上看到别人的文章推荐了 selfoss。自己架设了一个(习惯性使用 https,国外产品对此支持一直很不错)。

问题不少。

首先,OPML 导入功能有问题。我原本给一个 ATOM 设置了好几个 tag,这些 tag 没有自动合并。而是存在好几个不同的 ATOM。

其次是抓取功能。没有提供命令行接口,而是采用前台链接访问的方式。因为我的订阅列表很多,而且有大量的失效内容,处理时间会很长,基本上会超过 Web 服务器的最大处理时间。

最后是阅读功能。快捷键有一点不同,需要适应。而文章的分栏阅读界面也需要适应。