2006-10
01

本文参考了 mod_perl 的官方文档之一, 但并不是原文档的翻译。

阅读全文 »

2006-09
30

Synergy的确是一个不可思议的软件, 在此先谢谢 smalldust 的推荐。

Synergy可以算作一款远程控制软件。一般的远程控制软件都是将服务器的画面提供给客户端使用, 而Synergy的创意很独特,它将客户端的键盘和鼠标提供给服务器使用。 这样如果你有多台电脑并且每台电脑都有自己的显示器,你可以通过 Synergy 用一组键盘和鼠标控制所有电脑, 而且每台电脑的屏幕可以连接起来,就像在同一台电脑上使用多个显示器一样。 下面介绍一下使用方法,所用版本为 1.3.1。

阅读全文 »

2006-09
30

用过 del.icio.us 的人一定知道,该网站的标题栏后面有一个标签输入框, 在输入框中输入标签名即可直接跳转到想要看的标签,而不必从纷繁芜杂的标签云中去寻找。 如果你在 WordPress 中添加了标签云, 一定也想在标题栏后添加一个类似于 del.icio.us 那样的输入框吧。

这里是仿照 del.icio.us 制作的标签输入框代码。attachcrumb.zip 使用方法如下。

  1. 首先按照这个方法打开永久链接。
  2. 下载 prototype,然后将 prototype 和本文附带的 crumb.js 放到你的主题目录下的 js/ 目录下,然后在主题的 header.php 的 <head> 标记内加入以下代码。
    <script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/js/prototype.js"></script>
    <script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/js/crumb.js"></script>
  3. 在你想加入标签输入框的地方加入以下代码(通常是在blog的标题后)。
    <h1 id="pagetitle">
      <a id="top"></a><a href="<?php echo get_settings('home'); ?>/"><?php bloginfo('name'); ?></a>
      <!-- 上面是blog标题,下面是标签输入框的代码 -->
      / <span id="crumb"><?php echo single_cat_title(); ?></span>
      <script>
        if(Crumb) 
          Crumb.go('crumb', '<?php echo get_settings('home').get_settings('category_base').'/'; ?>');
      </script>
      <!-- 标签输入框代码结束 -->
    </h1>
  4. 最后在主题的 style.css 中增加以下代码,以定义标签输入框的样式。
    span#crumb input {
      font-size: 0.7em;
      font-family:verdana,sans-serif;
      background-color: #FFFFFF;
      border: solid 1px #DDDDDD;
      color: #808080;
    }
    span#crumb input.crumb-focus {
      border: solid 1px #000000;
      color: #000000;
    }


2006-09
28

如何在Linux下创建这样一个程序,执行之后返回shell,但程序本身驻留在内存之中继续执行?其实很简单,创建一个子进程,然后父进程结束即可。例如下面的Perl程序:

#!/usr/bin/perl
exit if fork();       # 创建子进程,然后父进程退出
while (1) { sleep 1; }       # 测试用死循环

不过需要考虑到一点,守护进程通常在系统启动时以root身份启动,但是由于安全问题,通常并不以root身份运行。这一点使用perl如何实现呢?可以使用下面的 sudo 函数。

sub sudo {
    my ($user, $group) = @_;
    my $uid = (getpwnam($user))[2];
    my $gid = (getgrnam($group))[2];
    ($(, $)) = ($gid, "$gid $gid");
    ($<, $>) = ($uid, $uid);
}

所以,一个基本的守护程序应当这样写:(sudo函数代码省略)

#!/usr/bin/perl
&sudo("myuser", "mygroup");     # myuser、mygroup为启动守护进程的用户和组
exit if fork();
while (1) { sleep 1; }


2006-09
28
信号动作解释
SIGHUP1终端线路挂断
SIGINT2Term键盘输入的中断命令,从终端输入 Ctrl-C 时发生
SIGQUIT3Core键盘输入的退出命令
SIGILL4Core错误指令
SIGABRT6Coreabort(3)发出的中止信号
SIGFPE8Core浮点数异常
SIGKILL9TermKILL信号
SIGSEGV11Core非法内存访问
SIGPIPE13Term管道断开
SIGALRM14Termalarm(2)发出的中止信号
SIGTERM15Term强制中止信号
SIGUSR130,10,16Term用户自定义信号1
SIGUSR231,12,17Term用户自定义信号2
SIGCHLD20,17,18Ign子进程中止信号
SIGCONT19,18,25Cont继续执行一个停止的进程
SIGSTOP17,19,23Stop非终端来的停止信号
SIGTSTP18,20,24Stop终端来的停止信号
SIGTTIN21,21,26Stop后台进程读终端
SIGTTOU22,22,27Stop后台进程写终端

常用的包括 SIGHUP(服务进程重起)、SIGKILL(进程结束)等。



2006-09
28

WordPress有个很好用的插件:Weighted Categories, 它能够将分类名显示成tag cloud,即文章数多的分类使用大号字体,文章数少的分类使用小号字体。 但是这个插件有两个问题,一是最后一个分类的链接不正确,这一点官方主页上也有人提出过; 二是各个级别的分类的样式是通过计算得出的,无法自定义样式。

针对以上两个问题,我修改了这个插件,并将其汉化。新的插件可以在这里下载。attachweighted-categories.zip

使用时将 weighted-categories.php 放到 wp-content/plugins 下,然后在管理面板中激活该插件。 然后在模板中加入以下的代码以显示tagcloud。

<div id="tagcloud">
<?php weighted_categories(1, 10, ""); ?>
</div>

然后需要在模板的 style.css 中加入你自己的分类级别样式定义(必须,否则各个级别显示出来都一个样)。 附带的 style-sample.css 为示例。

修改后的 weighted_categories 定义如下:

function weighted_categories($minlevel=1, $maxlevel=10, $exclude_categories)
  - $minlevel: 最小级别的编号
  - $maxlevel: 最大级别的编号
  - $exclude_categories: 不想显示的分类id,使用逗号分割,例如 "1,25"表示不显示 id 为 1 或 25 的分类

当然,为了让这些标签看起来更像真正的标签,我们需要在WordPress的选项中打开永久链接, 并在选项->永久链接分类基础选项中填入“/tag”,这样分类的链接就会显示为 /tag/分类名。



2006-09
23

下载并安装 httpd 2.2。

$ tar xjvf httpd-2.2.3.tar.bz2
$ cd httpd-2.2.3/
$ ./configure --enable-rewrite --enable-so
$ make
$ sudo make install

下载并安装 mysql-3.23

$ sudo tar xzvf mysql-3.23.58-pc-linux-i686.tar.gz -C /usr/local/mysql
$ sudo groupadd mysql
$ sudo useradd -d /usr/sbin -s /bin/false -g mysql mysql
$ sudo chown -R mysql.mysql /usr/local/mysql
$ cd  /usr/local/mysql
$ sudo ./scripts/mysql_install_db
$ sudo cp support-files/mysql.server /etc/init.d/mysql
$ /etc/init.d/mysqld start

下载并安装 php 5.1.6。

$ sudo apt-get install flex bison libxml2-dev
$ tar xjvf php-5.1.6.tar.bz2
$ cd php-5.1.6/
$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-gd
                  --with-gettext --with-mysql --with-zlib-dir=/usr/lib 
                  --with-mysql=/usr/local/mysql


2006-09
22

在 /boot/grub/menu.lst 的内核命令后加上 vga=nnn (nnn为整数)参数可以使用高分辨率的命令行界面。其值如下。

640x480800x6001024x7681280x1024
8bit769771773775
15bit784787790793
16bit785788791794
24bit786789792795


2006-09
22

我们知道,在KDE中可以通过窗口管理器方便地将窗口设置为总在最前、设置出现在所有工作区等, 但是Ubuntu 6.06的Gnome中无法做到这一点。Gnome所用的窗口管理器MetaCity认为这些不是窗口管理器的任务, 因此没有实现这些功能。好在Gnome的一名开发者为我们开发了 Devil's Pie 这个程序,它能够根据预先设定的动作自动控制Gnome中的窗口。

阅读全文 »

2006-09
21

默认情况下,在bash中按 TAB 可以自动补齐,但仅能自动补齐命令名和文件名。bash-2.05及以后的版本提供了自动补齐的编程接口,通过安装 bash-completion 来使用 TAB 键自动补齐几乎任何内容,包括参数、文件、目录甚至包名称等等。例如:(<TAB>表示按TAB键)

$ rpm -<TAB>    (自动补齐参数)
-F  -U  -V  -b  -e  -i  -q  -t
$ man cat<TAB>    (自动补齐manpage)
cat       catan     catanf    catanh    catanhf   catanhl   catanl    catch     catclose  catdic    catgets   catopen
$ tar xjvf <TAB>   (补齐时仅显示tar.bz2文件)
gimp-2.2.13.tar.bz2  glib-2.12.3.tar.bz2

最近的发行版一般都自带bash-completion包,如果你的bash没有这个功能,可以从这里下载bash-completion包并安装。安装方法很简单,下载到的包中包含一个 bas-completion 文件,将其放在 /etc 下,然后编辑 /etc/bashrc,在 if [ "$PS1" ]; then 的判断中加入以下内容:

if [ "$PS1" ]; then
  ...其他内容省略,加入以下内容
  # Run bash completion code
  if [ -r /etc/bash_completion ]; then
  # Source completion code.
    . /etc/bash_completion
  fi
fi