代码就是最好的文档

敏捷开发讲究的是快速响应变化,所以相对而言很反对繁冗的文档,他们认为,当情况变得很迫切的时候,才是建立文档的时候。而这份文档必须简短,以论述框架为主。而最好的文档是代码,从代码里面才能够完整的了解整个系统的结构。所以敏捷开发强调重构的重要性,一方面重构可以提高代码响应变化的能力;另一方面则是可以保持代码的清晰和简洁,让这份最好的文档能便于阅读。

每每读到一个文件数千行代码的时候,我就会更加坚信这一点,好在,至少这个文件里注释还不少:)

xinu, yslow

曾经在哪看到的xinu忘了,今天找的时候开发者居然不提供服务了,不过提供了源码下载,所以在本站放了一个。链接是xinu,很不错的一个站点各项数据分析搜索引擎数据采集工具,唉,偶的网站数据小的可怜啊~~
xinu的源代码,php的

再来说说YSlow,分析你的网页为何加载的这么慢的一个工具,地址回头再给。
会针对你的网页比如css的放置,js的放置等等各项打分,给出改进速度的建议,不过我不明白为何不欢迎ETag……

附图:
xinu偶的数据

GNU screen

一直以来都是term term term,N个term,刚看到screen的时候觉得多此一举,反正已经是term*N很容易的,都配成sawfish的快捷键了……
这儿有个how to start screen from .bashrc不过偶不喜欢,因为这样只能启动一个terminal,每次都会接管上一个screen。
于是配成了另一个sawfish的快捷键,目前我的快捷键如下:
Win+e 启动emacs或跳转到已启动的emacs
Win+t 启动thunderbird或跳转到已启动的thunderbird
Win+m 启动mlterm
Win+z 启动一个mlterm,在里头执行screen
Win+p 启动python解释器
Win+x 启动rox
Print 抓屏
Alt+Print 抓窗口

配置文件里这样写:
More >

Ubuntu Gutsy

呃,升级了之后一直报错,device-manager dm-linear device lookup error.
据说是内核需要patch,ubuntu的bug list里有,所以等等吧,幸亏2.6.20的内核还在,用这个启动就行了,hoho
顺便要说的是,之前的dual head双显不行了,在recovery模式下X -configure重写了下xorg.conf,当然,最好是dpkg-reconfigure xserver-xorg
双显啊双显,啥时候才能用的很爽呢……

好吧,接着写,关于i810的dual head

之前写过,但是用的很不方便,在/etc/X11/下放了两个xorg.conf 分别对应dual head和single head用脚本来切换
但是太麻烦了 得重启xwindow
于是把xinerama关了
但是问题就是sawfish只跑在主显示器上了
没法子 写了个脚本
DISPLAY=:0.1 sawfish &
这样就不用每次都切换xorg.conf了

不过 再一个麻烦事又来了……
窗口不能随便拖了~~~~

遭遇thunderbird丢失邮件

恩,写下来给其他人参考,如果也不幸遇到了的话,呵呵
找到你的邮件,比如Inbox 重命名为Inbox2
然后执行

sed '/^X-Mozilla-Status:/s/[0-9]*$/0000/' <Inbox2 >Inbox

重置了邮件的状态,所以最后一次compact this folder后删除的邮件也回来了……

Robert love joins Google

Novell的Linux桌面曾经的Chief Architect,现在Google的开源工作室,不知道会给Google带来什么
Blog | rlove

谣传maxthon获得了google一百万美金的投资

原文是这样的
Multiple sources are confirming that the Chinese/Israeli startup behind the Maxthon Browser has sold a minority stake to Google. The total investment size is rumored to be around $1 million. We are also hearing that this investment is part of a “much larger strategic deal” between the two companies

vmware under feisty

vmware-workstation的内核模块在2.6.20下编译不过,可能有解决方案,不过网上有现成的更好的办法,就是改用vmware-server

到vmware下载vmware-server,解压开来装上,问你是否执行vmware-config.pl的时候选no

然后开始cheat。

apt-get install vmware-server-kernel-modules

这个是ubuntu源里面别人编译好的vmware-server的内核模块,能够保持和内核的一致
然后sed -i -e "s/\/sbin\/insmod -s -f \"\/lib\/modules\/\`uname -r\`\/misc\/\$1.o\"/\/sbin\/insmod -s -f \"\/lib\/modules\/\`uname -r\`\/vmware-server\/\$1.ko\"/" /etc/init.d/vmware

这里和原文不一样,改的是vmware启动脚本里面关于加载内核模块的地方,原文是改成了modprobe一下,但是我不知道啥时候insmod,所以我就改成了这个,源里面针对2.6.20编译的内核是以ko结尾,而且是放在vmware-server下

再然后sed -i -e "s/sub configure_module {/sub configure_module {\n return 'yes';/" /usr/bin/vmware-config.pl

这个是hack掉vmware-config.pl里面安装内核模块部分,vmware-server自带是没有2.6.20的,自己编译可能还有什么问题,所以用别人编译好的,这里直接return yes;最好

之后就全ok了, 跑一下vmware-config.pl吧

注:以上步骤都需要root权限

原文在http://www.ubuntuforums.org/showpost.php?p=2143833&postcount=14

Seems scim conflicts with Xorg or sawfish or emacs?

I first found this problem when using ubuntu dapper & emacs 23.0.0.1.

Sometimes when speedbar is started in emacs, every key press in emacs does not effects unless next time I switched to emacs.

At first, I thought it was a little bug with emacs 23, so I did not take it serious.

But after upgrading to feisty & emacs 23.0.0.9, this happens more often. When created a new frame, either speedbar or C+X 5 2, key press frozen. And everything returns all right when all other frames are closed. And evem more, key press lags when switching windows! So I thought it maybe bug with xorg or sawfish!
So I asked in emacs@newsmth, and someone said it maybe problem between xim & emacs in reply. Then I disabled scim and now seems everything ok.

Fight for freedom,援引徐继哲先生致招商银行的一封公开信

刚刚看了亚瑟王,俺土,不喜欢看电影,所以被里面为自由而战感染的一塌糊涂,而同样是为自由而战,我们有权选择。

致招商银行的一封公开信(http://wiki.billxu.com/moin/CampaignPublicLetter),相信很多人都在用着国内银行提供的网上银行,我也是,然而国内众多网站的做法,不仅仅是银行业,让我敬而远之。

火车站订票,需要IE;网上银行,需要MS+IE;查询基金净值,得用IE;以前学校选课,需要IE;工作了,连公司委托第三方做的满意度调查,也只得用IE……

一个省略号,说不尽我们的苦衷,但我们能够选择。国内的公司们,当你们的客户正在动摇正在流失而你们不以为然,当你们痛抓80%而放弃20%的时候,我想说,闭关自守、固步自封最适合描述你们的未来,因为那你们放弃的20%将影响整个互联网的未来。

一句简简单单的 For freedom,哪里能涵盖我们选择的理由,我们需要的是更强大,更适合自己,更高效,更安全便捷的生活,我们拥有的是选择。

而有一天,我们成为主体的时候,国内IT业会因我们而改变。

开始学写shell

磕磕碰碰的写完了一个预处理的脚本,很简单,用来对代码里面的#ifdef DEBUG … #else … #endif来做处理 如果脚本没带参数 就认为启用DEBUG 带参数就认为不启用DEBUG 弱的很 暴汗……

其实以前也写过shell脚本,简单的比如切换有线和无线,复杂的比如解决rar x的中文问题(不过新版本的rar貌似没这个问题了),但还是好多东东要学@.@ 还得在实践中一点一点的被lisp给侵蚀着 呵呵
More >

ubuntu下用vpnc连入cisco vpn

之前转载过一个cisco的vpnclient的帖子,是要自己编译安装的,所以一直没空尝试

昨天还是前天来着突然想到ubuntu源里面应该已经有现成的vpnclient了吧,找了找果然有个vpnc。
于是刚刚看着vpnc的long-help试了试就搞定了

首先需要的是windows下有个配好的cisco vpn client,或者你有group的密码
windows下vpn client下profiles里面是相应的配置文件
/etc/vpnc.conf文件里面照着现有相应的pcf文件写就行了

IPSec gateway [ Host in .pcf ]
IPSec ID [ GroupName in .pcf ]
IPSec obfuscated secret [ enc_GroupPwd in .pcf ]
Xauth username [ your user name ]

如果直接有group密码 那么把IPSec obfuscated secret换成IPSec secret然后写上你的密码 或者直接sudo vpnc-connect然后输入ip,group name,group pwd,user name,user pwd连接也就ok了

DualHead ubuntu下实现I810显卡的笔记本双显

忍不住想双显,数次的失败之后终于搞定了

xorg.conf里面这样写More >

Ubuntu下的DNS caching

我实在受不了了……

每个请求都要到dns server上解析一下,太影响效率了……

今天找了一下 原来非常简单 就是装一个dnsmasq 原文在这儿
然后把/etc/dnsmasq.conf里面把"listen-address=127.0.0.1"写上

再去/etc/dhcp3/dhclient.conf里头把“prepend domain-name-servers 127.0.0.1;”前面的注释去掉

再到/etc/resolv.conf里头在紧接着search后面加一行"nameserver 127.0.0.1

最后sudo /etc/init.d/dnsmasq restart一下 就ok了More >

vpn under linux

不知道关不管用 先记下来再说

http://kor.cpmc.columbia.edu/vpn/linux-how-to.html

More >

xgl

我承认我土了,到现在才开始用xgl,说实话,真的很酷,不信,点下面连接或者点开comment看看那个flash……

http://www.youtube.com/watch?v=hhNWYtuW0fA

我是在用的xfce+compiz 回头补个安装手记上来顺便抓几张图:)

用CPP做apache的module

有三个地方要改

  1. 首先注释掉include/ap_config_auto.h里面的
    1. define AP_HAVE_DESIGNATED_INITIALIZER 1
  2. 然后在ap_config.h里面增加这几行
    1. if (defined(__GNUC__) && !defined(__cplusplus))                   \

    || (defined(__STDC_VERSION) && __STDC_VERSION__ > 199901L)

    1. define AP_HAVE_DESIGNATED_INITIALIZER 1
    2. endif
  3. 再到http_config.h里面修改
    typedef const char *(*cmd_func) ();

    1. if (defined(__GNUC__) && !defined(__cplusplus))                \

    || (defined(__STDC_VERSION) && __STDC_VERSION__ > 199901L)
    typedef const char *(*cmd_func) ();

    1. else

    typedef const char *(*cmd_func) (cmd_parms*, void*, const char*);

    1. endif

apache module中取post数据

一共使用三个函数

  1. ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)
    Apache里面说Setup the client to allow Apache to read the request body. 差不多意思就是初始化,第二个参数可以取以下三个值。

    1. REQUEST_NO_BODY
      意为如果request必须没有body,如果有就发一个413错误
    2. REQUEST_CHUNKED_ERROR
      意为request必须不可为chunked,如果有就发一个411错误
    3. REQUEST_CHUNKED_DECHUNK
      意思为如果chunked了,则dechunk。

    对于我们要读取post的数据,只能取后面两个,而chunked则是对长连接的选项了,使用哪个视情况而定。

  2. ap_should_client_block(r)
    检查是否有数据,对于chunked的话会发送一个100 continue的命令让客户端继续发送数据。
  3. ap_get_client_block(r, pBuff, size)
    读取数据

apache及其module的调试

  1. gdb httpd
    用gdb加载httpd进程
  2. (gdb) b break-point
    设置断点,可以设置函数名、行数等……
  3. (gdb) run -X -d /usr/local/apache
    执行httpd,这个是关键的,-X参数会让httpd以debug模式运行,debug模式是单进程的,这样才好调试。-d /usr/local/apache是设置运行的目录。

另外,gdb httpd pid可以attach一个正在运行的httpd来调试。