Posted on 31-08-2009
Filed Under (软件) by waterlin

如果你仅仅是想远程收发邮件,又厌倦了功能厚重的 Outlook、Thunderbird 等,更加恐惧使用灵活自如、界面不友好的mutt、Emacs Gnus等,那你就应该试试在 Firefox 里装上 Simple Mail 扩展来远程收发邮件。

Simple Mail 是 Firefox 下的邮件客户端程序,支持协议有 POP3、IMAP、SMTP 等,可以在 Firefox 中获得邮件到达提醒、阅读、撰写邮件等功能,能够为帐户指定图标颜色,以便通过不同颜色区分不同账户的邮件。安装了 Simple Mail 后,在 Firefox 的右键菜单”通过 Simple Mail 发送”,允许从一个 HTML 页面中选中文本或者链接并快速发送出去。

现在 Firefox 已经扮演着越来越多的角色,从文献管理工具 Zotero 到邮件收发的 Simple Mail,无所不能。如果你的邮件量不多、又图方便的话,不妨试试 Simple Mail

(1) Comment    Read More   
Posted on 28-08-2009
Filed Under (技术) by waterlin

昨天在用 C++ 操作 Windows 注册表(Registry)的时候,犯了一个非常低级的错误,现在把有关注册表的一些相关知识写下来,以免再犯。

1. 注册表的基本概念

Windows 的注册表中包含了 Windows 的系统配置、PC机的硬件配置、Win32应用程序和其他设置信息。注册表和 INI 文件不同,它是多层次的树状数据结构,具有六个分支(根键),每个分支又由许多的键(key)和值(value)组成,每个键则代表一个特定的配置项目。在注册表中,键可以包括子键(sub key)和值(value)。我们可以对它们做个比喻,键就是目录,而子键和值可以看成子目录和文件,这样比喻虽然不准确但是很形象。

2. 注册表里值(value)的数据类型

注册表里的值(value)可以是字符串、多字符串或是二进制值等,详细的解释可以看看MSDN上的相关解释

3. 写入多字符串类型数据时容易犯的错误

我在注册表编辑器里,在一个键下面直接新建了一个多字符串(REG_MULTI_SZ)的值,编辑该值的时候,输入完一个字符串就用回车来分隔,输了几行,就成了下面的情形:

REG_MULTI_SZ_editCopyright.png

测试完我该输入的东西后,我就开始用C++编码来实现这个步骤、让它自动化。

在编码需要一次性插入到多字符串(REG_MULTI_SZ)值里的多个字符串时,我就想当然地以为是用回车来分隔这若干个字符串(因为前面我在编辑器里就是用回车来分隔的嘛),于是在代码里把”\r\n”放在两个字符串之间。

但是,在测试代码的时候,用”\r\n”写出来的字符串,与之前手动编辑时添加回车的结果完全不一样。我找了很久原因,最后通过对比注册表值的二进制编码,才发现了原因。

REG_MULTI_SZ_edit2Copyright.png

REG_MULTI_SZ_edit3Copyright.png

其实,注册表里的多字符串(REG_MULTI_SZ)值是用NULL来分割的。在注册表编辑器里手动编辑后,有”\r\n”的地方自动被更替换成了””。因为规定了注册表里的字符串(REG_SZ)只能以一个空的字符结束,多字符串则需要以两个空字符串结束。当然,真正的规则稍微复杂一些,看MSDN里有关多字符串的说明:

A sequence of null-terminated strings, terminated by an empty string ().

The following is an example:

String1String2String3LastString

The first terminates the first string, the second to the last terminates the last string, and the final terminates the sequence. Note that the final terminator must be factored into the length of the string.

The values are separated by null characters and terminated by an empty string.

4. 注册表里值的大小是有限制的

放到注册表里的值不能超过2048 bytes,如果超过这个大小,最好存放在文件里,然后让注册表去读这个文件:

Value sizes are limited by available memory. Long values (more than 2048 bytes) should be stored as files with the file names stored in the registry. This helps the registry perform efficiently. Application elements such as icons, bitmaps, and executable files should be stored as files and not be placed in the registry.

5. 用MoveFileEx()并且带上MOVEFILE_DELAY_UNTIL_REBOOT的参数,也可以实现通过Windows注册表来实现开机时文件替换

这个页面里也有更多有关重启系统替换文件的知识。

6. 常用的注册表API函数有RegOpenKeyExRegQueryValueExRegSetValueEx等。

要判断一个Value是否存在于某个键下面,可以使用RegQueryValueEx函数,如果返回的是ERROR_FILE_NOT_FOUND,则表明该值不存在。

7. Windows 的 API 并不提供在一个值后面追加值的方法,如果你要在原来的值后面追加一个值,则你只能把这个值读出来、追加,然后再写入。

(1) Comment    Read More   
Posted on 28-08-2009
Filed Under (软件) by waterlin

之前介绍了 VirtualBox 里 Guest 机器是 Ubuntu 的时候,如何启用共享文件夹实现 Guest 与 Host 之间共享数据。如果 Guest 机器是 Windows,我们仍然可以用共享文件夹的方式来共享数据。

在 VirtualBox 的虚拟机菜单栏里点“设备”–>“分配数据空间”,创建一个固定分配的数据空间(这个数据空间其实就是 host 主机上的一个文件夹)。具体步骤是:在“固定分配”上点右键,选择“Add New Shared Folder”,然后再点击“Folder Path”右侧的向下的小三角,选择“Other…”,浏览选中你想共享的目录,点“选择”即可。

然后在 Guest 主机 Windows 里“我的电脑”上点右键,再选择“映射网络驱动器”,选定一个需要映射的盘符,点击下面的“浏览”,弹出的对话框如下图所示:


在弹出的对话框里展开“VirtualBox Shared Folders”,就能找到你刚才添加的共享文件夹,确定后就可以从 VirtualBox 里的 Windows 访问这个共享文件夹了。

(0) Comments    Read More   
Posted on 26-08-2009
Filed Under (技术) by waterlin

1. 为什么需要通过注册表来实现开机时文件替换?

有一些文件,被系统的一些服务所独占,我们在热备份与热恢复系统的时候,没有办法直接替换掉。

也有一些程序以独占的方式(exclusive access)打开某个文件,在这个程序退出之前,按常规的方法,我们是不能替换掉这个文件。

这些情况下,我们可以通过注册表 (Windows Registry) 记录下需要替换的文件等相关信息,在下一次开机、应用程序启动之前进行替换掉。

2. 具体的实现方法

记得在进行以下步骤之前,先备份一下你的注册表

下面就以用放在目录 C:\Temp 下的 Win32k.sys 文件,替换系统目录 %SystemRoot%\System32 下的 Win32k.sys 文件为例,详细介绍一下利用注册表来实现开机替换文件的操作。你可以通过这种方法来替换掉你 Windows 系统里的任何文件,当然,你的 Windows 应该是要能启动的。

  1. 启动注册表编辑器 (regedit.exe);

  2. 按下面的路径,在注册表里找到相关的key:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

  3. 在 Session Manager 这个注册表目录下,通过以下方式新建一个值 (value):

    值名称(Value name):
        PendingFileRenameOperations

    类型(Data type):
        REG_MULTI_SZ(多字符串值)

    值数据(Value data):
        \??\c:\temp\win32k.sys
        !\??\c:\winnt\system32\win32k.sys

    这里要特别注意,一定要分两行来填写值(填完后在注册表里会显示成一行),并且那个”!”必须放在第二行的开头。

    这种表达方式是用前面路径的文件来代替后面路径的文件。

  4. 退出注册表编辑器;

  5. 重新启动系统。

重启 Windows 系统后,如果第二个文件存在,则会把第一个文件的内容替换到第二个文件里,第二个文件的文件名保持不变,并且删除第一个文件;如果系统里原来就没有对应的第二个文件,则系统会自动新建一个和第二个文件名一模一样的文件,再把第一个文件里的内容拷贝进去。替换动作完成后,系统会自动清除注册表里添加的 PendingFileRenameOperations 值。

如果是要批量替换多个文件,则只需要按上面的值数据形式,在注册表变量值数据里添加要替换的多个文件信息即可,例如:

\??\c:\test2\test2.txt
!\??\c:\test1\test1.txt
\??\c:\test2\test22.txt
!\??\c:\test1\test11.txt

如果你的机器用上面的办法替换文件出错,则重点检查上面第三步的表达式是否有误。

除了往注册表里塞东西这个方法以外,你还可以使用Windows自带的mv.exe工具,或是下载与使用Inuse.exe工具,这些工具的详细使用方法,可以看帮助说明。

(2) Comments    Read More   
Posted on 25-08-2009
Filed Under (技术) by waterlin

Ubuntu的升级方法和Debian完全一样,只是多了一个更漂亮的GUI供你选择。但是,对于教育网的用户来说,不能直接访问国外的Ubuntu或是Debian源,哪怕是用代理或是教育网直通车之类的玩意,也是很慢的。不过没关系,国内很多大学都提供了Debian的源镜像,我们可以自己添加教育网里的镜像源。

在终端执行以下命令(第一条是备份现有服务器列表,第二条是使用Vim编辑)

sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
sudo vim /etc/apt/sources.list

从下面各服务器列表内容中选择一个镜像源,添加到文件里去:

教育网常用sources.list(以下只适用于sid即unstable用户,其它版本用户请酌情更改)
中科大
deb ftp://debian.ustc.edu.cn/debian unstable main non-free contrib
deb-src ftp://debian.ustc.edu.cn/debian unstable main non-free contrib
大连理工
deb ftp://mirror.dlut.edu.cn/debian unstable main non-free contrib
deb-src ftp://mirror.dlut.edu.cn/debian unstable main non-free contrib
清华大学
deb ftp://ftp.tsinghua.edu.cn/mirror/debian/debian unstable main non-free contrib
deb-src ftp://ftp.tsinghua.edu.cn/mirror/debian/debian unstable main non-free contrib

保存编辑好的文件,执行以下命令就可以进行更新:

sudo apt-get update
sudo apt-get dist-upgrade

用了这几个源之后,在教育网里,可以很方便地用sudo apt-get install安装你需要的包与软件,速度很快。

(0) Comments    Read More   
Posted on 25-08-2009
Filed Under (技术) by waterlin

因为工作需要,在VirtualBox 3.0.4里装了Ubuntu 9.04(懒得动硬盘了,现在的机器跑虚拟机性能也还不错)。不过,安装好以后,如果不做一些适当的配置,用起来实在是不舒服。

1) 分辨率问题的解决方法

默认的配置下,Ubuntu作为客户机(guest)的分辨率最大只能调到800×600,屏幕在VirtualBox下的大小不可调,看得十分不舒服。

解决的办法很简单,即安装VirtualBox增强工具包:

设备(VirtualBox客户机运行窗口菜单栏上) –> 安装增强功能(点击后桌面上会多一个虚拟光驱的图标),然后点击运行,根据提示进行安装即可。

2) 修改热键

默认VirtualBox与Windows进行切换的热键为右Ctrl键,这样的默认设置,对于我们用Emacs的人来说,相当于自残,这可怎么干活呢?我们可以把热键重新设置一下,在VirutalBox的主界面里,通过”管理 –> 全局设定 –> 热键“里进行设置。

3) 与Windows共享文件

既然使用了虚拟机,我们就经常需要在两个系统之间交换文件、数据等。当Windws为宿主机器、Ubuntu为Guest机器时,我们可以通过共享文件的方式来方便地实现Windows与Ubuntu的数据交换。

在虚拟机器的控制面板里,”设备 –> 分配数据空间”,分配一个”固定分配”的数据空间(记住你起的名字),这个数据空间就是我们的共享文件夹。

然后我们就可以到Ubuntu里面创建一个映射点,即一个全新的文件夹:

# sudo mkdir /media/windows-share

windows-share可以用你喜欢的任何名称来代替。

然后,我们就可以mount Windows里的共享文件夹到之前创建的文件夹里:

# sudo mount -t vboxsf folder-name /media/windows-share

这个folder-name需要用你之前创建的共享文件夹名称来代替。

通过上面的三个简单配置,用起VirtualBox里的Ubuntu就舒服多了。

另外,顺便说一下,VirtualBox现在的”无缝链接”模式太棒了!

(0) Comments    Read More   
Posted on 17-08-2009
Filed Under (技术) by waterlin

总的来说,Emacs 的默认配置文件放在变量 HOME 所指的路径下,所以,只要我们把 .emacs 扔到 HOME 所指向的目录就可以了,下面就简单介绍一下在 Windows 下设置 home 目录的几种方法,并进行简单的对比。

第一种方法,改变 home 环境变量的值。

这种方法,改变了 $home 变量,也会影响 Cygwin 或是其他一些应用程序,因为有一些程序会根据 Windows 的 home 环境变量来寻找数据存放的路径。

第二种方法,不改变 Windows 默认的 home 值,设置默认的 .emacs 文件读取你自己的 Emacs 配置文件,并重新设定 Emacs 的 home 目录。

你可以在 Emacs 中输入 C-x C-f,然后打开路径~(即当前的 home 环境变量所指的路径,一般来说是这样的路径:C:/Documents and Settings/water/Application Data)。

看看显示的是哪个目录,如果此目录下没有 .emacs,可以创建一个 .emacs 或 _emacs,然后在这个 .emacs 文件里,加入如下语句:

(load-file "E:/water/.emacs")

文件 E:/water/.emacs 才是我们真正的 Emacs 配置文件,我们可以在这个真正的配置文件里用如下语句设置我们的 home 目录:

(setenv "HOME" "E:/water") 
(setenv "PATH" "E:/water") 
;;set the default file path 
(setq default-directory "~/") 
(add-to-list 'load-path "~/emacs/site-lisp")

这个方法的优点是比较简单同样也方便对 .emacs 文件备份,不会对其它应用程序产生任何影响。

第三种方法,修改注册表,在注册表中进行如下设置:

HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs\HOME=%emacs_dir%

以上三种方法都可以设置好 Emacs 的 Home 目录,但是,系统是按什么顺序来解析它们的呢?大体上的顺序是这样的

  1. 如果设置了环境变量 HOME,则使用 HOME 指定的目录。
  2. 如果设置了注册表里的值 HKCU\SOFTWARE\GNU\Emacs\HOME,则使用这个值所指定的目录作为 home 目录。并不是太推荐使用这种方法,因为会导致用户共享一个 home 目录。
  3. 如果 C:\.emacs 文件存在,则使用 C:\.emacs 这个文件。这个是为了向低版本的 Emacs 兼容,因为低版本的 Emacs 就是默认用这个文件作为配置文件。
  4. 把用户的 AppData 目录作为 home 目录(通常来说,就是类似这样的目录 C:/Documents and Settings/water/Application Data ),这个用户的数据目录根据 Windows 版本的不同而有所不同。

我个人比较喜欢用第二种方法,即简单又方便备份。

(5) Comments    Read More   
Posted on 14-08-2009
Filed Under (技术) by waterlin

我们之前已经用BuddyPress和bbPress打造了一个WordPress-MU的多博客社区系统,但是这对于一个Web 2.0概念的网站来说,仍然显得不够。我们最好能让一些最新发布的文章、最新消息显示于全站的首页,例如最新发表的文章、最新的论坛留言等。这样的功能,我们也可以轻松地通过插件来实现。

1. 安装AHP Sitewide Recent Posts for WPMU插件

AHP Sitewide Recent Posts for WPMU这个插件可以把各个博客最新发布的文章,按一定的规则提取并显示链接于WordPress MU的最前端首页里。

下载插件文件,把这个文件扔到wp-content/mu-plugins目录里,插件将自动生效。

然后到你的当前主题里你喜欢的位置加入这么一条语句:

<?php ahp_recent_posts(5, 30); ?>

这条语句的参数,表示将显示最近30天里的5篇日志,这两个参数可以任意修改、设置。

因为我用的是BuddyPress的默认模板,所以我直接把这句话扔到wp-content/themes/bphome/home.php文件里,具体是放在左侧栏(即<div id=”left-column”>标签里)。

2. 安装MuTags插件,在首页把全站的tag显示出来

为了方便用户浏览我们用WordPress MU建立的站点,我们需要在首页显示一下全站的标签(tags),方便用户根据关键字来选择主题。我们可以用MuTags插件来实现这个功能,安装方法请详细阅读插件包里面的readme.txt文件。

该插件的主要安装步骤如下:

1) 把包里的MuTags.php文件复制到wp-content/mu-plugins目录下;

2) 把包里的templates/tag_results.php复制到你的模板目录,在我这里是wp-content/themes/bphome/目录;

3) 用管理员权限登陆管理后台的”Dashboard –> Site Admin –> Mu Tags”,在这里可以配置一些基本的参数;

4) 接下来我们要让标签云(tag cloud)在首页显示出来,我们可以把下面这个语句

<?php mu_tag_cloud() ;?>

扔到你模板文件里的任何地方。在我这里,我扔到wp-content/themes/bphome/home.php文件里的右侧栏(标签<div id=”right-column”>所在部分)。当你更新了文章后,这些tag就会在首页显示出来。

通过这两个插件,首页该有的模块我们都有了,剩下的主要工作就是个性化定制页面的外观。当然,这只是一个最基本的WordPress-MU前端页面定制,更多的定制功能以后再详细介绍。

(0) Comments    Read More   
Posted on 14-08-2009
Filed Under (技术) by waterlin

WordPress-MU支持管理后台的自动升级,但是,有的时候自动升级会失败,所以,手动升级的技能还是必须要掌握的。

官方文档对升级WordPress-MU的方法有着详细的介绍,这里以2.7.1升级到2.8.3为例,简单介绍一下WordPress-MU升级的基本步骤:

1) 第一步也是最重要的一步,升级之前先备份整站系统数据,包括数据库数据及所有的文件。

2) 保护wp-config.php以及 .htaccess文件,保护你的wp-content目录以及其它你自己建立的目录,例如bbPress目录之类的。

3) 把其它的WordPress-MU文件用新版本的文件替换掉,包括根目录下的文件以及目录wp-admin和wp-includes里的所有文件。

4) 到管理后台运行 Site Admin –> Upgrade,脚本的运行可能需要一些时间,所以,要耐心等待。

一切顺利的话,基本上就这几个步骤就够了。

(0) Comments    Read More   
Posted on 14-08-2009
Filed Under (技术) by waterlin

今天下午上班的时候,公司居然断电了。等电来了之后,发现Emacs死活启动不了,也就是说,没有办法顺利读入配置文件,Emacs会提示如下图所示的错误:

EmacsDesktopErrorCopyright.png

仔细地查看了一下Emacs的home目录,发现多了一个叫.emacs.desktop.lock的文件,我估计这个文件是和Desktop扩展有关。我把这个文件删掉之后,Emacs就可以正常启动了。看来,以前碰到的类似情况,多半也是这个原因。

仔细地试了一下,原来Emacs在跑的时候,会产生这个文件,应该是用来缓存当前打开的文件名信息之类的数据。当Emacs正常退出时,这个文件会随着消失;但是如果Emacs非法退出,这个文件可能就没办法处理了。

删除应该不是最正确的处理方法,但是我目前也不知道应该怎样处理会更好一些。

(3) Comments    Read More