江湖医生一样的程序员

2009年7月31日星期五

### My .emacs and .emacs.d files

File: my-emacs-dot-d.txt -*- Encoding: utf-8 -*-
Time-stamp: <luanma 07/30/2009 21:41:54>

### My .emacs and .emacs.d files

Emacs 是我的主编辑器, 对 Emacs 的喜爱之情我表达的
永远不够. 基本上每个 Emacs 用户都维护着自己的的
.emacs, 或者整整一个 .emacs.d 目录的 Emacs 配置或
者扩展. 因为 Emacs 是超级可定制化的, 这就是 Lisp
程序的一大优势, Lisp 是坨泥, 你扔再多泥上去它还是
一坨泥. 遵照 Emacs 社区的传统, 我也分享一下我的
.emacs.

所有文件放到 [Github](http://github.com/mrluanma/emacs.d)
上, 因为用了 git submodule, 所以最好用 git clone
仓库, git submodule init && git submodule update,
然后把 .emacs 和 .emacs.d 都拷到 HOME 目录就可以用
了.

如果您没有 Git, 而是直接下载打包好的文件, 您可能需
要根据 .gitmodules 文件里的 Git 仓库的地址去下载作
为 submodule 加入 .emacs.d 的部分, 下载并解压到
.emacs.d 目录下相应的位置.

.emacs 文件里是我的一些偏好设置. .emacs.d 目录下
大部分是一些第三方的 .el 文件, 包括一些我常用的,
而 GNU Emacs 官方发布版本没有包含的 mode. 注意,
一些非 GNU Emacs 官方发布版本的 Emacs 包含了许多的
mode, 完全比我常用的这些多. 比如 Mac OS X 底下非
常优秀的 Aquamacs, 就带了无数优秀的 mode, 单编辑相
关的 mode 就有如此之多:

$ ls /Applications/Aquamacs Emacs.app/Contents/Resources/site-lisp/edit-modes
actr-mode.el
auctex/
auctex.el
css-mode.el
elib/
emacs-rails/
ess-mode/
find-recursive.el
haskell-mode/
html-helper-mode.el
inf-ruby.el
info/
javascript-mode.el
matlab.el
nxml/
php-mode.el
preview-latex.el
prolog.el
python-mode/
ruby-electric.el
ruby-mode.el
rubydb3x.el
snippet.el
ssh.el
tex-site.el
wikipedia-mode.el

可惜 Aquamacs 只支持 Mac 平台, 而我基本上是各个平
台都在用, 各个平台底下表现一致对我来说非常重要.
也正因为各个平台底下的 Emacs 表现都非常之好, 所以
我才基本上忽略掉底层操作系统的差异. 我的 .emacs.d
包含 color-theme, erlang-mode, js2-mode, lua-mode,
ruby-mode, emacs-rails, io-mode, session.el,
haml-mode, sass-mode, yaml-mode.

还有一些零零碎碎的玩意

.emacs.d/find-recursive.el
.emacs.d/fortune.txt
.emacs.d/inf-ruby.el
.emacs.d/maxframe.el
.emacs.d/quack.el
.emacs.d/snippet.el
.emacs.d/asp-mode.el
.emacs.d/tpp-mode.el

在此 GNU Emacs 23 正式发布之良辰吉日, 把 Windows
机器上的 Emacs 从 ntemacs 23 更换成 GNU Emacs
23.1.1. 最后, 给我 Windows XP 机器上的 Emacs 拍张
照片.

2009年7月27日星期一

### RoseHA for SCO OpenServer 5.0.7 网卡状态 ERR

File: rose-ha-sco-openserver-5.0.7.txt -*- Encoding: utf-8 -*-
Time-stamp: <luanma 07/26/2009 21:08:20>

### RoseHA for SCO OpenServer 5.0.7 网卡状态 ERR

最近为一个客户实施了一个信息管理系统的双机热备(HA).
客户要求使用 SCO OpenServer 5.0.7 操作系统, HA 软
件则选择了 RoseHA for SCO Unix. 像 SCO
OpenServer, RoseHA 这样的老旧软件, 我是极力提议不
再使用的, 为什么要部署这种从部署之日之前许久就已经
过时了的系统呢. 最关键的是, 这些老东西还很花真金
白银的. 如果你实在很有钱, 为什么不捐两个开源项目
呢.

GNU/Linux 是一个比 SCO Unix 在效率, 硬件支持, 软件
支持等各个方面都要优秀许多的系统, 各大 HA 软件也支
持 GNU/Linux 系统, 并且有 GPL 的(代表自由和基本上
代表免费) Linux HA(Heartbeat) 可以用. 不过客户有
他自己的理由, 客户所用的信息管理系统是运行在 SCO
OpenServer 5.0.7 的 Binary, 客户认为他没得选择.

当然, 我们可以看到, 客户的信息管理系统是整个信息系
统中最急需处理的部分, 而不是让系统的其它部分反过来
来适应这个老旧软件. 在老旧系统的迁移过程中, 可以
将它先跑到虚拟机上. 正如行军, 伤员走不快, 不能让
大家都走慢来将就, 甚至将非伤员也捅成伤员, 好让大家
统一步伐, 而应该将伤员弄个担架抬起, 大家跑步前进.

转入正题, 写写在 SCO OpenServer 5.0.7 上部署 Rose
HA 的坎坷历程.

首先, 我们几经周折, 安装好 SCO OpenServer 5.0.7,
才让它正确的支持我们的 RAID 卡和 SCSI 卡. 然后安
装了 Intel 的千兆网卡的驱动, 并设置网卡. 然后安装
RoseHA, 在我的 SCO OpenServer 5.0.7 上, 安装程序
将 /opt/roseha/bin/S999roseha 这个启动脚本复制到
/etc/rc3.d, 因为 /etc/rc3.d/ 这个目录并不存在, 所
以 cp /opt/roseha/bin/S999roseha /etc/rc3.d 这个命
令错误地创建 /etc/rc3.d 这个文件. 需要手动删除
/etc/rc3.d, 然后 cp /opt/roseha/bin/S999roseha /etc/rc2.d/
否则 RoseHA 的服务器进程无法开机自动启动. RoseHA
安装在 /opt/roseha 目录下, 需要设置 ROSEHA_ROOT 环
境变量值为 /opt/roseha, 建议将 /opt/roseha/bin 加
入 PATH. 生成 Host ID 之后, 向经销商申请 License
Key, 最好要求经销商将 License Key email 过来, 否则
320 个数字的 License Key 手动输入起来可不是那么好
玩的.

一般需要一个工作日才能拿到 License Key,
ps -ef | grep ha 确保 RoseHA 的服务器进程正常运行
(可以运行 hamond 手动启动 RoseHA), 然后可以运行
RoseHA 的管理软件开始配置 RoseHA. 建议使用 RoseHA
的 Java 的 GUI 管理软件将 License Key 复制粘贴到配置
License Key 的界面. 这里需要注意的是, License Key
需要在做 HA 的两台机器上都分别输入, 每台机器都要输
入两台机器的 License Key. 并且要先输入本机的 Host
ID 匹配的那台机器的 License Key. 输入 License Key
的时候 Hostname 一栏输入机器的实际 Hostname(也就是
hostname 命令的输出). 输入完毕之后, 会有提示是否
更新 License Key 信息, 选择 OK, 等待一会儿之后, 可
以看到 License Key 是否正确. 要确保 License Key
在两边都输入成功之后, 才能够开始配置心跳和服务.

我在输入 License Key 的时候, 是在 Windows XP 机器
上用 cygwin ssh 到 SCO OpenServer 的机器, 然
后运行 RoseHA 的字符终端管理程序 hacon, 在 Emacs
里边打开包含 License Key 的文本文件, 然后用键盘复
制, 在 cygterm 里边按鼠标右键粘贴. 整个过程方便快
捷, 爽(帅)到掉渣渣, 看得我边上的同事简直目瞪口呆.

用 RS232 连上两台机器之后, 很轻松就可以配置上心跳.
但是问题才刚刚开始, 在网络配置的时候 AutoGet(自动
获取). 能正确找到两台机器上的 4 张网卡(每台 2 张),
但是在 RoseHA 配置程序里显示的网卡状态始终为
ERR(错误). 重启 RoseHA 服务之后网卡状态偶尔会 OK
一小会儿, 但一小会儿之后还是会 ERR. 我一直都在
ssh 访问这两台机器, 在这两台机器之间也可以互相
ssh, ping, 所以我一点也不怀疑网卡怎么了, 并且由于
我对 RoseHA 等老旧软件的不信任, 我先入为主地认为是
RoseHA 的问题.

在联系了 Rose 的技术支持之后, 对方也没有拿出合理
的解决方案, 最后对方答应帮忙 ssh 看看. 后来和
Rose 的一个经销商的销售人员聊天, 对方提到是否是
网卡驱动的问题. 我到客户那边准备协调客户设置网络
以便 ssh 时候, 查看了一下 SCO OpenServer 所装的
网卡驱动(用 custom 命令即可查看), 然后再 Google 一
下 "SCO OpenServer 5.0.7 Intel Gigabyte Ethernet",
找到 SCO 官网上的提供的 Intel 千兆网卡的驱动. 哦,
天啊, 我们装的驱动版本是 2.x, 而最新的驱动是 5.x.
于是我下载了最新的驱动, 新驱动依赖于 SCO
OpenServer 5.0.7 的 Maintainance Pack 5, 下吧, 200
多兆的 tar 包, 倒也很快. 于是将下载的两个文件都分
别 scp 到这两台机器的 /tmp, 先解压 Maintainance
Pack 5 的 tar 包, 用 custom 安装. 然后用 custom
删除原来安装的 2.x 版本的网卡驱动, 再用 custom 安装
5.x 版本的网卡驱动, 然后重新配置网卡(在这个过程中, 需
要重启 N 次, 比 Windows 还要重启的过分).

重新启动 RoseHA 的服务, 用 hacon 连上一看, 嘿嘿,
网卡似乎不再 ERR 了, 不过 License Key 变的 invalid
了, 然后网卡也 ERR 了. 看看 /opt/roseha/bin/hostid
的输出, 完了, Host Id 变了, 第一个字母变了, 重新申
请 License Key 吧.

新 License Key 拿来之后, 我先 ha_kill ha 停掉
RoseHA 的服务, 直接 /etc/roseha/etc/config.ha 这个
文件更新了 License 信息(scp 拷下来, 用 Emacs 修改完
再 scp 回去). 但是启动 RoseHA 服务之后网卡状态还
是 ERR, 我基本上要被它折磨崩溃了, 结果, 我重启机器
之后, 网卡状态终于 OK 了, 并且是稳定的 OK 了. 于
是配上基于网卡的心跳, 再写完监控, 运行, 停止信息管
理系统的 Shell 脚本, 在 RoseHA 里新建服务, 测试,
一切正常. 噩梦终于结束了!

在这个过程中, 我没少骂娘, 所以请不要再购买这样的老
旧软件了, 除非您喜欢挨骂.

2009年7月20日星期一

Windows XP RDP 远程无法连接解决过程

File: windows-rdp.txt -*- Encoding: utf-8 -*-
Time-stamp: <luanma 07/20/2009 09:51:33>

### Windows XP RDP 远程无法连接解决过程

事情是这样的, 我们公司给一个客户做了一套 HA 的解决
方案, 因为我是新人, 并且目前在公司的工作只是一个
WEB Boy, 系统实施的过程中老板根本没考虑我, 直接就
请了外地一位外援工程师. 故事正式开始了, 这位工程师
(以下简称 Y 工)要求我们这边给配个 Windows 机器的远
程.

我先按照他的要求 QQ 远程, 结果发现那个速度简直没法
用.

于是我说, 那咱们用 Windows 的远程终端吧, 于是我配
好这边的路由器的 DMZ 转发到我的机器, 然后我检查"我
的电脑"->"属性"->"远程"->"允许用户远程连接到此计算
机"的选项是选中的, 然后"开始"->"启动"->"mstsc"准备
连连看自己的机器能不能连, 我先试了 127.0.0.1 这个
回路 IP, 提示"客户端无法连接, 您已连接到这台计算机
的控制台, 无法建立新的控制台会话.", 我以为一切正常
呢, 不允许我在本机再次登陆本机. 好吧, 于是我换我在
同一个局域网内的 Mac OS X 装好微软的远程终端客户端,
输入 XP 机器的 IP, 连接, 连接失败, 我还尝试了一下
公网 IP, 也是一样. 我用公网 IP 访问了一下我 XP 机
器上开的 nginx HTTP 服务(主要用来和其他机器同步
Git 仓库), 那么说路由器的 DMZ 设置的确是生效了的.
我的 XP 机器没有使用防火墙, 连 Windows 自带的那个
防火墙我也是一支关闭的. 然后我以为是路由器屏蔽了
RDP 所用的 3389 TCP 端口, 于是在 D-Link的无线路由
器里边一顿狂翻, 也没找到哪个设置可能屏蔽了 3389 端
口. 于是我放弃了, 跟 Y 工说, 要不存储我来设置吧.

等过两天闲了下来, 我决定看看这到底是什么鬼呢. 于是
又翻了路由器的设置, 发现是在没有什么可疑的. 我在
XP 机器底下把一个 Rails APP 跑在了 3389 端口底下,
然后在 Mac 上访问 http://公网IP:3389, 发现访问正常.
我才明白路由器没有搞鬼, 是 XP 机器上的远程没有监听
3389 端口, 杀掉 Rails APP 之后在 Cygwin 下
netstat -aon | grep 3389, 没有任何输出, 然后在
cmd.exe 底下 telnet 127.0.0.1 3389 也连接不上.
这下我知道是远程终端的服务没有跑起来了, 于是"我的
电脑"->"管理"->"服务和应用程序"->"服务", 找到
Terminal Services, 发现这个服务被禁用了(不知道什么
时候头脑发热干的了). 启用这个服务之后, 3389 端口
也在监听了, 远程连接就正常了.

其实整个过程也没什么值得写的, 浪费了一些时间, 教训
就是任何网络服务不正常, 首先要确认服务端程序正确跑
起来没有, 先检查端口有没有在监听, 看看 telnet 能不
能连上那个端口, 然后才是去检查网络是否通畅.

我的计算机生活

File: windows-kid.txt -*- Encoding: utf-8 -*-
Time-stamp: <luanma 07/19/2009 08:19:37>

### 我的计算机生活

其实我是个盗版 Windows 受害者.

我有个 Sony VAIO 的 11.1 英寸小本本, 长的一副纤细
的好身材, 强劲的电池可以正常使用五个小时, 虽然在它
上面安装盗版 Windows XP 的过程异常的痛苦, 驱动, 驱
动...补丁, 补丁...并且它可以非常顺的跑 Linux, 但是
鉴于我对把 Linux 当桌面系统和 Linux 下现代浏览器的
失望, 并且我偶尔也得靠做点 Windows Only 的东西糊糊
口, 就算是 WEB App, 也得考虑该死的 IE 兼容. 于是
我成为了一个标准的 Windows Kid.

其实严格说我的本本是 OEM 了 Windows License 的, 那
么说在我的电脑上安装 Windows 应该是合法的, 但其实
我并没有太在乎我是不是盗版 Windows 的受害者. 这个
心态就跟小年轻都喜欢喝点小酒叼跟小烟差不多, 当然也
事关 Money, 如果让我花钱买 Windows, 那我宁愿把钱捐
给 GNU 基金会. 怎么说俺也是个 Geek, 用个盗版
Windows 掉不掉价! 其实你看周围大小 Geek 都整个
Linux 当桌面, 那你为了表现你与众不同, 你难不成要整
个 SCO OpenServer 当桌面系统? 前几天因为工作需要,
接触到了 OpenServer 5.0.7, 从此, 我认识到了
Windows 其实是个先进的系统.

其实说实话用什么系统对我来说并没有什么区别, 我依赖
的一些工具软件一般都是跨平台的, Emacs, Ruby, Git,
以及 GNU 的一大堆 Unix 工具的实现, 在主流 PC 操作
系统底下都有移植. 在 Windows 底下用 Cygwin, 就有
了再熟悉不过的 Bash 和 Unix 工具链. 然后装个
Pidgin 当做 IM 客户端, 装个 Google Chrome 作为默认
浏览器. 一个好用的 Windows 就这么诞生了.

我用的 Windows 不会安装任何杀毒软件或者安全软件,
就连 Windows 自带的防火墙, 我也会把它关闭. 如果你
自己都保障不了你计算机的安全, 那么一个傻逼的程序也
不能. 并且我的计算机资源有限, 浪费不起, 少跑一个
程序, CPU 少点负担, 至少也能省点电池.

我也不喜欢更改 Windows 的主题. 一个商业用的桌面系
统, 你就是再折腾, 它也不会漂亮到哪里去. 我干脆直
接使用的 "Windows 经典" 这个主题, 并且在把系统的
Theme 服务给禁用了. 还是那句老话, 省点电池.

我很依赖 Google 的各种服务, 一般连上互联网, 我就会
用 Pidgin 同时登陆 MSN, Gtalk, 然后处理 Gmail 里的
邮件, 如果得空我会看 Google Reader 里订阅的信息,
如果是上班时间则在下班之前用 Google Gears 同步
Google Reader, 然后在得空的时候离线看. 就算是
Twitter 或类似的服务, 我也只通过 Gtalk bot 使用,
因为 Gtalk 的信息是可以保存在 Google 的服务器上的.

在我遇到新东西的时候, 我会先阅读这玩意在维基百科上
的词条, 在有需要的时候, 我会并且一般只会使用
Google 英文搜索.

我一般不使用国内的抄袭大王如腾讯, 校内等的小农意识
严重的产品, 包括 QQ, 虽然到今天在主流系统底下都出
了客户端, 我接受不了他们对待第三方客户端的态度.
校内呢一个连客户端都是基于 Google 开源的 libjingle
开发的校内通, XMPP 服务器为什么用第三方的客户端(比
如 Pidgin)登陆就隔三岔五掉线呢, 应该是开始向腾讯学
习了. 你们都是大爷, 我惹不起你们的服务.

在贵国, 不但企业有特色, 我们的政府给我们的"互联网"
都是有特色的. 在党和政府的培养下, 我们的小学生都
掌握了一种以上的翻墙技术. 我们的博客作者们开始大
量的使用国外的域名注册商, 使用国外的主机, 先精神移
民了再说. 我就接着使用这些我喜欢的服务, 管你能访
问也好, 不能访问也好. 所以, 哪怕没人看的到, 我也
继续更新我"江湖程序员"的博客. 因为我相信, 真正的
互联网, 会到来. 在这场战争中, 我还没有认输.