2009年4月16日星期四

.htaccess 与 Unix 换行符

.htaccess是一个很好的工具,尤其对于静态网站。

我的网站是全静态的,原来是把RSS放在了/rss/目录下,后来改成了直接放在根目录,但是又不想每次更新都要去同步两边的文件,所以想把原来/rss/下的RSS Feed重定向到根目录下的RSS Feed,我在.htaccess文件中写了这两句:


Redirect /rss.xml http://blog.yypig.net/rss.xml
Redirect /atom.xml http://blog.yypig.net/atom.xml

但是一放到网站上,就出现了500 Internal Server Error,但是如果只有一行就可以了,百思不得其解,以为一个文件里面只能出现一个Redirect语句。后来看到了这个链接 ,恍然大悟,原来只是换行符的问题,如果服务器是Unix的,一定要用Unix换行符,改了之后一切正常。

.htaccess其实功能很强大,最近就通过它的URL Rewrite功能,把公司的动态网页的URL全部变成由目录和文件名组成的貌似静态网页的结构,以类似“服务.html”代替“index.php?cat=2&item=1”,据说这样对搜索引擎比较友好。

2009年3月17日星期二

Zim Wiki 的中文乱码问题的解决办法

Zim 是一款桌面维基软件,可以当桌面笔记来用,小众软件推荐的 ,由于是用perl+gtk写成的,所以在Windwos下的安装非常麻烦,不过已经有人做了Windows的包,在这里 。刚开始用,不知道好不好用。不过首先发现的问题是日期乱码,而且发现在它的release note里面明明写了加上了简体中文翻译,但是界面还是英文的,设置里面好像也没有办法改,正想把它扔了,不过有点不甘心,发扬了开源的DIY精神,终于找到办法了。

在安装目录的bin下,有个zim文件,这是个perl脚本,也是Zim的主运行文件。在32至34行:


# i18n initialization
$Zim::CODESET = 'utf-8';
$Zim::LANG = '';

把它改成:


# i18n initialization
$Zim::CODESET = 'gbk';
$Zim::LANG = 'zh_CN';

重新打开Zim,就是中文界面,而且日期不会乱码。

2009年1月14日星期三

Windows XP的无线桥接

目前大部分的笔记本都是有两块网卡,一块是普通网卡,一块是无线网卡。一般有网口的地方会用普通网卡,通过网线连接上网,以获得较好的性能,没有网口的地方,会用无线上网。通常情况下,即使在同一个局域网里面,如果手工配置IP地址,必须为这两个不同的链接配置不同的IP地址,因为windows不允许为两个不同的适配器配置相同的IP地址。在特殊情况下,例如,使用电驴并在路由器上做了端口映射,于是需要在两种情况下都使用相同的IP地址,又不想每次都重新手工配置,这个时候可以用Windows自带的桥接模式来解决这个问题。

在网络连接的文件夹中,选中“本地连接”和“无线网络连接”,击右键,选择“桥接”。这个时候将创建一个新的连接,叫“网络桥”(MAC Birdge Miniport)。这时候就可以手工为“网路桥”配置IP地址了。这样配置后,发现当接上网线时,上网是没有任何问题的,但是一旦拔开网线,改用无线上网,就上不去了,但是无线网卡显示的是连接上的状态。百思不得其解。Google了一下,发现了这两个连接:

Windows XP Home Networking: Building Network Bridges
Bridge May Not Work With a Non-Promiscuous Mode Network Adapter

其中,提到了一个东西:“Promiscuous Mode”。原来,网卡工作在普通状态时,只接收属于自己的MAC地址的以太网包。只有当工作在“Promiscuous Mode”时,才不加限制地接收所有的以太网包。大部分的普通网卡都可以工作在“Promiscuous Mode”,可能为了安全起见,大部分的无线网卡都不能工作在“Promiscuous Mode”下。当Windows创建桥接模式时,实际上在系统里面创建了一个虚拟的新的网卡,这个新的网卡有自己的MAC地址,桥里面的所有网卡都以这个新的MAC地址发送以太网包,回送的以太网包自然也是发给这个新的MAC地址,由于普通网卡支持“Promiscuous Mode”,所以可以接收到不属于自己的新的MAC地址以太网包,所以通讯正常,无线网卡会抛弃掉所有不属于自己MAC地址的包,所以在桥接模式下收不到任何发回来的以太网包,自然就不能正常工作了。Windows XP提供了一个解决办法,叫ForceCompatibilityMode(强制兼容模式),在命令行(cmd)下,打入netsh bridge show a,可以看到已经桥接的各个网卡的编号和是否启用强制兼容模式,如果无线网卡显示“已停用”或者“未知”,应记住无线网卡的编号,并在命令行下打入:netsh bridge set a X e,其中X是无线网卡的编号,以启用强制兼容模式。

这个兼容模式的原理是这样的,一旦某个网卡启用了这个模式,当从这个网口向外发送以太网包时,将改写以太网包,把源地址换成网卡自己的MAC地址,并记住这个转换,回复的以太网包的目标地址也是网卡的MAC地址,这样网卡就不会丢弃这个包,当这个收到这个回复包后,再根据原来的记忆,把目标地址换回原来的地址,和IP层的NAT的原理类似。

通过这样设置以后,当拔掉网线,启用无线网络连接后,依然可以上网,并且IP地址不变,整个过程自动完成。