Sunday, August 31, 2008

今天再次重温正则表达式,记录一下

正则表达式是让我又爱又恨的东西。
爱在它的功能强大,恨在它的凌乱不互通,POSIX标准本身就有bug,各家实现又各有不同。

man regex可以看到对POSIX标准的regex的评述。

这里有一个不错的介绍正则表达式各种资料的网站。
http://iregex.org/

这个网页总结了各大unix tools对正则表达式的支持。
http://www.greenend.org.uk/rjk/2002/06/regexp.html

而我用得最多的无非是vi,sed,grep,less了。

我自己的发现是:
[[. .]] 这种,在标准里面是把字符元素合成单个元素进行匹配的。比如[[.ab.]]匹配ab这个整体,而不是a或b,但是less,grep和vi里都不支持。
[[= =]]这种,在标准里面是匹配等价类的,比如,[[=^=]]这个匹配所有与^等价的字符,如果'=','.',','是与'^'一类的话,则匹配它们的其中一个,但是grep,vi里都不支持。(less支持)
[[: :]]这种,在标准里面是匹配一个集合的,比如[[:digit:]]匹配[0-9],这点被几乎所有的工具支持。

另外还有很多小的细节,一下子非常难梳理清楚,这就是让我最不爽的地方了,很容易弄混regex的用法。

学习刘未鹏:一直以来伴随我的一些学习习惯(part1)

http://blog.csdn.net/pongba/archive/2008/07/08/2625115.aspx
摘录几点有共鸣的:

1. Google&Wiki(遇到问题做的第一件事情,也是学习某个东西做功课(homework)最先用到的东西。

非常同意,这两样工具能帮助我们快速,大量地搜集信息;但这也需要自己有很强的过滤信息,去伪存真去粗取精的能力,

2. 看书挑剔,只看经典。如何选择经典,可以到网上做做功课,看看评价,综合分析一下。

很同意,但是这个做起来难。不过现在有意识地培养这个习惯ing。因为以前不知道该问谁这些问题,现在可以大概总结一下:豆瓣、chinapub,amazon,有经验的人士(如师兄师姐)



4. 提到思考,我有一个小习惯。利用走路和吃饭的时候思考,还有睡觉前必然要弄一个问题放在脑子里面,在思考中迷糊入睡。发现这样一来往往在不知不觉中多出来大量的思考时间。

学习中,虽然我现在已经稍微有走路、吃饭、坐车的时候思考的习惯。但是还是不习惯睡觉的时候思考,也许我思考的问题太具体,不适合没有纸笔的情况下进行(如算法)。考虑睡觉时是不是要思考一些哲理性的问题,弥补一下自己空泛的内在。

6. 重要的事情营造比较大的时间块来完成。比如一本好书,或者一个重要的知识点,最好不要切得太琐碎了看,否则看了后面忘了前面。不利于知识的组织&联系。

同意,我总是喜欢耗上1天的时间来疯狂读一本书,同时做做笔记。感觉这样比粉刺看效率高多了,因为分次看老是要回去看忘记的定义,公理。

8. 学习一项知识,必须问自己三个重要问题:1. 它的本质是什么。2. 它的第一原则是什么。3. 它的知识结构是怎样的。

未能理解其含义,需要进一步学习。我自己是这样的,先搜索一本经典教材或文章,然后观看其目录了解知识结构,最后在wiki以及google上找几篇好的文章来对其有个大概的了解。

总结一下:完成上述任务一定要克服懒惰的心理,be active!

Thursday, August 28, 2008

KDE无法更改文件关联

据说是由于配置文件被锁定(属主为root),无法被普通用户所修改而引起。
通过修改
/usr/share/kubuntu-default-settings/kde-profile/default/share/config/profilerc
以及
~/.kde/share/config/profilerc
的uid为自己即可。

另外不知道跟mimetype有没有关系,我还删除了
/usr/share/applications/mimeinfo.cache

一些线索:
https://bugs.launchpad.net/ubuntu/+source/kdelibs/+bug/157166
http://www.kde-forum.org/artikel/17212/Konqueror-doesnt-remember-file-associations-.html

--
Regards,
Zigang XIAO (MPhil)
Department of Computer Science and Engineering,
The Chinese University of Hong Kong,
Shatin N.T. Hong Kong
http://www.cse.cuhk.edu.hk/~zgxiao

Monday, August 25, 2008

为自己的程序添加GNU readline

1.引言:什么是readline
http://www.javvin.net/Software-Terms/GNU-readline.php

GNU readline 是由 GNU 工程创建和维护的一个软件包。它提供行编辑功能。例如,在 readline 授权的应用程序中,按下 C-b (CTRL-B) 将指针向后移到一个位置,然而 C-f 向前移动这个指针到一个位置;C-r 在历史纪录中搜索;这些组合键(这些是默认的,尽管像组合 vi's 是选择性的)来自于 GNU 的最早和最流行的工程,文本编辑器 Emacs 。Readline 支持多种高级特征,包括一个 kill ring( 复制/粘贴剪切板的一种更灵活的版本)和 tab completion 。作为一个跨平台的库,readline 允许多种系统上很多应用程序来展示行编辑行为。它是在 GNU 通用公共许可证(GPL)下的分发的一个自由包。

2.表现与使用
emacs,bash,vi,lftp等许多unix工具都使用了readline。readline支持组合键操作,历史记录搜寻,文件自动补全等功能。

3.例子
下面是一个例子,程序输出"Enter 'exit' to return:" 并且等待输入,知道输入'exit'为止。
支持热键编辑,文件名匹配,历史记录搜寻等。
文件readline.c的内容:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <readline/readline.h>  // readline 库头文件
#include <readline/history.h>  // readline 的历史命令功能

// 下面的一段例程摘自: http://www.ascc.sinica.edu.tw/pd-man/readline-2.0/rlman_2.html#SEC23
// start
/* A static variable for holding the line. */
static char *line_read = (char *)NULL;

/* Read a string, and return a pointer to it.  Returns NULL on EOF. */
char * rl_gets ()
{
    /* If the buffer has already been allocated, return the memory
     *      to the free pool. */
    if (line_read)
    {
        free (line_read);
        line_read = (char *)NULL;
    }

    /* Get a line from the user. */
    line_read = readline ("Enter 'exit' to return:");

    /* If the line has any text in it, save it on the history. */
    if (line_read && *line_read)
        add_history (line_read);

    return (line_read);
}

// end

void main()
{
    do
    {
        rl_gets();
    }while( strcmp("exit",line_read) != 0);
    exit(0);
}

其中rl_get这个例程摘自这里,有非常简明易懂的readline使用说明。
事实上实现最简单的readline其实只需用readline代替gets/fgets即可。

使用以下命令进行编译:
gcc readline.c -lreadline -o readline

Tuesday, August 19, 2008

m4的一个例子

m4是一个general purpose macro processor
m4 stands for macro.

一个例子:

test.m4:
define(`H2_COUNT', 0)dnl
define(`H2', `define(`H2_COUNT', incr(H2_COUNT))'dnl
`<h2>H2_COUNT. $1</h2>')dnl
dnl
H2(First Section)
H2(Second Section)
H2(Conclusion)


使用 (GNU) m4 处理后,得到:
<h2>1. First Section</h2>
<h2>2. Second Section</h2>
<h2>3. Conclusion</h2>

很容易学习这种语言。

其中dnl的作用是删除到目前为止的空行,因为m4处理时会把define删除,从而得到一个空行。

Monday, August 18, 2008

关于i18n与l10n,gettext,locale

今天稍微研究了一下gettext,发觉涉及到的东西很多,有点乱,稍微总结一下。

1.概念与介绍
i18n=internationlization的缩写,代表国际化
i10n=localization的缩写,代表本地化
gettext是用于实现i18n和i10n的一个工具
locale翻译成区域或区域设置,是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。 [2]
这个用户环境可以按照所涉及到的文化传统的各个方面分成几个大类,通常包括用户所使用的语言符号及其分类(LC_CTYPE),数字 (LC_NUMERIC),比较和排序习惯(LC_COLLATE),时间显示格式(LC_TIME),货币单位(LC_MONETARY),信息主要是 提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES),姓名书写方式(LC_NAME),地址书写方式(LC_ADDRESS),电话号码书写方式 (LC_TELEPHONE),度量衡表达方式(LC_MEASUREMENT),默认纸张尺寸大小(LC_PAPER)和locale对自身包含信息的 概述(LC_IDENTIFICATION)。 [2]

编写软件时,要使软件能国际化,则必须考虑到其在不同区域,能符合当地的习惯显示正确的字符串,数字格式等。
但是如何解决这个翻译的问题?最笨的方法显然是hardcode,以C程序为例,
printf("hello world")
每次要翻译成不同语言都把字符串"hello world"改变,再重新编译一次,这显然非常不方便。

聪明一点,可以使用一个宏代替字符串,每次更改一系列的宏。

而现在普遍使用的方法基于一个"映射表"式的方法。程序的字符串能根据运行时,动态地从对应的翻译文件中取得正确的字符串进行显示。
比如gettext,又比如windows下win32程序的字符串映射表。

下面着重介绍gettext。

2.gettext实现i18n与l10n
以下总结自参考资料[1].
主要的流程为:
  1. 编写应用程序,包含以下头文件:libintl.h,locale.h
  2. 使用setlocale设置程序的locale为当前用户的locale
  3. 使用bindtextdomain指定一个域名(domain)的对应文件所在的基目录(一般为/usr/share/local/<xxx>,<xxx>为zh_CN等)
  4. 使用textdomain设置当前应用程序的域名(一般与3中的域名对应)
  5. 使用gettext("...")包含printf("...")中的字符串,即printf(gettext("..."));
  6. 使用xgettext从源文件中抽取字符串,生成pot文件(portable object template)
  7. 使用msginit从pot文件生成指定语言的po文件(portable object)
  8. 使用msgfmt从po文件生成mo文件(machine object)
  9. 复制生成的po文件到3中指定基目录中与po的区域对应的目录
  10. 程序运行时,能根据区域设置(LC_ALL,LANG等)来输出字符串。
3.locale
说道locale,我虽然看了不少文章,还是模模糊糊的,还是要靠以后积累了。
参考资料[2]是一篇非常好的文章。

参考资料:
[1] A tutorial on Native Language Support using GNU gettext, http://oriya.sarovar.org/docs/gettext/memo.html
[2] 关于locale的设定,为什么要设定locale, http://forum.ubuntu.org.cn/viewtopic.php?t=18273

Sunday, August 17, 2008

[Updated] Cisco VPN Client under Linux

I wrote a article(search it in my blog) about how to do cisco VPN client under linux to CSE@CUHK.
However, later I found that my system will freeze(maybe kernel panic) under some uncertain conditions,
e.g. use remote desktop client to connect my PC at office.

Finally, I found the cause in this page:
http://forum.tuxx-home.at/viewtopic.php?f=15&t=457&st=0&sk=t&sd=a&start=15

To conclude, the problem will appear if you are using a intel core 2 duo(might as well as some other multicore processors)
To continue, you will have to disable other cores, left only one working, this can be done via many ways.
However, the most convenient one should be disable them during runtime.

Solution can be found in the web page mentioned just now: use a wrapper script to turn off other cores before start VPN connection,
and turn on other cores when the connection is closed.

Also, here is a new version of cisco vpn client, the version is 4.8.02.0030, no need to patch it under 32bit environment, however, patch is still needed if your system is 64bit.

Friday, August 15, 2008

VPN to CSE@CUHK using Linux

(Thanks to Alexander Griesser's useful guide and his work[1][2])
After several hours try, finally I got it work this way.

1.Download cisco VPN client and its patch : suitable for 2.6.24 kernel.
client:http://www.longren.org/files/vpnclient-linux-x86_64-4.8.01.0640-k9.tar.gz
patch:http://projects.tuxx-home.at/ciscovpn/patches/vpnclient-linux-2.6.24-final.diff

Upon building, I am using:
iveney@iveney-laptop:~$ uname -a
Linux iveney-laptop 2.6.24-19-generic #1 SMP Wed Jun 18 14:43:41 UTC 2008 i686 GNU/Linux
There's another available client:vpnc
It is a user developed cisco vpn client, however, I have not tried it, because I think the official one should work better.

2.Unpack and build the client(Suppose the diff file is in the SAME folder as the gzipped file)
$ tar xzvf vpnclient-linux-x86_64-4.8.01.0640-k9.tar.gz
$ cd vpnclient
$ patch < ../vpnclient-linux-2.6.24-final.diff

If patched correctly, you may now proceed.
$ sudo ./vpn_install
# some options here, remember to INSTALL your ``linux kernel header''(src file for development) before!!!

3. Set up the user profile
Go to CSE homepage and download the package. Unzip and note there are two important files:
vpn2.pcf and cert.p12

4. Copy the user profile 'vpn2.pcf' to /etc/opt/cisco-vpnclient/Profiles
and change its mode if neccesary.

5. Import the certificate into vpnclient's certificate repository[3].
$ cisco_cert_mgr -U -op import -f /path/to/your/cert.p12
the password should be input accroding to your identity in the department ( csepg if you are a PG )
you may enter a password to protect the certificate in this step.
Use
$ cisco_cert_mgr -U -op list
to see if it is correctly imported.
iveney@iveney-laptop:/etc/opt/cisco-vpnclient/Profiles$ cisco_cert_mgr -U -op list
Cisco Systems VPN Client Version 4.8.01 (0640)
Copyright (C) 1998-2007 Cisco Systems, Inc. All Rights Reserved.
Client Type(s): Linux
Running on: Linux 2.6.24-19-generic #1 SMP Wed Jun 18 14:43:41 UTC 2008 i686


      Cert #          Common Name
      -------         ------------

      0               csecert-pg

6. start the ipsec service and connect
$ sudo /etc/init.d/vpnclient_init  start
$ sudo vpnclient connect vpn2   # this parameter should match the one put in the Profiles dir, i.e. vpn2.pcf

and then enter your CSE  account.

The log should look like this:
iveney@iveney-laptop:~$ sudo vpnclient connect vpn2
Cisco Systems VPN Client Version 4.8.01 (0640)
Copyright (C) 1998-2007 Cisco Systems, Inc. All Rights Reserved.
Client Type(s): Linux
Running on: Linux 2.6.24-19-generic #1 SMP Wed Jun 18 14:43:41 UTC 2008 i686
Config file directory: /etc/opt/cisco-vpnclient

Enter Certificate password:
Initializing the VPN connection.
Contacting the gateway at 137.189.90.166
User Authentication for vpn2...

Enter Username and Password.

Username [yourname]:
Password []:
Authenticating user.
Negotiating security policies.
Securing communication channel.

Welcome to CSE VPN 2 (vpn2.cse.cuhk.edu.hk)!
Do you wish to continue? (y/n): y

Your VPN connection is secure.

VPN tunnel information.
Client address: 192.168.232.4
Server address: 137.189.90.166
Encryption: 168-bit 3-DES
Authentication: HMAC-MD5
IP Compression: LZS
NAT passthrough is active on port UDP 10000
Local LAN Access is disabled

Ref:
[1]http://www.longren.org/2007/05/17/how-to-cisco-vpn-client-on-ubuntu-704-feisty-fawn/#projectpage
[2]http://projects.tuxx-home.at/?id=cisco_vpn_client
[3]http://www.cisco.com/univercd/cc/td/doc/product/vpn/client/nonwin35/user_gd/certs.htm

Saturday, August 9, 2008

l2tp over ipsec in Linux @ CUHK

[Last updated : Aug. 9th, 2008]

由于ITSC声称将于2008年9月1日开始正式停止PPTP服
务,而使用L2TP服务,
因此刚进来这两天虽然忙,但是还是要先把最基本的东西搞好,以便于日后的长久使用。

1. 原来的pptp VPN接入:
在ITSC的site有很详细的介绍:
http://www.cuhk.edu.hk/itsc/network/vpn/vpn.html
http://www.cuhk.edu.hk/itsc/network/vpn/ubuntu.html

2. l2tp over ipsec VPN接入:
注意:ipsec和l2tp是两个无关的东西,但是,
据说由于windows的ipsec和l2tp是捆绑在一起的,
所以只能一起把它们做了……

关于这两个东西,我看了一篇很好的文章:
Openswan - IPsec on Linux for the Future

主要是介绍了ipsec在linux的现状,
clarify了主要是两种方法,一是内核集成的ipsec支持+racoon+ipsec-tools,一是*swan家族。
在此不再赘述。

本人首先参考了这篇文章:
Using Linux as an L2TP/IPsec client
(另外该系列文章还有介绍linux,
windows上的server,client设置,强烈推荐)

然后发觉设置不大成功,运行不起来,搜了好久也不知道结果,
因此下面介绍使用racoon的方法。
注: 后来经过研究,发觉还是能配置起来的,主要是l2tp的问题。

总结一下使用的软件:
ipsec : racoon, ipsec-tools / openswan(或strongswan)
l2tp: xl2tpd( 基于l2tpd的一个fork )

3.ipsec链接的建立

ipsec和l2tp是不同的,我们必须先建立ipsec链接,
然后再建立l2tp链接。实际上一个包应该是这样的:
| ppp header | l2tp header | ipsec header | ip header |  payload |

这就是所谓的l2tp over ipsec.
不过ppp的位置我还有点混淆,不敢确定,以后补上。

在写这篇文章时主要参考了:
http://liuchuan.org/cuhk/l2tp_ipsec.html

也是介绍类似的情况,但是在使用之中我与它有一点出入(
gentoo vs ubuntu)
因此在这里做一个备忘(假设kernel是2.6系列的)。

另外这个页面
http://www.wogri.at/index.php?id=194
似乎也有有用信息,但是没来得及看。

以下步骤,3.1与3.2任选1个即可。

3.1. 使用racoon
1)设置 racoon:编辑/etc/racoon/racoon.
conf,内容与上文一致。
path pre_shared_key "/etc/racoon/psk.txt";

padding {
        maximum_length 20;
        randomize off;
        strict_check off;
        exclusive_tail off;
}
remote anonymous {
        exchange_mode main;
        doi ipsec_doi;
        situation identity_only;
        generate_policy on;
        proposal_check obey;
        proposal {
                encryption_algorithm des;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group 1;
        }
}
sainfo anonymous {
        lifetime time 28800 sec;
        encryption_algorithm 3des;
        authentication_algorithm hmac_md5;
        compression_algorithm deflate;
}

2) 编辑/etc/racoon/psk.txt
10.0.255.248 ipsec-vpn
10.0.255.249 ipsec-vpn
10.0.255.250 ipsec-vpn
10.0.255.251 ipsec-vpn
10.0.255.252 ipsec-vpn
10.0.255.253 ipsec-vpn
10.0.255.254 ipsec-vpn
这里就是ITSC提到的pre-shared key的地方了


3) 建立ipsec链接:
/etc/init.d/racoon start

3.2.使用openswan
1)  修改/etc/ipsec.conf
version 2

conn L2TP-PSK-CLIENT
        authby=secret
        pfs=no
        rekey=yes
        keyingtries=3
        type=transport
        left=%defaultroute
        leftprotoport=17/1701
        right=ipsec-vpn.resnet.cuhk.edu.hk
        rightprotoport=17/1701
        auto=add

2) 修改/etc/ipsec.secrets
localhost %any : PSK "ipsec-vpn"

3)
建立ipsec链接:
sudo /etc/init.d/ipsec start

4.l2tp的建立
1)编辑/etc/xl2tpd/xl2tpd.conf
[global]
port = 1701
auth file = /etc/xl2tpd/l2tp-secrets

[lac ResNet]
lns = ipsec-vpn.resnet.cuhk.edu.hk
redial = yes
require pap = yes
ppp debug = no
pppoptfile = /etc/ppp/options.xl2tpd
2) 编辑/etc/ppp/options.xl2tpd  (这个文件与上一个文件最后一行相对应)
noauth
lock
debug
mtu 1000
nobsdcomp
nodeflate
noaccomp
nopcomp
novj
defaultroute
replacedefaultroute  --> 以上两行使得自动更新route表而无须手动更新
name <your name> --> 这里填写用户名
3) 编辑/etc/l2tpd/l2tp-secrets
<your name> ipsec-vpn.resnet.cuhk.edu.hk <password>
在上面填写自己的用户名和密码。

4) 启动服务
首先建立一个这样的文件夹(即使使用xl2tpd,似乎也无法自动建立这个文件夹):
$ sudo mkdir /var/run/xl2tpd
然后启动xl2tpd
$ sudo /etc/init.d/xl2tpd start
使用
$ sudo xl2tpd -D
来使l2tp运行于前台查看debug信息。

最后建立连接:
$ sudo sh -c 'echo "c ResNet" > /var/run/xl2tpd/l2tp-control'
这个是中断连接:
$ sudo sh -c 'echo "d ResNet" > /var/run/xl2tpd/l2tp-control'

5) 总结
要建立连接的最后命令可以归纳为:
$ sudo /etc/init.d/racoon start
或者
$ sudo /etc/init.d/ipsec start

$ sudo mkdir /var/run/xl2tpd
$ sudo touch /var/run/xl2tpd/l2tp-control
$ sudo touch /
$ /etc/init.d/xl2tpd start
$ sudo sh -c 'echo "c ResNet" > /var/run/xl2tpd/l2tp-control'

6) 脚本(完善中,我的脚本实在烂)
$ sudo vi /usr/local/sbin/vpnon
#!/bin/bash
# use this script to build/stop l2tp/ipsec between PC and CUHK's VPN LNC

# check if it is root user
if [ $UID -ne 0 ]
then
    echo "Must be root!"
    exit 1
fi

# first we build ipsec channel
sudo /etc/init.d/ipsec start

# create the folder and file
sudo mkdir -p /var/run/xl2tpd
sudo touch /var/run/xl2tpd/l2tp-control

# run xl2tpd
sudo /etc/init.d/xl2tpd start

# sleep 3 seconds to wait for the PPP on
IP=''
count=0
MAX_TRY=5
while [ $count -lt $MAX_TRY ]
do
    count=$(($count+1))
    echo "trying " $count "first time"
    # just assume the face is ppp0
    IP=`ifconfig ppp0 2>/dev/null | awk '/inet/{print $2}' | awk -F: '{print $2}'`
    if [ "$IP" != '' ]
    then
        printf "IP is %s\n" $IP
        break;
    fi
    sleep 1
done


if [ $count -gt $MAX_TRY ]
then
    echo "Can't create connection"
    exit 1
else
    # create connection
    sudo sh -c 'echo "c ResNet" > /var/run/xl2tpd/l2tp-control'
    # show connection
    echo $IP
fi

exit 0

只做了基本的权限检查,建议把文件权限改为700.这样保证只有root可执行。

$ sudo vi /usr/local/sbin/vpno  

#!/bin/bash
if [ $UID -ne 0 ]
then
    echo "Must be root!"
    exit 1
fi

sudo sh -c 'echo "d ResNet" > /var/run/xl2tpd/l2tp-control'
sudo /etc/init.d/xl2tpd stop
sudo /etc/init.d/ipsec stop
sudo rm -rf /var/run/xl2tpd

exit 0

---------------------------------------------------------------------
5.后记
使用以上步骤与脚本可以很好地解决我的需求,就等9月ITSC正式终端pptp连接服务了。

补充:据说在每次建立连接前,有必要先flush security association table in kernel.
资料在这里
vi /etc/racoon/setup.sh
内容如下:
#!/bin/bash
/sbin/setkey -FP
/sbin/setkey -F
/sbin/setkey -c << EOF
spdadd 192.168.0.1[1701] 0.0.0.0/0[0] any
   -P out ipsec esp/transport//require;
EOF

然后chmodx +x /etc/racoon/setup.sh
在每次建立ipsec连接前运行一次。
但事实上经我实验,不需要这步也能很好地建立连接。

Wednesday, August 6, 2008

firefox里下载项"打开所在文件夹"无响应的解决

默认好像是用nautilus来打开
但是不一定所有人都装了,所以会发生无响应的现象

解决:
打开设置页面(about:config)
添加两个bool类型的:

network.protocol-handler.expose.file = true

network.protocol-handler.external.file = true

然后添加个字符串类型的

network.protocol-handler.app.file = 文件管理器名称,如konqueror,dolphin




问题解决.

Gmail真的很强大

不使用客户端已经很久了。
一直在用gmail,现在把我在香港科技大学、香港中文大学、中山大学的邮件都聚合到了gmail里。
但是聚合有一个功能的弱点,就是不能自定收信的间隔,因此对于HK这种利用email当作即时通信软件的环境里,
很容易miss掉重要事件的时间,好在CUHK的webmail支持forwarding,于是我把它forward到了gmail。坚持使用gmail。
这样就不会造成miss mail了。
但是要check mail的话还是需要一点辅助,觉得gtalk有点麻烦,google toolbar好像也有点傻傻的,
还是用gmail notifier吧。
Linux下有个一个python 些的notifier,也很好。

Tuesday, August 5, 2008

原来RFC规定url是不准带下划线的。

今天想在tencent的网站下载一个foxmail,发觉打开连接失败,提示如下:

ERROR

The requested URL could not be retrieved


While trying to retrieve the URL: http://dl_dir.qq.com/foxmail/foxmail65beta02.exe

The following error was encountered:

  • Invalid URL

Some aspect of the requested URL is incorrect. Possible problems:

  • Missing or incorrect access protocol (should be `http://'' or similar)
  • Missing hostname
  • Illegal double-escape in the URL-Path
  • Illegal character in hostname; underscores are not allowed

Your cache administrator is sysadm@cse.cuhk.edu.hk.


Generated Tue, 05 Aug 2008 14:17:54 GMT by pluto.cse.cuhk.edu.hk (squid/2.5.STABLE12)

仔细看,似乎是因为underscore的问题。

网上搜得出了这个答案:

出错的原因是你提到的这个域名有一个不称职的管理员。

RFC 1034中明确指出:

代码:

The following syntax will result in fewer problems with many applications that use domain names (e.g., mail, TELNET).

<domain> ::= <subdomain> | " "

<subdomain> ::= <label> | <subdomain> "." <label>

<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9


下划线有保留意义,不能随意使用。

引自:http://www.freebsdchina.org/forum/viewtopic.php?=&p=188440
据说是squid的问题。

Monday, August 4, 2008

关于sudo的一个必须注意的point

今天在往一个只有600权限的文件中写入内容时发现了一点小问题:

iveney@iveney-laptop:~$ ll /var/run/xl2tpd/l2tp-control
prw------- 1 root root 0 2008-08-04 11:21 /var/run/xl2tpd/l2tp-control

iveney@iveney-laptop:~$ sudo echo "d ResNet" > /var/run/xl2tpd/l2tp-control
bash: /var/run/xl2tpd/l2tp-control: Permission denied

非常奇怪,为什么用了sudo还是permission denied了呢?难道一定要先chmod后再echo?
岂不是非常不符合逻辑?

后来查阅了一下发现原来是这样的:
echo,ls等是bash的built-in命令,echo时实际是shell自己往文件里头写东西,而我是以普通用户身份运行的shell。

因此只要在命令前再加上生成一个子shell的命令即可。

sudo sh -c 'echo "c ResNet" > /var/run/xl2tpd/l2tp-control'


Sunday, August 3, 2008

对CUHK网络的初步认识

CUHK的网络历史很悠久,由学校的ITSC部门负责,主页上(itsc.cuhk.edu.hk)有详细介绍。
是香港最早联通互联网的实体,后来还建立了HK唯一的一个internet exchange中心:HKIX。

现在CUHK的网络处于改进迁移之中,特别是无线网络方面最近似乎有许多大的工程要动。
比如ITSC主页说要在2009年开放802.11n,然而事实上我认为与其考虑incorporate新技术,
不如先解决校园无线网覆盖范围小的问题(相比HKUST的全覆盖,CUHK只有可怜的一点,
宿舍和公路都没有,不过也跟CUHK的地理范围大有关)

另外在不同地区接入需要不同的设置和方法,略显呆板(用户不友好)
比如要访问CUHK的内网则必须分为以下几类:
1) ResNet,Residence Net,即宿舍网络。据观察IP地址范围是10.0.192/18,CUHK的研宿有6座,
UG学生宿舍也有近10座。
2) ClassNet,据介绍,原理是跟ResNet一样的,还没尝试过。
3) CUHKNet,用于从外网访问(VPN)使用。
4)教学楼的网络,这个还没仔细看过是怎么样的架构。
5)无线网络,这个比较乱,因为以前好像是分为几个不同的部分接入的,现在全部统一成一个ssid了,
但是连接后也必须建立VPN链接才能接入Internet。

附:一点补充
据观察
宿舍网段是10.0.192.0/18
公网IP地址范围是137.189.0.0/16
在宿舍上网后能拿到两个dns地址
然后必须通过pptp或者l2tp+ipsec登录到学校网络
dns刷新为新的两个
分配到一个137.189.x.x的IP地址
并且校内的dns自动添加分配的IP
比如现在的IP是137.189.244.7
显示为h244007.xxx.xxx.xxx

不过始终不是很懂为什么要用VPN来建立连接
是为了分配一个公网IP吗?

Solution : Google Reader的“合烧功能”

稍微搜索了一下,发觉Google Reader本来就有"合烧"的功能。
之所以加上双引号,是因为google reader本来没有标榜自己提供这个服务。
然而强大的greader提供了文件夹功能,每个folder的属性设置为public后,拥有一个public page,只需要把feed移入文件夹即可达到合烧的效果。
我的合烧地址在这里:
http://www.google.com/reader/shared/user/00212757343177934295/label/BurnTogether

有兴趣的朋友可以浏览此页面,也可以把它添加进您的rss reader。
to be done:
The link is a little bit long.
Gonna seek if there is url redirection provided in CUHK's ihome.

Saturday, August 2, 2008

有一个想法:feed合烧

一直以为我的blog是私人日记。
这两天才发觉其实我的blog还是一两个人看的。
一般我是通过email群发到blogger和windows live space。
然而有时也想从google reader分享一些好的文章给朋友看
(虽然blog几乎没人看,但是还是希望看到的人能与自己一起分享好文章 ^_^ )
greader自动生成一个页面,提供我的share与note item
然而我还想把自己blog的内容也放到上面,最后再加上delicious的tag
也就是说,这个feed拥有四个内容:
1.my personal blog
2.my delicious tag
3.my google reader share items
4.my google reader noted items

而以上四个东东的Service Provider都是能提供feed输入的。
因此有必要弄一个feed合烧,呵呵。

另外还有一个小小的idea,搜索了下发觉还没人做过,因此先不公布,看什么时间有空做一下。