2月 222012
 

几天前,我在系统 Fedora 16 启动过程中 Plymouth 的主题气泡快要充满时,把USB接口的鼠标接了上去,发现之后在 GDM 登录界面,移动鼠标根本不会让光标移动。使用笔记本上的触摸板倒是正常。登录进入系统后,插上U盘测试,根本出不来 /dev/sdb。换其他的USB接口,依然不行。查看日志 /var/log/messages,可以看到大量类似的行(dmesg输出也有类似信息):

Feb 20 22:00:14 localhost kernel: [   34.571048] hub 2-0:1.0: connect-debounce failed, port 2 disabled

上网 Google,看到 Launchpad 上一个 kernel bug 讨论中,不少人遇到过这个问题。其中提到的解决方案之一是重启电脑,修改 BIOS 设置里 USB Legacy Support 或类似选项为禁用,之后进入 Linux 系统,应该不会有新的上述错误信息,USB 接口可以正常使用。再次重启,在 BIOS 中重新启用 USB Legacy Support,然后进入系统,也不会再有类似错误信息。USB 接口也可以重新正常使用。我使用了这一方法,对我的情形的确有效。(然而根据讨论,有的机器上就没有作用)

当然,潜意识告诉我:在启动未就绪时热插拔不是个好主意。不过这究竟会带来什么问题,是否会导致硬件故障,我着实没有搞清楚。

2月 162012
 

JavaScript 中数组与对象定义时最后一个元素后如果跟了一个逗号,那么可能引起问题。一个简单的例子是 [2, 3].length 等于 2,而 [2, 3,].length 在 Firefox/Chrome 中仍为 2,但在 IE (旧版)中等于 3 (它会认为最后有一个元素值为 undefined)。有关这个问题,还可以参考 Dan Lee 这篇有趣的博文,以及 Drupal 的一个 Bug 报告。而我最初是在看 GitHub 上 Hotot 的一个 Pull Request 时开始注意到这个情况。

末尾逗号的写法 C/C++ 程序员应该很习惯。末尾逗号能在改变对象中元素顺序、使用代码生成数组、拷贝代码时带来方便。然而在旧的 JavaScript 实现中,这是不允许的。根据这篇博文,IE8 里已经修复了这个 "bug"。另外,ECMAScript 5 规范里已经容许了末尾逗号,目前新版本的 Firefox/Chrome 对这个标准有良好的支持。(参见这里

值得注意的是,JSON 规范中要求不能有末尾逗号的,否则就是格式错误。JSON 不等于 JS 对象。因此,使用代码生成 JSON 格式的字符串时,采用前置逗号是更好的实践。(参考 stackoverflow 上的这个问题

2月 032012
 

我的 connect6-ng 是在 connect6 的基础上进行的。原项目使用 SVN 做版本控制,但我更喜欢使用 Git。所以我在开始 connect6-ng 时先检出了 SVN 仓库里的最新版本然后取出其中源代码初始化了 Git 仓库,并没有继续 SVN 历史。

董渊老师建议我能把两段历史连接起来,以体现出项目的延续性。老师还帮忙使用 git-svn 在 Ubuntu 9.10 下将 connect6 项目的 SVN 历史转换到了 Git 仓库下:

mkdir connect6.git
cd connect6.git/
git-svn init http://connect6.googlecode.com/svn/ --no-metadata
git config svn.authorsfile ../authors.txt
git-svn fetch
git log
cd ..
tar -zcvf connect6.git.tgz connect6.git/

其中authors.txt的内容为:

qq280833822 = CHEN Shuang <qq280833822@gmail.com>
wanglei     = WANG Lei    <leopardguo25@gmail.com>

我收到 connect6.git.tgz 后在连接两段历史前,对前一段历史记录做了一些更改:使用 git filter-branch 删除了仓库里的 *.class 文件、/trunk/connect6.jar 文件,因为我觉得这些中间文件或目标文件放在仓库里意义不大。另外,我又将 trunk 目录做成了仓库的根目录,这和后面我的仓库更接近。处理后的仓库目录我命名为 connect6-shrinked/

参考 stackoverflow 中这个问题回答,我使用其中的第三种方法(refs/replace/) 将 SVN 仓库历史转换成的 git 历史添加在了 connect6-ng 提交历史的前面,连上了两段历史。不太详细的步骤如下:

切换到新项目 connect6-ng 的顶层目录,把 connect6-shrinked 加为一个远程仓库,命名为 history:

$ git remote add history file:///path/to/connect6-shrinked/

然后找出 connect6-ng 项目最初的提交(Initial commit)的 SHA1 值,保存到 $TAIL 变量中:

$ TAIL=$(git rev-list --topo-order master | tail -n 1)

接着找出要导入历史的旧项目的最近的一次提交,保存到 $TOP 变量中:

$ TOP=$(git rev-parse --verify history^0)

然后读取 $TAIL 这个 commit 对象的内容:

$ git cat-file commit $TAIL > TAIL_COMMIT

手工编辑 TAIL_COMMIT 这个文件,加入一行 parent $TOP(其中 $TOP 换成对应的 SHA-1 值),这使得新项目的初始提交有了旧项目的顶部作为父提交。将新的 TAIL_COMMIT 写入仓库:

$ NEW_TAIL=$(git hash-object -t commit -w TAIL_COMMIT)

最后使用 git replace

$ git replace $TAIL $NEW_TAIL

这样就连接好了两段历史记录,可以用 git log 等查看。

要把合并后的历史 push 出去,需要在自己仓库 .git/config 文件中对应 remote 部分加一行:

push = +refs/replace/*:refs/replace/*

在合并两段历史之前已经从 connect6-ng 远程仓库 clone 了代码仓库的同学,如果不做修改,还是只能看到较新的一段历史。要想看到旧的SVN导出的历史,需要修改自己的 .git/config 里 origin 部分(或者其他指向 connect6-ng 远程仓库的 remote 分支名)添加一行:

fetch = +refs/replace/*:refs/replace/*

这样之后 git fetchgit pull 就可以拉取 refs/replace/ 下的后来添加的历史了。

附注:本文参考了董渊老师和我的邮件、stackoverflow 上的回答等,一并感谢。

2月 022012
 

昨天(2月1号)给网站添加了 favicon,参考了这里。其中要注意的是如果使用了子主题,那么 favicon 需要放在子主题而非父主题的根目录中。

昨天还安装了 syntaxhighlighter 插件用于代码高亮。安装很简单,就是下载解压,然后在管理界面启用插件,具体步骤可以参考前面的链接。

今天则调整了网站副标题(CSS 中 description 类)的样式,改成了个人更喜欢的斜体衬线字。另外是花了不少精力优化打印版本页面的样式,最终通过将针对打印介质的 CSS 代码写到 Suffusion 配置中的 Back-end -- Custom Includes -- Custom Styles 部分,得到了比较好的效果(可以通过打印预览查看)。目前的 CSS 代码是(顺便测试 syntaxhighlighter :)):

@media print {
    body {
        font-family: serif;
        font-size: 10pt;
        background-color: white;
        color: black;
    }
    a:link, a:visited {
        background-color: transparent;
        color: #520;
        text-decoration: underline;
        font-weight: bold;
    }
    h1, h2, h3 {
        background-color: white;
        color: black;
    }
    code, pre, kbd {
        overflow: visible;
    }
    pre {
        padding: 0;
        font-size: 80%;
    }
    div.entry a:link:after, div.entry a:visited:after {
        content: " (" attr(href) ") ";
        font-size: 90%;
    }

    /* Do not display nav bar, sidebar, etc */
    #nav, #sidebar-shell-1, #commentform {
        display: none;
    }
    #wrapper {
        background-color: white;
        color: black;
        max-width: 100%;
        min-width: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
        border-style: none;
    }
    #container, #main-col {
        width: 100%;
        margin: 0;
        padding: 0;
    }
}

另外,今天还意外地解决了固定链接被覆盖需要重设的问题。由于我在 OpenShift 上搭的博客,组件的更新需要用 git 推送。之前我发现每次 git 推送后,WordPress 的固定链接都会失效,得在管理界面的固定链接部分再次“保存更改”才行。查看了有关固定链接的介绍后我才明白,WordPress 通过写 .htaccess 规则来实现各种格式的固定链接。我 SSH 到网站网页文件目录,用 cat(1) 查看 .htaccess 文件内容,发现比起 git 仓库的版本果然多了一些内容。将相应行内容复制到 git 仓库中,重新推送,问题就不复存在了。