Poderosa 项目复活了

Poderosa截图,图片来自官网
Poderosa 截图

四年之前我就开始关注 Poderosa 这个项目,因为我认为它是我能找到的最好的 Cygwin 终端客户端——没有之一。当然,如果你把它当做 ssh 客户端去跟其它软件比,你就输了。

由于它在 2006 年 11 月以后再也没有更新过新版本,两年前,我曾经因为它有了一个“同人” 2009 特别版 而激动不已。

前两天,我偶尔去逛论坛,居然发现这个项目复活了!作者在开放讨论区里面声明发布了 4.3.0b,真是太让人兴奋了!

令人奇怪的是,xjzhang1979 君虽然提供了 N 个 Poderosa 特别版升级版本,但从来没有释出过源代码,看起来也没有打算这样做。作者 kzmi这里也提到:

5.7.x has more new features, but their source code has not been disclosed.

4.3.x are developed on the Poderosa project and you can get their source code.
Some features from 5.7.x were added to 4.3.x.
...
I believe that the terminal emulation of 4.3.x would be better than 5.7.x's.

由于 5.7.x 不开放的源代码,相比 4.3.x 而言用户肯定对其安全性有一定怀疑。现在有了更好选择,恐怕特别版的拥护者会越来越少了。这真的让人很遗憾!

有关 SVN、Cygwin 和 Notepad++

1. svn 的访问控制

很久以前我就自己配置过 svn 服务器,但总是不能访问成功。到最后还是使用文件系统(即用 file:/// 而不是 svn:// 或其它)访问 svn 仓库,因为自己建立的文件系统不需要认证。

今天我又尝试琢磨了一下我 svn 仓库的设置,才发现之前没配置成功的原因:svn 对用户的权限默认是关闭的。因此当我设置了用户名密码,svn ls 时得到的提示信息仍然是:

svn: Authorization failed

时,我就糊涂了,我的用户名密码没错呀,为啥还是Authorization failed?我还以为是密码设置有问题,没想到除了用户名以外,还得给用户配置访问列表(ACL),否则就什么都访问不了。说简单点儿就是 svn 用户访问控制是一个白名单机制,而我当成了黑名单机制。

知道了错误原因,就很简单了。到与 svnserve.conf 同目录下的 authz 为对应用户添加可以访问的项目就可以了。

2. cygwin 的启动速度

最近发现 cygwin 的启动速度大大变慢,一个终端起来至少要 30 秒。而且不仅仅是启动,所有程序的运行速度都变慢了,比如文件名补全竟然需要好几秒!我忍了很久,就差卸了重装它了,只是想到好不容易配好的各种环境,给忍耐了下来。

今天琢磨了一下 cygwin 的启动过程,发现可以在 bash 命令后加 -x 参数打印所有执行的命令。于是把启动 log 打印出来,查找到引起运行变慢的罪魁祸首:bash_completion。我之前装了一个名叫 bash_completion 的包所谓命令补全的增强包,好家伙,在 /etc/bash_completion.d/ 下面添加了 144 个文件。在启动的时候要一个个 source 这些脚本,怪不得慢呢!

卸载掉这个 bash_completion 包后,cygwin 的运行速度回到了原来的水平,敲命令的时候总算不用憋屈地等补全了。

3. Notepad++ 的中文搜索

使用 2.6.8 版本时,又发现无法搜索中文的 bug。我非常搞不懂 Notepad++ 的作者怎么维护软件质量的,这 bug 在我的印象里就反覆出现两次了。这样的bug都不写一个回归测试用例来检查,实在是有点儿不可思议。无奈之下只好退回到 2.6.7 版本了。

Cygwin GCC qsort 函数错误

我平时在 Windows 下写代码时,经常使用 Cygwin 的 gcc。但是今天我居然发现 Cygwin 下 gcc 的 qsort 函数是错误的!这种基本的函数出错,太让人惊讶了。为了验证是不是代码有错,我使用 tcc 和 Linux 下的 gcc 都编译了同样一段程序,它们两个都输出了期望的结果,只有 Cygwin 的 gcc 是错的。下面是示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void *p, const void *q)
{
  return *(const char *)p > *(const char *)q;
}

int main()
{
  char a[] = "1312515";
  printf("%sn", a);
  qsort(a, strlen(a), sizeof(char), compare);
  printf("%sn", a);
  return 0;
}

按说它应该输出:

1312515
1112355

但是我用 Cygwin gcc 编译后,它居然运行出这样的结果:

1312515
2111355

太诡异了。我尝试调试它,结果 gdb 无法步入 qsort 代码中。谁能告诉我是为什么?

附 Cygwin gcc 信息:

$ gcc -v
Using built-in specs.
Target: i686-pc-cygwin
Configured with: /gnu/gcc/package/gcc4-4.3.2-2/src/gcc-4.3.2/configure --srcdir=/gnu/gcc/package/gcc4-4.3.2-2/src/gcc-4.3.2 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/sbin --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --enable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix AS=/opt/gcc-tools/bin/as.exe AS_FOR_TARGET=/opt/gcc-tools/bin/as.exe LD=/opt/gcc-tools/bin/ld.exe LD_FOR_TARGET=/opt/gcc-tools/bin/ld.exe
Thread model: posix
gcc version 4.3.2 20080827 (beta) 2 (GCC)

我犯了一个愚蠢的错误,感谢来自 Stephen 的评论

你的compare函数有问题,你的compare函数不会返回负数。修改compare为:
int compare(const void *p, const void *q)
{
return *(const char *)p - *(const char *)q;
}
再编译运行就正确了。

Poderosa 2009 特别版

自从讨厌了 Putty 黑黑的界面之后,在 Windows 下我一直使用 Poderosa 登录 ssh 主机。与 Putty 相比,Poderosa 的优点是支持标签和 Cygwin shell。 原生的 Cygwin shell 窗口太丑陋了,和 Linux 下的终端没办法比,相信经常在 Windows 下使用 Cygwin 的同志都会有同感。Poderosa 能使 Cygwin 的终端窗口获得与 Linux 终端类似的使用感受,这是我偏爱它的一个重要原因。

当然,国产的 Fterm 也支持登录 ssh 主机,使用起来也凑合,但是很多 ssh 的高级功能是不支持的。

我以前曾在这篇文章中推荐过 Poderosa,但是和很多开源软件一样,一旦遇到困难(比如主要开发人员流失),软件的升级就陷入了停滞。Poderosa 从 2006 年 11 月 22 日发布 4.10 版本之后就再也没有更新,虽然 SF Project 的 Activity 中一片对 BUG 的抱怨之声。

一直以来我对 Poderosa 最重要的不满是编码和按键问题。Poderosa 是日本人写的,所以在编码中只有ISO-8859-1、UTF-8 和日文支持,缺少对 GBK 中文编码的支持。那么在 Cygwin shell 中执行一些 Windows 原生命令比如 ipconfig 时,命令输出的中文就会是乱码;按键问题主要体现在登录到远程主机时一些按键不支持,比如 Home 键就无法正常使用。

虽然我很早之前就想自己添加进去这些特性,因为不懂 C# 语言,一直没有动手。昨天实在忍不住了,把 Poderosa 的源代码下载下来,准备学一下 C# 语言然后去修改它。

但是很不幸幸运的是,我看到 Poderosa 的 Activity 中 4 天前(09 年 1 月 2 日)增加了一篇 post,一个咱们的同胞xjzhang1979说:他改进了 Poderosa,我下载了一看,我想要的功能都有了,真开心。

xjzhang1979 将软件包上传到了一个网络文件共享网站,您可以点击这个链接下载:http://www.box.net/shared/7n7ps57jgn。为了避免该链接失效,我在我的共享网站做了一个备份,您也可以到这里去下载:http://share.solrex.org/ibuild/

PS: 后来搜索找到了作者的博客,关于此修改版介绍的原文在这

2009-03-29: 更新的 Poderosa 特别版在这里:http://share.solrex.org/ibuild/